define strerror() return
[unix-history] / usr / src / usr.bin / find / option.c
CommitLineData
45fc66f9
KB
1/*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Cimarron D. Taylor of the University of California, Berkeley.
7 *
8 * %sccs.include.redist.c%
9 */
10
11#ifndef lint
12static char sccsid[] = "@(#)option.c 5.1 (Berkeley) %G%";
13#endif /* not lint */
14
15#include <sys/types.h>
16#include <sys/stat.h>
17#include <fts.h>
18#include <stdio.h>
19#include "find.h"
20
21typedef struct _option {
22 char *name; /* option name */
23 int token; /* token value */
24 PLAN *(*create)(); /* create function */
25#define O_NONE 0x01 /* no call required */
26#define O_ZERO 0x02 /* pass: nothing */
27#define O_ARGV 0x04 /* pass: argv, increment argv */
28#define O_ARGVP 0x08 /* pass: *argv, T_OK || T_EXEC */
29 int flags;
30} OPTION;
31
32PLAN *c_atime(), *c_ctime(), *c_depth(), *c_exec(), *c_follow(),
33 *c_fstype(), *c_group(), *c_inum(), *c_links(), *c_ls(),
34 *c_mtime(), *c_name(), *c_newer(), *c_nogroup(), *c_nouser(),
35 *c_ok(), *c_perm(), *c_print(), *c_prune(), *c_size(), *c_type(),
36 *c_user(), *c_xdev(), *c_openparen(), *c_closeparen(), *c_not(),
37 *c_or();
38
39OPTION options[] = {
40 "!", T_NOT, c_not, O_ZERO,
41 "(", T_OPENPAREN, c_openparen, O_ZERO,
42 ")", T_CLOSEPAREN, c_closeparen, O_ZERO,
43 "-a", T_AND, (PLAN *(*)())-1,O_NONE,
44 "-atime", T_ATIME, c_atime, O_ARGV,
45 "-ctime", T_CTIME, c_ctime, O_ARGV,
46 "-depth", T_DEPTH, c_depth, O_ZERO,
47 "-exec", T_EXEC, c_exec, O_ARGVP,
48 "-follow", T_FOLLOW, c_follow, O_ZERO,
49 "-fstype", T_FSTYPE, c_fstype, O_ARGV,
50 "-group", T_GROUP, c_group, O_ARGV,
51 "-inum", T_INUM, c_inum, O_ARGV,
52 "-links", T_LINKS, c_links, O_ARGV,
53 "-ls", T_LS, c_ls, O_ZERO,
54 "-mtime", T_MTIME, c_mtime, O_ARGV,
55 "-name", T_NAME, c_name, O_ARGV,
56 "-newer", T_NEWER, c_newer, O_ARGV,
57 "-nogroup", T_NOGROUP, c_nogroup, O_ZERO,
58 "-nouser", T_NOUSER, c_nouser, O_ZERO,
59 "-o", T_OR, c_or, O_ZERO,
60 "-ok", T_OK, c_exec, O_ARGVP,
61 "-perm", T_PERM, c_perm, O_ARGV,
62 "-print", T_PRINT, c_print, O_ZERO,
63 "-prune", T_PRUNE, c_prune, O_ZERO,
64 "-size", T_SIZE, c_size, O_ARGV,
65 "-type", T_TYPE, c_type, O_ARGV,
66 "-user", T_USER, c_user, O_ARGV,
67 "-xdev", T_XDEV, c_xdev, O_ZERO,
68 { NULL },
69};
70
71/*
72 * find_create --
73 * create a node corresponding to a command line argument.
74 *
75 * TODO:
76 * add create/process function pointers to node, so we can skip
77 * this switch stuff.
78 */
79PLAN *
80find_create(argvp)
81 char ***argvp;
82{
83 register OPTION *p;
84 OPTION tmp;
85 PLAN *new;
86 char **argv;
87 OPTION *find_typelookup();
88 int typecompare();
89
90 argv = *argvp;
91 tmp.name = *argv++;
92
93 p = (OPTION *)bsearch(&tmp, options, sizeof(options)/sizeof(OPTION),
94 sizeof(OPTION), typecompare);
95 if (!p) {
96 (void)fprintf(stderr, "find: unknown option %s.\n", *--argv);
97 exit(1);
98 }
99 if (p->flags & (O_ARGV|O_ARGVP) && !*argv) {
100 (void)fprintf(stderr,
101 "find: %s requires additional arguments.\n", *--argv);
102 exit(1);
103 }
104
105 switch(p->flags) {
106 case O_ZERO:
107 new = (p->create)();
108 break;
109 case O_ARGV:
110 new = (p->create)(*argv++);
111 break;
112 case O_ARGVP:
113 new = (p->create)(&argv, p->token == T_OK);
114 break;
115 }
116 *argvp = argv;
117 return(new);
118}
119
120typecompare(a, b)
121 OPTION *a, *b;
122{
123 return(strcmp(a->name, b->name));
124}