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

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

unix.superglobalmegacorp.com

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