home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / TESERACT / TESS-044.ZIP / SMC21.LBR / CC22.CQ / CC22.C
Text File  |  1989-01-22  |  9KB  |  458 lines

  1.  
  2. ifline() {
  3.   while(1) {
  4.     inline();
  5.     if(eof) return;
  6.     if(match("#ifdef")) {
  7.       ++iflevel;
  8.       if(skiplevel) continue;
  9.       blanks();
  10.  
  11. #ifdef HASH
  12.       symname(msname,NO);
  13.       if(search(msname, macn, NAMESIZE+2, MACNEND, MACNBR, 0)==0)
  14. #else /* HASH */
  15.       if(findmac(lptr)==0)
  16. #endif /* HASH */
  17.  
  18.         skiplevel=iflevel;
  19.       continue;
  20.       }
  21.     if(match("#ifndef")) {
  22.       ++iflevel;
  23.       if(skiplevel) continue;
  24.       blanks();
  25.  
  26. #ifdef HASH
  27.       symname(msname,NO);
  28.       if(search(msname, macn, NAMESIZE+2, MACNEND, MACNBR, 0))
  29. #else /* HASH */
  30.       if(findmac(lptr))
  31. #endif /* HASH */
  32.  
  33.         skiplevel=iflevel;
  34.       continue;
  35.       }
  36.     if(match("#else")) {
  37.       if(iflevel) {
  38.         if(skiplevel==iflevel) skiplevel=0;
  39.         else if(skiplevel==0)  skiplevel=iflevel;
  40.         }
  41.       else noiferr();
  42.       continue;
  43.       }
  44.     if(match("#endif")) {
  45.       if(iflevel) {
  46.         if(skiplevel==iflevel) skiplevel=0;
  47.         --iflevel;
  48.         }
  49.       else noiferr();
  50.       continue;
  51.       }
  52.     if(skiplevel) continue;
  53.     if(listfp) {
  54.       if(listfp==output) cout(';', output);
  55.       lout(line, listfp);
  56.       }
  57.     if(ch==0) continue;
  58.     break;
  59.     }
  60.   }
  61.  
  62. keepch(c)  char c; {
  63.   if(pptr<LINEMAX) pline[++pptr]=c;
  64.   }
  65.  
  66. preprocess() {
  67.   int k;
  68.   char c;
  69.   if(ccode) {
  70.     line=mline;
  71.     ifline();
  72.     if(eof) return;
  73.     }
  74.   else {
  75.     line=pline;
  76.     inline();
  77.     return;
  78.     }
  79.   pptr = -1;
  80.   while(ch) {
  81.     if(white()) {
  82.       keepch(' ');
  83.       while(white()) gch();
  84.       }
  85.     else if(ch=='"') {
  86.       keepch(ch);
  87.       gch();
  88.       while((ch!='"')|((*(lptr-1)==92)&(*(lptr-2)!=92))) {
  89.         if(ch==0) {
  90.           error
  91. ("no quote");
  92.           break;
  93.           }
  94.         keepch(gch());
  95.         }
  96.       gch();
  97.       keepch('"');
  98.       }
  99.     else if(ch==39) {
  100.       keepch(39);
  101.       gch();
  102.       while((ch!=39)|((*(lptr-1)==92)&(*(lptr-2)!=92))) {
  103.         if(ch==0) {
  104.           error("no apostrophe");
  105.           break;
  106.           }
  107.         keepch(gch());
  108.         }
  109.       gch();
  110.       keepch(39);
  111.       }
  112.     else if((ch=='/')&(nch=='*')) {
  113.       bump(2);
  114.       while(((ch=='*')&(nch=='/'))==0) {
  115.         if(ch) bump(1);
  116.         else {
  117.           ifline();
  118.           if(eof) break;
  119.           }
  120.         }
  121.       bump(2);
  122.       }
  123.     else if(an(ch)) {
  124.       k=0;
  125.       while((an(ch)) & (k<NAMEMAX)){                /* 7 */
  126.         msname[k++]=ch;                        /* 7 */
  127.         gch();
  128.         }
  129.       msname[k]=0;
  130.  
  131. #ifdef HASH
  132.       if(search(msname, macn, NAMESIZE+2, MACNEND, MACNBR, 0)) {
  133.         k=getint(cptr+NAMESIZE, 2);
  134.         while(c=macq[k++]) keepch(c);
  135.         while(an(ch)) gch();                    /* 7 */
  136.         }
  137. #else /* HASH */
  138.       if(k=findmac(msname)) while(c=macq[k++]) keepch(c);
  139. #endif /* HASH */
  140.  
  141.       else {
  142.         k=0;
  143.         while(c=msname[k++]) keepch(c);
  144.         }
  145.       }
  146.     else keepch(gch());
  147.     }
  148.   if(pptr>=LINEMAX) error("line too long");
  149.   keepch(0);
  150.   line=pline;
  151.   bump(0);
  152.   }
  153.  
  154. noiferr() {
  155.   error("no matching #if...");
  156.   errflag=0;
  157.   }
  158.  
  159. addmac() {
  160.   int k;
  161.   if(symname(msname, NO)==0) {
  162.     illname();
  163.     kill();
  164.     return;
  165.     }
  166.   k=0;
  167.  
  168. #ifdef HASH
  169.   if(search(msname, macn, NAMESIZE+2, MACNEND, MACNBR, 0)==0) {
  170.     if(cptr2=cptr) while(*cptr2++ = msname[k++]);
  171.     else {
  172.       error("macro name table full");
  173.       return;
  174.       }
  175.     }
  176.   putint(macptr, cptr+NAMESIZE, 2);
  177. #else /* HASH */
  178.   while(putmac(msname[k++]));
  179. #endif /* HASH */
  180.  
  181.   while(white()) gch();
  182.   while(putmac(gch()));
  183.   if(macptr>=MACMAX) {
  184.     error("macro string queue full"); abort(ERRCODE);
  185.     }
  186.   }
  187.  
  188. putmac(c)  char c; {
  189.   macq[macptr]=c;
  190.   if(macptr<MACMAX) ++macptr;
  191.   return c;
  192.   }
  193.  
  194. #ifdef HASH
  195. /*
  196. ** search for symbol match
  197. ** on return cptr points to slot found or empty slot
  198. */
  199. search(sname, buf, len, end, max, off)
  200.   char *sname, *buf, *end;  int len, max, off; {
  201.   cptr=cptr2=buf+((hash(sname)%(max-1))*len);
  202.   while(*cptr != 0) {
  203.     if(astreq(sname, cptr+off, NAMEMAX)) return 1;
  204.     if((cptr=cptr+len) >= end) cptr=buf;
  205.     if(cptr == cptr2) return (cptr=0);
  206.     }
  207.   return 0;
  208.   }
  209.  
  210. hash(sname) char *sname; {
  211.   int i, c;
  212.   i=0;
  213.   while(c = *sname++) i=(i<<1)+c;
  214.   return i;
  215.   }
  216.  
  217. #else /* HASH */
  218. findmac(sname)  char *sname; {
  219.   mack=0;
  220.   while(mack<macptr) {
  221.     if(astreq(sname,macq+mack,NAMEMAX)) {
  222.       while(macq[mack++]);
  223.       return mack;
  224.       }
  225.     while(macq[mack++]);
  226.     while(macq[mack++]);
  227.     }
  228.   return 0;
  229.   }
  230. #endif /* HASH */
  231.  
  232. setstage(before, start) int *before, *start; {
  233.   if((*before=stagenext)==0) stagenext=stage;
  234.   *start=stagenext;
  235.   }
  236.  
  237. clearstage(before, start) char *before, *start; {
  238.   *stagenext=0;
  239.   if(stagenext=before) return;
  240.   if(start) {
  241.  
  242. #ifdef OPTIMIZE
  243.     peephole(start);
  244. #else /* OPTIMIZE */
  245.     sout(start, output);
  246. #endif /* OPTIMIZE */
  247.  
  248.     }
  249.   }
  250.  
  251. outdec(number)  int number; {
  252.   int k,zs;
  253.   char c, *q, *r;                        /* 9 */
  254.   zs = 0;
  255.   k=10000;
  256.   if (number<0) {
  257.     number=(-number);
  258.     outbyte('-');
  259.     }
  260.   while (k>=1) {
  261.    q = 0; r = number;                        /* 9 */
  262.    while(r >= k) {++q; r -= k;}                    /* 9 */
  263.    c = q + '0';                            /* 9 */
  264.     if ((c!='0')|(k==1)|(zs)) {
  265.       zs=1;
  266.       outbyte(c);
  267.       }
  268.     number=r;                            /* 9 */
  269.     k=k/10;
  270.     }
  271.   }
  272.  
  273. ol(ptr)  char ptr[];  {
  274.   ot(ptr);
  275.   nl();
  276.   }
  277.  
  278. ot(ptr) char ptr[]; {
  279.  
  280. #ifdef TAB
  281.   tab();
  282. #else /* TAB */
  283.   outbyte(' ');
  284. #endif /* TAB */
  285.  
  286.   outstr(ptr);
  287.   }
  288.  
  289. outstr(ptr) char ptr[]; {
  290.  
  291. #ifdef POLL
  292.   CCPOLL(1); /* allow program interruption */
  293. #endif /* POLL */
  294.  
  295.   /* must work with symbol table names terminated by length */
  296.   while(*ptr >= ' ') outbyte(*ptr++);
  297.   }
  298.  
  299. outbyte(c) char c; {
  300.   if(stagenext) {
  301.     if(stagenext==stagelast) {
  302.       error("staging buffer overflow");
  303.       return 0;
  304.       }
  305.     else *stagenext++ = c;
  306.     }
  307.   else cout(c,output);
  308.   return c;
  309.   }
  310.  
  311. cout(c, fd) char c; int fd; {
  312.  
  313.   if(fputc(c, fd)==EOF) xout();
  314.  
  315.   }
  316.  
  317. sout(string, fd) char *string; int fd; {
  318.   if(fputs(string, fd)==EOF) xout();
  319.   }
  320.  
  321. lout(line, fd) char *line; int fd; {
  322.   sout(line, fd);
  323.   cout('\n', fd);
  324.   }
  325.  
  326. xout() {
  327.   fputs("output error\n", stderr);
  328.   abort(ERRCODE);
  329.   }
  330.  
  331.  
  332. nl() {
  333.   outbyte('\n');
  334.   }
  335.  
  336. tab() {
  337.   outbyte(TAB);
  338.   }
  339.  
  340. col() {
  341.  
  342. #ifdef COL
  343.   outbyte(':');
  344. #else /* COL */
  345.   outbyte(' ');
  346. #endif /* COL */
  347.  
  348.   }
  349.  
  350. error(msg) char msg[]; {
  351. int ec;
  352.   if(errflag) return; else errflag=1;
  353.   lout(line, stderr);
  354.   errout(msg, stderr);
  355.  
  356.   if(alarm) fputc(7, stderr);
  357.  
  358.   /*
  359.   ** while reading from stderr is not strictly legal,
  360.   ** stderr will always be assigned to the user's terminal
  361.   ** (CON: on CP/M systems [should be /dev/tty on Unix]).
  362.   */
  363.   if(pause) while((ec = getc(stderr)) != CR){
  364.     if(ec == 24) abort(23);
  365.     }
  366.   if(listfp>0) errout(msg, listfp);
  367.   }
  368.  
  369. errout(msg, fp) char msg[]; int fp; {
  370.   int k; k=line+2;
  371.   while(k++ <= lptr) cout(' ', fp);
  372.   lout("/\\", fp);
  373.   sout("**** ", fp); lout(msg, fp);
  374.   }
  375.  
  376. streq(str1,str2)  char str1[],str2[]; {
  377.   /* check for string equality over whole string */
  378.   int k;
  379.   k=0;
  380.   while (str2[k]) {
  381.     if ((str1[k])!=(str2[k])) return 0;
  382.     ++k;
  383.     }
  384.   return k;
  385.  }
  386.  
  387. astreq(str1,str2,len)  char str1[],str2[];int len; {
  388.   /* check for string equality over first 'len' characters */
  389.   int k;
  390.   k=0;
  391.   while (k<len) {
  392.     if ((str1[k])!=(str2[k]))break;
  393.     /*
  394.     ** must detect end of symbol table names terminated by
  395.     ** symbol length in binary
  396.     */
  397.     if(str1[k] < ' ') break;
  398.     if(str2[k] < ' ') break;
  399.     ++k;
  400.     }
  401.   if (an(str1[k]))return 0;
  402.   if (an(str2[k]))return 0;
  403.   return k;
  404.  }
  405.  
  406. match(lit)  char *lit; {
  407.   int k;
  408.   blanks();
  409.   if (k=streq(lptr,lit)) {
  410.     bump(k);
  411.     return 1;
  412.     }
  413.   return 0;
  414.   }
  415.  
  416. amatch(lit,len)  char *lit;int len; {
  417.   int k;
  418.   blanks();
  419.   if (k=astreq(lptr,lit,len)) {
  420.     bump(k);
  421.     while(an(ch)) inbyte();
  422.     return 1;
  423.     }
  424.   return 0;
  425.  }
  426.  
  427. nextop(list) char *list; {
  428.   char op[4];
  429.   opindex=0;
  430.   blanks();
  431.   while(1) {
  432.     opsize=0;
  433.     while(*list > ' ') op[opsize++] = *list++;
  434.     op[opsize]=0;
  435.     if(opsize=streq(lptr, op))
  436.       if((*(lptr+opsize) != '=')&
  437.          (*(lptr+opsize) != *(lptr+opsize-1)))
  438.          return 1;
  439.     if(*list) {
  440.       ++list;
  441.       ++opindex;
  442.       }
  443.     else return 0;
  444.     }
  445.   }
  446.  
  447. blanks() {
  448.   while(1) {
  449.     while(ch) {
  450.       if(white()) gch();
  451.       else return;
  452.       }
  453.     if(line==mline) return;
  454.     preprocess();
  455.     if(eof)break;
  456.     }
  457.   }
  458.