home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / misc / smc203.ark / CC21.C < prev    next >
Encoding:
Text File  |  1983-07-28  |  6.1 KB  |  334 lines

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