Annotation of 3BSD/cmd/lint/lint.c, revision 1.1

1.1     ! root        1: # include "mfile1"
        !             2: 
        !             3: # include "lmanifest"
        !             4: 
        !             5: # include <ctype.h>
        !             6: 
        !             7: # define VAL 0
        !             8: # define EFF 1
        !             9: 
        !            10: /* these are appropriate for the -p flag */
        !            11: int  SZCHAR = 8;
        !            12: int  SZINT = 16;
        !            13: int  SZFLOAT = 32;
        !            14: int  SZDOUBLE = 64;
        !            15: int  SZLONG = 32;
        !            16: int  SZSHORT = 16;
        !            17: int SZPOINT = 16;
        !            18: int ALCHAR = 8;
        !            19: int ALINT = 16;
        !            20: int ALFLOAT = 32;
        !            21: int ALDOUBLE = 64;
        !            22: int ALLONG = 32;
        !            23: int ALSHORT = 16;
        !            24: int ALPOINT = 16;
        !            25: int ALSTRUCT = 16;
        !            26: 
        !            27: int vflag = 1;  /* tell about unused argments */
        !            28: int xflag = 0;  /* tell about unused externals */
        !            29: int argflag = 0;  /* used to turn off complaints about arguments */
        !            30: int libflag = 0;  /* used to generate library descriptions */
        !            31: int vaflag = -1;  /* used to signal functions with a variable number of args */
        !            32: int aflag = 0;  /* used th check precision of assignments */
        !            33: 
        !            34: char *flabel = "xxx";
        !            35: 
        !            36: # define LNAMES 100
        !            37: 
        !            38: struct lnm {
        !            39:        short lid, flgs;
        !            40:        }  lnames[LNAMES], *lnp;
        !            41: 
        !            42: contx( p, down, pl, pr ) register NODE *p; register *pl, *pr; {
        !            43: 
        !            44:        *pl = *pr = VAL;
        !            45:        switch( p->op ){
        !            46: 
        !            47:        case ANDAND:
        !            48:        case OROR:
        !            49:        case QUEST:
        !            50:                *pr = down;
        !            51:                break;
        !            52: 
        !            53:        case SCONV:
        !            54:        case PCONV:
        !            55:        case COLON:
        !            56:                *pr = *pl = down;
        !            57:                break;
        !            58: 
        !            59:        case COMOP:
        !            60:                *pl = EFF;
        !            61:                *pr = down;
        !            62: 
        !            63:        case FORCE:
        !            64:        case INIT:
        !            65:        case UNARY CALL:
        !            66:        case STCALL:
        !            67:        case UNARY STCALL:
        !            68:        case CALL:
        !            69:        case UNARY FORTCALL:
        !            70:        case FORTCALL:
        !            71:        case CBRANCH:
        !            72:                break;
        !            73: 
        !            74:        default:
        !            75:                if( asgop(p->op) ) break;
        !            76:                if( p->op == UNARY MUL && ( p->type == STRTY || p->type == UNIONTY) ) {
        !            77:                        break;  /* the compiler does this... */
        !            78:                        }
        !            79:                if( down == EFF && hflag ) werror( "null effect" );
        !            80: 
        !            81:                }
        !            82:        }
        !            83: 
        !            84: ecode( p ) NODE *p; {
        !            85:        /* compile code for p */
        !            86: 
        !            87:        fwalk( p, contx, EFF );
        !            88:        lnp = lnames;
        !            89:        lprt( p, EFF, 0 );
        !            90:        }
        !            91: 
        !            92: ejobcode( flag ){
        !            93:        /* called after processing each job */
        !            94:        /* flag is nonzero if errors were detected */
        !            95:        register k;
        !            96:        register struct symtab *p;
        !            97: 
        !            98:        for( p=stab; p< &stab[SYMTSZ]; ++p ){
        !            99: 
        !           100:                if( p->stype != TNULL ) {
        !           101: 
        !           102:                        if( p->stype == STRTY || p->stype == UNIONTY ){
        !           103:                                if( dimtab[p->sizoff+1] < 0 ){ /* never defined */
        !           104:                                        if( hflag ) werror( "struct/union %.7s never defined", p->sname );
        !           105:                                        }
        !           106:                                }
        !           107: 
        !           108:                        switch( p->sclass ){
        !           109:                        
        !           110:                        case STATIC:
        !           111:                                if( p->suse > 0 ){
        !           112:                                        k = lineno;
        !           113:                                        lineno = p->suse;
        !           114:                                        uerror( "static variable %s unused",
        !           115:                                                p->sname );
        !           116:                                        lineno = k;
        !           117:                                        break;
        !           118:                                        }
        !           119: 
        !           120:                        case EXTERN:
        !           121:                        case USTATIC:
        !           122:                                /* with the xflag, worry about externs not used */
        !           123:                                /* the filename may be wrong here... */
        !           124:                                if( xflag && p->suse >= 0 && !libflag ){
        !           125:                                        printf( "%.7s\t%03d\t%o\t%d\t", p->sname, LDX, p->stype, 0 );
        !           126:                                        /* we don't really know the file number; we know only the line 
        !           127:                                                number, so we put only that out */
        !           128:                                        printf( "\"???\"\t%d\t%s\n", p->suse, flabel );
        !           129:                                        }
        !           130:                        
        !           131:                        case EXTDEF:
        !           132:                                if( p->suse < 0 ){  /* used */
        !           133:                                        printf( "%.7s\t%03d\t%o\t%d\t", exname(p->sname), LUM, p->stype, 0 );
        !           134:                                        fident( -p->suse );
        !           135:                                        }
        !           136:                                break;
        !           137:                                }
        !           138:                        
        !           139:                        }
        !           140: 
        !           141:                }
        !           142:        exit( 0 );
        !           143:        }
        !           144: 
        !           145: fident( line ){ /* like ident, but lineno = line */
        !           146:        register temp;
        !           147:        temp = lineno;
        !           148:        lineno = line;
        !           149:        ident();
        !           150:        lineno = temp;
        !           151:        }
        !           152: 
        !           153: ident(){ /* write out file and line identification  */
        !           154:        printf( "%s\t%d\t%s\n", ftitle, lineno, flabel );
        !           155:        }
        !           156: 
        !           157: bfcode( a, n ) int a[]; {
        !           158:        /* code for the beginning of a function; a is an array of
        !           159:                indices in stab for the arguments; n is the number */
        !           160:        /* this must also set retlab */
        !           161:        register i;
        !           162:        register struct symtab *cfp;
        !           163:        register unsigned t;
        !           164: 
        !           165:        retlab = 1;
        !           166:        cfp = &stab[curftn];
        !           167: 
        !           168:        /* if variable number of arguments, only print the ones which will be checked */
        !           169:        if( vaflag > 0 ){
        !           170:                if( n < vaflag ) werror( "declare the VARARGS arguments you want checked!" );
        !           171:                else n = vaflag;
        !           172:                }
        !           173:        printf( "%.7s\t%03d\t%o\t%d\t", exname(cfp->sname), libflag?LIB:LDI,
        !           174:                cfp->stype, vaflag>=0?-n:n );
        !           175:        vaflag = -1;
        !           176: 
        !           177:        for( i=0; i<n; ++i ) {
        !           178:                switch( t = stab[a[i]].stype ){
        !           179: 
        !           180:                case ULONG:
        !           181:                        break;
        !           182: 
        !           183:                case CHAR:
        !           184:                case SHORT:
        !           185:                        t = INT;
        !           186:                        break;
        !           187: 
        !           188:                case UCHAR:
        !           189:                case USHORT:
        !           190:                case UNSIGNED:
        !           191:                        t = UNSIGNED;
        !           192:                        break;
        !           193: 
        !           194:                        }
        !           195: 
        !           196:                printf( "%o\t", t );
        !           197:                }
        !           198:        ident();
        !           199:        }
        !           200: 
        !           201: ctargs( p ) NODE *p; {
        !           202:        /* count arguments; p points to at least one */
        !           203:        /* the arguemnts are a tower of commasto the left */
        !           204:        register c;
        !           205:        c = 1; /* count the rhs */
        !           206:        while( p->op == CM ){
        !           207:                ++c;
        !           208:                p = p->left;
        !           209:                }
        !           210:        return( c );
        !           211:        }
        !           212: 
        !           213: lpta( p ) NODE *p; {
        !           214:        TWORD t;
        !           215: 
        !           216:        if( p->op == CM ){
        !           217:                lpta( p->left );
        !           218:                p = p->right;
        !           219:                }
        !           220:        switch( t = p->type ){
        !           221: 
        !           222:                case CHAR:
        !           223:                case SHORT:
        !           224:                        t = INT;
        !           225:                case LONG:
        !           226:                case ULONG:
        !           227:                case INT:
        !           228:                case UNSIGNED:
        !           229:                        break;
        !           230: 
        !           231:                case UCHAR:
        !           232:                case USHORT:
        !           233:                        t = UNSIGNED;
        !           234:                        break;
        !           235: 
        !           236:                case FLOAT:
        !           237:                        printf( "%o\t", DOUBLE );
        !           238:                        return;
        !           239: 
        !           240:                default:
        !           241:                        printf( "%o\t", p->type );
        !           242:                        return;
        !           243:                }
        !           244: 
        !           245:        if( p->op == ICON ) printf( "%o<1\t", t );
        !           246:        else printf( "%o\t", t );
        !           247:        }
        !           248: 
        !           249: # define VALSET 1
        !           250: # define VALUSED 2
        !           251: # define VALASGOP 4
        !           252: # define VALADDR 8
        !           253: 
        !           254: lprt( p, down, uses ) register NODE *p; {
        !           255:        register struct symtab *q;
        !           256:        register id;
        !           257:        register acount;
        !           258:        register down1, down2;
        !           259:        register use1, use2;
        !           260:        register struct lnm *np1, *np2;
        !           261: 
        !           262:        /* first, set variables which are set... */
        !           263: 
        !           264:        use1 = use2 = VALUSED;
        !           265:        if( p->op == ASSIGN ) use1 = VALSET;
        !           266:        else if( p->op == UNARY AND ) use1 = VALADDR;
        !           267:        else if( asgop( p->op ) ){ /* =ops */
        !           268:                use1 = VALUSED|VALSET;
        !           269:                if( down == EFF ) use1 |= VALASGOP;
        !           270:                }
        !           271: 
        !           272: 
        !           273:        /* print the lines for lint */
        !           274: 
        !           275:        down2 = down1 = VAL;
        !           276:        acount = 0;
        !           277: 
        !           278:        switch( p->op ){
        !           279: 
        !           280:        case EQ:
        !           281:        case NE:
        !           282:        case GT:
        !           283:        case GE:
        !           284:        case LT:
        !           285:        case LE:
        !           286:                if( p->left->type == CHAR && p->right->op==ICON && p->right->lval < 0 ){
        !           287:                        werror( "nonportable character comparison" );
        !           288:                        }
        !           289:                if( (p->op==EQ || p->op==NE ) && ISUNSIGNED(p->left->type) && p->right->op == ICON ){
        !           290:                        if( p->right->lval < 0 && p->right->rval == NONAME && !ISUNSIGNED(p->right->type) ){
        !           291:                                werror( "comparison of unsigned with negative constant" );
        !           292:                                }
        !           293:                        }
        !           294:                break;
        !           295: 
        !           296:        case UGE:
        !           297:        case ULT:
        !           298:                if( p->right->op == ICON && p->right->lval == 0 && p->right->rval == NONAME ){
        !           299:                        werror( "unsigned comparison with 0?" );
        !           300:                        break;
        !           301:                        }
        !           302:        case UGT:
        !           303:        case ULE:
        !           304:                if( p->right->op == ICON && p->right->lval <= 0 && !ISUNSIGNED(p->right->type) && p->right->rval == NONAME ){
        !           305:                        werror( "degenerate unsigned comparison" );
        !           306:                        }
        !           307:                break;
        !           308: 
        !           309:        case COMOP:
        !           310:                down1 = EFF;
        !           311: 
        !           312:        case ANDAND:
        !           313:        case OROR:
        !           314:        case QUEST:
        !           315:                down2 = down;
        !           316:                /* go recursively left, then right  */
        !           317:                np1 = lnp;
        !           318:                lprt( p->left, down1, use1 );
        !           319:                np2 = lnp;
        !           320:                lprt( p->right, down2, use2 );
        !           321:                lmerge( np1, np2, 0 );
        !           322:                return;
        !           323: 
        !           324:        case SCONV:
        !           325:        case PCONV:
        !           326:        case COLON:
        !           327:                down1 = down2 = down;
        !           328:                break;
        !           329: 
        !           330:        case CALL:
        !           331:        case STCALL:
        !           332:        case FORTCALL:
        !           333:                acount = ctargs( p->right );
        !           334:        case UNARY CALL:
        !           335:        case UNARY STCALL:
        !           336:        case UNARY FORTCALL:
        !           337:                if( p->left->op == ICON && (id=p->left->rval) != NONAME ){ /* used to be &name */
        !           338:                        printf( "%.7s\t%03d\t%o\t%d\t",
        !           339:                                exname(stab[id].sname),
        !           340:                                down==EFF ? LUE : LUV,
        !           341:                                DECREF(p->left->type), acount );
        !           342:                        if( acount ) lpta( p->right );
        !           343:                        ident();
        !           344:                        }
        !           345:                break;
        !           346: 
        !           347:        case ICON:
        !           348:                /* look for &name case */
        !           349:                if( (id = p->rval) >= 0 && id != NONAME ){
        !           350:                        q = &stab[id];
        !           351:                        q->sflags |= (SREF|SSET);
        !           352:                        }
        !           353:                return;
        !           354: 
        !           355:        case NAME:
        !           356:                if( (id = p->rval) >= 0 && id != NONAME ){
        !           357:                        q = &stab[id];
        !           358:                        if( (uses&VALUSED) && !(q->sflags&SSET) ){
        !           359:                                if( q->sclass == AUTO || q->sclass == REGISTER ){
        !           360:                                        if( !ISARY(q->stype ) && !ISFTN(q->stype) && q->stype!=STRTY ){
        !           361:                                                werror( "%.7s may be used before set", q->sname );
        !           362:                                                q->sflags |= SSET;
        !           363:                                                }
        !           364:                                        }
        !           365:                                }
        !           366:                        if( uses & VALASGOP ) break;  /* not a real use */
        !           367:                        if( uses & VALSET ) q->sflags |= SSET;
        !           368:                        if( uses & VALUSED ) q->sflags |= SREF;
        !           369:                        if( uses & VALADDR ) q->sflags |= (SREF|SSET);
        !           370:                        if( p->lval == 0 ){
        !           371:                                lnp->lid = id;
        !           372:                                lnp->flgs = (uses&VALADDR)?0:((uses&VALSET)?VALSET:VALUSED);
        !           373:                                if( ++lnp >= &lnames[LNAMES] ) --lnp;
        !           374:                                }
        !           375:                        }
        !           376:                return;
        !           377: 
        !           378:                }
        !           379: 
        !           380:        /* recurse, going down the right side first if we can */
        !           381: 
        !           382:        switch( optype(p->op) ){
        !           383: 
        !           384:        case BITYPE:
        !           385:                np1 = lnp;
        !           386:                lprt( p->right, down2, use2 );
        !           387:        case UTYPE:
        !           388:                np2 = lnp;
        !           389:                lprt( p->left, down1, use1 );
        !           390:                }
        !           391: 
        !           392:        if( optype(p->op) == BITYPE ){
        !           393:                if( p->op == ASSIGN && p->left->op == NAME ){ /* special case for a =  .. a .. */
        !           394:                        lmerge( np1, np2, 0 );
        !           395:                        }
        !           396:                else lmerge( np1, np2, p->op != COLON );
        !           397:                /* look for assignments to fields, and complain */
        !           398:                if( p->op == ASSIGN && p->left->op == FLD && p->right->op == ICON ) fldcon( p );
        !           399:                }
        !           400: 
        !           401:        }
        !           402: 
        !           403: lmerge( np1, np2, flag ) struct lnm *np1, *np2; {
        !           404:        /* np1 and np2 point to lists of lnm members, for the two sides
        !           405:         * of a binary operator
        !           406:         * flag is 1 if commutation is possible, 0 otherwise
        !           407:         * lmerge returns a merged list, starting at np1, resetting lnp
        !           408:         * it also complains, if appropriate, about side effects
        !           409:         */
        !           410: 
        !           411:        register struct lnm *npx, *npy;
        !           412: 
        !           413:        for( npx = np2; npx < lnp; ++npx ){
        !           414: 
        !           415:                /* is it already there? */
        !           416:                for( npy = np1; npy < np2; ++npy ){
        !           417:                        if( npx->lid == npy->lid ){ /* yes */
        !           418:                                if( npx->flgs == 0 || npx->flgs == (VALSET|VALUSED) )
        !           419:                                        ;  /* do nothing */
        !           420:                                else if( (npx->flgs|npy->flgs)== (VALSET|VALUSED) ||
        !           421:                                        (npx->flgs&npy->flgs&VALSET) ){
        !           422:                                        if( flag ) werror( "%.8s evaluation order undefined", stab[npy->lid].sname );
        !           423:                                        }
        !           424:                                if( npy->flgs == 0 ) npx->flgs = 0;
        !           425:                                else npy->flgs |= npx->flgs;
        !           426:                                goto foundit;
        !           427:                                }
        !           428:                        }
        !           429: 
        !           430:                /* not there: update entry */
        !           431:                np2->lid = npx->lid;
        !           432:                np2->flgs = npx->flgs;
        !           433:                ++np2;
        !           434: 
        !           435:                foundit: ;
        !           436:                }
        !           437: 
        !           438:        /* all finished: merged list is at np1 */
        !           439:        lnp = np2;
        !           440:        }
        !           441: 
        !           442: efcode(){
        !           443:        /* code for the end of a function */
        !           444:        register struct symtab *cfp;
        !           445: 
        !           446:        cfp = &stab[curftn];
        !           447:        if( retstat & RETVAL ){
        !           448:                printf( "%.7s\t%03d\t%o\t%d\t", exname(cfp->sname),
        !           449:                        LRV, DECREF( cfp->stype), 0 );
        !           450:                ident();
        !           451:                }
        !           452:        if( !vflag ){
        !           453:                vflag = argflag;
        !           454:                argflag = 0;
        !           455:                }
        !           456:        if( retstat == RETVAL+NRETVAL )
        !           457:                werror( "function %.8s has return(e); and return;", cfp->sname);
        !           458:        }
        !           459: 
        !           460: aocode(p) struct symtab *p; {
        !           461:        /* called when automatic p removed from stab */
        !           462:        register struct symtab *cfs;
        !           463:        cfs = &stab[curftn];
        !           464:        if(p->suse>0 && !(p->sflags&SMOS) ){
        !           465:                if( p->sclass == PARAM ){
        !           466:                        if( vflag ) werror( "argument %.7s unused in function %.7s",
        !           467:                                p->sname,
        !           468:                                cfs->sname );
        !           469:                        }
        !           470:                else {
        !           471:                        if( p->sclass != TYPEDEF ) werror( "%.7s unused in function %.7s",
        !           472:                                p->sname, cfs->sname );
        !           473:                        }
        !           474:                }
        !           475: 
        !           476:        if( p->suse < 0 && (p->sflags & (SSET|SREF|SMOS)) == SSET &&
        !           477:                !ISARY(p->stype) && !ISFTN(p->stype) ){
        !           478: 
        !           479:                werror( "%.7s set but not used in function %.7s", p->sname, cfs->sname );
        !           480:                }
        !           481: 
        !           482:        if( p->stype == STRTY || p->stype == UNIONTY || p->stype == ENUMTY ){
        !           483:                if( dimtab[p->sizoff+1] < 0 ) werror( "structure %.7s never defined", p->sname );
        !           484:                }
        !           485: 
        !           486:        }
        !           487: 
        !           488: defnam( p ) register struct symtab *p; {
        !           489:        /* define the current location as the name p->sname */
        !           490: 
        !           491:        if( p->sclass == STATIC && p->slevel>1 ) return;
        !           492: 
        !           493:        if( !ISFTN( p->stype ) ){
        !           494:                printf( "%.7s\t%03d\t%o\t%d\t",
        !           495:                        exname(p->sname), libflag?LIB:LDI, p->stype, 0 );
        !           496:                ident();
        !           497:                }
        !           498:        }
        !           499: 
        !           500: zecode( n ){
        !           501:        /* n integer words of zeros */
        !           502:        OFFSZ temp;
        !           503:        temp = n;
        !           504:        inoff += temp*SZINT;
        !           505:        ;
        !           506:        }
        !           507: 
        !           508: andable( p ) NODE *p; {  /* p is a NAME node; can it accept & ? */
        !           509:        register r;
        !           510: 
        !           511:        if( p->op != NAME ) cerror( "andable error" );
        !           512: 
        !           513:        if( (r = p->rval) < 0 ) return(1);  /* labels are andable */
        !           514: 
        !           515:        if( stab[r].sclass == AUTO || stab[r].sclass == PARAM ) return(0)        !           516:        return(1);
        !           517:        }
        !           518: 
        !           519: NODE *
        !           520: clocal(p) NODE *p; {
        !           521: 
        !           522:        /* this is called to do local transformations on
        !           523:           an expression tree preparitory to its being
        !           524:           written out in intermediate code.
        !           525:        */
        !           526: 
        !           527:        /* the major essential job is rewriting the
        !           528:           automatic variables and arguments in terms of
        !           529:           REG and OREG nodes */
        !           530:        /* conversion ops which are not necessary are also clobbered here */
        !           531:        /* in addition, any special features (such as rewriting
        !           532:           exclusive or) are easily handled here as well */
        !           533: 
        !           534:        register o;
        !           535:        register unsigned t, tl;
        !           536: 
        !           537:        switch( o = p->op ){
        !           538: 
        !           539:        case SCONV:
        !           540:        case PCONV:
        !           541:                if( p->left->type==ENUMTY ){
        !           542:                        p->left = pconvert( p->left );
        !           543:                        }
        !           544:                /* assume conversion takes place; type is inherited */
        !           545:                t = p->type;
        !           546:                tl = p->left->type;
        !           547:                if( aflag && (tl==LONG||tl==ULONG) && (t!=LONG&&t!=ULONG) ){
        !           548:                        werror( "long assignment may lose accuracy" );
        !           549:                        }
        !           550:                if( ISPTR(tl) && ISPTR(t) ){
        !           551:                        tl = DECREF(tl);
        !           552:                        t = DECREF(t);
        !           553:                        switch( ISFTN(t) + ISFTN(tl) ){
        !           554: 
        !           555:                        case 0:  /* neither is a function pointer */
        !           556:                                if( talign(t,p->csiz) > talign(tl,p->left->csiz) ){
        !           557:                                        if( hflag||pflag ) werror( "possible pointer alignment problem" );
        !           558:                                        }
        !           559:                                break;
        !           560: 
        !           561:                        case 1:
        !           562:                                werror( "questionable conversion of function pointer" );
        !           563: 
        !           564:                        case 2:
        !           565:                                ;
        !           566:                                }
        !           567:                        }
        !           568:                p->left->type = p->type;
        !           569:                p->left->cdim = p->cdim;
        !           570:                p->left->csiz = p->csiz;
        !           571:                p->op = FREE;
        !           572:                return( p->left );
        !           573: 
        !           574:        case PVCONV:
        !           575:        case PMCONV:
        !           576:                if( p->right->op != ICON ) cerror( "bad conversion");
        !           577:                p->op = FREE;
        !           578:                return( buildtree( o==PMCONV?MUL:DIV, p->left, p->right ) );
        !           579: 
        !           580:                }
        !           581: 
        !           582:        return(p);
        !           583:        }
        !           584: 
        !           585: NODE *
        !           586: offcon( off, t, d, s ) OFFSZ off; TWORD t;{  /* make a structure offset node */
        !           587:        register NODE *p;
        !           588:        p = bcon(0);
        !           589:        p->lval = off/SZCHAR;
        !           590:        return(p);
        !           591:        }
        !           592: 
        !           593: noinit(){
        !           594:        /* storage class for such as "int a;" */
        !           595:        return( pflag ? EXTDEF : EXTERN );
        !           596:        }
        !           597: 
        !           598: 
        !           599: cinit( p, sz ) NODE *p; { /* initialize p into size sz */
        !           600:        inoff += sz;
        !           601:        if( p->op == INIT ){
        !           602:                if( p->left->op == ICON ) return;
        !           603:                if( p->left->op == NAME && p->left->type == MOE ) return;
        !           604:                }
        !           605:        uerror( "illegal initialization" );
        !           606:        }
        !           607: 
        !           608: char *
        !           609: exname( p ) char *p; {
        !           610:        /* make a name look like an external name in the local machine */
        !           611:        static char aa[8];
        !           612:        register int i;
        !           613: 
        !           614:        if( !pflag ) return(p);
        !           615:        for( i=0; i<6; ++i ){
        !           616:                if( isupper(*p ) ) aa[i] = tolower( *p );
        !           617:                else aa[i] = *p;
        !           618:                if( *p ) ++p;
        !           619:                }
        !           620:        aa[6] = '\0';
        !           621:        return( aa );
        !           622:        }
        !           623: 
        !           624: where(f){ /* print true location of error */
        !           625:        if( f == 'u' && nerrors>1 ) --nerrors; /* don't get "too many errors" */
        !           626:        fprintf( stderr, "%s, line %d: ", ftitle, lineno );
        !           627:        }
        !           628: 
        !           629:        /* a number of dummy routines, unneeded by lint */
        !           630: 
        !           631: branch(n){;}
        !           632: defalign(n){;}
        !           633: deflab(n){;}
        !           634: bycode(t,i){;}
        !           635: cisreg(t){return(1);}  /* everyting is a register variable! */
        !           636: 
        !           637: fldty(p) struct symtab *p; {
        !           638:        ; /* all types are OK here... */
        !           639:        }
        !           640: 
        !           641: fldal(t) unsigned t; { /* field alignment... */
        !           642:        if( t == ENUMTY ) return( ALCHAR );  /* this should be thought through better... */
        !           643:        if( ISPTR(t) ){ /* really for the benefit of honeywell (and someday IBM) */
        !           644:                if( pflag ) uerror( "nonportable field type" );
        !           645:                }
        !           646:        else uerror( "illegal field type" );
        !           647:        return(ALINT);
        !           648:        }
        !           649: 
        !           650: main( argc, argv ) char *argv[]; {
        !           651:        char *p;
        !           652: 
        !           653:        /* handle options */
        !           654: 
        !           655:        for( p=argv[1]; *p; ++p ){
        !           656: 
        !           657:                switch( *p ){
        !           658: 
        !           659:                case '-':
        !           660:                        continue;
        !           661: 
        !           662:                case 'L':  /* produced by driver program */
        !           663:                        flabel = p;
        !           664:                        goto break2;
        !           665: 
        !           666:                case '\0':
        !           667:                        break;
        !           668: 
        !           669:                case 'b':
        !           670:                        brkflag = 1;
        !           671:                        continue;
        !           672: 
        !           673:                case 'p':
        !           674:                        pflag = 1;
        !           675:                        continue;
        !           676: 
        !           677:                case 'c':
        !           678:                        cflag = 1;
        !           679:                        continue;
        !           680: 
        !           681:                case 's':
        !           682:                        /* for the moment, -s triggers -h */
        !           683: 
        !           684:                case 'h':
        !           685:                        hflag = 1;
        !           686:                        continue;
        !           687: 
        !           688:                case 'v':
        !           689:                        vflag = 0;
        !           690:                        continue;
        !           691: 
        !           692:                case 'x':
        !           693:                        xflag = 1;
        !           694:                        continue;
        !           695: 
        !           696:                case 'a':
        !           697:                        aflag = 1;
        !           698:                case 'u':       /* done in second pass */
        !           699:                case 'n':       /* done in shell script */
        !           700:                        continue;
        !           701: 
        !           702:                case 't':
        !           703:                        werror( "option %c now default: see `man 6 lint'", *p );
        !           704:                        continue;
        !           705: 
        !           706:                default:
        !           707:                        uerror( "illegal option: %c", *p );
        !           708:                        continue;
        !           709: 
        !           710:                        }
        !           711:                }
        !           712: 
        !           713:        break2:
        !           714:        if( !pflag ){  /* set sizes to sizes of target machine */
        !           715: # ifdef gcos
        !           716:                SZCHAR = ALCHAR = 9;
        !           717: # else
        !           718:                SZCHAR = ALCHAR = 8;
        !           719: # endif
        !           720:                SZINT = ALINT = sizeof(int)*SZCHAR;
        !           721:                SZFLOAT = ALFLOAT = sizeof(float)*SZCHAR;
        !           722:                SZDOUBLE = ALDOUBLE = sizeof(double)*SZCHAR;
        !           723:                SZLONG = ALLONG = sizeof(long)*SZCHAR;
        !           724:                SZSHORT = ALSHORT = sizeof(short)*SZCHAR;
        !           725:                SZPOINT = ALPOINT = sizeof(int *)*SZCHAR;
        !           726:                ALSTRUCT = ALINT;
        !           727:                /* now, fix some things up for various machines (I wish we had "alignof") */
        !           728: 
        !           729: # ifdef pdp11
        !           730:                ALLONG = ALDOUBLE = ALFLOAT = ALINT;
        !           731: #endif
        !           732: # ifdef ibm
        !           733:                ALSTRUCT = ALCHAR;
        !           734: #endif
        !           735:                }
        !           736: 
        !           737:        return( mainp1( argc, argv ) );
        !           738:        }
        !           739: 
        !           740: ctype( type ) unsigned type; { /* are there any funny types? */
        !           741:        return( type );
        !           742:        }
        !           743: 
        !           744: commdec( i ){
        !           745:        /* put out a common declaration */
        !           746:        register struct symtab *p;
        !           747:        p = &stab[i];
        !           748:        printf( "%.7s\t%03d\t%o\t%d\t", exname(p->sname), libflag?LIB:LDC, p->stype, 0 );
        !           749:        ident();
        !           750:        }
        !           751: 
        !           752: isitfloat ( s ) char *s; {
        !           753:        /* s is a character string;
        !           754:           if floating point is implemented, set dcon to the value of s */
        !           755:        /* lint version
        !           756:        */
        !           757:        dcon = atof( s );
        !           758:        return( FCON );
        !           759:        }
        !           760: 
        !           761: fldcon( p ) register NODE *p; {
        !           762:        /* p is an assignment of a constant to a field */
        !           763:        /* check to see if the assignment is going to overflow, or otherwise cause trouble */
        !           764:        register s;
        !           765:        CONSZ v;
        !           766: 
        !           767:        if( !hflag & !pflag ) return;
        !           768: 
        !           769:        s = UPKFSZ(p->left->rval);
        !           770:        v = p->right->lval;
        !           771: 
        !           772:        switch( p->left->type ){
        !           773: 
        !           774:        case CHAR:
        !           775:        case INT:
        !           776:        case SHORT:
        !           777:        case LONG:
        !           778:        case ENUMTY:
        !           779:                if( v>=0 && (v>>(s-1))==0 ) return;
        !           780:                werror( "precision lost in assignment to (possibly sign-extended) field" );
        !           781:        default:
        !           782:                return;
        !           783: 
        !           784:        case UNSIGNED:
        !           785:        case UCHAR:
        !           786:        case USHORT:
        !           787:        case ULONG:
        !           788:                if( v<0 || (v>>s)!=0 ) werror( "precision lost in field assignment" );
        !           789:                
        !           790:                return;
        !           791:                }
        !           792: 
        !           793:        }

unix.superglobalmegacorp.com

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