Annotation of 43BSDTahoe/usr.bin/lint/lpass2.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)lpass2.c   1.9     (Berkeley)      12/11/87";
                      3: #endif lint
                      4: 
                      5: # include "macdefs.h"
                      6: # include "manifest.h"
                      7: # include "lmanifest.h"
                      8: 
                      9: # define USED 01
                     10: # define VUSED 02
                     11: # define EUSED 04
                     12: # define RVAL 010
                     13: # define VARARGS 0100
                     14: 
                     15: # define NSZ 4096
                     16: # define TYSZ 3500
                     17: # define FSZ 500
                     18: # define NTY 50
                     19: 
                     20: typedef struct sty STYPE;
                     21: struct sty { ATYPE t; STYPE *next; };
                     22: 
                     23: typedef struct sym {
                     24: #ifndef FLEXNAMES
                     25:        char name[LCHNM];
                     26: #else
                     27:        char *name;
                     28: #endif
                     29:        short nargs;
                     30:        int decflag;
                     31:        int fline;
                     32:        STYPE symty;
                     33:        int fno;
                     34:        int use;
                     35:        } STAB;
                     36: 
                     37: STAB stab[NSZ];
                     38: STAB *find();
                     39: 
                     40: STYPE tary[TYSZ];
                     41: STYPE *tget();
                     42: 
                     43: #ifndef FLEXNAMES
                     44: char fnm[FSZ][LFNM];
                     45: #else
                     46: char *fnm[FSZ];
                     47: #endif
                     48: 
                     49: #ifdef FLEXNAMES
                     50: char *getstr();
                     51: #endif
                     52: 
                     53: int tfree;  /* used to allocate types */
                     54: int ffree;  /* used to save filenames */
                     55: 
                     56: struct ty atyp[NTY];
                     57:        /* r is where all the input ends up */
                     58: union rec r;
                     59: 
                     60: int hflag = 0;
                     61: int pflag = 0;
                     62: int xflag = 0;
                     63: int uflag = 1;
                     64: int ddddd = 0;
                     65: int zflag = 0;
                     66: int Pflag = 0;
                     67: 
                     68: int cfno;  /* current file number */
                     69: 
                     70: main( argc, argv ) char *argv[]; {
                     71:        register char *p;
                     72: 
                     73:        /* first argument is intermediate file */
                     74:        /* second argument is - options */
                     75: 
                     76:        for( ; argc>2 && argv[argc-1][0] == '-' ; --argc ){
                     77:                for( p=argv[argc-1]; *p; ++p ){
                     78:                        switch( *p ){
                     79: 
                     80:                        case 'h':
                     81:                                hflag = 1;
                     82:                                break;
                     83: 
                     84:                        case 'p':
                     85:                                pflag = 1;
                     86:                                break;
                     87: 
                     88:                        case 'x':
                     89:                                xflag = 1;
                     90:                                break;
                     91: 
                     92:                        case 'X':
                     93:                                ddddd = 1;
                     94:                                break;
                     95: 
                     96:                        case 'u':
                     97:                                uflag = 0;
                     98:                                break;
                     99: 
                    100:                        case 'z':
                    101:                                zflag = 1;
                    102:                                break;
                    103: 
                    104:                        case 'P':
                    105:                                Pflag = 1;
                    106:                                break;
                    107: 
                    108:                                }
                    109:                        }
                    110:                }
                    111: 
                    112:        if( argc < 2 || !freopen( argv[1], "r", stdin ) ){
                    113:                error( "cannot open intermediate file" );
                    114:                exit( 1 );
                    115:                }
                    116:        if( Pflag ){
                    117:                pfile();
                    118:                return( 0 );
                    119:                }
                    120:        mloop( LDI|LIB|LST );
                    121:        rewind( stdin );
                    122:        mloop( LDC|LDX );
                    123:        rewind( stdin );
                    124:        mloop( LRV|LUV|LUE|LUM );
                    125:        cleanup();
                    126:        return(0);
                    127:        }
                    128: 
                    129: mloop( m ){
                    130:        /* do the main loop */
                    131:        register STAB *q;
                    132: 
                    133:        while( lread(m) ){
                    134:                q = find();
                    135:                if( q->decflag ) chkcompat(q);
                    136:                else setuse(q);
                    137:                }
                    138:        }
                    139: 
                    140: lread(m){ /* read a line into r.l */
                    141: 
                    142:        register n;
                    143: 
                    144:        for(;;) {
                    145:                if( fread( (char *)&r, sizeof(r), 1, stdin ) <= 0 ) return(0);
                    146:                if( r.l.decflag & LFN ){
                    147:                        /* new filename */
                    148: #ifdef FLEXNAMES
                    149:                        r.f.fn = getstr(0);
                    150: #endif
                    151:                        if( Pflag ) return( 1 );
                    152:                        setfno( r.f.fn );
                    153:                        continue;
                    154:                        }
                    155: #ifdef FLEXNAMES
                    156:                r.l.name = getstr(1);
                    157: #else /* !FLEXNAMES */
                    158:                portify(r.l.name);
                    159: #endif /* !FLEXNAMES */
                    160:                n = r.l.nargs;
                    161:                if( n<0 ) n = ~n;
                    162:                if( n>=NTY ) error( "more than %d args?", n );
                    163:                fread( (char *)atyp, sizeof(ATYPE), n, stdin );
                    164:                if( ( r.l.decflag & m ) ) return( 1 );
                    165:                }
                    166:        }
                    167: 
                    168: setfno( s ) char *s; {
                    169:        /* look up current file names */
                    170:        /* first, strip backwards to the beginning or to the first / */
                    171:        int i;
                    172: 
                    173:        /* now look up s */
                    174:        for( i=0; i<ffree; ++i ){
                    175: #ifndef FLEXNAMES
                    176:                if( !strncmp( s, fnm[i], LFNM ) )
                    177: #else
                    178:                if (fnm[i] == s)
                    179: #endif
                    180:                        {
                    181:                        cfno = i;
                    182:                        return;
                    183:                        }
                    184:                }
                    185:        /* make a new entry */
                    186:        if( ffree >= FSZ ) error( "more than %d files", FSZ );
                    187: #ifndef FLEXNAMES
                    188:        strncpy( fnm[ffree], s, LFNM );
                    189: #else
                    190:        fnm[ffree] = s;
                    191: #endif
                    192:        cfno = ffree++;
                    193:        }
                    194: 
                    195: /* VARARGS */
                    196: error( s, a ) char *s; {
                    197: 
                    198: #ifndef FLEXNAMES
                    199:        fprintf( stderr, "pass 2 error:(file %.*s) ", LFNM, fnm[cfno] );
                    200: #else
                    201:        fprintf( stderr, "pass 2 error:(file %s) ", fnm[cfno] );
                    202: #endif
                    203:        fprintf( stderr, s, a );
                    204:        fprintf( stderr, "\n" );
                    205:        exit(1);
                    206:        }
                    207: 
                    208: STAB *
                    209: find(){
                    210:        register h=0;
                    211: #ifndef FLEXNAMES
                    212:        h = hashstr(r.l.name, LCHNM) % NSZ;
                    213: #else
                    214:        h = (int)r.l.name % NSZ;
                    215: #endif
                    216:        {       register STAB *p, *q;
                    217:                for( p=q= &stab[h]; q->decflag; ){
                    218: #ifndef FLEXNAMES
                    219:                        if( !strncmp( r.l.name, q->name, LCHNM))
                    220: #else
                    221:                        if (r.l.name == q->name)
                    222: #endif
                    223:                                if( ((q->decflag|r.l.decflag)&LST)==0 || q->fno==cfno )
                    224:                                        return(q);
                    225:                        if( ++q >= &stab[NSZ] ) q = stab;
                    226:                        if( q == p ) error( "too many names defined" );
                    227:                        }
                    228: #ifndef FLEXNAMES
                    229:                strncpy( q->name, r.l.name, LCHNM );
                    230: #else
                    231:                q->name = r.l.name;
                    232: #endif
                    233:                return( q );
                    234:                }
                    235:        }
                    236: 
                    237: STYPE *
                    238: tget(){
                    239:        if( tfree >= TYSZ ){
                    240:                error( "too many types needed" );
                    241:                }
                    242:        return( &tary[tfree++] );
                    243:        }
                    244: 
                    245: chkcompat(q) STAB *q; {
                    246:        /* are the types, etc. in r.l and q compatible */
                    247:        register int i;
                    248:        STYPE *qq;
                    249: 
                    250:        setuse(q);
                    251: 
                    252:        /* argument check */
                    253: 
                    254:        if( q->decflag & (LDI|LIB|LUV|LUE|LST) ){
                    255:                if( r.l.decflag & (LUV|LIB|LUE) ){
                    256:                        if( q->nargs != r.l.nargs ){
                    257:                                if( !(q->use&VARARGS) ){
                    258: #ifndef FLEXNAMES
                    259:                                        printf( "%.8s: variable # of args.", q->name );
                    260: #else
                    261:                                        printf( "%s: variable # of args.", q->name );
                    262: #endif
                    263:                                        viceversa(q);
                    264:                                        }
                    265:                                if( r.l.nargs > q->nargs ) r.l.nargs = q->nargs;
                    266:                                if( !(q->decflag & (LDI|LIB|LST) ) ) {
                    267:                                        q->nargs = r.l.nargs;
                    268:                                        q->use |= VARARGS;
                    269:                                        }
                    270:                                }
                    271:                        for( i=0,qq=q->symty.next; i<r.l.nargs; ++i,qq=qq->next){
                    272:                                if( chktype( &qq->t, &atyp[i], q->fno ) ){
                    273: #ifndef FLEXNAMES
                    274:                                        printf( "%.8s, arg. %d used inconsistently",
                    275: #else
                    276:                                        printf( "%s, arg. %d used inconsistently",
                    277: #endif
                    278:                                                q->name, i+1 );
                    279:                                        viceversa(q);
                    280:                                        }
                    281:                                }
                    282:                        }
                    283:                }
                    284: 
                    285:        if( (q->decflag&(LDI|LIB|LUV|LST)) && r.l.decflag==LUV ){
                    286:                if( chktype( &r.l.type, &q->symty.t, q->fno ) ){
                    287: #ifndef FLEXNAMES
                    288:                        printf( "%.8s value used inconsistently", q->name );
                    289: #else
                    290:                        printf( "%s value used inconsistently", q->name );
                    291: #endif
                    292:                        viceversa(q);
                    293:                        }
                    294:                }
                    295: 
                    296:        /* check for multiple declaration */
                    297: 
                    298:        if( (q->decflag&(LDI|LST)) && (r.l.decflag&(LDI|LIB|LST)) ){
                    299: #ifndef FLEXNAMES
                    300:                printf( "%.8s multiply declared", q->name );
                    301: #else
                    302:                printf( "%s multiply declared", q->name );
                    303: #endif
                    304:                viceversa(q);
                    305:                }
                    306: 
                    307:        /* do a bit of checking of definitions and uses... */
                    308: 
                    309:        if( (q->decflag & (LDI|LIB|LDX|LDC|LUM|LST)) && (r.l.decflag & (LDX|LDC|LUM)) && q->symty.t.aty != r.l.type.aty ){
                    310: #ifndef FLEXNAMES
                    311:                printf( "%.8s value declared inconsistently", q->name );
                    312: #else
                    313:                printf( "%s value declared inconsistently", q->name );
                    314: #endif
                    315:                viceversa(q);
                    316:                }
                    317: 
                    318:        /* better not call functions which are declared to be structure or union returning */
                    319: 
                    320:        if( (q->decflag & (LDI|LIB|LDX|LDC|LST)) && (r.l.decflag & LUE) && q->symty.t.aty != r.l.type.aty ){
                    321:                /* only matters if the function returns union or structure */
                    322:                TWORD ty;
                    323:                ty = q->symty.t.aty;
                    324:                if( ISFTN(ty) && ((ty = DECREF(ty))==STRTY || ty==UNIONTY ) ){
                    325: #ifndef FLEXNAMES
                    326:                        printf( "%.8s function value type must be declared before use", q->name );
                    327: #else
                    328:                        printf( "%s function value type must be declared before use", q->name );
                    329: #endif
                    330:                        viceversa(q);
                    331:                        }
                    332:                }
                    333: 
                    334:        if( pflag && q->decflag==LDX && r.l.decflag == LUM && !ISFTN(q->symty.t.aty) ){
                    335:                /* make the external declaration go away */
                    336:                /* in effect, it was used without being defined */
                    337:                }
                    338:        }
                    339: 
                    340: viceversa(q) STAB *q; {
                    341:        /* print out file comparison */
                    342: #ifndef FLEXNAMES
                    343:        printf( "       %.*s(%d)  ::  %.*s(%d)\n",
                    344:                LFNM, fnm[q->fno], q->fline,
                    345:                LFNM, fnm[cfno], r.l.fline );
                    346: #else
                    347:        printf( "       %s(%d)  ::  %s(%d)\n",
                    348:                fnm[q->fno], q->fline,
                    349:                fnm[cfno], r.l.fline );
                    350: #endif
                    351:        }
                    352: 
                    353:        /* messages for defintion/use */
                    354: char *
                    355: mess[2][2] ={
                    356:        "",
                    357: #ifndef FLEXNAMES
                    358:        "%.8s used( %.*s(%d) ), but not defined\n",
                    359:        "%.8s defined( %.*s(%d) ), but never used\n",
                    360:        "%.8s declared( %.*s(%d) ), but never used or defined\n"
                    361: #else
                    362:        "%s used( %s(%d) ), but not defined\n",
                    363:        "%s defined( %s(%d) ), but never used\n",
                    364:        "%s declared( %s(%d) ), but never used or defined\n"
                    365: #endif
                    366:        };
                    367: 
                    368: lastone(q) STAB *q; {
                    369: 
                    370:        register nu, nd, uses;
                    371: 
                    372:        if( ddddd ) pst(q);
                    373: 
                    374:        nu = nd = 0;
                    375:        uses = q->use;
                    376: 
                    377:        if( !(uses&USED) && q->decflag != LIB ) {
                    378: #ifndef FLEXNAMES
                    379:                if( strncmp(q->name,"main",7) )
                    380: #else
                    381:                if (strcmp(q->name, "main"))
                    382: #endif
                    383:                        nu = 1;
                    384:                }
                    385: 
                    386:        if( !ISFTN(q->symty.t.aty) ){
                    387:                switch( q->decflag ){
                    388: 
                    389:                case LIB:
                    390:                        nu = nd = 0;  /* don't complain about uses on libraries */
                    391:                        break;
                    392:                case LDX:
                    393:                        if( !xflag ) break;
                    394:                case LUV:
                    395:                case LUE:
                    396: /* 01/04/80 */ case LUV | LUE:
                    397:                case LUM:
                    398:                        nd = 1;
                    399:                        }
                    400:                }
                    401:        if( uflag && ( nu || nd ) )
                    402: #ifndef FLEXNAMES
                    403:                printf( mess[nu][nd], q->name, LFNM, fnm[q->fno], q->fline );
                    404: #else
                    405:                printf( mess[nu][nd], q->name, fnm[q->fno], q->fline );
                    406: #endif
                    407: 
                    408:        if( (uses&(RVAL+EUSED)) == (RVAL+EUSED) ){
                    409:                /* if functions is static, then print the file name too */
                    410:                if( q->decflag & LST )
                    411: #ifndef FLEXNAMES
                    412:                        printf( "%.*s(%d):", LFNM, fnm[q->fno], q->fline );
                    413: #else
                    414:                        printf( "%s(%d):", fnm[q->fno], q->fline );
                    415: #endif
                    416: #ifndef FLEXNAMES
                    417:                printf( "%.*s returns value which is %s ignored\n",
                    418:                        LCHNM, q->name, uses&VUSED ? "sometimes" : "always" );
                    419: #else
                    420:                printf( "%s returns value which is %s ignored\n",
                    421:                        q->name, uses&VUSED ? "sometimes" : "always" );
                    422: #endif
                    423:                }
                    424: 
                    425:        if( (uses&(RVAL+VUSED)) == (VUSED) && (q->decflag&(LDI|LIB|LST)) ){
                    426:                if( q->decflag & LST )
                    427: #ifndef FLEXNAMES
                    428:                        printf( "%.*s(%d):", LFNM, fnm[q->fno], q->fline );
                    429: #else
                    430:                        printf( "%s(%d):", fnm[q->fno], q->fline );
                    431: #endif
                    432: #ifndef FLEXNAMES
                    433:                printf( "%.*s value is used, but none returned\n",
                    434:                        LCHNM, q->name);
                    435: #else
                    436:                printf( "%s value is used, but none returned\n", q->name);
                    437: #endif
                    438:                }
                    439:        }
                    440: 
                    441: cleanup(){ /* call lastone and die gracefully */
                    442:        STAB *q;
                    443:        for( q=stab; q< &stab[NSZ]; ++q ){
                    444:                if( q->decflag ) lastone(q);
                    445:                }
                    446:        exit(0);
                    447:        }
                    448: 
                    449: setuse(q) STAB *q; { /* check new type to ensure that it is used */
                    450: 
                    451:        if( !q->decflag ){ /* new one */
                    452:                q->decflag = r.l.decflag;
                    453:                q->symty.t = r.l.type;
                    454:                if( r.l.nargs < 0 ){
                    455:                        q->nargs = ~r.l.nargs;
                    456:                        q->use = VARARGS;
                    457:                        }
                    458:                else {
                    459:                        q->nargs = r.l.nargs;
                    460:                        q->use = 0;
                    461:                        }
                    462:                q->fline = r.l.fline;
                    463:                q->fno = cfno;
                    464:                if( q->nargs ){
                    465:                        int i;
                    466:                        STYPE *qq;
                    467:                        for( i=0,qq= &q->symty; i<q->nargs; ++i,qq=qq->next ){
                    468:                                qq->next = tget();
                    469:                                qq->next->t = atyp[i];
                    470:                                }
                    471:                        }
                    472:                }
                    473: 
                    474:        switch( r.l.decflag ){
                    475: 
                    476:        case LRV:
                    477:                q->use |= RVAL;
                    478:                return;
                    479:        case LUV:
                    480:                q->use |= VUSED+USED;
                    481:                return;
                    482:        case LUE:
                    483:                q->use |= EUSED+USED;
                    484:                return;
                    485: /* 01/04/80 */ case LUV | LUE:
                    486:        case LUM:
                    487:                q->use |= USED;
                    488:                return;
                    489: 
                    490:                }
                    491:        }
                    492: 
                    493: chktype( pt1, pt2, fno ) register ATYPE *pt1, *pt2; {
                    494:        TWORD t;
                    495: 
                    496:        /* check the two type words to see if they are compatible */
                    497:        /* for the moment, enums are turned into ints, and should be checked as such */
                    498:        if( pt1->aty == ENUMTY ) pt1->aty =  INT;
                    499:        if( pt2->aty == ENUMTY ) pt2->aty = INT;
                    500: 
                    501:        if( (t=BTYPE(pt1->aty)==STRTY) || t==UNIONTY ){
                    502:                if( pt1->aty != pt2->aty || pt1->extra1 != pt2->extra1 )
                    503:                        return 1;
                    504:                /* if -z then don't worry about undefined structures,
                    505:                   as long as the names match */
                    506:                if( zflag && (pt1->extra == 0 || pt2->extra == 0) ) return 0;
                    507:                /* if -p and pt1 is "too big" and
                    508:                ** pt1 came from a llib-l file, we can't pass judgment on it.
                    509:                */
                    510:                if ( pflag && pt1->extra > pt2->extra &&
                    511:                        strncmp(fnm[fno], "llib-l", 6) == 0)
                    512:                                return 0;
                    513:                return pt1->extra != pt2->extra;
                    514:                }
                    515: 
                    516:        if( pt2->extra ){ /* constant passed in */
                    517:                if( pt1->aty == UNSIGNED && pt2->aty == INT ) return( 0 );
                    518:                else if( pt1->aty == ULONG && pt2->aty == LONG ) return( 0 );
                    519:                }
                    520:        else if( pt1->extra ){ /* for symmetry */
                    521:                if( pt2->aty == UNSIGNED && pt1->aty == INT ) return( 0 );
                    522:                else if( pt2->aty == ULONG && pt1->aty == LONG ) return( 0 );
                    523:                }
                    524: 
                    525:        return( pt1->aty != pt2->aty );
                    526:        }
                    527: 
                    528: struct tb { int m; char * nm };
                    529: 
                    530: struct tb dfs[] = {
                    531:        LDI, "LDI",
                    532:        LIB, "LIB",
                    533:        LDC, "LDC",
                    534:        LDX, "LDX",
                    535:        LRV, "LRV",
                    536:        LUV, "LUV",
                    537:        LUE, "LUE",
                    538:        LUM, "LUM",
                    539:        LST, "LST",
                    540:        LFN, "LFN",
                    541:        0, "" };
                    542: 
                    543: struct tb us[] = {
                    544:        USED, "USED",
                    545:        VUSED, "VUSED",
                    546:        EUSED, "EUSED",
                    547:        RVAL, "RVAL",
                    548:        VARARGS, "VARARGS",
                    549:        0, "" };
                    550: 
                    551: ptb( v, tp ) struct tb *tp; {
                    552:        /* print a value from the table */
                    553:        int flag;
                    554:        flag = 0;
                    555:        for( ; tp->m; ++tp ){
                    556:                if( v&tp->m ){
                    557:                        if( flag++ ) putchar( '|' );
                    558:                        printf( "%s", tp->nm );
                    559:                        }
                    560:                }
                    561:        }
                    562: 
                    563: pst( q ) STAB *q; {
                    564:        /* give a debugging output for q */
                    565: 
                    566: #ifndef FLEXNAMES
                    567:        printf( "%.8s (", q->name );
                    568: #else
                    569:        printf( "%s (", q->name );
                    570: #endif
                    571:        ptb( q->decflag, dfs );
                    572:        printf( "), use= " );
                    573:        ptb( q->use, us );
                    574:        printf( ", line %d, nargs=%d\n", q->fline, q->nargs );
                    575:        }
                    576: 
                    577: pfile() {
                    578:        /* print the input file in readable form */
                    579:        while( lread( LDI|LIB|LDC|LDX|LRV|LUV|LUE|LUM|LST|LFN ) )
                    580:                prc();
                    581:        }
                    582: 
                    583: prc() {
                    584:        /* print out 'r' for debugging */
                    585:        register i, j, k;
                    586: 
                    587:        printf( "decflag\t" );
                    588:        ptb( r.l.decflag, dfs );
                    589:        putchar( '\n' );
                    590:        if( r.l.decflag & LFN ){
                    591: #ifdef FLEXNAMES
                    592:                printf( "fn\t\t%s\n", r.f.fn );
                    593: #else
                    594:                printf( "fn\t%\t.*s\n", LFNM, r.f.fn );
                    595: #endif
                    596:                }
                    597:        else {
                    598: #ifdef FLEXNAMES
                    599:                printf( "name\t%s\n", r.l.name );
                    600: #else
                    601:                printf( "name\t%.*s\n", LCHNM, r.l.name );
                    602: #endif
                    603:                printf( "nargs\t%d\n", r.l.nargs );
                    604:                printf( "fline\t%d\n", r.l.fline );
                    605:                printf( "type.aty\t0%o (", r.l.type.aty );
                    606:                pty( r.l.type.aty, r.l.name );
                    607:                printf( ")\ntype.extra\t%d\n", r.l.type.extra );
                    608:                j = r.l.type.extra1;
                    609:                printf( "type.extra1\t0x%x (%d,%d)\n",
                    610:                        j, j & X_NONAME ? 1 : 0, j & ~X_NONAME );
                    611:                k = r.l.nargs;
                    612:                if( k < 0 ) k = ~k;
                    613:                for( i = 0; i < k; i++ ){
                    614:                        printf( "atyp[%d].aty\t0%o (", i, atyp[i].aty );
                    615:                        pty( atyp[i].aty, "" );
                    616:                        printf( ")\natyp[%d].extra\t%d\n", i, atyp[i].extra);
                    617:                        j = atyp[i].extra1;
                    618:                        printf( "atyp[%d].extra1\t0x%x (%d,%d)\n",
                    619:                                i, j, j & X_NONAME ? 1 : 0, j & ~X_NONAME );
                    620:                        }
                    621:                }
                    622:                putchar( '\n' );
                    623:        }
                    624: 
                    625: pty( t, name )  TWORD t; {
                    626:        static char * tnames[] = {
                    627:                "void", "farg", "char", "short",
                    628:                "int", "long", "float", "double",
                    629:                "struct xxx", "union %s", "enum", "moety",
                    630:                "unsigned char", "unsigned short", "unsigned", "unsigned long",
                    631:                "?", "?"
                    632:                };
                    633: 
                    634:        printf( "%s ", tnames[BTYPE(t)] );
                    635:        pty1( t, name, (8 * sizeof (int) - BTSHIFT) / TSHIFT );
                    636:        }
                    637: 
                    638: pty1( t, name, level ) TWORD t; {
                    639:        register TWORD u;
                    640: 
                    641:        if( level < 0 ){
                    642:                printf( "%s", name );
                    643:                return;
                    644:                }
                    645:        u = t >> level * TSHIFT;
                    646:        if( ISPTR(u) ){
                    647:                printf( "*" );
                    648:                pty1( t, name, level-1 );
                    649:                }
                    650:        else if( ISFTN(u) ){
                    651:                if( level > 0 && ISPTR(u << TSHIFT) ){
                    652:                        printf( "(" );
                    653:                        pty1( t, name, level-1 );
                    654:                        printf( ")()" );
                    655:                        }
                    656:                else {
                    657:                        pty1( t, name, level-1 );
                    658:                        printf( "()" );
                    659:                        }
                    660:                }
                    661:        else if( ISARY(u) ){
                    662:                if( level > 0 && ISPTR(u << TSHIFT) ){
                    663:                        printf( "(" );
                    664:                        pty1( t, name, level-1 );
                    665:                        printf( ")[]" );
                    666:                        }
                    667:                else {
                    668:                        pty1( t, name, level-1 );
                    669:                        printf( "[]" );
                    670:                        }
                    671:                }
                    672:        else {
                    673:                pty1( t, name, level-1 );
                    674:                }
                    675:        }
                    676: 
                    677: #ifdef FLEXNAMES
                    678: char *
                    679: getstr(doport)
                    680: {
                    681:        char buf[BUFSIZ];
                    682:        register char *cp = buf;
                    683:        register int c;
                    684: 
                    685:        if (feof(stdin) || ferror(stdin))
                    686:                return("");
                    687:        while ((c = getchar()) > 0)
                    688:                *cp++ = c;
                    689:        if (c < 0) {
                    690:                error("intermediate file format error (getstr)");
                    691:                exit(1);
                    692:        }
                    693:        *cp++ = 0;
                    694:        if (doport)
                    695:                portify(buf);
                    696:        return (hash(buf));
                    697: }
                    698: 
                    699: #define        NSAVETAB        4096
                    700: char   *savetab;
                    701: int    saveleft;
                    702: 
                    703: char *
                    704: savestr(cp)
                    705:        register char *cp;
                    706: {
                    707:        register int len;
                    708: 
                    709:        len = strlen(cp) + 1;
                    710:        if (len > saveleft) {
                    711:                saveleft = NSAVETAB;
                    712:                if (len > saveleft)
                    713:                        saveleft = len;
                    714:                savetab = (char *)malloc(saveleft);
                    715:                if (savetab == 0) {
                    716:                        error("ran out of memory (savestr)");
                    717:                        exit(1);
                    718:                }
                    719:        }
                    720:        strncpy(savetab, cp, len);
                    721:        cp = savetab;
                    722:        savetab += len;
                    723:        saveleft -= len;
                    724:        return (cp);
                    725: }
                    726: 
                    727: /*
                    728:  * The definition for the segmented hash tables.
                    729:  */
                    730: #define        MAXHASH 20
                    731: #define        HASHINC 1013
                    732: struct ht {
                    733:        char    **ht_low;
                    734:        char    **ht_high;
                    735:        int     ht_used;
                    736: } htab[MAXHASH];
                    737: 
                    738: char *
                    739: hash(s)
                    740:        char *s;
                    741: {
                    742:        register char **h;
                    743:        register i;
                    744:        register char *cp;
                    745:        struct ht *htp;
                    746:        int sh;
                    747: 
                    748:        sh = hashstr(s) % HASHINC;
                    749:        cp = s;
                    750:        /*
                    751:         * There are as many as MAXHASH active
                    752:         * hash tables at any given point in time.
                    753:         * The search starts with the first table
                    754:         * and continues through the active tables
                    755:         * as necessary.
                    756:         */
                    757:        for (htp = htab; htp < &htab[MAXHASH]; htp++) {
                    758:                if (htp->ht_low == 0) {
                    759:                        register char **hp =
                    760:                            (char **) calloc(sizeof (char **), HASHINC);
                    761:                        if (hp == 0) {
                    762:                                error("ran out of memory (hash)");
                    763:                                exit(1);
                    764:                        }
                    765:                        htp->ht_low = hp;
                    766:                        htp->ht_high = htp->ht_low + HASHINC;
                    767:                }
                    768:                h = htp->ht_low + sh;
                    769:                /*
                    770:                 * quadratic rehash increment
                    771:                 * starts at 1 and incremented
                    772:                 * by two each rehash.
                    773:                 */
                    774:                i = 1;
                    775:                do {
                    776:                        if (*h == 0) {
                    777:                                if (htp->ht_used > (HASHINC * 3)/4)
                    778:                                        break;
                    779:                                htp->ht_used++;
                    780:                                *h = savestr(cp);
                    781:                                return (*h);
                    782:                        }
                    783:                        if (**h == *cp && strcmp(*h, cp) == 0)
                    784:                                return (*h);
                    785:                        h += i;
                    786:                        i += 2;
                    787:                        if (h >= htp->ht_high)
                    788:                                h -= HASHINC;
                    789:                } while (i < HASHINC);
                    790:        }
                    791:        error("ran out of hash tables");
                    792:        exit(1);
                    793: }
                    794: char   *tstrbuf[1];
                    795: #endif
                    796: 
                    797: #include "ctype.h"
                    798: 
                    799: portify(cp)
                    800: register char *        cp;
                    801: {
                    802:        register int    i;
                    803: 
                    804:        if (!pflag)
                    805:                return;
                    806:        for (i = 0; i < 6; ++i)
                    807:                if (cp[i] == '\0')
                    808:                        return;
                    809:                else if (isascii(cp[i]) && isupper(cp[i]))
                    810:                        cp[i] = tolower(cp[i]);
                    811:        cp[i] = '\0';
                    812: }

unix.superglobalmegacorp.com

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