From 77d3af375670e3406aa9320cb06f23e07aef6169 Mon Sep 17 00:00:00 2001 From: Evan Gates Date: Fri, 20 Feb 2015 17:30:28 -0800 Subject: [PATCH] make gobals static, change execv to execvp, fix a comment, change some data types, rearrange struct members from largest to smallest (no affect due to small structs, good practice) --- find.c | 68 ++++++++++++++++++++++++++++++++---------------------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/find.c b/find.c index 257b4a9..bb9f344 100644 --- a/find.c +++ b/find.c @@ -40,31 +40,31 @@ typedef struct { /* Information about operators, for lookup table */ typedef struct { char *name; /* string representation of op */ - int type; /* from Tok.type */ - int prec; /* precedence */ - int nargs; /* number of arguments (unary or binary) */ - int lassoc; /* left associative */ + char type; /* from Tok.type */ + char prec; /* precedence */ + char nargs; /* number of arguments (unary or binary) */ + char lassoc; /* left associative */ } Op_info; /* Token when lexing/parsing * (although also used for the expression tree) */ typedef struct Tok Tok; struct Tok { - enum { - PRIM = 0, LPAR, RPAR, NOT, AND, OR, END - } type; + Tok *left, *right; /* if (type == NOT) left = NULL */ + Extra extra; union { Pri_info *pinfo; /* if (type == PRIM) */ Op_info *oinfo; } u; - Extra extra; - Tok *left, *right; /* if (type == NOT) left = NULL */ + enum { + PRIM = 0, LPAR, RPAR, NOT, AND, OR, END + } type; }; /* structures used for Arg.extra.p and Tok.extra.p */ typedef struct { - mode_t mode; - unsigned char exact; + mode_t mode; + char exact; } Permarg; typedef struct { @@ -83,7 +83,7 @@ typedef struct { typedef struct { Narg n; - unsigned char bytes; /* size is in bytes, not 512 byte sectors */ + char bytes; /* size is in bytes, not 512 byte sectors */ } Sizearg; typedef struct { @@ -99,8 +99,8 @@ typedef struct { size_t cap; /* capacity of argv */ } p; /* plus */ } u; - char **argv; /* NULL terminated list of arguments (allocated if isplus) */ - unsigned char isplus; /* -exec + instead of -exec ; */ + char **argv; /* NULL terminated list of arguments (allocated if isplus) */ + char isplus; /* -exec + instead of -exec ; */ } Execarg; /* used to find loops while recursing through directory structure */ @@ -168,14 +168,14 @@ static int cmp_gt(int a, int b) { return a > b; } static int cmp_eq(int a, int b) { return a == b; } static int cmp_lt(int a, int b) { return a < b; } -int (*cmps[])(int, int) = { +static int (*cmps[])(int, int) = { [GT] = cmp_gt, [EQ] = cmp_eq, [LT] = cmp_lt, }; /* order from find(1p), may want to alphabetize */ -Pri_info primaries[] = { +static Pri_info primaries[] = { { "-name" , pri_name , get_name_arg , NULL }, { "-path" , pri_path , get_path_arg , NULL }, { "-nouser" , pri_nouser , NULL , NULL }, @@ -200,7 +200,7 @@ Pri_info primaries[] = { { NULL, NULL, NULL, NULL } }; -Op_info ops[] = { +static Op_info ops[] = { { "(" , LPAR, 0, 0, 0 }, /* parens are handled specially */ { ")" , RPAR, 0, 0, 0 }, { "!" , NOT , 3, 1, 0 }, @@ -212,23 +212,21 @@ Op_info ops[] = { extern char **environ; -Tok *toks; /* holds allocated array of all Toks created while parsing */ -Tok *root; /* points to root of expression tree, inside toks array */ +static Tok *toks; /* holds allocated array of all Toks created while parsing */ +static Tok *root; /* points to root of expression tree, inside toks array */ -struct timespec start; /* time find was started, used for -[acm]time */ +static struct timespec start; /* time find was started, used for -[acm]time */ -size_t envlen; /* number of bytes in environ, used to calculate against ARG_MAX */ -size_t argmax; /* value of ARG_MAX retrieved using sysconf(3p) */ +static size_t envlen; /* number of bytes in environ, used to calculate against ARG_MAX */ +static size_t argmax; /* value of ARG_MAX retrieved using sysconf(3p) */ -struct { - unsigned ret ; /* return value from main */ - unsigned depth; /* -depth, directory contents before directory itself */ - unsigned h ; /* -H, follow symlinks on command line */ - unsigned l ; /* -L, follow all symlinks (command line and search) */ - unsigned prune; /* hit -prune, eval should return STW_PRUNE (return values - traversing expression tree are boolean so we can't - easily return this. instead set a global flag) */ - unsigned xdev ; /* -xdev, prune directories on different devices */ +static struct { + char ret ; /* return value from main */ + char depth; /* -depth, directory contents before directory itself */ + char h ; /* -H, follow symlinks on command line */ + char l ; /* -L, follow all symlinks (command line and search) */ + char prune; /* hit -prune */ + char xdev ; /* -xdev, prune directories on different devices */ } gflags; /* @@ -369,7 +367,7 @@ pri_exec(Arg *arg) e->argv[e->u.p.next] = NULL; if (!(pid = fork())) { /* child */ - execv(*e->argv, e->argv); + execvp(*e->argv, e->argv); eprintf("exec %s failed:", *e->argv); } waitpid(pid, &status, 0); @@ -403,7 +401,7 @@ pri_exec(Arg *arg) **brace = arg->path; if (!(pid = fork())) { /* child */ - execv(*e->argv, e->argv); + execvp(*e->argv, e->argv); eprintf("exec %s failed:", *e->argv); } /* FIXME: propper course of action for all waitpid() on EINTR? */ @@ -440,7 +438,7 @@ pri_ok(Arg *arg) **brace = arg->path; if (!(pid = fork())) { /* child */ - execv(*o->argv, o->argv); + execvp(*o->argv, o->argv); eprintf("exec %s failed:", *o->argv); } waitpid(pid, &status, 0); @@ -707,7 +705,7 @@ free_exec_arg(Extra extra) pid_t pid = fork(); if (!pid) { /* child */ - execv(*e->argv, e->argv); + execvp(*e->argv, e->argv); eprintf("exec %s failed:", *e->argv); } waitpid(pid, &status, 0); -- 2.3.0