anlwrk.c

来自「unix v7是最后一个广泛发布的研究型UNIX版本」· C语言 代码 · 共 172 行

C
172
字号
#include "uucp.h"#include <sys/types.h>#include <sys/stat.h>#define LLEN 10#define SAME 0/******* *	anlwrk(file, wvec)	create a vector of command arguments *	char *file, **wvec; * *	return codes: *		0  -  no more work in this file *		positive number  -  number of arguments */anlwrk(file, wvec)char *file, **wvec;{	static char str[BUFSIZ];	static FILE *fp = NULL;	if (file[0] == '\0')		return(0);	if (fp == NULL) {		fp = fopen(file, "r");		if (fp == NULL)			return(0);	}	if (fgets(str, BUFSIZ, fp) == NULL) {		fclose(fp);		unlink(file);		file[0] = '\0';		fp = NULL;		return(0);	}	return(getargs(str, wvec));}/*** *	iswrk(file, reqst, dir, pre) *	char *file, *reqst, *dir, *pre; * *	iswrk  -  this routine will check the work list (list). *	If it is empty or the present work is exhausted, it *	will call gtwrk to generate a new list. *	The "reqst" field will be the string "chk" or "get" to *	check for work, or get the next work file respectively. * *	return codes: *		0  -  no more work (or some error) *		1  -  there is work */iswrk(file, reqst, dir, pre)char *file, *reqst, *dir, *pre;{	static char **listp, *list[LLEN];	if (listp == NULL || *listp == NULL || listp > (list + LLEN)	  || !prefix(pre, *listp)) {		int i;		for (i = 0, listp = list; i < LLEN; i++) {			if (*listp != NULL)				free(*listp);			*listp++ = NULL;		}		if (gtwrk(dir, pre, listp = list, LLEN) != 0)			/* alloc error */			return(0);	}	if (*listp == NULL)		return(0);	if (strcmp(reqst, "get") == SAME)		sprintf(file, "%s/%s", dir, *listp++);	return(1);}/*** *	gtwvec(file, dir, wkpre, wrkvec)	get work vector  *	char *file, *dir, *wkpre, **wrkvec; * *	return codes: *		positive number  -  number of arguments *		0 -  no arguments - fail */gtwvec(file, dir, wkpre, wrkvec)char *file, *dir, *wkpre, **wrkvec;{	int nargs;	while ((nargs = anlwrk(file, wrkvec)) == 0) {		if (!iswrk(file, "get", dir, wkpre))			return(0);	}	return(nargs);}#define ANYREAD 04/*** *	gtwrk(dir, pre, list, llen) *	char *dir, *pre, **list; *	int llen; * *	gtwrk  -  this routine will build a sorted list *	of files in a directory. *	"dir" is the directory name to search for file names *	beginning with the prefix (pre). *	"list" is the pointer to the list and "llen" is the *	length of the list. * *	return codes:  0  |  FAIL */gtwrk(dir, pre, list, llen)char *dir, *pre, **list;int llen;{	struct stat s;	char filename[NAMESIZE], *p;	char **first, **last;	FILE *pdir;	extern int compar();	extern char *calloc();	first = last = list;	if ((pdir = fopen(dir, "r")) == NULL)		return(FAIL);	while (gnamef(pdir, filename)) {		if (!prefix(pre, filename))			continue;		if (stat(filename, &s) == -1)			continue;		if ((s.st_mode & ANYREAD) == 0)			continue;		if ((p = calloc(strlen(filename) + 1, sizeof (char))) == NULL)			return(FAIL);		strcpy(p, filename);		if ((last - first) < llen)			*last++ = p;	}	fclose(pdir);	qsort(first, last - first, sizeof *last, compar);	return(0);}/*** *	compar(p1, p2) *	char **p1, **p2; * *	compar  -  this routine is used by qsort. * */compar(p1, p2)char **p1, **p2;{	return(strcmp(*p1, *p2));}

⌨️ 快捷键说明

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