home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 163_01 / cc21.c < prev    next >
Text File  |  1990-11-21  |  7KB  |  341 lines

  1. /*
  2. ** Purpose is kill characters until a transition between alphanumeric and
  3. ** non-alphanumeric occurs.  Fixed to not gobble primes and quotes.  DRH.
  4. */
  5. junk() {
  6.   if (an(inbyte())) while(an(ch)) gch();
  7.   else while((an(ch)==0)&&(ch!='\'')&&(ch!='"')) { /* don't swallow quote */
  8.     if(ch==0) break;
  9.     gch();
  10.     }
  11.   blanks();
  12.   }
  13.  
  14. endst() {
  15.   blanks();
  16.   return ((streq(lptr,";")|(ch==0)));
  17.   }
  18.  
  19. illname() {
  20.   error("illegal symbol");
  21.   junk();
  22.   }
  23.  
  24.  
  25. multidef(sname) char *sname; {
  26.   error("already defined");
  27.   }
  28.  
  29. needtoken(str) char *str; {
  30.   if (match(str)==0) error("missing token");
  31.   }
  32.  
  33. needlval() {
  34.   error("must be lvalue");
  35.   }
  36.  
  37. findglb(sname) char *sname; {
  38. #ifdef HASH
  39.   if(search(sname, STARTGLB, SYMMAX, ENDGLB, NUMGLBS, NAME))
  40.     return cptr;
  41. #else
  42.   cptr= STARTGLB;
  43.   while(cptr < glbptr) {
  44.     if(astreq(sname, cptr+NAME, NAMEMAX)) return cptr;
  45.     cptr=nextsym(cptr);
  46.     }
  47. #endif
  48.   return 0;
  49.   }
  50.  
  51. findloc(sname)  char *sname;  {
  52.   cptr = locptr - 1;  /* search backward for block locals */
  53.   while(cptr > STARTLOC) {
  54.     cptr = cptr - *cptr;
  55.     if(astreq(sname, cptr, NAMEMAX)) return (cptr - NAME);
  56.     cptr = cptr - NAME - 1;
  57.     }
  58.   return 0;
  59.   }
  60.  
  61. addsym(sname, id, typ, value, lgptrptr, class, cdim, ndim)
  62.   char *sname, id, typ; int value, *lgptrptr, class, cdim, ndim; {
  63.   if(lgptrptr == &glbptr) {
  64.     if(cptr2=findglb(sname)) return cptr2;
  65. #ifdef HASH
  66.     if(cptr==0) {
  67.       error("global symbol table overflow");
  68.       return 0;
  69.       }
  70. #else
  71. #ifndef DYNAMIC
  72.     if(glbptr >= ENDGLB) {
  73.       error("global symbol table overflow");
  74.       return 0;
  75.       }
  76. #endif
  77.     cptr=*lgptrptr;
  78. #endif
  79.     }
  80.   else {
  81.     if(locptr > (ENDLOC-SYMMAX)) {
  82.       error("local symbol table overflow");
  83.       exit(EUSER);
  84.       }
  85.     cptr=*lgptrptr;
  86.     }
  87.   cptr[IDENT]=id;
  88.   cptr[TYPE] =typ;
  89.   cptr[CLASS]=class;
  90.   cptr[STATUS]=0;
  91.   putint(value, cptr+OFFSET, OFFSIZE);
  92.   cptr[NDIM] = ndim;
  93.   putint(cdim, cptr + CDIM, 2);
  94.   cptr3 = cptr2 = cptr + NAME;
  95.   while(an(*sname)) *cptr2++ = *sname++;
  96. #ifdef HASH
  97.   if(lgptrptr == &locptr) {
  98.     *cptr2 = cptr2 - cptr3; /* set length */
  99.     *lgptrptr = ++cptr2;
  100.     }
  101. #else
  102.   *cptr2 = cptr2 - cptr3;   /* set length */
  103.   *lgptrptr = ++cptr2;
  104. #ifdef DYNAMIC
  105.   if(lgptrptr == &glbptr) malloc(cptr2 - cptr);
  106.   /* gets allocation error if no more memory */
  107. #endif
  108. #endif
  109.   return cptr;
  110.   }
  111.  
  112. /*
  113. ** declare externals to the assembler and warn of undefined variables
  114. */
  115. externs() {
  116.   errflag = 0;
  117. #ifdef HASH
  118.   this section not yet defined;
  119. #else
  120.   cptr= STARTGLB;
  121.   while(cptr < glbptr) {
  122.     if((cptr[IDENT]==FUNCTION) &
  123.        (!(cptr[STATUS] & DECLARED))) {
  124.       if(errflag==0) {
  125.         errflag = 1;
  126.         ++errcnt;
  127.         lout("**** undefined symbols:", stderr);
  128.         }
  129.       errstr(cptr+NAME);
  130.       lout(" ",stderr);
  131.       external(cptr+NAME, cptr[TYPE], cptr[IDENT]);
  132.       }
  133.     if((cptr[CLASS] == EXTERNAL) &&
  134.         (cptr[STATUS] & USED))
  135.       external(cptr+NAME, cptr[TYPE], cptr[IDENT]);
  136.     cptr=nextsym(cptr);
  137.     }
  138. #endif
  139.   }
  140.  
  141. #ifndef HASH
  142. nextsym(entry) char *entry; {
  143.   entry = entry + NAME;
  144.   while(*entry++ >= ' ');  /* find length byte */
  145.   return entry;
  146.   }
  147. #endif
  148.  
  149. /*
  150. ** get integer of length len from address addr
  151. ** (byte sequence set by "putint")
  152. */
  153. getint(addr, len) char *addr; int len; {
  154.   int i;
  155.   i = *(addr + --len);  /* high order byte sign extended */
  156.   while(len--) i = (i << 8) | *(addr+len)&255;
  157.   return i;
  158.   }
  159.  
  160. /*
  161. ** put integer i of length len into address addr
  162. ** (low byte first)
  163. */
  164. putint(i, addr, len) char *addr; int i, len; {
  165.   while(len--) {
  166.     *addr++ = i;
  167.     i = i>>8;
  168.     }
  169.   }
  170.  
  171. /*
  172. ** test if next input string is legal symbol name
  173. */
  174. symname(sname, ucase) char *sname; int ucase; {
  175.   int k;char c;
  176.   blanks();
  177.   if(alpha(ch)==0) return 0;
  178.   k=0;
  179.   while(an(ch)) {
  180. #ifdef UPPER
  181.     if(ucase)
  182.       sname[k]=upper(gch());
  183.     else
  184. #endif
  185.       sname[k]=gch();
  186.     if(k<NAMEMAX) ++k;
  187.     }
  188.   sname[k]=0;
  189.   return 1;
  190.   }
  191.  
  192. #ifdef UPPER
  193. /*
  194. ** force upper case alphabetics
  195. */
  196. upper(c)  char c; {
  197.   if((c >= 'a') & (c <= 'z')) return (c - 32);
  198.   else return c;
  199.   }
  200. #endif
  201.  
  202. /*
  203. ** return next avail intern label number
  204. */
  205. getlabel() {
  206.   return(++nxtlab);
  207.   }
  208.  
  209. /*
  210. ** post a label in the program
  211. */
  212. postlabel(label) int label; {
  213.   printlabel(label);
  214.   col();
  215.   nl();
  216.   }
  217.  
  218. /*
  219. ** print specified number as a label
  220. */
  221. printlabel(label)  int label; {
  222.   outstr("CC");
  223.   outdec(label);
  224.   }
  225.  
  226. /*
  227. ** test if given character is alphabetic
  228. */
  229. alpha(c)  char c; {
  230.   return (((c>='a')&(c<='z'))|((c>='A')&(c<='Z'))|(c=='_'));
  231.   }
  232.  
  233. /*
  234. ** test if given character is numeric
  235. */
  236. numeric(c)  char c; {
  237.   return((c>='0')&(c<='9'));
  238.   }
  239.  
  240. /*
  241. ** test if given character is alphanumeric
  242. */
  243. an(c) char c; {
  244.   return((alpha(c))|(numeric(c)));
  245.   }
  246.  
  247. addwhile(ptr)  int ptr[]; {
  248.   int k;
  249.   ptr[WQSP]  =csp;         /* and stack pointer */
  250.   ptr[WQLOOP]=getlabel();  /* and looping label */
  251.   ptr[WQEXIT]=getlabel();   /* and exit label    */
  252.   if (wqptr==WQMAX) {
  253.     error("too many active loops");
  254.     exit(EUSER);
  255.     }
  256.   k=0;
  257.   while (k<WQSIZ) *wqptr++ = ptr[k++];
  258.   }
  259.  
  260. /*
  261. ** fixed per J. E. Hendrix letter, DDJ #77
  262. */
  263. delwhile() {
  264.   if(wqptr>wq) wqptr=wqptr-WQSIZ;
  265.   }
  266.  
  267. /*
  268. ** fixed per J. E. Hendrix letter, DDJ #77
  269. */
  270. readwhile(ptr) int *ptr; {
  271.   if (ptr<=wq) {
  272.     error("out of context");
  273.     return 0;
  274.     }
  275.   else return (ptr-WQSIZ);
  276.   }
  277.  
  278. white() {
  279.   /* test for stack/program overlap          */
  280.   /* primary -> symname -> blanks -> white   */
  281. #ifdef DYNAMIC
  282.   CCAVAIL();  /* abort on stack/symbol table overflow */
  283. #endif
  284.   if(*lptr==' ') return 1; /* blank */
  285.   if(*lptr==9)   return 1; /* tab */
  286.   if(*lptr==10)  return 1; /* new line (line feed) */
  287.   if(*lptr==13)  return 1; /* carriage return */
  288.   return 0;
  289.   }
  290.  
  291. gch() {
  292.   int c;
  293.   if(c=ch) bump(1);
  294.   return c;
  295.   }
  296.  
  297. bump(n) int n; {
  298.   if(n) lptr=lptr+n;
  299.   else  lptr=line;
  300.   if(ch=nch=*lptr) nch=*(lptr+1);
  301.   }
  302.  
  303. kill() {
  304.   *line=0;
  305.   bump(0);
  306.   }
  307.  
  308. inbyte()  {
  309.   while(ch==0) {
  310.     if (eof) return 0;
  311.     preprocess();
  312.     }
  313.   return gch();
  314.   }
  315.  
  316. inline() {
  317.   int k,unit;
  318.   char *ptr;
  319.   while(1) {
  320.     if (input==EOF) {eof=1; return;}
  321.     if((unit=input2)==EOF) unit=input;
  322.     if(fgets(line, LINEMAX, unit)==NULL) {
  323.       fclose(unit);
  324.       if(input2!=EOF) input2=EOF;
  325.       else input=EOF;
  326.       }
  327.     else {
  328.       bump(0);
  329.       /* if line ends with '\n', get rid of it */
  330.       ptr = line;
  331.       while(*ptr++);
  332.       ptr -= 2;
  333.       if(*ptr == '\n') *ptr = '\0';
  334.       else error("line too long");
  335.       return;
  336.       }
  337.     }
  338.   }
  339.  
  340.  
  341.