home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / 4.3cpp.patch next >
Text File  |  1986-11-30  |  9KB  |  307 lines

  1. Subject:  v07i023:  #elif patch to 4.3BSD cpp
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: linus!gatech!emoryu1!emoryu2!arnold (Arnold D. Robbins)
  6. Mod.sources: Volume 7, Issue 23
  7. Archive-name: 4.3cpp.patch
  8.  
  9. [  This is a modification of the V6#44 cpp.patch for 4.3BSD.  --r$  ]
  10.  
  11. Basically, with these patches are installed, /lib/cpp gains two new
  12. capabilities: The #elif found in recent versions of System V and in the
  13. draft ANSI standard, and the ability to recognize C++ // comments,
  14. which start with the // delimiter, and go to the end of the line.
  15.  
  16. #elif is automatic: it is fast becoming a standard C feature, and I
  17. feel that everyone would want it. // comments require that the new -B
  18. option be given, for their recognition to be turned on. Sites with C++
  19. should modify their CC shell script to call /lib/cpp with this option.
  20. (I chose -B as sort of mnemonic for the BCPL programming language, from
  21. which // was re-instituted.)
  22.  
  23. Credits: Doug Gwyn of BRL implemented #elif for his System V emulation;
  24. however I typed it in to make the "style" consistent; all typos are
  25. mine. I wrote the // processing code. Enjoy.
  26.  
  27. Unpack this file and feed it to patch while in a cpp source directory,
  28. then run make / "make install".
  29.  
  30. --------------------CUT HERE--------------------
  31. *** cpp.c.orig    Mon Aug 11 17:58:06 1986
  32. --- cpp.c    Mon Aug 11 17:50:28 1986
  33. ***************
  34. *** 1,4 ****
  35. --- 1,24 ----
  36.   #ifndef lint
  37. + static char *RCSid = "$Header: cpp.c,v 1.3 86/08/11 17:49:38 root Locked $";
  38. + #endif
  39. + /*
  40. +  * $Log:    cpp.c,v $
  41. +  * Revision 1.3  86/08/11  17:49:38  root
  42. +  * Bug fix to #elif stuff due to a typo. Fixed new code to call sayline()
  43. +  * with an argument. ADR.
  44. +  * 
  45. +  * Revision 1.2  86/08/07  17:55:56  root
  46. +  * Added Doug Gwyn's code to handle #elif. This is always on. Also
  47. +  * added my code that takes a -B option, to recognize C++ // ... \n
  48. +  * style of comments. ADR.
  49. +  * 
  50. +  * Revision 1.1  86/08/07  16:15:52  root
  51. +  * Initial revision
  52. +  * 
  53. +  */
  54. + #ifndef lint
  55.   static char sccsid[] = "@(#)cpp.c    1.14 4/27/86";
  56.   #endif lint
  57.   
  58. ***************
  59. *** 153,158 ****
  60. --- 173,179 ----
  61.   STATIC    int    nd    = 1;
  62.   STATIC    int    pflag;    /* don't put out lines "# 12 foo.c" */
  63.   int    passcom;    /* don't delete comments */
  64. + int    eolcom;        /* allow // ... \n comments */
  65.   int    incomment;    /* True if parsing a comment */
  66.   STATIC    int rflag;    /* allow macro recursion */
  67.   STATIC    int mflag;    /* generate makefile dependencies */
  68. ***************
  69. *** 192,197 ****
  70. --- 213,219 ----
  71.   STATIC    struct symtab *udfloc;
  72.   STATIC    struct symtab *incloc;
  73.   STATIC    struct symtab *ifloc;
  74. + STATIC    struct symtab *eliloc;        /* DAG -- added */
  75.   STATIC    struct symtab *elsloc;
  76.   STATIC    struct symtab *eifloc;
  77.   STATIC    struct symtab *ifdloc;
  78. ***************
  79. *** 204,209 ****
  80. --- 226,233 ----
  81.   STATIC    struct symtab *identloc;    /* Sys 5r3 compatibility */
  82.   STATIC    int    trulvl;
  83.   STATIC    int    flslvl;
  84. + #define MAX_IF_NESTING    64        /* DAG -- added (must be at least6) */
  85. + STATIC    int    ifdone[MAX_IF_NESTING];    /* DAG -- added */
  86.   
  87.   sayline(where)
  88.       int where;
  89. ***************
  90. *** 393,402 ****
  91.           else {++p; break;}
  92.       } break;
  93.       case '/': for (;;) {
  94. !         if (*p++=='*') {/* comment */
  95.               incomment++;
  96.               if (!passcom) {inp=p-2; dump(); ++flslvl;}
  97.               for (;;) {
  98.                   while (!iscom(*p++));
  99.                   if (p[-1]=='*') for (;;) {
  100.                       if (*p++=='/') goto endcom;
  101. --- 417,448 ----
  102.           else {++p; break;}
  103.       } break;
  104.       case '/': for (;;) {
  105. !         if (*p=='/' && eolcom) {
  106. !             p++;
  107.               incomment++;
  108.               if (!passcom) {inp=p-2; dump(); ++flslvl;}
  109.               for (;;) {
  110. +                 while (*p && *p++ != '\n');
  111. +                 if (p[-1]=='\n') {
  112. +                     p--;
  113. +                     goto endcpluscom;
  114. +                 } else if (eob(--p)) {
  115. +                     if(!passcom) {inp=p; p=refill(p);}
  116. +                     else if ((p-inp) >= BUFSIZ) {/* split long comment */
  117. +                         inp=p; refill(p);
  118. +                     } else p=refill(p);
  119. +                 } else ++p; /* ignore null byte */
  120. +             }
  121. +         endcpluscom:
  122. +             if (!passcom) {outp=inp=p; --flslvl;}
  123. +             incomment--;
  124. +             goto newline;
  125. +             break;
  126. +         }
  127. +         else if (*p++=='*') {/* comment */
  128. +             incomment++;
  129. +             if (!passcom) {inp=p-2; dump(); ++flslvl;}
  130. +             for (;;) {
  131.                   while (!iscom(*p++));
  132.                   if (p[-1]=='*') for (;;) {
  133.                       if (*p++=='/') goto endcom;
  134. ***************
  135. *** 446,451 ****
  136. --- 492,498 ----
  137.           }
  138.       } break;
  139.       case '\n': {
  140. + newline:
  141.           ++lineno[ifno]; if (isslo) {state=LF; return(p);}
  142.   prevlf:
  143.           state=BEG;
  144. ***************
  145. *** 746,752 ****
  146.   #define fasscan() ptrtab=fastab+COFF
  147.   #define sloscan() ptrtab=slotab+COFF
  148.   
  149. ! char *
  150.   control(p) register char *p; {/* find and handle preprocessor control lines */
  151.       register struct symtab *np;
  152.   for (;;) {
  153. --- 793,799 ----
  154.   #define fasscan() ptrtab=fastab+COFF
  155.   #define sloscan() ptrtab=slotab+COFF
  156.   
  157. ! void    /* DAG -- bug fix (was (char *)) */
  158.   control(p) register char *p; {/* find and handle preprocessor control lines */
  159.       register struct symtab *np;
  160.   for (;;) {
  161. ***************
  162. *** 759,777 ****
  163.           if (flslvl==0) {p=doincl(p); continue;}
  164.       } else if (np==ifnloc) {/* ifndef */
  165.           ++flslvl; p=skipbl(p); np=slookup(inp,p,0); --flslvl;
  166. !         if (flslvl==0 && np->value==0) ++trulvl;
  167.           else ++flslvl;
  168.       } else if (np==ifdloc) {/* ifdef */
  169.           ++flslvl; p=skipbl(p); np=slookup(inp,p,0); --flslvl;
  170. !         if (flslvl==0 && np->value!=0) ++trulvl;
  171.           else ++flslvl;
  172.       } else if (np==eifloc) {/* endif */
  173.           if (flslvl) {if (--flslvl==0) sayline(CONT);}
  174. !         else if (trulvl) --trulvl;
  175.           else pperror("If-less endif",0);
  176.       } else if (np==elsloc) {/* else */
  177.           if (flslvl) {
  178. !             if (--flslvl!=0) ++flslvl;
  179.               else {++trulvl; sayline(CONT);}
  180.           }
  181.           else if (trulvl) {++flslvl; --trulvl;}
  182. --- 806,832 ----
  183.           if (flslvl==0) {p=doincl(p); continue;}
  184.       } else if (np==ifnloc) {/* ifndef */
  185.           ++flslvl; p=skipbl(p); np=slookup(inp,p,0); --flslvl;
  186. !         if (flslvl==0)
  187. !             if(ifdone[trulvl] = np->value==0)
  188. !                 ++trulvl;
  189. !             else
  190. !                 ++flslvl;
  191.           else ++flslvl;
  192.       } else if (np==ifdloc) {/* ifdef */
  193.           ++flslvl; p=skipbl(p); np=slookup(inp,p,0); --flslvl;
  194. !         if (flslvl==0)
  195. !             if (ifdone[trulvl] = np->value!=0)
  196. !                 ++trulvl;
  197. !             else
  198. !                 ++flslvl;
  199.           else ++flslvl;
  200.       } else if (np==eifloc) {/* endif */
  201.           if (flslvl) {if (--flslvl==0) sayline(CONT);}
  202. !         else if (trulvl) ifdone[--trulvl] = 0;    /* DAG */
  203.           else pperror("If-less endif",0);
  204.       } else if (np==elsloc) {/* else */
  205.           if (flslvl) {
  206. !             if (--flslvl!=0 || ifdone[trulvl]) ++flslvl;
  207.               else {++trulvl; sayline(CONT);}
  208.           }
  209.           else if (trulvl) {++flslvl; --trulvl;}
  210. ***************
  211. *** 783,794 ****
  212.       } else if (np==ifloc) {/* if */
  213.   #if tgp
  214.           pperror(" IF not implemented, true assumed", 0);
  215. !         if (flslvl==0) ++trulvl; else ++flslvl;
  216.   #else
  217.           newp=p;
  218. !         if (flslvl==0 && yyparse()) ++trulvl; else ++flslvl;
  219.           p=newp;
  220.   #endif
  221.       } else if (np==lneloc) {/* line */
  222.           if (flslvl==0 && pflag==0) {
  223.               char *savestring();
  224. --- 838,897 ----
  225.       } else if (np==ifloc) {/* if */
  226.   #if tgp
  227.           pperror(" IF not implemented, true assumed", 0);
  228. !         if (flslvl==0) ifdone[trulvl++] = 1; else ++flslvl;
  229.   #else
  230.           newp=p;
  231. !         if (flslvl==0)
  232. !         {
  233. !             if (ifdone[trulvl] = yyparse())    /* DAG */
  234. !                 ++trulvl;
  235. !             else
  236. !                 ++flslvl;
  237. !         }
  238. !         else ++flslvl;
  239.           p=newp;
  240.   #endif
  241. +     } else if (np==eliloc) {/* elif */    /* DAG -- added */
  242. + #if tgp
  243. +         pperror (" ELIF not implemented, true assumed", (char *) 0, (char *) 0);
  244. +         if (flslvl)
  245. +         {
  246. +             if (--flslvl == 0 && !ifdone[trulvl])
  247. +             {
  248. +                 ifdone[trulvl++] = 1;
  249. +                 sayline (CONT);
  250. +             }
  251. +             else
  252. +                 ++flslvl;
  253. +         }
  254. +         else if (trulvl)
  255. +         {
  256. +             ++flslvl;
  257. +             --trulvl;
  258. +         }
  259. +         else
  260. +             pperror ( "If-less elif", (char *) 0, (char *) 0);
  261. + #else
  262. +         newp = p;
  263. +         if (flslvl)
  264. +         {
  265. +             if (--flslvl == 0 && !ifdone[trulvl] && yyparse ())
  266. +             {
  267. +                 ifdone[trulvl++] = 1;
  268. +                 sayline (CONT);
  269. +             }
  270. +             else
  271. +                 ++flslvl;
  272. +         }
  273. +         else if (trulvl)
  274. +         {
  275. +             ++flslvl;
  276. +             --trulvl;
  277. +         }
  278. +         else
  279. +             pperror ( "If-less elif", (char *) 0, (char *) 0);
  280. +         p = newp;
  281. + #endif
  282.       } else if (np==lneloc) {/* line */
  283.           if (flslvl==0 && pflag==0) {
  284.               char *savestring();
  285. ***************
  286. *** 1137,1142 ****
  287. --- 1240,1246 ----
  288.                   case 'E': continue;
  289.                   case 'R': ++rflag; continue;
  290.                   case 'C': passcom++; continue;
  291. +                 case 'B': eolcom++; continue;
  292.                   case 'D':
  293.                       if (predef>prespc+NPREDEF) {
  294.                           pperror("too many -D options, ignoring %s",argv[i]);
  295. ***************
  296. *** 1235,1240 ****
  297. --- 1339,1345 ----
  298.       ifdloc=ppsym("ifdef");
  299.       ifnloc=ppsym("ifndef");
  300.       ifloc=ppsym("if");
  301. +     eliloc=ppsym("elif");
  302.       lneloc=ppsym("line");
  303.       identloc=ppsym("ident");    /* Sys 5r3 compatibility */
  304.       for (i=sizeof(macbit)/sizeof(macbit[0]); --i>=0; ) macbit[i]=0;
  305.