summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorfanf <fanf@FreeBSD.org>2003-06-30 14:46:25 +0000
committerfanf <fanf@FreeBSD.org>2003-06-30 14:46:25 +0000
commitcca07433cc4346d74e15b2628370096afdaf82b9 (patch)
tree8868fa96f44d01dc545f0373e23844a829c9e78c /usr.bin
parentafcf98e92a64c393bcec75535adee26b58c220a3 (diff)
downloadFreeBSD-src-cca07433cc4346d74e15b2628370096afdaf82b9.zip
FreeBSD-src-cca07433cc4346d74e15b2628370096afdaf82b9.tar.gz
Various fixes from upstream, including a bug...
Fix the usage synopsis. Amend the copyright notice to reflect the fact that there's no Berkeley code left. Fix a typo in a comment, improve the descriptions of the way we use some global variables (relevant to the bug below), and note that division-by-zero has side effects so the current expression evaluator can't be trivially extended to arithmetic in its current design. Avoid hitting an abort(); /* bug */ when in "text mode" (i.e. ignoring comment state) by updating the line parser state properly. PR: 53907
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/unifdef/unifdef.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/usr.bin/unifdef/unifdef.c b/usr.bin/unifdef/unifdef.c
index d008c6d..34a2db9 100644
--- a/usr.bin/unifdef/unifdef.c
+++ b/usr.bin/unifdef/unifdef.c
@@ -1,9 +1,10 @@
/*
+ * Copyright (c) 2002, 2003 Tony Finch <dot@dotat.at>
* Copyright (c) 1985, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
- * Dave Yost. Support for #if and #elif was added by Tony Finch.
+ * Dave Yost. It was rewritten to support ANSI C by Tony Finch.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -42,14 +43,15 @@ static const char copyright[] =
"@(#) Copyright (c) 1985, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif
-
#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.148 2003/01/20 12:05:41 fanf2 Exp $");
+__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.156 2003/06/30 14:30:54 fanf2 Exp $");
#endif
#endif /* not lint */
+#ifdef __FBSDID
__FBSDID("$FreeBSD$");
+#endif
/*
* unifdef - remove ifdef'ed lines
@@ -302,7 +304,7 @@ static void
usage(void)
{
fprintf(stderr, "usage: unifdef [-cdeklst]"
- " [[-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym]] ... [file]\n");
+ " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
exit(2);
}
@@ -310,7 +312,7 @@ usage(void)
* A state transition function alters the global #if processing state
* in a particular way. The table below is indexed by the current
* processing state and the type of the current line. A NULL entry
- * indicate that processing is complete.
+ * indicates that processing is complete.
*
* Nesting is handled by keeping a stack of states; some transition
* functions increase or decrease the depth. They also maintain the
@@ -501,7 +503,8 @@ process(void)
/*
* Parse a line and determine its type. We keep the preprocessor line
- * parser state between calls in a global variable.
+ * parser state between calls in the global variable linestate, with
+ * help from skipcomment().
*/
static Linetype
getline(void)
@@ -587,7 +590,9 @@ getline(void)
}
/*
- * These are the operators that are supported by the expression evaluator.
+ * These are the binary operators that are supported by the expression
+ * evaluator. Note that if support for division is added then we also
+ * need short-circuiting booleans because of divide-by-zero.
*/
static int op_lt(int a, int b) { return (a < b); }
static int op_gt(int a, int b) { return (a > b); }
@@ -758,16 +763,18 @@ ifeval(const char **cpp)
/*
* Skip over comments and stop at the next character position that is
- * not whitespace. Between calls we keep the comment state in a global
- * variable, and we also make a note when we get a proper end-of-line.
+ * not whitespace. Between calls we keep the comment state in the
+ * global variable incomment, and we also adjust the global variable
+ * linestate when we see a newline.
* XXX: doesn't cope with the buffer splitting inside a state transition.
*/
static const char *
skipcomment(const char *cp)
{
if (text || ignoring[depth]) {
- while (isspace((unsigned char)*cp))
- cp += 1;
+ for (; isspace((unsigned char)*cp); cp++)
+ if (*cp == '\n')
+ linestate = LS_START;
return (cp);
}
while (*cp != '\0')
OpenPOWER on IntegriCloud