Annotation of 42BSD/bin/as/asscan1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     Copyright (c) 1982 Regents of the University of California
                      3:  */
                      4: #ifndef lint
                      5: static char sccsid[] = "@(#)asscan1.c 4.6 7/6/83";
                      6: #endif not lint
                      7: 
                      8: #include "asscanl.h"
                      9: 
                     10: inittokfile()
                     11: {
                     12:        if (passno == 1){
                     13:                if (useVM){
                     14:                        bufstart = &tokbuf[0];
                     15:                        buftail = &tokbuf[1];
                     16:                        bufstart->tok_next = buftail;
                     17:                        buftail->tok_next = 0;
                     18:                }
                     19:                tokbuf[0].tok_count = -1;
                     20:                tokbuf[1].tok_count = -1;
                     21:        }
                     22:        tok_temp = 0;
                     23:        tok_free = 0;
                     24:        bufno = 0;
                     25:        emptybuf = &tokbuf[bufno];
                     26:        tokptr = 0;
                     27:        tokub = 0;
                     28: }
                     29: 
                     30: closetokfile()
                     31: {
                     32:        if (passno == 1){
                     33:                if (useVM){
                     34:                        emptybuf->toks[emptybuf->tok_count++] = PARSEEOF;
                     35:                } else {
                     36:                        /*
                     37:                         *      Clean up the buffers that haven't been
                     38:                         *      written out yet
                     39:                         */
                     40:                        if (tokbuf[bufno ^ 1].tok_count >= 0){
                     41:                                if (writeTEST((char *)&tokbuf[bufno ^ 1], sizeof *emptybuf, 1, tokfile)){
                     42:                                  badwrite:
                     43:                                        yyerror("Unexpected end of file writing the interpass tmp file");
                     44:                                exit(2);
                     45:                                }
                     46:                        }
                     47:                        /*
                     48:                         *      Ensure that we will read an End of file,
                     49:                         *      if there are more than one file names
                     50:                         *      in the argument list
                     51:                         */
                     52:                        tokbuf[bufno].toks[tokbuf[bufno].tok_count++] = PARSEEOF;
                     53:                        if (writeTEST((char *)&tokbuf[bufno], sizeof *emptybuf, 1, tokfile))
                     54:                                goto badwrite;
                     55:                }
                     56:        }       /*end of being pass 1*/
                     57: }
                     58: 
                     59: inttoktype yylex()
                     60: {
                     61:        register        ptrall  bufptr; 
                     62:        register        inttoktype              val;    
                     63:        register        struct  exp     *locxp;
                     64:        /*
                     65:         *      No local variables to be allocated; this saves
                     66:         *      one piddling instruction..
                     67:         */
                     68:        static  int     Lastjxxx;
                     69: 
                     70:        bufptr = tokptr;                /*copy in the global value*/
                     71:    top:
                     72:        if (bufptr < tokub){
                     73:                gtoken(val, bufptr);
                     74:                switch(yylval = val){
                     75:                case    PARSEEOF:
                     76:                                yylval = val = PARSEEOF;
                     77:                                break;
                     78:                case    BFINT:
                     79:                case    INT:
                     80:                                if (xp >= &explist[NEXP])
                     81:                                     yyerror("Too many expressions; try simplyfing");
                     82:                                else
                     83:                                    locxp = xp++;
                     84:                                locxp->e_number = Znumber;
                     85:                                locxp->e_number.num_tag = TYPL;
                     86:                                glong(locxp->e_xvalue, bufptr);
                     87:                          makevalue:
                     88:                                locxp->e_xtype = XABS;
                     89:                                locxp->e_xloc = 0;
                     90:                                locxp->e_xname = NULL;
                     91:                                yylval = (int)locxp;
                     92:                                break;
                     93:                case    BIGNUM: 
                     94:                                if (xp >= &explist[NEXP])
                     95:                                     yyerror("Too many expressions; try simplyfing");
                     96:                                else
                     97:                                    locxp = xp++;
                     98:                                gnumber(locxp->e_number, bufptr);
                     99:                                goto makevalue;
                    100:                case    NAME:
                    101:                                gptr(yylval, bufptr);
                    102:                                lastnam = (struct symtab *)yylval;
                    103:                                break;
                    104:                case    SIZESPEC:
                    105:                case    REG:
                    106:                                gchar(yylval, bufptr);
                    107:                                break;
                    108:                case    INSTn:
                    109:                case    INST0:
                    110:                                gopcode(yyopcode, bufptr);
                    111:                                break;
                    112:                case    IJXXX:
                    113:                                gopcode(yyopcode, bufptr);
                    114:                                /* We can't cast Lastjxxx into (int *) here.. */
                    115:                                gptr(Lastjxxx, bufptr);
                    116:                                lastjxxx = (struct symtab *)Lastjxxx;
                    117:                                break;
                    118:                case    ILINESKIP:
                    119:                                gint(yylval, bufptr);
                    120:                                lineno += yylval;
                    121:                                goto top;
                    122:                case    SKIP:   
                    123:                                eatskiplg(bufptr);
                    124:                                goto top;
                    125:                case    VOID:   
                    126:                                goto top;
                    127:                case    STRING:
                    128:                case    ISTAB:
                    129:                case    ISTABSTR:
                    130:                case    ISTABNONE:
                    131:                case    ISTABDOT:
                    132:                case    IALIGN:
                    133:                                gptr(yylval, bufptr);
                    134:                                break;
                    135:                } 
                    136: #ifdef DEBUG
                    137:                if (toktrace){
                    138:                char    *tok_to_name();
                    139:                printf("P: %d T#: %4d, %s ",
                    140:                        passno, bufptr -  firsttoken, tok_to_name(val));
                    141:                switch(val){
                    142:                case    INT:    printf("val %d",
                    143:                                        ((struct exp *)yylval)->e_xvalue);
                    144:                                break;
                    145:                case    BFINT:  printf("val %d",
                    146:                                        ((struct exp *)yylval)->e_xvalue);
                    147:                                break;
                    148:                case    BIGNUM: bignumprint(((struct exp*)yylval)->e_number);
                    149:                                break;
                    150:                case    NAME:   printf("\"%.8s\"",
                    151:                                        FETCHNAME((struct symtab *)yylval));
                    152:                                break;
                    153:                case    REG:    printf(" r%d",
                    154:                                        yylval);
                    155:                                break;
                    156:                case    IJXXX:
                    157:                case    INST0:  
                    158:                case    INSTn:  if (ITABCHECK(yyopcode))
                    159:                                        printf("%.8s",
                    160:                                                FETCHNAME(ITABFETCH(yyopcode)));
                    161:                                else
                    162:                                        printf("IJXXX or INST0 or INSTn can't get into the itab\n");
                    163:                                break;
                    164:                case    STRING:
                    165:                        printf("length %d, seekoffset %d, place 0%o ",
                    166:                                ((struct strdesc *)yylval)->sd_strlen,
                    167:                                ((struct strdesc *)yylval)->sd_stroff,
                    168:                                ((struct strdesc *)yylval)->sd_place
                    169:                                );
                    170:                        if (((struct strdesc *)yylval)->sd_place & STR_CORE)
                    171:                                printf("value\"%*s\"",
                    172:                                        ((struct strdesc *)yylval)->sd_strlen,
                    173:                                        ((struct strdesc *)yylval)->sd_string);
                    174:                        break;
                    175:                }               /*end of the debug switch*/
                    176:                printf("\n");
                    177:                }
                    178: #endif DEBUG
                    179: 
                    180:        } else {        /* start a new buffer */
                    181:            if (useVM){
                    182:                if (passno == 2){
                    183:                        tok_temp = emptybuf->tok_next;
                    184:                        emptybuf->tok_next = tok_free;
                    185:                        tok_free = emptybuf;
                    186:                        emptybuf = tok_temp;
                    187:                } else {
                    188:                        emptybuf = emptybuf->tok_next;
                    189:                }
                    190:                bufno += 1;
                    191:                if (emptybuf == 0){
                    192:                        struct  tokbufdesc *newdallop;
                    193:                        int     i;
                    194:                        if (passno == 2)
                    195:                                goto badread;
                    196:                        emptybuf = newdallop = (struct tokbufdesc *)
                    197:                          Calloc(TOKDALLOP, sizeof (struct tokbufdesc));
                    198:                        for (i=0; i < TOKDALLOP; i++){
                    199:                                buftail->tok_next = newdallop;
                    200:                                buftail = newdallop;
                    201:                                newdallop += 1;
                    202:                        }
                    203:                        buftail->tok_next = 0;
                    204:                }       /*end of need to get more buffers*/
                    205:                (bytetoktype *)bufptr = &(emptybuf->toks[0]);
                    206:                if (passno == 1)
                    207:                        scan_dot_s(emptybuf);
                    208:            } else {    /*don't use VM*/
                    209:                bufno ^= 1;
                    210:                emptybuf = &tokbuf[bufno];
                    211:                ((bytetoktype *)bufptr) = &(emptybuf->toks[0]);
                    212:                if (passno == 1){
                    213:                        /*
                    214:                         *      First check if there are things to write
                    215:                         *      out at all
                    216:                         */
                    217:                        if (emptybuf->tok_count >= 0){
                    218:                            if (writeTEST((char *)emptybuf, sizeof *emptybuf, 1, tokfile)){
                    219:                                yyerror("Unexpected end of file writing the interpass tmp file");
                    220:                                exit(2);
                    221:                            }
                    222:                        }
                    223:                        scan_dot_s(emptybuf);
                    224:                } else {        /*pass 2*/
                    225:                    if (readTEST((char *)emptybuf, sizeof *emptybuf, 1, tokfile)){
                    226:                         badread:
                    227:                             yyerror("Unexpected end of file while reading the interpass tmp file");
                    228:                             exit(1);
                    229:                    }
                    230:                }
                    231:            }   /*end of using a real live file*/
                    232:            (char *)tokub = (char *)bufptr + emptybuf->tok_count;
                    233: #ifdef DEBUG
                    234:            firsttoken = bufptr;
                    235:            if (debug)
                    236:                printf("created buffernumber %d with %d tokens\n",
                    237:                        bufno, emptybuf->tok_count);
                    238: #endif DEBUG
                    239:            goto top;
                    240:        }       /*end of reading/creating a new buffer*/
                    241:        tokptr = bufptr;                /*copy back the global value*/
                    242:        return(val);
                    243: }      /*end of yylex*/
                    244: 
                    245: 
                    246: buildskip(from, to)
                    247:        register        ptrall  from, to;
                    248: {
                    249:        int     diff;
                    250:        register        struct  tokbufdesc *middlebuf;
                    251:        /*
                    252:         *      check if from and to are in the same buffer
                    253:         *      from and to DIFFER BY AT MOST 1 buffer and to is
                    254:         *      always ahead of from, with to being in the buffer emptybuf
                    255:         *      points to.
                    256:         *      The hard part here is accounting for the case where the
                    257:         *      skip is to cross a buffer boundary; we must construct
                    258:         *      two skips.
                    259:         *
                    260:         *      Figure out where the buffer boundary between from and to is
                    261:         *      It's easy in VM, as buffers increase to high memory, but
                    262:         *      w/o VM, we alternate between two buffers, and want
                    263:         *      to look at the exact middle of the contiguous buffer region.
                    264:         */
                    265:        middlebuf = useVM ? emptybuf : &tokbuf[1];
                    266:        if (  ( (bytetoktype *)from > (bytetoktype *)middlebuf)
                    267:            ^ ( (bytetoktype *)to > (bytetoktype *)middlebuf)
                    268:           ){   /*split across a buffer boundary*/
                    269:                ptoken(from, SKIP);
                    270:                /*
                    271:                 *      Set the skip so it lands someplace beyond
                    272:                 *      the end of this buffer.
                    273:                 *      When we pull this skip out in the second pass,
                    274:                 *      we will temporarily move the current pointer
                    275:                 *      out beyond the end of the buffer, but immediately
                    276:                 *      do a compare and fail the compare, and then reset
                    277:                 *      all the pointers correctly to point into the next buffer.
                    278:                 */
                    279:                bskiplg(from,  TOKBUFLG + 1);
                    280:                /*
                    281:                 *      Now, force from to be in the same buffer as to
                    282:                 */
                    283:                (bytetoktype *)from = (bytetoktype *)&(emptybuf->toks[0]);
                    284:        }
                    285:        /*
                    286:         *      Now, to and from are in the same buffer
                    287:         */
                    288:        if (from > to)
                    289:                yyerror("Internal error: bad skip construction");
                    290:        else {
                    291:                if ( (diff = (bytetoktype *)to - (bytetoktype *)from) >= 
                    292:                        (sizeof(bytetoktype) + sizeof(lgtype) + 1)) {
                    293:                                ptoken(from, SKIP);
                    294:                                bskipfromto(from, to);
                    295:                } else {
                    296:                        for ( ; diff > 0; --diff)
                    297:                                ptoken(from, VOID);
                    298:                }
                    299:        }
                    300: }
                    301: 
                    302: movestr(to, from, lg)
                    303:        char    *to;    /* 4(ap) */ 
                    304:        char    *from;  /* 8(ap) */
                    305:        int     lg;     /* 12(ap) */
                    306: {
                    307:        if (lg <= 0)
                    308:                return;
                    309:        ;
                    310:        asm("movc3      12(ap),*8(ap),*4(ap)");
                    311:        ;
                    312: }
                    313: 
                    314: new_dot_s(namep)
                    315:        char    *namep;
                    316: {
                    317:        newfflag = 1;
                    318:        newfname = namep;
                    319:        dotsname = namep;
                    320:        lineno = 1;
                    321:        scanlineno = 1;
                    322: }
                    323: 
                    324: min(a, b)
                    325: {
                    326:        return(a < b ? a : b);
                    327: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.