files.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 540 行

C
540
字号
static	char	*sccsid = "@(#)files.c	4.1	(ULTRIX)	7/17/90";/* UNIX DEPENDENT PROCEDURES *//* DEFAULT RULES FOR UNIX */char *builtin[] =	{#ifdef pwb	".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl",#else	".SUFFIXES : .out .o .c .F .f .e .r .y .yr .ye .l .s .cl .p",#endif	"YACC=yacc",	"YACCR=yacc -r",	"YACCE=yacc -e",	"YFLAGS=",	"LEX=lex",	"LFLAGS=",	"LINT=/usr/bin/lint",	"LINTFLAGS=",	"CC=/bin/cc",#if defined(vax) || defined(sun)	"AS=as",#else	"AS=as -",#endif	"SCCS=/usr/ucb/sccs",	"ECHO=/bin/echo",	"MAKE=/bin/make",	"PC=pc",	"PFLAGS=",	"CFLAGS=",	"RC=f77",	"RFLAGS=",	"FC=f77",	"EFLAGS=",	"FFLAGS=",	"LOADLIBES=",#ifdef pwb	"SCOMP=scomp",	"SCFLAGS=",	"CMDICT=cmdict",	"CMFLAGS=",#endif	".c.o :",	"\t$(CC) $(CFLAGS) -c $<",	".p.o :",	"\t$(PC) $(PFLAGS) -c $<",	".cl.o :",	"\tclass -c $<",	".e.o .r.o .F.o .f.o :",	"\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",	".s.o :",	"\t$(AS) -o $@ $<",	".y.o :",	"\t$(YACC) $(YFLAGS) $<",	"\t$(CC) $(CFLAGS) -c y.tab.c",	"\trm y.tab.c",	"\tmv y.tab.o $@",	".yr.o:",	"\t$(YACCR) $(YFLAGS) $<",	"\t$(RC) $(RFLAGS) -c y.tab.r",	"\trm y.tab.r",	"\tmv y.tab.o $@",	".ye.o :",	"\t$(YACCE) $(YFLAGS) $<",	"\t$(EC) $(RFLAGS) -c y.tab.e",	"\trm y.tab.e",	"\tmv y.tab.o $@",	".l.o :",	"\t$(LEX) $(LFLAGS) $<",	"\t$(CC) $(CFLAGS) -c lex.yy.c",	"\trm lex.yy.c",	"\tmv lex.yy.o $@",	".y.c :",	"\t$(YACC) $(YFLAGS) $<",	"\tmv y.tab.c $@",	".l.c :",	"\t$(LEX) $(LFLAGS) $<",	"\tmv lex.yy.c $@",	".yr.r:",	"\t$(YACCR) $(YFLAGS) $<",	"\tmv y.tab.r $@",	".ye.e :",	"\t$(YACCE) $(YFLAGS) $<",	"\tmv y.tab.e $@",#ifdef pwb	".o.L .c.L .t.L:",	"\t$(SCOMP) $(SCFLAGS) $<",	".t.o:",	"\t$(SCOMP) $(SCFLAGS) -c $<",	".t.c:",	"\t$(SCOMP) $(SCFLAGS) -t $<",	".h.z .t.z:",	"\t$(CMDICT) $(CMFLAGS) $<",	".h.x .t.x:",	"\t$(CMDICT) $(CMFLAGS) -c $<",#endif	".s.out .c.out .o.out :",	"\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",	".f.out .F.out .r.out .e.out :",	"\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",	"\t-rm $*.o",	".y.out :",	"\t$(YACC) $(YFLAGS) $<",	"\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@",	"\trm y.tab.c",	".l.out :",	"\t$(LEX) $(LFLAGS) $<",	"\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",	"\trm lex.yy.c",	0 };#include "defs"#include <sys/stat.h>TIMETYPE exists(filename)char *filename;{struct stat buf;register char *s;TIMETYPE lookarch();for(s = filename ; *s!='\0' && *s!='(' ; ++s)	;if(*s == '(')	return(lookarch(filename));if (stat(filename, &buf) < 0)	return(0);else	return(buf.st_mtime);}TIMETYPE prestime(){TIMETYPE t;time(&t);return(t);}FSTATIC char nbuf[MAXNAMLEN + 1];FSTATIC char *nbufend	= &nbuf[MAXNAMLEN];struct depblock *srchdir(pat, mkchain, nextdbl)register char *pat; /* pattern to be matched in directory */int mkchain;  /* nonzero if results to be remembered */struct depblock *nextdbl;  /* final value for chain */{DIR *dirf;register int i;int nread, cldir;char *dirname, *dirpref, *endir, *filepat, *p, temp[100];char fullname[100], *p1, *p2;struct nameblock *q;struct depblock *thisdbl;struct dirhdr *od;struct pattern *patp;struct direct *dptr;thisdbl = 0;if(mkchain == NO)	for(patp=firstpat ; patp ; patp = patp->nxtpattern)		if(! unequal(pat, patp->patval)) return(0);patp = ALLOC(pattern);patp->nxtpattern = firstpat;firstpat = patp;patp->patval = copys(pat);endir = 0;for(p=pat; *p!='\0'; ++p)	if(*p=='/') endir = p;if(endir==0)	{	dirname = ".";	dirpref = "";	filepat = pat;	}else	{	dirname = pat;	*endir = '\0';	dirpref = concat(dirname, "/", temp);	filepat = endir+1;	}dirf = NULL;cldir = NO;for(od = firstod; od; od = od->nxtopendir)	if(! unequal(dirname, od->dirn) )		{		dirf = od->dirfc;		if (dirf != NULL)			rewinddir(dirf); /* start over at the beginning  */		break;		}if(dirf == NULL)	{	dirf = opendir(dirname);	if(nopdir >= MAXDIR)		cldir = YES;	else	{		++nopdir;		od = ALLOC(dirhdr);		od->nxtopendir = firstod;		firstod = od;		od->dirfc = dirf;		od->dirn = copys(dirname);		}	}if(dirf == NULL)	{	fprintf(stderr, "Directory %s: ", dirname);	fatal("Cannot open");	}else for (dptr = readdir(dirf); dptr != NULL; dptr = readdir(dirf))	{	p1 = dptr->d_name;	p2 = nbuf;	while( (p2<nbufend) && (*p2++ = *p1++)!='\0' )		/* void */;	if( amatch(nbuf,filepat) )		{		concat(dirpref,nbuf,fullname);		if( (q=srchname(fullname)) ==0)			q = makename(copys(fullname));		if(mkchain)			{			thisdbl = ALLOC(depblock);			thisdbl->nxtdepblock = nextdbl;			thisdbl->depname = q;			nextdbl = thisdbl;			}		}	}if(endir != 0)  *endir = '/';if(cldir) {	closedir(dirf);	dirf = NULL;}return(thisdbl);}/* stolen from glob through find */static amatch(s, p)char *s, *p;{	register int cc, scc, k;	int c, lc;	scc = *s;	lc = 077777;	switch (c = *p) {	case '[':		k = 0;		while (cc = *++p) {			switch (cc) {			case ']':				if (k)					return(amatch(++s, ++p));				else					return(0);			case '-':				k |= (lc <= scc)  & (scc <= (cc=p[1]) ) ;			}			if (scc==(lc=cc)) k++;		}		return(0);	case '?':	caseq:		if(scc) return(amatch(++s, ++p));		return(0);	case '*':		return(umatch(s, ++p));	case 0:		return(!scc);	}	if (c==scc) goto caseq;	return(0);}static umatch(s, p)char *s, *p;{	if(*p==0) return(1);	while(*s)		if (amatch(s++,p)) return(1);	return(0);}#ifdef METERFILE#include <pwd.h>int meteron	= 0;	/* default: metering off */meter(file)char *file;{TIMETYPE tvec;char *p, *ctime();FILE * mout;struct passwd *pwd, *getpwuid();if(file==0 || meteron==0) return;pwd = getpwuid(getuid());time(&tvec);if( (mout=fopen(file,"a")) != NULL )	{	p = ctime(&tvec);	p[16] = '\0';	fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);	fclose(mout);	}}#endif/* look inside archives for notations a(b) and a((b))	a(b)	is file member   b   in archive a	a((b))	is entry point  _b  in object archive a*/#ifdef ASCARCH#	include <ar.h>#else#	include <ar.h>#endif#include <a.out.h>static long arflen;static long arfdate;static char arfname[16];FILE *arfd;long int arpos, arlen;static struct exec objhead;static struct nlist objentry;TIMETYPE lookarch(filename)char *filename;{char *p, *q, *send, s[MAXNAMLEN + 1];int i, nc, nsym, objarch;for(p = filename; *p!= '(' ; ++p)	;*p = '\0';openarch(filename);*p++ = '(';if(*p == '(')	{	objarch = YES;	nc = 8;	++p;	}else	{	objarch = NO;	nc = MAXNAMLEN;	}send = s + nc;for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )	;while(q < send)	*q++ = '\0';while(getarch())	{	if(objarch)		{		getobj();		nsym = objhead.a_syms / sizeof(objentry);		for(i = 0; i<nsym ; ++i)			{			fread( (char *) &objentry, sizeof(objentry),1,arfd);			if( (objentry.n_type & N_EXT)			   && ((objentry.n_type & ~N_EXT) || objentry.n_value)			   && eqstr(objentry.n_un.n_name,s,nc))				{				clarch();				return(arfdate);				}			}		}	else if( eqstr(arfname, s, nc))		{		clarch();		return(arfdate);		}	}clarch();return( 0L);}clarch(){fclose( arfd );}openarch(f)register char *f;{#ifdef ASCARCHchar magic[SARMAG];#endifint word;struct stat buf;stat(f, &buf);arlen = buf.st_size;arfd = fopen(f, "r");if(arfd == NULL)	fatal1("cannot open %s", f);	fread( (char *) &word, sizeof(word), 1, arfd);#ifdef ASCARCH	fseek(arfd, 0L, 0);	fread(magic, SARMAG, 1, arfd);	arpos = SARMAG;	if( ! eqstr(magic, ARMAG, SARMAG) )#else	arpos = sizeof(word);	if(word != ARMAG)#endif		fatal1("%s is not an archive", f);arflen = 0;}getarch(){	struct ar_hdr arhead;	long atol();arpos += (arflen + 1) & ~1L;	/* round archived file length up to even */if(arpos >= arlen)	return(0);fseek(arfd, arpos, 0);	fread( (char *) &arhead, sizeof(arhead), 1, arfd);	arpos += sizeof(arhead);#ifdef ASCARCH	arflen = atol(arhead.ar_size);	arfdate = atol(arhead.ar_date);#else	arflen = arhead.ar_size;	arfdate = arhead.ar_date;#endif	strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name));return(1);}getobj(){long int skip;fread( (char *) &objhead, sizeof(objhead), 1, arfd);if (N_BADMAG(objhead))	fatal1("%s is not an object module", arfname);skip = objhead.a_text + objhead.a_data;#if defined(vax) || defined(sun)skip += objhead.a_trsize + objhead.a_drsize;#elseif(! objhead.a_flag )	skip *= 2;#endiffseek(arfd, skip, 1);}eqstr(a,b,n)register char *a, *b;int n;{register int i;for(i = 0 ; i < n ; ++i)	if(*a++ != *b++)		return(NO);return(YES);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?