summaryrefslogtreecommitdiff
path: root/contrib/global/lib/find.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/global/lib/find.c')
-rw-r--r--contrib/global/lib/find.c409
1 files changed, 65 insertions, 344 deletions
diff --git a/contrib/global/lib/find.c b/contrib/global/lib/find.c
index 4682beec1d6d..10a9bf1cde78 100644
--- a/contrib/global/lib/find.c
+++ b/contrib/global/lib/find.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 1997, 1998 Shigio Yamaguchi. All rights reserved.
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,159 +28,115 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * find.c 1-May-98
+ * find.c 20-Oct-97
*
*/
-/*
- * USEFIND use find(1) to traverse directory tree.
- * Otherwise, use dirent(3) library.
- */
-#define USEFIND
-
-#include <sys/param.h>
-
-#include <assert.h>
-#include <ctype.h>
-#ifndef USEFIND
-#include <dirent.h>
-#ifndef BSD4_4
-#include <sys/stat.h>
-#endif
-#endif
#include <stdio.h>
-#include <stdlib.h>
-#include <strings.h>
+#include <string.h>
+#include <sys/types.h>
#include <regex.h>
-
-#include "conf.h"
-#include "die.h"
-#include "find.h"
+#include <sys/param.h>
#include "gparam.h"
+#include "find.h"
+#include "die.h"
#include "locatestring.h"
-#include "makepath.h"
-#include "strbuf.h"
/*
* usage of findxxx()
*
- * findopen(db);
+ * findopen();
* while (path = findread(&length)) {
* ...
* }
* findclose();
*
*/
+static char *skippath[] = {
+ "y.tab.c",
+ "y.tab.h",
+ "SCCS/",
+ "RCS/",
+};
+static char *ext[] = {
+ "c",
+ "h",
+ "y",
+ "s",
+ "S",
+};
+static char findcom[MAXCOMLINE+1];
static regex_t skip_area;
-static regex_t *skip = &skip_area;
+static regex_t *skip;
+static FILE *ip;
static int opened;
-static void trim __P((char *));
-
-/*
- * trim: remove blanks and '\'.
- */
-static void
-trim(s)
-char *s;
+int
+issource(path)
+char *path;
{
char *p;
- for (p = s; *s; s++) {
- if (isspace(*s))
- continue;
- if (*s == '\\' && *(s + 1))
- s++;
- *p++ = *s;
+ if (!(p = locatestring(path, ".", 2)))
+ return 0;
+ ++p;
+ if (sizeof(ext) != 0) {
+ int i, lim = sizeof(ext)/sizeof(char *);
+ for (i = 0; i < lim; i++)
+ if (*ext[i] == *p && !strcmp(ext[i], p))
+ return 1;
}
- *p = 0;
+ return 0;
}
-#ifdef USEFIND
-/*----------------------------------------------------------------------*/
-/* find command version */
-/*----------------------------------------------------------------------*/
-static FILE *ip;
void
-findopen()
+findopen(void)
{
- char *findcom, *p, *q;
- STRBUF *sb;
- char *sufflist = NULL;
- char *skiplist = NULL;
+ char edit[512], *p, *q;
+ int i, lim;
- assert(opened == 0);
+ if (opened)
+ die("nested call to findopen.");
opened = 1;
-
- sb = stropen();
- if (!getconfs("suffixes", sb))
- die("cannot get suffixes data.");
- sufflist = strdup(strvalue(sb));
- if (!sufflist)
- die("short of memory.");
- trim(sufflist);
- strstart(sb);
- if (getconfs("skip", sb)) {
- skiplist = strdup(strvalue(sb));
- if (!skiplist)
- die("short of memory.");
- trim(skiplist);
- }
-
- strstart(sb);
- strputs(sb, "find . \\( -type f -o -type l \\) \\(");
- for (p = sufflist; p; ) {
- char *suff = p;
- if ((p = locatestring(p, ",", MATCH_FIRST)) != NULL)
- *p++ = 0;
- strputs(sb, " -name '*.");
- strputs(sb, suff);
- strputs(sb, "'");
- if (p)
- strputs(sb, " -o");
+ p = findcom;
+ strcpy(p, "find . \\( -type f -o -type l \\) \\(");
+ p += strlen(p);
+ lim = sizeof(ext)/sizeof(char *);
+ for (i = 0; i < lim; i++) {
+ sprintf(p, " -name '*.%s'%s", ext[i], (i + 1 < lim) ? " -o" : "");
+ p += strlen(p);
}
- strputs(sb, " \\) -print");
- findcom = strvalue(sb);
-
- if (skiplist) {
- char *reg;
- STRBUF *sbb = stropen();
+ sprintf(p, " \\) -print");
+ if (sizeof(skippath) != 0) {
+ int i, lim = sizeof(skippath)/sizeof(char *);
/*
* construct regular expression.
*/
- strputc(sbb, '('); /* ) */
- for (p = skiplist; p; ) {
- char *skipf = p;
- if ((p = locatestring(p, ",", MATCH_FIRST)) != NULL)
- *p++ = 0;
- strputc(sbb, '/');
- for (q = skipf; *q; q++) {
+ p = edit;
+ *p++ = '(';
+ for (i = 0; i < lim; i++) {
+ *p++ = '/';
+ for (q = skippath[i]; *q; q++) {
if (*q == '.')
- strputc(sbb, '\\');
- strputc(sbb, *q);
+ *p++ = '\\';
+ *p++ = *q;
}
if (*(q - 1) != '/')
- strputc(sbb, '$');
- if (p)
- strputc(sbb, '|');
+ *p++ = '$';
+ *p++ = '|';
}
- strputc(sbb, ')');
- reg = strvalue(sbb);
+ *(p - 1) = ')';
+ *p = 0;
/*
* compile regular expression.
*/
- if (regcomp(skip, reg, REG_EXTENDED|REG_NEWLINE) != 0)
+ skip = &skip_area;
+ if (regcomp(skip, edit, REG_EXTENDED|REG_NEWLINE) != 0)
die("cannot compile regular expression.");
- strclose(sbb);
} else {
skip = (regex_t *)0;
}
if (!(ip = popen(findcom, "r")))
die("cannot execute find.");
- strclose(sb);
- if (sufflist)
- free(sufflist);
- if (skiplist)
- free(skiplist);
}
char *
findread(length)
@@ -189,12 +145,8 @@ int *length;
static char path[MAXPATHLEN+1];
char *p;
- assert(opened == 1);
while (fgets(path, MAXPATHLEN, ip)) {
if (!skip || regexec(skip, path, 0, 0, 0) != 0) {
- /*
- * chop(path)
- */
p = path + strlen(path) - 1;
if (*p != '\n')
die("output of find(1) is wrong (findread).");
@@ -204,242 +156,11 @@ int *length;
return path;
}
}
- return NULL;
+ return (char *)0;
}
void
findclose(void)
{
- assert(opened == 1);
pclose(ip);
opened = 0;
}
-#else /* USEFIND */
-/*----------------------------------------------------------------------*/
-/* dirent version findxxx() */
-/*----------------------------------------------------------------------*/
-#define STACKSIZE 50
-static char dir[MAXPATHLEN+1]; /* directory path */
-static struct {
- STRBUF *sb;
- char *dirp, *start, *end, *p;
-} stack[STACKSIZE], *topp, *curp; /* stack */
-
-static regex_t suff_area;
-static regex_t *suff = &suff_area;
-
-static int
-getdirs(dir, sb)
-char *dir;
-STRBUF *sb;
-{
- DIR *dirp;
- struct dirent *dp;
-#ifndef BSD4_4
- struct stat st;
-#endif
-
- if ((dirp = opendir(dir)) == NULL)
- return -1;
- while ((dp = readdir(dirp)) != NULL) {
-#ifdef BSD4_4
- if (dp->d_namlen == 1 && dp->d_name[0] == '.')
- continue;
- if (dp->d_namlen == 2 && dp->d_name[0] == '.' && dp->d_name[1] == '.')
- continue;
- if (dp->d_type == DT_DIR)
- strputc(sb, 'd');
- else if (dp->d_type == DT_REG)
- strputc(sb, 'f');
- else if (dp->d_type == DT_LNK)
- strputc(sb, 'l');
- else
- strputc(sb, ' ');
- strnputs(sb, dp->d_name, (int)dp->d_namlen);
-#else
- if (stat(path, &st) < 0) {
- fprintf(stderr, "cannot stat '%s'. (Ignored)\n", path);
- continue;
- }
- if (S_ISDIR(st.st_mode))
- strputc(sb, 'd');
- else if (S_ISREG(st.st_mode))
- strputc(sb, 'f');
- else if (S_ISLNK(st.st_mode))
- strputc(sb, 'l');
- else
- strputc(sb, ' ');
- strputs(sb, dp->d_name);
-#endif /* BSD4_4 */
- strputc(sb, '\0');
- }
- (void)closedir(dirp);
- return 0;
-}
-void
-findopen()
-{
- STRBUF *sb = stropen();
- char *sufflist = NULL;
- char *skiplist = NULL;
-
- assert(opened == 0);
- opened = 1;
-
- /*
- * setup stack.
- */
- curp = &stack[0];
- topp = curp + STACKSIZE;
- strcpy(dir, ".");
-
- curp->dirp = dir + strlen(dir);
- curp->sb = stropen();
- if (getdirs(dir, curp->sb) < 0)
- die("cannot open '.' directory.");
- curp->start = curp->p = strvalue(curp->sb);
- curp->end = curp->start + strbuflen(curp->sb);
-
- /*
- * preparing regular expression.
- */
- strstart(sb);
- if (!getconfs("suffixes", sb))
- die("cannot get suffixes data.");
- sufflist = strdup(strvalue(sb));
- if (!sufflist)
- die("short of memory.");
- trim(sufflist);
- strstart(sb);
- if (getconfs("skip", sb)) {
- skiplist = strdup(strvalue(sb));
- if (!skiplist)
- die("short of memory.");
- trim(skiplist);
- }
- {
- char *p;
-
- strstart(sb);
- strputc(sb, '('); /* ) */
- for (p = sufflist; p; ) {
- char *suffp = p;
- if ((p = locatestring(p, ",", MATCH_FIRST)) != NULL)
- *p++ = 0;
- strputs(sb, "\\.");
- strputs(sb, suffp);
- strputc(sb, '$');
- if (p)
- strputc(sb, '|');
- }
- strputc(sb, ')');
- /*
- * compile regular expression.
- */
- if (regcomp(suff, strvalue(sb), REG_EXTENDED) != 0)
- die("cannot compile regular expression.");
- }
- if (skiplist) {
- char *p, *q;
- /*
- * construct regular expression.
- */
- strstart(sb);
- strputc(sb, '('); /* ) */
- for (p = skiplist; p; ) {
- char *skipf = p;
- if ((p = locatestring(p, ",", MATCH_FIRST)) != NULL)
- *p++ = 0;
- strputc(sb, '/');
- for (q = skipf; *q; q++) {
- if (*q == '.')
- strputc(sb, '\\');
- strputc(sb, *q);
- }
- if (*(q - 1) != '/')
- strputc(sb, '$');
- if (p)
- strputc(sb, '|');
- }
- strputc(sb, ')');
- /*
- * compile regular expression.
- */
- if (regcomp(skip, strvalue(sb), REG_EXTENDED) != 0)
- die("cannot compile regular expression.");
- } else {
- skip = (regex_t *)0;
- }
- strclose(sb);
- if (sufflist)
- free(sufflist);
- if (skiplist)
- free(skiplist);
-}
-char *
-findread(length)
-int *length;
-{
- static char val[MAXPATHLEN+1];
-
- for (;;) {
- while (curp->p < curp->end) {
- char type = *(curp->p);
- char *unit = curp->p + 1;
-
- curp->p += strlen(curp->p) + 1;
- if (type == 'f' || type == 'l') {
- char *path = makepath(dir, unit);
- if (regexec(suff, path, 0, 0, 0) != 0)
- continue;
- if (skip && regexec(skip, path, 0, 0, 0) == 0)
- continue;
- strcpy(val, path);
- return val;
- }
- if (type == 'd') {
- STRBUF *sb = stropen();
- char *dirp = curp->dirp;
-
- strcat(dirp, "/");
- strcat(dirp, unit);
- if (getdirs(dir, sb) < 0) {
- fprintf(stderr, "cannot open directory '%s'. (Ignored)\n", dir);
- strclose(sb);
- *(curp->dirp) = 0;
- continue;
- }
- /*
- * Push stack.
- */
- if (++curp >= topp)
- die("directory stack over flow.");
- curp->dirp = dirp + strlen(dirp);
- curp->sb = sb;
- curp->start = curp->p = strvalue(sb);
- curp->end = curp->start + strbuflen(sb);
- }
- }
- strclose(curp->sb);
- curp->sb = NULL;
- if (curp == &stack[0])
- break;
- /*
- * Pop stack.
- */
- curp--;
- *(curp->dirp) = 0;
- }
- return NULL;
-}
-void
-findclose(void)
-{
- assert(opened == 1);
- for (curp = &stack[0]; curp < topp; curp++)
- if (curp->sb != NULL)
- strclose(curp->sb);
- else
- break;
- opened = 0;
-}
-#endif /* !USEFIND */