summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorfanf <fanf@FreeBSD.org>2002-09-24 19:27:44 +0000
committerfanf <fanf@FreeBSD.org>2002-09-24 19:27:44 +0000
commite90165a4c97b8e4bd541df4c5f2ca97f2097adc1 (patch)
tree760e79708052ed1c75eaeb96c549b7ed46c7d842 /usr.bin
parent136752fc5327d1689df7aeb5e6bc72efb2b3dfab (diff)
downloadFreeBSD-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.126
-rw-r--r--usr.bin/unifdef/unifdef.c25
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);
}
OpenPOWER on IntegriCloud