new version derived from Cimarron Taylor's
[unix-history] / usr / src / usr.bin / find / misc.c
/*-
* 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);
}