new version derived from Cimarron Taylor's
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Fri, 4 May 1990 13:01:02 +0000 (05:01 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Fri, 4 May 1990 13:01:02 +0000 (05:01 -0800)
SCCS-vsn: usr.bin/find/misc.c 5.1

usr/src/usr.bin/find/misc.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/find/misc.c b/usr/src/usr.bin/find/misc.c
new file mode 100644 (file)
index 0000000..80f22b4
--- /dev/null
@@ -0,0 +1,136 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * %sccs.include.redist.c%
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)misc.c     5.1 (Berkeley) %G%";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include "find.h"
+/*
+ * find_getpaths --
+ *     remove the path strings from the command line and returns them in
+ *     another array.  The find syntax assumes all command arguments up
+ *     to the first one beginning with a '-', '(' or '!' are pathnames.
+ */
+char **
+find_getpaths(argvp)
+       char ***argvp;
+{
+       register char **argv;
+       char **start;
+
+       /*
+        * find first '-', '(' or '!' to delimit paths; if no paths, it's
+        * an error.  Shift the array back one at the same time, creating
+        * a separate array of pathnames.
+        */
+       for (argv = *argvp + 1;; ++argv) {
+               argv[-1] = argv[0];
+               if (!*argv || **argv == '-' || **argv == '!' || **argv == '(')
+                       break;
+       }
+
+       if (argv == *argvp + 1)
+               usage();
+
+       argv[-1] = NULL;
+
+       start = *argvp;                 /* save beginning of path array */
+       *argvp = argv;                  /* move argv value */
+       return(start);                  /* return path array */
+}
+    
+/*
+ * find_subst --
+ *     Replace occurrences of {} in s1 with s2 and return the result string.
+ *     Find_subst always returns a newly allocated string which should be
+ *     freed by the caller.
+ */
+find_subst(orig, store, path, len)
+       char *orig, **store, *path;
+       int len;
+{
+       register int plen;
+       register char ch, *p;
+       char *realloc();
+
+       plen = strlen(path);
+       for (p = *store; ch = *orig; ++orig)
+               if (ch == '{' && orig[1] == '}') {
+                       while ((p - *store) + plen > len)
+                               if (!(*store = realloc(*store, len *= 2))) {
+                                       (void)fprintf(stderr,
+                                           "find: %s.\n", strerror(errno));
+                                       exit(1);
+                               }
+                       bcopy(path, p, plen);
+                       p += plen;
+                       ++orig;
+               } else
+                       *p++ = ch;
+       *p = '\0';
+}
+
+/*
+ * find_queryuser --
+ *     print a message to standard error and then read input from standard
+ *     input. If the input is 'y' then 1 is returned.
+ */
+find_queryuser(argv)
+       register char **argv;
+{
+       char buf[10];
+
+       (void)fprintf(stderr, "\"%s", *argv);
+       while (*++argv)
+               (void)fprintf(stderr, " %s", *argv);
+       (void)fprintf(stderr, "\"? ");
+       (void)fflush(stderr);
+       return(!fgets(buf, sizeof(buf), stdin) || buf[0] != 'y' ? 0 : 1);
+}
+/*
+ * bad_arg --
+ *     print out a bad argument message.
+ */
+void
+bad_arg(option, error)
+       char *option, *error;
+{
+       (void)fprintf(stderr, "find: %s: %s.\n", option, error);
+       exit(1);
+}
+/*
+ * emalloc --
+ *     malloc with error checking.
+ */
+char *
+emalloc(len)
+       u_int len;
+{
+       char *p, *malloc();
+
+       if (!(p = malloc(len))) {
+               (void)fprintf(stderr, "find: %s.\n", strerror(errno));
+               exit(1);
+       }
+       return(p);
+}
+
+usage()
+{
+       (void)fprintf(stderr, "usage: find path-list expression\n");
+       exit(1);
+}