⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpass2.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -