diff options
author | fanf <fanf@FreeBSD.org> | 2002-09-24 19:27:44 +0000 |
---|---|---|
committer | fanf <fanf@FreeBSD.org> | 2002-09-24 19:27:44 +0000 |
commit | e90165a4c97b8e4bd541df4c5f2ca97f2097adc1 (patch) | |
tree | 760e79708052ed1c75eaeb96c549b7ed46c7d842 /usr.bin | |
parent | 136752fc5327d1689df7aeb5e6bc72efb2b3dfab (diff) | |
download | FreeBSD-src-e90165a4c97b8e4bd541df4c5f2ca97f2097adc1.zip FreeBSD-src-e90165a4c97b8e4bd541df4c5f2ca97f2097adc1.tar.gz |
It is probably a bad idea to unconditionally process directives with
constant controlling expressions: in particular, removing #if 0 sections
is considered "rude". This commit changes the default so that such
things are passed through unchanged, and the old behaviour can be had
with the -k "kill konsts" flag.
Suggested by: markm
MFC after: 3 weeks
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/unifdef/unifdef.1 | 26 | ||||
-rw-r--r-- | usr.bin/unifdef/unifdef.c | 25 |
2 files changed, 41 insertions, 10 deletions
diff --git a/usr.bin/unifdef/unifdef.1 b/usr.bin/unifdef/unifdef.1 index 556bec1..03390aa 100644 --- a/usr.bin/unifdef/unifdef.1 +++ b/usr.bin/unifdef/unifdef.1 @@ -33,10 +33,10 @@ .\" SUCH DAMAGE. .\" .\" @(#)unifdef.1 8.2 (Berkeley) 4/1/94 -.\" $dotat: things/unifdef.1,v 1.23 2002/05/14 22:15:03 fanf Exp $ +.\" $dotat: things/unifdef.1,v 1.25 2002/09/24 19:16:29 fanf2 Exp $ .\" $FreeBSD$ .\" -.Dd April 26, 2002 +.Dd September 24, 2002 .Dt UNIFDEF 1 .Os .Sh NAME @@ -44,7 +44,7 @@ .Nd remove preprocessor conditionals from code .Sh SYNOPSIS .Nm -.Op Fl clst +.Op Fl cklst .Oo .Fl I Ns Ar path .Fl D Ns Ar sym Ns Op = Ns Ar val @@ -97,6 +97,14 @@ and directives are only processed if the symbol is specified on the command line, otherwise they are also passed through unchanged. +Constant +.Ic #if +and +.Ic #elif +expressions are passed through by default, +or they may be processed by specifying the +.Fl k +flag. .Pp The .Nm @@ -153,6 +161,18 @@ is complemented, i.e., the lines that would have been removed or blanked are retained and vice versa. .Pp +.It Fl k +Process +.Ic #if +and +.Ic #elif +lines with constant expressions. +By default, sections controlled by such lines are passed through unchanged +because they typically start +.Li #if 0 +and are used as a kind of comment to sketch out future or past development. +It would be rude to strip them out, just as it would be for normal comments. +.Pp .It Fl l Replace removed lines with blank lines instead of deleting them. diff --git a/usr.bin/unifdef/unifdef.c b/usr.bin/unifdef/unifdef.c index 0a76d56..553b5ef 100644 --- a/usr.bin/unifdef/unifdef.c +++ b/usr.bin/unifdef/unifdef.c @@ -44,7 +44,7 @@ static const char copyright[] = #ifdef __IDSTRING __IDSTRING(Berkeley, "@(#)unifdef.c 8.1 (Berkeley) 6/6/93"); __IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $"); -__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.73 2002/05/21 17:33:41 fanf Exp $"); +__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.75 2002/09/24 19:16:29 fanf2 Exp $"); #endif #ifdef __FBSDID __FBSDID("$FreeBSD$"); @@ -184,6 +184,7 @@ const char *filename; int linenum; /* current line number */ int stifline; /* start of current #if */ int stqcline; /* start of current coment or quote */ +bool keepthis; /* ignore this #if's value 'cause it's const */ #define MAXLINE 1024 #define KWSIZE 8 @@ -193,6 +194,7 @@ char *keyword; /* used for editing #elif's */ bool complement; /* -c option in effect: do the complement */ bool debugging; /* -d option in effect: debugging reports */ +bool killconsts; /* -k option in effect: eval constant #ifs */ bool lnblank; /* -l option in effect: blank deleted lines */ bool symlist; /* -s option in effect: output symbol list */ bool text; /* -t option in effect: this is a text file */ @@ -222,6 +224,7 @@ int findsym(const char *); void flushline(bool); int getline(char *, int, FILE *, bool); Linetype ifeval(const char **); +int main(int, char **); const char *skipcomment(const char *); const char *skipquote(const char *, Quote_state); const char *skipsym(const char *); @@ -234,7 +237,7 @@ main(int argc, char *argv[]) { int opt; - while ((opt = getopt(argc, argv, "i:D:U:I:cdlst")) != -1) + while ((opt = getopt(argc, argv, "i:D:U:I:cdklst")) != -1) switch (opt) { case 'i': /* treat stuff controlled by these symbols as text */ /* @@ -262,6 +265,9 @@ main(int argc, char *argv[]) case 'c': /* treat -D as -U and vice versa */ complement = true; break; + case 'k': /* process constant #ifs */ + killconsts = true; + break; case 'd': debugging = true; break; @@ -305,7 +311,7 @@ void usage(void) { fprintf (stderr, "usage: %s", -"unifdef [-cdlst] [[-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym]] ... [file]\n"); +"unifdef [-cdklst] [[-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym]] ... [file]\n"); exit (2); } @@ -535,20 +541,20 @@ checkline(int *cursym) } else if (strcmp(kw, "if") == 0) { retval = ifeval(&cp); cp = skipcomment(cp); - if (*cp != '\n') + if (*cp != '\n' || keepthis) retval = LT_IF; *cursym = 0; } else if (strcmp(kw, "elif") == 0) { retval = ifeval(&cp); cp = skipcomment(cp); + if (*cp != '\n' || keepthis) + retval = LT_ELIF; if (retval == LT_IF) retval = LT_ELIF; if (retval == LT_TRUE) retval = LT_ELTRUE; if (retval == LT_FALSE) retval = LT_ELFALSE; - if (*cp != '\n') - retval = LT_ELIF; *cursym = 0; } else if (strcmp(kw, "else") == 0) retval = LT_ELSE; @@ -605,6 +611,7 @@ elif2endif(void) /* * Function for evaluating the innermost parts of expressions, * viz. !expr (expr) defined(symbol) symbol number + * We reset the keepthis flag when we find a non-constant subexpression. */ Linetype eval_unary(struct ops *ops, int *valp, const char **cpp) @@ -646,6 +653,7 @@ eval_unary(struct ops *ops, int *valp, const char **cpp) cp = skipcomment(cp); if (*cp++ != ')') return LT_IF; + keepthis = false; } else if (!endsym(*cp)) { debug("eval%d symbol", ops - eval_ops); sym = findsym(cp); @@ -659,6 +667,7 @@ eval_unary(struct ops *ops, int *valp, const char **cpp) return LT_IF; } cp = skipsym(cp); + keepthis = false; } else return LT_IF; @@ -703,13 +712,15 @@ eval_table(struct ops *ops, int *valp, const char **cpp) /* * Evaluate the expression on a #if or #elif line. If we can work out * the result we return LT_TRUE or LT_FALSE accordingly, otherwise we - * return just a generic LT_IF. + * return just a generic LT_IF. If the expression is constant and + * we are not processing constant #ifs then the keepthis flag is true. */ Linetype ifeval(const char **cpp) { int val; debug("eval %s", *cpp); + keepthis = killconsts ? false : true; return eval_table(eval_ops, &val, cpp); } |