home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 223_01 / cc11.c < prev    next >
Text File  |  1979-12-31  |  7KB  |  279 lines

  1. /*
  2. ** execution begins here
  3. */
  4.  
  5. main(argc, argv) int argc; char *argv[]; {
  6.  
  7.   if (argc > MAXARGS) {
  8.     lout("max command args exceeded", stderr);
  9.     abort(ERRCODE);
  10.     }
  11.   argcs = argc;
  12.   argvs = argv;
  13.  
  14.   sout("Small-C Version 2.7   3/26/86   (fas)", stderr);
  15.   lout(" ", stderr);
  16.  
  17. #ifdef DYNAMIC
  18.   swnext=calloc(SWTABSZ, 1);
  19.   swend=swnext+((SWTABSZ-SWSIZ)>>1);
  20.   stage=calloc(STAGESIZE, 1);
  21.   stagelast=stage+STAGELIMIT;
  22.   wq=calloc(WQTABSZ, BPW);
  23.   litq=calloc(LITABSZ, 1);
  24.   macn=calloc(MACNSIZE, 1);
  25.                            /*10*/
  26.   macq=calloc(MACQSIZE, 1);
  27.   pline=calloc(LINESIZE, 1);
  28.   mline=calloc(LINESIZE, 1);
  29.   arrptr=calloc(MDASIZE, 2);                /* fas 2.6 */
  30.   sarrptr=arrptr;                    /* fas 2.6 */
  31.   arrcount = 1;                        /* fas 2.6 */
  32. #else
  33.   swend=(swnext=swq)+SWTABSZ-SWSIZ;
  34.   stagelast=stage+STAGELIMIT;
  35. #endif
  36.   swactive=       /* not in switch */
  37.   stagenext=      /* direct output mode */
  38.   iflevel=        /* #if... nesting level = 0 */
  39.   skiplevel=      /* #if... not encountered */
  40.   macptr=         /* clear the macro pool */
  41.   csp =           /* stack ptr (relative) */
  42.   errflag=        /* not skipping errors till ";" */
  43.   eof=            /* not eof yet */
  44.   ncmp=           /* not in compound statement */
  45.   files=
  46.   filearg=
  47.   inclevel=      /* include nesting level       fas 2.7 */
  48.   quote[1]=0;
  49.   func1=          /* first function */
  50.   ccode=1;        /* enable preprocessing */
  51.   wqptr=wq;       /* clear while queue */
  52.   quote[0]='"';   /* fake a quote literal */
  53.   input=input2[0]=input2[1]=input2[2]=input2[3]=
  54.   input2[4]=input2[5]=EOF;            /* fas 2.7 */
  55.  
  56. /*
  57. ** this is the real start
  58. */
  59.  
  60.   ask();         /* get user options */
  61.   openin();      /* and initial input file */
  62.   preprocess();  /* fetch first line */
  63.  
  64. #ifdef DYNAMIC
  65.   symtab=calloc((NUMLOCS*SYMAVG + NUMGLBS*SYMMAX), 1);
  66. #endif
  67.                          /*10*/
  68.   locptr=STARTLOC;       /*52*/
  69.   glbptr=STARTGLB;
  70.   glbflag=1;
  71.   ctext=0;
  72.   header();          /* intro code */
  73.   setops();          /* set values in op arrays */
  74.   parse();           /* process ALL input */
  75.   outside();         /* verify outside any function */
  76.   trailer();         /* follow-up code */
  77.   fclose(output);
  78.   }
  79.  
  80. /*
  81. ** process all input text
  82. **
  83. ** At this level, only static declarations,
  84. **      defines, includes and function
  85. **      definitions are legal...
  86. */
  87. parse() {
  88.   while (eof==0) {
  89.     if(amatch("extern", 6))   dodeclare(EXTERNAL);
  90.     else if(match("static")) {            /* fas 2.2 */
  91.       m80flg = NO;
  92.       dodeclare(STATIC);
  93.       m80flg = YES;
  94.     }
  95.     else if(dodeclare(STATIC));
  96.     else if(match("#asm"))    doasm();
  97.     else if(match("#include"))doinclude();
  98.     else if(match("#define")) addmac();
  99.     else                      newfunc();
  100.     blanks();       /* force eof if pending */
  101.     }
  102.   }
  103.  
  104. /*
  105. ** dump the literal pool
  106. */
  107. dumplits(size) int size; {
  108.   int j, k;
  109.   k=0;
  110.   while (k<litptr) {
  111.     poll(1); /* allow program interruption */
  112.     defstorage(size);
  113.     j=10;
  114.     while(j--) {
  115.       outdec(getint(litq+k, size));
  116.       k=k+size;
  117.       if ((j==0)|(k>=litptr)) {
  118.         nl();
  119.         break;
  120.         }
  121.       outbyte(',');
  122.       }
  123.     }
  124.   }
  125.  
  126. /*
  127. ** dump zeroes for default initial values
  128. */
  129. dumpzero(size, count) int size, count; {
  130.   int j;
  131.  
  132.   if(!iflag){                    /* fas 2.2 */
  133.     if(count > 0){
  134.     ot("DS ");
  135.     outdec(size * count);
  136.     nl();
  137.     }
  138.   }else{
  139.     while (count > 0) {
  140.       poll(1); /* allow program interruption */
  141.       defstorage(size);
  142.       j=30;
  143.       while(j--) {
  144.         outdec(0);
  145.         if ((--count <= 0)|(j==0)) {
  146.           nl();
  147.           break;
  148.           }
  149.         outbyte(',');
  150.         }
  151.       }
  152.     }
  153.   }
  154.  
  155. /*
  156. ** verify compile ends outside any function
  157. */
  158. outside()  {
  159.   if (ncmp) error("no closing bracket");
  160.   }
  161.  
  162. /*
  163. ** get run options
  164. */
  165.  
  166.  
  167. ask()  {
  168.   int i;
  169.   i=listfp=nxtlab=0;
  170.   output=stdout;
  171.  
  172. #ifdef OPTIMIZE
  173.   optimize=
  174. #endif /* OPTIMIZE */
  175.  
  176.   nbflg=iflag=alarm=monitor=pause=NO;
  177.   m80flg=YES;
  178.   line=mline;
  179.  
  180.   while(++i < argcs) {
  181.     line = argvs[i];
  182.     if (line[0] == '-') {
  183.       switch (toupper(line[1])) {
  184.         case 'L':  if (isdigit(line[2]) & (line[3] <= ' ')) {
  185.                      listfp = line[2] - '0';
  186.                      break;
  187.                      }
  188.                    else
  189.                      goto errcase;
  190.         case 'A':  alarm = YES;
  191.                    break;
  192.         case 'M':  monitor = YES;
  193.                    break;
  194.         case 'P':  pause = YES;
  195.                    break;
  196.     case 'I':  iflag = YES;
  197.            break;
  198.     case 'N':  nbflg = YES;
  199.            break;
  200. #ifdef OPTIMIZE
  201.         case 'O':  optimize = YES;
  202.                    break;
  203. #endif /* OPTIMIZE */
  204.  
  205. #ifndef LINK
  206.         case 'B': if (numeric(line[2]) & (line[3] <= ' ')) {
  207.                     bump(0); bump(2);
  208.                     if(number(&nxtlab)) break;
  209.                     }
  210.                     /* fall through to error case */
  211. #endif /* LINK */
  212.  
  213.         errcase:
  214.    default:  sout("usage: cc [file]...[-a] [-i] [-l#] [-m] [-n] [-p]", stderr);
  215.  
  216. #ifdef OPTIMIZE
  217.                   sout(" [-o]", stderr);
  218. #endif /* OPTIMIZE */
  219.  
  220. #ifndef LINK
  221.                   sout(" [-b#]", stderr);
  222. #endif /* LINK */
  223.  
  224.                   sout("\n", stderr);
  225.                   abort(ERRCODE);
  226.         }
  227.       }
  228.     }
  229.   }
  230.  
  231.  
  232. /*
  233. ** get next input file
  234. */
  235.  
  236. openin() {
  237.   input = EOF;
  238.   line = pline;
  239.  
  240.   while(++filearg < argcs) {
  241.     line = argvs[filearg];
  242.     if(line[0]=='-') continue;
  243.  
  244.     if((input=fopen(line,"r"))==NULL) {
  245.       sout("open error: ", stderr);
  246.       lout(line, stderr);
  247.       abort(ERRCODE);
  248.       }
  249.     files=YES;
  250.     kill();
  251.     return;
  252.     }
  253.   if(files++) eof=YES;
  254.  
  255.   else input=stdin;  /* V7 convention */
  256.  
  257.   kill();
  258.   }
  259.  
  260. setops() {
  261.   op2[00]=     op[00]=  ffor;  /* heir5 */
  262.   op2[01]=     op[01]= ffxor;  /* heir6 */
  263.   op2[02]=     op[02]= ffand;  /* heir7 */
  264.   op2[03]=     op[03]=  ffeq;  /* heir8 */
  265.   op2[04]=     op[04]=  ffne;
  266.   op2[05]=ule; op[05]=  ffle;  /* heir9 */
  267.   op2[06]=uge; op[06]=  ffge;
  268.   op2[07]=ult; op[07]=  fflt;
  269.   op2[08]=ugt; op[08]=  ffgt;
  270.   op2[09]=     op[09]= ffasr;  /* heir10 */
  271.   op2[10]=     op[10]= ffasl;
  272.   op2[11]=     op[11]= ffadd;  /* heir11 */
  273.   op2[12]=     op[12]= ffsub;
  274.   op2[13]=     op[13]=ffmult;  /* heir12 */
  275.   op2[14]=     op[14]= ffdiv;
  276.   op2[15]=     op[15]= ffmod;
  277.   }
  278.  
  279.