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

📄 files.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* POSIX DEPENDENT PROCEDURES */#include "defs.h"#include <sys/stat.h>#include <ar.h>#define NAMESPERBLOCK	32/* DEFAULT RULES FOR POSIX */char *dfltmacro[] =	{	".SUFFIXES : .o .c .y .l .a .sh .f",	"MAKE=make",	"AR=ar",	"ARFLAGS=rv",	"YACC=yacc",	"YFLAGS=",	"LEX=lex",	"LFLAGS=",	"LDFLAGS=",	"CC=c89",	"CFLAGS=-O",	"FC=fort77",	"FFLAGS=-O 1",	0 };char *dfltpat[] =	{	"%.o : %.c",	"\t$(CC) $(CFLAGS) -c $<",	"%.o : %.y",	"\t$(YACC) $(YFLAGS) $<",	"\t$(CC) $(CFLAGS) -c y.tab.c",	"\trm y.tab.c",	"\tmv y.tab.o $@",	"%.o : %.l",	"\t$(LEX) $(LFLAGS) $<",	"\t$(CC) $(CFLAGS) -c lex.yy.c",	"\trm lex.yy.c",	"\tmv lex.yy.o $@",	"%.c : %.y",	"\t$(YACC) $(YFLAGS) $<",	"\tmv y.tab.c $@",	"%.c : %.l",	"\t$(LEX) $(LFLAGS) $<",	"\tmv lex.yy.c $@",	"% : %.o",	"\t$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<",	"% : %.c",	"\t$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<",	0 };char *dfltsuff[] =	{	".SUFFIXES : .o .c .y .l .a .sh .f",	".c.o :",	"\t$(CC) $(CFLAGS) -c $<",	".f.o :",	"\t$(FC) $(FFLAGS) -c $<",	".y.o :",	"\t$(YACC) $(YFLAGS) $<",	"\t$(CC) $(CFLAGS) -c y.tab.c",	"\trm -f y.tab.c",	"\tmv y.tab.o $@",	".l.o :",	"\t$(LEX) $(LFLAGS) $<",	"\t$(CC) $(CFLAGS) -c lex.yy.c",	"\trm -f 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 $@",	".c.a:",	"\t$(CC) -c $(CFLAGS) $<",	"\t$(AR) $(ARFLAGS) $@ $*.o",	"\trm -f $*.o",	".f.a:",	"\t$(FC) -c $(FFLAGS) $<",	"\t$(AR) $(ARFLAGS) $@ $*.o",	"\trm -f $*.o",	".c:",	"\t$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<",	".f:",	"\t$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $<",	".sh:",	"\tcp $< $@",	"\tchmod a+x $@",	0 };static struct dirhd	*opdir(char *, int);static void		cldir(struct dirhd *, int);static int		amatch(char *, char *);static int		umatch(char *, char *);static void		clarch(void);static int		openarch(char *);static int		getarch(void);time_texists(char *filename){struct stat buf;char *s;for(s = filename ; *s!='\0' && *s!='(' &&  *s!=')' ; ++s)	;if(*s != '\0')	return lookarch(filename);if(stat(filename,&buf) < 0) 	return 0;else	return buf.st_mtime;}time_tprestime(void){time_t t;time(&t);return t;}static char nmtemp[MAXNAMLEN+1];	/* guarantees a null after the name */static char *tempend = nmtemp + MAXNAMLEN;depblkpsrchdir(char *pat, int mkchain, depblkp nextdbl){DIR *dirf;struct dirhd *dirptr;char *dirname, *dirpref, *endir, *filepat, *p, temp[100];char fullname[100];nameblkp q;depblkp thisdbl;struct pattern *patp;struct dirent *dptr;thisdbl = 0;if(mkchain == NO)	for(patp=firstpat ; patp ; patp = patp->nxtpattern)		if(equal(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;	}dirptr = opdir(dirname,YES);dirf = dirptr->dirfc;for( dptr = readdir(dirf) ; dptr ; dptr = readdir(dirf) )	{	char *p1, *p2;	p1 = dptr->d_name;	p2 = nmtemp;	while( (p2<tempend) && (*p2++ = *p1++)!='\0')		;	if( amatch(nmtemp,filepat) )		{		concat(dirpref,nmtemp,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)	*endir = '/';cldir(dirptr, YES);return thisdbl;}static struct dirhd *opdir(char *dirname, int stopifbad){struct dirhd *od;for(od = firstod; od; od = od->nxtdirhd)	if(equal(dirname, od->dirn) )		break;if(od == NULL)	{	++nopdir;	od = ALLOC(dirhd);	od->nxtdirhd = firstod;	firstod = od;	od->dirn = copys(dirname);	}if(od->dirfc==NULL && (od->dirfc = opendir(dirname)) == NULL && stopifbad)	{	fprintf(stderr, "Directory %s: ", dirname);	fatal("Cannot open");	}return od;}static voidcldir(struct dirhd *dp, int used){if(nopdir >= MAXDIR)	{	closedir(dp->dirfc);	dp->dirfc = NULL;	}else if(used)	rewinddir(dp->dirfc); /* start over at the beginning  */}/* stolen from glob through find */static intamatch(char *s, char *p){	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 intumatch(char *s, char *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 */extern void meter(char *file){time_t tvec;char *p;FILE * mout;struct passwd *pwd;if(file==0 || meteron==0) return;pwd = getpwuid(getuid());time(&tvec);if( mout = fopen(file,"a") )	{	p = ctime(&tvec);	p[16] = '\0';	fprintf(mout, "User %s, %s\n", pwd->pw_name, p+4);	fclose(mout);	}}#endif/* look inside archives for notation a(b)	a(b)	is file member   b   in archive a*/static long arflen;static long arfdate;static char arfname[16];FILE *arfd;long int arpos, arlen;time_tlookarch(char *filename){char *p, *q, *send, s[15], pad;int i, nc, nsym;for(p = filename; *p!= '(' ; ++p)	;*p = '\0';if( ! openarch(filename) )	{	*p = '(';	return 0L;	}*p++ = '(';nc = 14;pad = ' ';send = s + nc;for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )	;if(p[0]==')' && p[1]!='\0')	/* forbid stuff after the paren */	{	clarch();	return 0L;	}while(q < send)	*q++ = pad;while(getarch())	{	if( !strncmp(arfname, s, nc))		{		clarch();/*TEMP fprintf(stderr, "found archive member %14s, time=%d\n", s, arfdate); */		return arfdate;		}	}clarch();return  0L;}static voidclarch(void){fclose( arfd );}static intopenarch(char *f){char magic[SARMAG];int word;struct stat buf;nameblkp p;stat(f, &buf);arlen = buf.st_size;arfd = fopen(f, "r");if(arfd == NULL)	return NO;	/* fatal1("cannot open %s", f); */fread( (char *) &word, sizeof(word), 1, arfd);fseek(arfd, 0L, 0);fread(magic, SARMAG, 1, arfd);arpos = SARMAG;if( strncmp(magic, ARMAG, SARMAG) )	fatal1("%s is not an archive", f);if( !(p = srchname(f)) )	p = makename( copys(f) );p->isarch = YES;arflen = 0;return YES;}static intgetarch(void){struct ar_hdr arhead;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);arflen = atol(arhead.ar_size);arfdate = atol(arhead.ar_date);strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name));return 1;}/* find the directory containing name.   read it into the hash table if it hasn't been used before or if   if might have changed since last reference*/voiddirsrch(char *name){DIR *dirf;struct dirhd *dirp;time_t dirt, objt;int dirused, hasparen;char *dirname, *lastslash;char *fullname, *filepart, *fileend, *s;struct dirent *dptr;lastslash = NULL;hasparen = NO;for(s=name; *s; ++s)	if(*s == '/')		lastslash = s;	else if(*s=='(' || *s==')')		hasparen = YES;if(hasparen)	{	if(objt = lookarch(name))		makename(name)->modtime = objt;	return;	}if(lastslash)	{	dirname = name;	*lastslash = '\0';	}else	dirname = ".";dirused = NO;dirp = opdir(dirname, NO);dirf = dirp->dirfc;if(dirp->dirok || !dirf)	goto ret;dirt = exists(dirname);if(dirp->dirtime == dirt)	goto ret;dirp->dirok = YES;dirp->dirtime = dirt;dirused = YES;/* allocate buffer to hold full file name */if(lastslash)	{	fullname = (char *) ckalloc(strlen(dirname)+MAXNAMLEN+2);	concat(dirname, "/", fullname);	filepart = fullname + strlen(fullname);	}else	filepart = fullname = (char *) ckalloc(MAXNAMLEN+1);fileend = filepart + MAXNAMLEN;*fileend = '\0';for(dptr = readdir(dirf) ; dptr ; dptr = readdir(dirf) )	{	char *p1, *p2;	p1 = dptr->d_name;	p2 = filepart;	while( (p2<fileend) && (*p2++ = *p1++)!='\0')		;	if( ! srchname(fullname) )		(void) makename(copys(fullname));	}free(fullname);ret:	cldir(dirp, dirused);	if(lastslash)		*lastslash = '/';}voidbaddirs(void){struct dirhd *od;for(od = firstod; od; od = od->nxtdirhd)	od->dirok = NO;}

⌨️ 快捷键说明

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