📄 lpass2.c
字号:
#else if (strcmp(q->name, "main"))#endif nu = 1; } if( !ISFTN(q->symty.t.aty) ){ switch( q->decflag ){ case LIB: nu = nd = 0; /* don't complain about uses on libraries */ break; case LDX: if( !xflag ) break; case LUV: case LUE:/* 01/04/80 */ case LUV | LUE: case LUM: nd = 1; } } if( uflag && ( nu || nd ) )#ifndef FLEXNAMES printf( mess[nu][nd], q->name, LFNM, fnm[q->fno], q->fline );#else printf( mess[nu][nd], q->name, fnm[q->fno], q->fline );#endif if( (uses&(RVAL+EUSED)) == (RVAL+EUSED) ){ /* if functions is static, then print the file name too */ if( q->decflag & LST )#ifndef FLEXNAMES printf( "%.*s(%d):", LFNM, fnm[q->fno], q->fline );#else printf( "%s(%d):", fnm[q->fno], q->fline );#endif#ifndef FLEXNAMES printf( "%.*s returns value which is %s ignored\n", LCHNM, q->name, uses&VUSED ? "sometimes" : "always" );#else printf( "%s returns value which is %s ignored\n", q->name, uses&VUSED ? "sometimes" : "always" );#endif } if( (uses&(RVAL+VUSED)) == (VUSED) && (q->decflag&(LDI|LIB|LST)) ){ if( q->decflag & LST )#ifndef FLEXNAMES printf( "%.*s(%d):", LFNM, fnm[q->fno], q->fline );#else printf( "%s(%d):", fnm[q->fno], q->fline );#endif#ifndef FLEXNAMES printf( "%.*s value is used, but none returned\n", LCHNM, q->name);#else printf( "%s value is used, but none returned\n", q->name);#endif } }cleanup(){ /* call lastone and die gracefully */ STAB *q; for( q=stab; q< &stab[NSZ]; ++q ){ if( q->decflag ) lastone(q); } exit(0); }setuse(q) STAB *q; { /* check new type to ensure that it is used */ if( !q->decflag ){ /* new one */ q->decflag = r.l.decflag; q->symty.t = r.l.type; if( r.l.nargs < 0 ){ q->nargs = -r.l.nargs; q->use = VARARGS; } else { q->nargs = r.l.nargs; q->use = 0; } q->fline = r.l.fline; q->fno = cfno; if( q->nargs ){ int i; STYPE *qq; for( i=0,qq= &q->symty; i<q->nargs; ++i,qq=qq->next ){ qq->next = tget(); qq->next->t = atyp[i]; } } } switch( r.l.decflag ){ case LRV: q->use |= RVAL; return; case LUV: q->use |= VUSED+USED; return; case LUE: q->use |= EUSED+USED; return;/* 01/04/80 */ case LUV | LUE: case LUM: q->use |= USED; return; } }chktype( pt1, pt2 ) register ATYPE *pt1, *pt2; { TWORD t; /* check the two type words to see if they are compatible */ /* for the moment, enums are turned into ints, and should be checked as such */ if( pt1->aty == ENUMTY ) pt1->aty = INT; if( pt2->aty == ENUMTY ) pt2->aty = INT; if( (t=BTYPE(pt1->aty)==STRTY) || t==UNIONTY ){ if( pt1->aty != pt2->aty || pt1->extra1 != pt2->extra1 ) return 1; /* if -z then don't worry about undefined structures, as long as the names match */ if( zflag && (pt1->extra == 0 || pt2->extra == 0) ) return 0; return pt1->extra != pt2->extra; } if( pt2->extra ){ /* constant passed in */ if( pt1->aty == UNSIGNED && pt2->aty == INT ) return( 0 ); else if( pt1->aty == ULONG && pt2->aty == LONG ) return( 0 ); } else if( pt1->extra ){ /* for symmetry */ if( pt2->aty == UNSIGNED && pt1->aty == INT ) return( 0 ); else if( pt2->aty == ULONG && pt1->aty == LONG ) return( 0 ); } return( pt1->aty != pt2->aty ); }struct tb { int m; char * nm };struct tb dfs[] = { LDI, "LDI", LIB, "LIB", LDC, "LDC", LDX, "LDX", LRV, "LRV", LUV, "LUV", LUE, "LUE", LUM, "LUM", LST, "LST", LFN, "LFN", 0, "" };struct tb us[] = { USED, "USED", VUSED, "VUSED", EUSED, "EUSED", RVAL, "RVAL", VARARGS, "VARARGS", 0, "" };ptb( v, tp ) struct tb *tp; { /* print a value from the table */ int flag; flag = 0; for( ; tp->m; ++tp ){ if( v&tp->m ){ if( flag++ ) putchar( '|' ); printf( "%s", tp->nm ); } } }pst( q ) STAB *q; { /* give a debugging output for q */#ifndef FLEXNAMES printf( "%.8s (", q->name );#else printf( "%s (", q->name );#endif ptb( q->decflag, dfs ); printf( "), use= " ); ptb( q->use, us ); printf( ", line %d, nargs=%d\n", q->fline, q->nargs ); }pfile() { /* print the input file in readable form */ while( lread( LDI|LIB|LDC|LDX|LRV|LUV|LUE|LUM|LST|LFN ) ) prc(); }prc() { /* print out 'r' for debugging */ register i, j, k; printf( "decflag\t" ); ptb( r.l.decflag, dfs ); putchar( '\n' ); if( r.l.decflag & LFN ){#ifdef FLEXNAMES printf( "fn\t\t%s\n", r.f.fn );#else printf( "fn\t%\t.*s\n", LFNM, r.f.fn );#endif } else {#ifdef FLEXNAMES printf( "name\t%s\n", r.l.name );#else printf( "name\t%.*s\n", LCHNM, r.l.name );#endif printf( "nargs\t%d\n", r.l.nargs ); printf( "fline\t%d\n", r.l.fline ); printf( "type.aty\t0%o (", r.l.type.aty ); pty( r.l.type.aty, r.l.name ); printf( ")\ntype.extra\t%d\n", r.l.type.extra ); j = r.l.type.extra1; printf( "type.extra1\t0x%x (%d,%d)\n", j, j & X_NONAME ? 1 : 0, j & ~X_NONAME ); k = r.l.nargs; if( k < 0 ) k = -k; for( i = 0; i < k; i++ ){ printf( "atyp[%d].aty\t0%o (", i, atyp[i].aty ); pty( atyp[i].aty, "" ); printf( ")\natyp[%d].extra\t%d\n", i, atyp[i].extra); j = atyp[i].extra1; printf( "atyp[%d].extra1\t0x%x (%d,%d)\n", i, j, j & X_NONAME ? 1 : 0, j & ~X_NONAME ); } } putchar( '\n' ); }pty( t, name ) TWORD t; { static char * tnames[] = { "void", "farg", "char", "short", "int", "long", "float", "double", "struct xxx", "union %s", "enum", "moety", "unsigned char", "unsigned short", "unsigned", "unsigned long", "?", "?" }; printf( "%s ", tnames[BTYPE(t)] ); pty1( t, name, (8 * sizeof (int) - BTSHIFT) / TSHIFT ); }pty1( t, name, level ) TWORD t; { register TWORD u; if( level < 0 ){ printf( "%s", name ); return; } u = t >> level * TSHIFT; if( ISPTR(u) ){ printf( "*" ); pty1( t, name, level-1 ); } else if( ISFTN(u) ){ if( level > 0 && ISPTR(u << TSHIFT) ){ printf( "(" ); pty1( t, name, level-1 ); printf( ")()" ); } else { pty1( t, name, level-1 ); printf( "()" ); } } else if( ISARY(u) ){ if( level > 0 && ISPTR(u << TSHIFT) ){ printf( "(" ); pty1( t, name, level-1 ); printf( ")[]" ); } else { pty1( t, name, level-1 ); printf( "[]" ); } } else { pty1( t, name, level-1 ); } }#ifdef FLEXNAMESchar *getstr(){ char buf[BUFSIZ]; register char *cp = buf; register int c; if (feof(stdin) || ferror(stdin)) return(""); while ((c = getchar()) > 0) *cp++ = c; if (c < 0) { error("intermediate file format error (getstr)"); exit(1); } *cp++ = 0; return (hash(buf));}#define NSAVETAB 4096char *savetab;int saveleft;char *savestr(cp) register char *cp;{ register int len; len = strlen(cp) + 1; if (len > saveleft) { saveleft = NSAVETAB; if (len > saveleft) saveleft = len; savetab = (char *)malloc(saveleft); if (savetab == 0) { error("ran out of memory (savestr)"); exit(1); } } strncpy(savetab, cp, len); cp = savetab; savetab += len; saveleft -= len; return (cp);}/* * The definition for the segmented hash tables. */#define MAXHASH 20#define HASHINC 1013struct ht { char **ht_low; char **ht_high; int ht_used;} htab[MAXHASH];char *hash(s) char *s;{ register char **h; register i; register char *cp; struct ht *htp; int sh; sh = hashstr(s) % HASHINC; cp = s; /* * There are as many as MAXHASH active * hash tables at any given point in time. * The search starts with the first table * and continues through the active tables * as necessary. */ for (htp = htab; htp < &htab[MAXHASH]; htp++) { if (htp->ht_low == 0) { register char **hp = (char **) calloc(sizeof (char **), HASHINC); if (hp == 0) { error("ran out of memory (hash)"); exit(1); } htp->ht_low = hp; htp->ht_high = htp->ht_low + HASHINC; } h = htp->ht_low + sh; /* * quadratic rehash increment * starts at 1 and incremented * by two each rehash. */ i = 1; do { if (*h == 0) { if (htp->ht_used > (HASHINC * 3)/4) break; htp->ht_used++; *h = savestr(cp); return (*h); } if (**h == *cp && strcmp(*h, cp) == 0) return (*h); h += i; i += 2; if (h >= htp->ht_high) h -= HASHINC; } while (i < HASHINC); } error("ran out of hash tables"); exit(1);}char *tstrbuf[1];#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -