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 / CC12.C < prev    next >
Text File  |  2000-06-30  |  7KB  |  280 lines

  1.  
  2. /*
  3. ** open an include file
  4. */
  5. doinclude()  {
  6.   blanks();       /* skip over to name */
  7.   if((input2=fopen(lptr,"r"))==NULL)  {
  8.     input2=EOF;
  9.     error("open failure on include file");
  10.     }
  11.   kill();           /* clear rest of line */
  12.       /* so new read will come from */
  13.       /* new file (if open) */
  14.   }
  15.  
  16. /*
  17. ** test for global declarations
  18. */
  19. dodeclare(class) int class; {
  20.   if(amatch("char",4)) {
  21.     declglb(CCHAR, class);
  22.     ns();
  23.     return 1;
  24.     }
  25.   else if((amatch("int",3))|(class==EXTERNAL)) {
  26.     declglb(CINT, class);
  27.     ns();
  28.     return 1;
  29.     }
  30.   return 0;
  31.   }
  32.  
  33. /*
  34. ** declare a static variable
  35. */
  36. declglb(type, class)  int type, class; {
  37.   int k, j;
  38.   while(1) {
  39.     if(endst()) return;     /* do line */
  40.     if(match("(*")|match("*")) {                /*03*/
  41.       j=POINTER;
  42.       k=0;
  43.       }
  44.     else {
  45.       j=VARIABLE;
  46.       k=1;
  47.       }
  48.     if (symname(ssname, YES)==0) illname();
  49.     if(findglb(ssname)) multidef(ssname);
  50.     if(match(")")) ;                            /*03*/
  51.     if(match("()")) j=FUNCTION;
  52.     else if (match("[")) {
  53.       k=needsub();    /* get size */
  54.       j=ARRAY;   /* !0=array */ 
  55.       }
  56.     if(class==EXTERNAL) external(ssname);
  57.     else if(j!=FUNCTION) j=initials(type>>2, j, k);   /*16*/
  58.     addsym(ssname, j, type, k, &glbptr, class);
  59.     if (match(",")==0) return; /* more? */
  60.     }
  61.   }
  62.  
  63. /*
  64. ** declare local variables
  65. */
  66. declloc(typ)  int typ;  {
  67.   int k,j;
  68.   if(swactive) error("not allowed in switch");        /*08*/
  69.  
  70. #ifdef STGOTO
  71.  
  72.   if(noloc) error("not allowed with goto");
  73.  
  74. #endif /* STGOTO */
  75.  
  76.   if(declared < 0) error("must declare first in block");
  77.   while(1) {
  78.     while(1) {
  79.       if(endst()) return;
  80.       if(match("*")) j=POINTER;
  81.       else j=VARIABLE;
  82.       if (symname(ssname, YES)==0) illname();
  83.       /* no multidef check, block-locals are together */
  84.       k=BPW;
  85.       if (match("[")) {
  86.         if(k=needsub()) {                               /*25*/
  87.           j=ARRAY;
  88.           if(typ==CINT)k=k<<LBPW;
  89.           }
  90.         else {j=POINTER; k=BPW;}                        /*25*/
  91.       }
  92.                                                         /*14*/
  93.       else if((typ==CCHAR)&(j==VARIABLE)) k=SBPC;
  94.       declared = declared + k;
  95.       addsym(ssname, j, typ, csp - declared, &locptr, AUTOMATIC);
  96.       break;
  97.       }
  98.     if (match(",")==0) return;
  99.     }
  100.   }
  101.  
  102. /*
  103. ** initialize global objects
  104. */
  105. initials(size, ident, dim) int size, ident, dim; {
  106.   int savedim;
  107.   litptr=0;
  108.   if(dim==0) dim = -1;
  109.   savedim=dim;
  110.   entry();
  111.   if(match("=")) {
  112.     if(match("{")) {
  113.       while(dim) {
  114.         init(size, ident, &dim);
  115.         if(match(",")==0) break;
  116.         }
  117.       needtoken("}");
  118.       }
  119.     else init(size, ident, &dim);
  120.     }
  121.   if((dim == -1)&(dim==savedim)) {
  122.      stowlit(0, size=BPW);
  123.     ident=POINTER;
  124.     }
  125.   dumplits(size);
  126.   dumpzero(size, dim);
  127.   return ident;
  128.   }
  129.  
  130. /*
  131. ** evaluate one initializer
  132. */
  133. init(size, ident, dim) int size, ident, *dim; {
  134.   int value;
  135.   if(qstr(&value)) {
  136.     if((ident==VARIABLE)|(size!=1))
  137.       error("must assign to char pointer or array");
  138.     *dim = *dim - (litptr - value);
  139.     if(ident==POINTER) point();
  140.     }
  141.   else if(constexpr(&value)) {
  142.     if(ident==POINTER) error("cannot assign to pointer");
  143.     stowlit(value, size);
  144.     *dim = *dim - 1;
  145.     }
  146.   }
  147.  
  148. /*
  149. ** get required array size
  150. */
  151. needsub()  {
  152.   int val;
  153.   if(match("]")) return 0; /* null size */
  154.   if (constexpr(&val)==0) val=1;
  155.   if (val<0) {
  156.     error("negative size illegal");
  157.     val = -val;
  158.     }
  159.   needtoken("]");      /* force single dimension */
  160.   return val;          /* and return size */
  161.   }
  162.  
  163. /*
  164. ** begin a function
  165. **
  166. ** called from "parse" and tries to make a function
  167. ** out of the following text
  168. **
  169. ** Patched per P.L. Woods (DDJ #52)
  170. */
  171. newfunc()  {
  172.   char *ptr;
  173.  
  174. #ifdef STGOTO
  175.  
  176.   nogo  =             /* enable goto statements */
  177.   noloc = 0;          /* enable block-local declarations */
  178.  
  179. #endif /* STGOTO */
  180.  
  181.   lastst=             /* no statement yet */
  182.   litptr=0;           /* clear lit pool */
  183.   litlab=getlabel();  /* label next lit pool */
  184.   locptr=STARTLOC;    /* clear local variables */
  185.   if(monitor) lout(line, stderr);
  186.   if (symname(ssname, YES)==0) {
  187.     error("illegal function or declaration");
  188.     kill(); /* invalidate line */
  189.     return;
  190.     }
  191.   if(func1) {
  192.     postlabel(beglab);
  193.     func1=0;
  194.     }
  195.   if(ptr=findglb(ssname)) {      /* already in symbol table ? */
  196.     if(ptr[IDENT]!=FUNCTION)       multidef(ssname);
  197.     else if(ptr[OFFSET]==FUNCTION) multidef(ssname);
  198.     else {                        /*37*/
  199.       /*  earlier assumed to be a function */
  200.       ptr[OFFSET]=FUNCTION;
  201.       ptr[CLASS]=STATIC;        /*37*/
  202.       }                           /*37*/
  203.     }
  204.   else
  205.     addsym(ssname, FUNCTION, CINT, FUNCTION, &glbptr, STATIC);
  206.   if(match("(")==0) error("no open paren");
  207.   entry();
  208.   locptr=STARTLOC;
  209.   argstk=0;               /* init arg count */
  210.   while(match(")")==0) {  /* then count args */
  211.     /* any legal name bumps arg count */
  212.     if(symname(ssname, YES)) {
  213.       if(findloc(ssname)) multidef(ssname);
  214.       else {
  215.         addsym(ssname, 0, 0, argstk, &locptr, AUTOMATIC);
  216.         argstk=argstk+BPW;
  217.         }
  218.       }
  219.     else {error("illegal argument name");junk();}
  220.     blanks();
  221.     /* if not closing paren, should be comma */
  222.     if(streq(lptr,")")==0) {
  223.       if(match(",")==0) error("no comma");
  224.       }
  225.     if(endst()) break;
  226.     }
  227.   csp=0;        /* preset stack ptr */
  228.   argtop=argstk;
  229.   while(argstk) {
  230.     /* now let user declare what types of things */
  231.     /*      those arguments were */
  232.     if(amatch("char",4))     {doargs(CCHAR);ns();}
  233.     else if(amatch("int",3)) {doargs(CINT);ns();}
  234.     else {error("wrong number of arguments");break;}
  235.     }
  236.   if(statement()!=STRETURN) ffret();
  237.   if(litptr) {
  238.     printlabel(litlab);
  239.     col();
  240.     dumplits(1); /* dump literals */
  241.     }
  242.   }
  243.  
  244. /*
  245. ** declare argument types
  246. **
  247. ** called from "newfunc" this routine adds an entry in the
  248. ** local symbol table for each named argument
  249. **
  250. ** rewritten per P.L. Woods (DDJ #52)
  251. */
  252. doargs(t) int t; {
  253.   int j, legalname;
  254.   char c, *argptr;
  255.   while(1) {
  256.     if(argstk==0) return; /* no arguments */
  257.     if(match("*")|match("(*")) j=POINTER; else j=VARIABLE; /*03*/
  258.     if((legalname=symname(ssname, YES))==0) illname();
  259.     if(match(")") );                                       /*03*/
  260.     if(match("()"));                                       /*03*/
  261.     if(match("[")) {   /* is it a pointer? */
  262.       /* yes, so skip stuff between "[...]" */
  263.       while(inbyte()!=']') if(endst()) break;
  264.       j=POINTER; /* add entry as pointer */
  265.       }
  266.     if(legalname) {
  267.       if(argptr=findloc(ssname)) {
  268.         /* add details of type and address */
  269.         argptr[IDENT]=j;
  270.         argptr[TYPE]=t;
  271.         putint(argtop-getint(argptr+OFFSET, OFFSIZE), argptr+OFFSET, OFFSIZE);
  272.         }
  273.       else error("not an argument");
  274.       }
  275.     argstk=argstk-BPW;        /* cnt down */
  276.     if(endst())return;
  277.     if(match(",")==0) error("no comma");
  278.     }
  279.   }
  280.