Annotation of 43BSD/bin/as/asscan1.c, revision 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.