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 + -
显示快捷键?