|
|
1.1 ! root 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: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)option.c 5.3 (Berkeley) 7/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include <sys/types.h> ! 28: #include <sys/stat.h> ! 29: #include <fts.h> ! 30: #include <stdio.h> ! 31: #include "find.h" ! 32: ! 33: typedef struct _option { ! 34: char *name; /* option name */ ! 35: int token; /* token value */ ! 36: PLAN *(*create)(); /* create function */ ! 37: #define O_NONE 0x01 /* no call required */ ! 38: #define O_ZERO 0x02 /* pass: nothing */ ! 39: #define O_ARGV 0x04 /* pass: argv, increment argv */ ! 40: #define O_ARGVP 0x08 /* pass: *argv, T_OK || T_EXEC */ ! 41: #define O_MASK 0x0f /* mask of op bits */ ! 42: #define O_OLD 0x10 /* deprecated syntax */ ! 43: #define O_NEW 0x20 /* new syntax */ ! 44: int flags; ! 45: } OPTION; ! 46: ! 47: PLAN *c_atime(), *c_ctime(), *c_depth(), *c_exec(), *c_follow(), ! 48: *c_fstype(), *c_group(), *c_inum(), *c_links(), *c_ls(), ! 49: *c_mtime(), *c_name(), *c_newer(), *c_nogroup(), *c_nouser(), ! 50: *c_perm(), *c_print(), *c_prune(), *c_size(), *c_type(), ! 51: *c_user(), *c_xdev(), *c_openparen(), *c_closeparen(), *c_not(), ! 52: *c_or(); ! 53: ! 54: OPTION options[] = { ! 55: "!", T_NOT, c_not, O_ZERO, ! 56: "(", T_OPENPAREN, c_openparen, O_ZERO, ! 57: ")", T_CLOSEPAREN, c_closeparen, O_ZERO, ! 58: "a", T_AND, NULL, O_NONE|O_OLD, ! 59: "and", T_AND, NULL, O_NONE|O_NEW, ! 60: "atime", T_ATIME, c_atime, O_ARGV, ! 61: "ctime", T_CTIME, c_ctime, O_ARGV, ! 62: "depth", T_DEPTH, c_depth, O_ZERO|O_OLD, ! 63: "exec", T_EXEC, c_exec, O_ARGVP, ! 64: "follow", T_FOLLOW, c_follow, O_ZERO|O_OLD, ! 65: "fstype", T_FSTYPE, c_fstype, O_ARGV, ! 66: "group", T_GROUP, c_group, O_ARGV, ! 67: "inum", T_INUM, c_inum, O_ARGV, ! 68: "links", T_LINKS, c_links, O_ARGV, ! 69: "ls", T_LS, c_ls, O_ZERO, ! 70: "mtime", T_MTIME, c_mtime, O_ARGV, ! 71: "name", T_NAME, c_name, O_ARGV, ! 72: "newer", T_NEWER, c_newer, O_ARGV, ! 73: "nogroup", T_NOGROUP, c_nogroup, O_ZERO, ! 74: "nouser", T_NOUSER, c_nouser, O_ZERO, ! 75: "o", T_OR, c_or, O_ZERO|O_OLD, ! 76: "ok", T_OK, c_exec, O_ARGVP, ! 77: "or", T_OR, c_or, O_ZERO|O_NEW, ! 78: "perm", T_PERM, c_perm, O_ARGV, ! 79: "print", T_PRINT, c_print, O_ZERO, ! 80: "prune", T_PRUNE, c_prune, O_ZERO, ! 81: "size", T_SIZE, c_size, O_ARGV, ! 82: "type", T_TYPE, c_type, O_ARGV, ! 83: "user", T_USER, c_user, O_ARGV, ! 84: "xdev", T_XDEV, c_xdev, O_ZERO|O_OLD, ! 85: { NULL }, ! 86: }; ! 87: ! 88: /* ! 89: * find_create -- ! 90: * create a node corresponding to a command line argument. ! 91: * ! 92: * TODO: ! 93: * add create/process function pointers to node, so we can skip ! 94: * this switch stuff. ! 95: */ ! 96: PLAN * ! 97: find_create(argvp) ! 98: char ***argvp; ! 99: { ! 100: extern int deprecated; ! 101: register OPTION *p; ! 102: OPTION tmp; ! 103: PLAN *new; ! 104: char **argv; ! 105: int typecompare(); ! 106: ! 107: argv = *argvp; ! 108: tmp.name = *argv++; ! 109: ! 110: /* strip off any leading dash */ ! 111: if (*tmp.name == '-') ! 112: ++tmp.name; ! 113: ! 114: p = (OPTION *)bsearch(&tmp, options, sizeof(options)/sizeof(OPTION), ! 115: sizeof(OPTION), typecompare); ! 116: if (!p || deprecated && p->flags&O_NEW || ! 117: !deprecated && p->flags&O_OLD) { ! 118: (void)fprintf(stderr, "find: unknown option %s.\n", *--argv); ! 119: exit(1); ! 120: } ! 121: if (p->flags & (O_ARGV|O_ARGVP) && !*argv) { ! 122: (void)fprintf(stderr, ! 123: "find: %s requires additional arguments.\n", *--argv); ! 124: exit(1); ! 125: } ! 126: ! 127: switch(p->flags&O_MASK) { ! 128: case O_NONE: ! 129: new = NULL; ! 130: break; ! 131: case O_ZERO: ! 132: new = (p->create)(); ! 133: break; ! 134: case O_ARGV: ! 135: new = (p->create)(*argv++); ! 136: break; ! 137: case O_ARGVP: ! 138: new = (p->create)(&argv, p->token == T_OK); ! 139: break; ! 140: } ! 141: *argvp = argv; ! 142: return(new); ! 143: } ! 144: ! 145: typecompare(a, b) ! 146: OPTION *a, *b; ! 147: { ! 148: return(strcmp(a->name, b->name)); ! 149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.