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 / ENTERPRS / CPM / UTILS / S / SMC21SRC.LZH / CC21.C < prev    next >
Text File  |  2000-06-30  |  5KB  |  245 lines

  1. junk() {
  2.   if(an(inbyte())) while(an(ch)) gch();
  3.   else while(an(ch)==0) {
  4.     if(ch==0) break;
  5.     gch();
  6.     }
  7.   blanks();
  8.   }
  9.  
  10. endst() {
  11.   blanks();
  12.   return ((streq(lptr,";")|(ch==0)));
  13.   }
  14.  
  15. illname() {
  16.   error("illegal symbol");
  17.   junk();
  18.   }
  19.  
  20. multidef(sname)  char *sname; {
  21.   error("already defined");
  22.   }
  23.  
  24. needtoken(str)  char *str; {
  25.   if (match(str)==0) error("missing token");
  26.   }
  27.  
  28. needlval() {
  29.   error("must be lvalue");
  30.   }
  31.  
  32. findglb(sname)  char *sname; {
  33.   if(search(sname, STARTGLB, SYMMAX, ENDGLB, NUMGLBS, NAME))
  34.     return cptr;
  35.   return 0;
  36.   }
  37.  
  38. findloc(sname)  char *sname;  {
  39.   cptr = locptr - 1;  /* search backward for block locals */
  40.   while(cptr > STARTLOC) {
  41.     cptr = cptr - *cptr;
  42.     if(astreq(sname, cptr, NAMEMAX)) return (cptr - NAME);
  43.     cptr = cptr - NAME - 1;
  44.     }
  45.   return 0;
  46.   }
  47.  
  48. addsym(sname, id, typ, value, lgptrptr, class)
  49.   char *sname, id, typ;  int value, *lgptrptr, class; {
  50.   if(lgptrptr == &glbptr) {
  51.     if(cptr2=findglb(sname)) return cptr2;
  52.     if(cptr==0) {
  53.       error("global symbol table overflow");
  54.       return 0;
  55.       }
  56.     }
  57.   else {
  58.     if(locptr > (ENDLOC-SYMMAX)) {
  59.       error("local symbol table overflow");
  60.       abort(ERRCODE);
  61.       }
  62.     cptr = *lgptrptr;
  63.     }
  64.   cptr[IDENT]=id;
  65.   cptr[TYPE]=typ;
  66.   cptr[CLASS]=class;
  67.   putint(value, cptr+OFFSET, OFFSIZE);
  68.   cptr3 = cptr2 = cptr + NAME;
  69.   while(an(*sname)) *cptr2++ = *sname++;
  70.   if(lgptrptr == &locptr) {
  71.     *cptr2 = cptr2 - cptr3;         /* set length */
  72.     *lgptrptr = ++cptr2;
  73.     }
  74.   return cptr;
  75.   }
  76.  
  77. nextsym(entry) char *entry; {
  78.   entry = entry + NAME;
  79.   while(*entry++ >= ' '); /* find length byte */
  80.   return entry;
  81.   }
  82.  
  83. /*
  84. ** get integer of length len from address addr
  85. ** (byte sequence set by "putint")
  86. */
  87. getint(addr, len) char *addr; int len; {
  88.   int i;
  89.   i = *(addr + --len);  /* high order byte sign extended */
  90.   while(len--) i = (i << 8) | *(addr+len)&255;
  91.   return i;
  92.   }
  93.  
  94. /*
  95. ** put integer i of length len into address addr
  96. ** (low byte first)
  97. */
  98. putint(i, addr, len) char *addr; int i, len; {
  99.   while(len--) {
  100.     *addr++ = i;
  101.     i = i>>8;
  102.     }
  103.   }
  104.  
  105. /*
  106. ** test if next input string is legal symbol name
  107. */
  108. symname(sname, ucase) char *sname; int ucase; {
  109.   int k;char c;
  110.   blanks();
  111.   if(alpha(ch)==0) return (*sname = 0);           /*19*/
  112.   k=0;
  113.   while(an(ch)) {
  114.  
  115. #ifdef UPPER
  116.  
  117.     if(ucase)
  118.       sname[k]=toupper(gch());
  119.     else
  120.  
  121. #endif /* UPPER */
  122.  
  123.       sname[k]=gch();
  124.     if(k<NAMEMAX) ++k;
  125.     }
  126.   sname[k]=0;
  127.   return 1;
  128.   }
  129.  
  130. /*
  131. ** return next avail internal label number
  132. */
  133. getlabel() {
  134.   return(++nxtlab);
  135.   }
  136.  
  137. /*
  138. ** post a label in the program
  139. */
  140. postlabel(label) int label; {
  141.   printlabel(label);
  142.   col();
  143.   nl();
  144.   }
  145.  
  146. /*
  147. ** print specified number as a label
  148. */
  149. printlabel(label)  int label; {
  150.   outstr("CC");
  151.   outdec(label);
  152.   }
  153.  
  154. /*
  155. ** test if given character is alphabetic
  156. */
  157. alpha(c)  char c; {
  158.   return (isalpha(c)|(c=='_'));
  159.   }
  160.  
  161. /*
  162. ** test if given character is alphanumeric
  163. */
  164. an(c)  char c; {
  165.   return (alpha(c)|isdigit(c));
  166.   }
  167.  
  168. addwhile(ptr)  int ptr[]; {
  169.   int k;
  170.   ptr[WQSP]=csp;           /* and stk ptr */
  171.   ptr[WQLOOP]=getlabel();  /* and looping label */
  172.   ptr[WQEXIT]=getlabel();   /* and exit label */
  173.   if (wqptr==WQMAX) {
  174.     error("too many active loops");
  175.     abort(ERRCODE);
  176.     }
  177.   k=0;
  178.   while (k<WQSIZ) *wqptr++ = ptr[k++];
  179.   }
  180.  
  181. delwhile() {
  182.   if(wqptr > wq) wqptr=wqptr-WQSIZ;         /*01*/
  183.   }
  184.  
  185. readwhile(ptr)  int *ptr; {
  186.   if (ptr <= wq) {                          /*01*/
  187.     error("out of context");                /*01*/
  188.     return 0;                               /*01*/
  189.     }
  190.   else return (ptr-WQSIZ);                  /*01*/
  191.  }
  192.  
  193. white() {
  194.  
  195. #ifdef DYNAMIC
  196.  
  197.   /* test for stack/program overlap */
  198.   /* primary -> symname -> blanks -> white */
  199.   avail(YES);   /*abort on stack overflow*/            /*31*/
  200.  
  201. #endif /*DYNAMIC*/
  202.  
  203.   return (*lptr<= ' ' && *lptr!=NULL);            /*19*/
  204.   }
  205.  
  206. gch() {
  207.   int c;
  208.   if(c=ch) bump(1);
  209.   return c;
  210.   }
  211.  
  212. bump(n) int n; {
  213.   if(n) lptr=lptr+n;
  214.   else  lptr=line;
  215.   if(ch = nch = *lptr) nch = *(lptr+1);
  216.   }
  217.  
  218. kill() {
  219.   *line=0;
  220.   bump(0);
  221.   }
  222.  
  223. inbyte()  {
  224.   while(ch==0) {
  225.     if (eof) return 0;
  226.     preprocess();
  227.     }
  228.   return gch();
  229.   }
  230.  
  231. inline() {            /*numerous revisions*/            /*20*/
  232.   int k,unit;
  233.   poll(1);  /* allow operator interruption */
  234.   if (input == EOF) openfile();
  235.   if(eof) return;
  236.   if((unit=input2) == EOF) unit=input;
  237.   if(fgets(line, LINEMAX, unit)==NULL) {
  238.     fclose(unit);
  239.     if(input2 != EOF) input2 = EOF;
  240.     else input = EOF;
  241.     *line=NULL;
  242.     }
  243.   bump(0);
  244.   }
  245.