home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_09_07 / 9n07070a < prev    next >
Text File  |  1991-05-07  |  5KB  |  177 lines

  1.  
  2. heir14(lval)  int *lval; {
  3.   int k, const, val, lval2[8];
  4.   char *ptr, *before, *start;
  5.   k=primary(lval);
  6.   ptr=lval[0];
  7.   blanks();
  8.   if((ch=='[')|(ch=='(')) {
  9.     lval[5]=1;   /* secondary register will be used */
  10.     while(1) {
  11.       if(match("[")) {               /* [subscript] */
  12.         if(ptr==0) {
  13.           error("can't subscript");
  14.           junk();
  15.           needtoken("]");
  16.           return 0;
  17.           }
  18.         else if(ptr[IDENT]==POINTER) rvalue(lval);
  19.         else if(ptr[IDENT]!=ARRAY) {
  20.           error("can't subscript");
  21.           k=0;
  22.           }
  23.         setstage(&before, &start);
  24.         lval2[3]=0;
  25.     plunge2(0, 0, heir1, lval2, lval2);
  26.                      /* lval2 deadend */
  27.     needtoken("]");
  28.     /* -- beginning of added code -- */
  29.     if(match("[")) { /* we have more dimensions */
  30.            if(ptr[NDIM] < 2 ) {
  31.              error("too many dimensions");
  32.                 /* variable declared with */
  33.              junk();  /* less dimensions */
  34.              needtoken("]");
  35.              return 0;
  36.            }
  37.            if(lval2[3]) { /*Test for index being const*/
  38.             clearstage(before, 0);
  39.               /* ignore code generated by plunge2 */
  40.             ol("XCHG AX,BX");
  41.             ot("MOV AX,");
  42.             outdec(lval2[4]);
  43.             nl();
  44.            }
  45.            ol("PUSH BX");
  46.            if((lval2[3] == 0) | lval2[4]) {
  47.                if(ptr[TYPE] == CINT)
  48.                 /* Get 2nd dimension size */
  49.                const2(ptr[CDIM] << LBPW);
  50.                   /* and adjust for type size */
  51.                else
  52.                const2(ptr[CDIM]);
  53.                mult(); /* AX gets CDIM * i1 */
  54.            }
  55.            setstage(&before, &start);
  56.            lval2[3] = 0;    /* parse sub 2 expression */
  57.            plunge2(0, 0, heir1, lval2, lval2);
  58.            needtoken("]");
  59.            if(lval2[3]) { /* if index is a constant */
  60.                clearstage(before, 0);
  61.              /* dump plunge2 generated code */
  62.                if(lval2[4]) /*if index is non-zero*/
  63.                    if(ptr[TYPE] == CINT) {
  64.                        ot("ADD AX,");
  65.                        outdec(lval2[4]
  66.                            << LBPW);
  67.                        nl();
  68.                   }
  69.                    else {
  70.                        ot("ADD AX,");
  71.                        outdec(lval2[4]);
  72.                    }
  73.            }
  74.            else {
  75.                if(ptr[TYPE] == CINT)
  76.                    doublereg();
  77.                add(); /* AX gets CDIM*i1 + i2 */
  78.            }
  79.            ol("POP BX");
  80.            /* retrieve array base from stack */
  81.            add(); /* calculate segment addr of target */
  82.     }
  83.     else { /*  only one dimension  */
  84.     /* -- end of new code -- */
  85.     if(lval2[3]) {
  86.           clearstage(before,0);
  87.           if(lval2[4]) {
  88.             if(ptr[TYPE]==CINT) const2(lval2[4]<<LBPW);
  89.             else                const2(lval2[4]);
  90.             add();
  91.             }
  92.           }
  93.         else {
  94.           if(ptr[TYPE]==CINT) doublereg();
  95.           add();
  96.       }
  97.     }
  98.         lval[0]=lval[2]=0;
  99.         lval[1]=ptr[TYPE];
  100.         k=1;
  101.         }
  102.       else if(match("(")) {          /* function(...) */
  103.     if(ptr==0) callfunction(0);
  104.                /* call to an absolute address */
  105.         else if(ptr[IDENT]!=FUNCTION) {
  106.           rvalue(lval);
  107.           callfunction(0);
  108.           }
  109.         else callfunction(ptr);
  110.         k=lval[0]=lval[3]=0;
  111.         }
  112.       else return k;
  113.       }
  114.     }
  115.   if(ptr==0) return k; /* if constant, return */
  116.   if(ptr[IDENT]==FUNCTION) {
  117.         /* if function name without "()", gen address */
  118.     address(ptr);
  119.     return 0;
  120.     }
  121.   return k;
  122.   }
  123.  
  124. addsym(sname, id, typ, value, lgptrptr, class, cdim, ndim)
  125.   char *sname, id, typ; int value, *lgptrptr, class, cdim,
  126.                              ndim; {
  127.   if(lgptrptr == &glbptr) {
  128.     if(cptr2=findglb(sname)) return cptr2;
  129. #ifdef HASH
  130.     if(cptr==0) {
  131.       error("global symbol table overflow");
  132.       return 0;
  133.       }
  134. #else
  135. #ifndef DYNAMIC
  136.     if(glbptr >= ENDGLB) {
  137.       error("global symbol table overflow");
  138.       return 0;
  139.       }
  140. #endif
  141.     cptr=*lgptrptr;
  142. #endif
  143.     }
  144.   else {
  145.     if(locptr > (ENDLOC-SYMMAX)) {
  146.       error("local symbol table overflow");
  147.       exit(EUSER);
  148.       }
  149.     cptr=*lgptrptr;
  150.     }
  151.   cptr[IDENT]=id;
  152.   cptr[TYPE] =typ;
  153.   cptr[CLASS]=class;
  154.   cptr[STATUS]=0;
  155.   putint(value, cptr+OFFSET, OFFSIZE);
  156.   cptr[NDIM] = ndim;
  157.   putint(cdim, cptr + CDIM, 2);
  158.   cptr3 = cptr2 = cptr + NAME;
  159.   while(an(*sname)) *cptr2++ = *sname++;
  160. #ifdef HASH
  161.   if(lgptrptr == &locptr) {
  162.     *cptr2 = cptr2 - cptr3; /* set length */
  163.     *lgptrptr = ++cptr2;
  164.     }
  165. #else
  166.   *cptr2 = cptr2 - cptr3;   /* set length */
  167.   *lgptrptr = ++cptr2;
  168. #ifdef DYNAMIC
  169.   if(lgptrptr == &glbptr) malloc(cptr2 - cptr);
  170.   /* gets allocation error if no more memory */
  171. #endif
  172. #endif
  173.   return cptr;
  174.   }
  175.  
  176.  
  177.