Tizen 2.0 Release tizen_2.0 accepted/tizen_2.0/20130215.204954 submit/tizen_2.0/20130215.192139
authorHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:51:43 +0000 (00:51 +0900)
committerHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:51:43 +0000 (00:51 +0900)
262 files changed:
COPYING [new file with mode: 0644]
Changelog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
packaging/unifdef.spec [new file with mode: 0644]
reversion.sh [new file with mode: 0755]
runtests.sh [new file with mode: 0755]
tests/args1.c [new file with mode: 0644]
tests/args1.experr [new file with mode: 0644]
tests/args1.expout [new file with mode: 0644]
tests/args1.exprc [new file with mode: 0644]
tests/args1.sh [new file with mode: 0644]
tests/args2.c [new file with mode: 0644]
tests/args2.experr [new file with mode: 0644]
tests/args2.expout [new file with mode: 0644]
tests/args2.exprc [new file with mode: 0644]
tests/args2.sh [new file with mode: 0644]
tests/blank0d.c [new file with mode: 0644]
tests/blank0d.experr [new file with mode: 0644]
tests/blank0d.expout [new file with mode: 0644]
tests/blank0d.exprc [new file with mode: 0644]
tests/blank0d.sh [new file with mode: 0644]
tests/blank0u.c [new file with mode: 0644]
tests/blank0u.experr [new file with mode: 0644]
tests/blank0u.expout [new file with mode: 0644]
tests/blank0u.exprc [new file with mode: 0644]
tests/blank0u.sh [new file with mode: 0644]
tests/blank1d.c [new file with mode: 0644]
tests/blank1d.experr [new file with mode: 0644]
tests/blank1d.expout [new file with mode: 0644]
tests/blank1d.exprc [new file with mode: 0644]
tests/blank1d.sh [new file with mode: 0644]
tests/blank1u.c [new file with mode: 0644]
tests/blank1u.experr [new file with mode: 0644]
tests/blank1u.expout [new file with mode: 0644]
tests/blank1u.exprc [new file with mode: 0644]
tests/blank1u.sh [new file with mode: 0644]
tests/blank2d.c [new file with mode: 0644]
tests/blank2d.experr [new file with mode: 0644]
tests/blank2d.expout [new file with mode: 0644]
tests/blank2d.exprc [new file with mode: 0644]
tests/blank2d.sh [new file with mode: 0644]
tests/blank2u.c [new file with mode: 0644]
tests/blank2u.experr [new file with mode: 0644]
tests/blank2u.expout [new file with mode: 0644]
tests/blank2u.exprc [new file with mode: 0644]
tests/blank2u.sh [new file with mode: 0644]
tests/blank3d.c [new file with mode: 0644]
tests/blank3d.experr [new file with mode: 0644]
tests/blank3d.expout [new file with mode: 0644]
tests/blank3d.exprc [new file with mode: 0644]
tests/blank3d.sh [new file with mode: 0644]
tests/blank3u.c [new file with mode: 0644]
tests/blank3u.experr [new file with mode: 0644]
tests/blank3u.expout [new file with mode: 0644]
tests/blank3u.exprc [new file with mode: 0644]
tests/blank3u.sh [new file with mode: 0644]
tests/blank4d.c [new file with mode: 0644]
tests/blank4d.experr [new file with mode: 0644]
tests/blank4d.expout [new file with mode: 0644]
tests/blank4d.exprc [new file with mode: 0644]
tests/blank4d.sh [new file with mode: 0644]
tests/blank4u.c [new file with mode: 0644]
tests/blank4u.experr [new file with mode: 0644]
tests/blank4u.expout [new file with mode: 0644]
tests/blank4u.exprc [new file with mode: 0644]
tests/blank4u.sh [new file with mode: 0644]
tests/crlf-a.experr [new file with mode: 0644]
tests/crlf-a.expout [new file with mode: 0644]
tests/crlf-a.exprc [new file with mode: 0644]
tests/crlf-a.sh [new file with mode: 0644]
tests/crlf-b.experr [new file with mode: 0644]
tests/crlf-b.expout [new file with mode: 0644]
tests/crlf-b.exprc [new file with mode: 0644]
tests/crlf-b.sh [new file with mode: 0644]
tests/crlf-c.experr [new file with mode: 0644]
tests/crlf-c.expout [new file with mode: 0644]
tests/crlf-c.exprc [new file with mode: 0644]
tests/crlf-c.sh [new file with mode: 0644]
tests/crlf-d.experr [new file with mode: 0644]
tests/crlf-d.expout [new file with mode: 0644]
tests/crlf-d.exprc [new file with mode: 0644]
tests/crlf-d.sh [new file with mode: 0644]
tests/crlf.c [new file with mode: 0644]
tests/empty.c [new file with mode: 0644]
tests/empty.experr [new file with mode: 0644]
tests/empty.expout [new file with mode: 0644]
tests/empty.exprc [new file with mode: 0644]
tests/empty.sh [new file with mode: 0644]
tests/if1-a.experr [new file with mode: 0644]
tests/if1-a.expout [new file with mode: 0644]
tests/if1-a.exprc [new file with mode: 0644]
tests/if1-a.sh [new file with mode: 0644]
tests/if1-k.c [new file with mode: 0644]
tests/if1-k.experr [new file with mode: 0644]
tests/if1-k.expout [new file with mode: 0644]
tests/if1-k.exprc [new file with mode: 0644]
tests/if1-k.sh [new file with mode: 0644]
tests/if1-kDU.c [new file with mode: 0644]
tests/if1-kDU.experr [new file with mode: 0644]
tests/if1-kDU.expout [new file with mode: 0644]
tests/if1-kDU.exprc [new file with mode: 0644]
tests/if1-kDU.sh [new file with mode: 0644]
tests/if1.c [new file with mode: 0644]
tests/if1.experr [new file with mode: 0644]
tests/if1.expout [new file with mode: 0644]
tests/if1.exprc [new file with mode: 0644]
tests/if1.sh [new file with mode: 0644]
tests/if1a.experr [new file with mode: 0644]
tests/if1a.expout [new file with mode: 0644]
tests/if1a.exprc [new file with mode: 0644]
tests/if1a.sh [new file with mode: 0644]
tests/if2-a.experr [new file with mode: 0644]
tests/if2-a.expout [new file with mode: 0644]
tests/if2-a.exprc [new file with mode: 0644]
tests/if2-a.sh [new file with mode: 0644]
tests/if2-k.c [new file with mode: 0644]
tests/if2-k.experr [new file with mode: 0644]
tests/if2-k.expout [new file with mode: 0644]
tests/if2-k.exprc [new file with mode: 0644]
tests/if2-k.sh [new file with mode: 0644]
tests/if2-kDU.c [new file with mode: 0644]
tests/if2-kDU.experr [new file with mode: 0644]
tests/if2-kDU.expout [new file with mode: 0644]
tests/if2-kDU.exprc [new file with mode: 0644]
tests/if2-kDU.sh [new file with mode: 0644]
tests/if2.c [new file with mode: 0644]
tests/if2.experr [new file with mode: 0644]
tests/if2.expout [new file with mode: 0644]
tests/if2.exprc [new file with mode: 0644]
tests/if2.sh [new file with mode: 0644]
tests/if3-a.experr [new file with mode: 0644]
tests/if3-a.expout [new file with mode: 0644]
tests/if3-a.exprc [new file with mode: 0644]
tests/if3-a.sh [new file with mode: 0644]
tests/if3-k.c [new file with mode: 0644]
tests/if3-k.experr [new file with mode: 0644]
tests/if3-k.expout [new file with mode: 0644]
tests/if3-k.exprc [new file with mode: 0644]
tests/if3-k.sh [new file with mode: 0644]
tests/if3-kDU.c [new file with mode: 0644]
tests/if3-kDU.experr [new file with mode: 0644]
tests/if3-kDU.expout [new file with mode: 0644]
tests/if3-kDU.exprc [new file with mode: 0644]
tests/if3-kDU.sh [new file with mode: 0644]
tests/if3.c [new file with mode: 0644]
tests/if3.experr [new file with mode: 0644]
tests/if3.expout [new file with mode: 0644]
tests/if3.exprc [new file with mode: 0644]
tests/if3.sh [new file with mode: 0644]
tests/if4-a.experr [new file with mode: 0644]
tests/if4-a.expout [new file with mode: 0644]
tests/if4-a.exprc [new file with mode: 0644]
tests/if4-a.sh [new file with mode: 0644]
tests/if4-k.c [new file with mode: 0644]
tests/if4-k.experr [new file with mode: 0644]
tests/if4-k.expout [new file with mode: 0644]
tests/if4-k.exprc [new file with mode: 0644]
tests/if4-k.sh [new file with mode: 0644]
tests/if4-kDU.c [new file with mode: 0644]
tests/if4-kDU.experr [new file with mode: 0644]
tests/if4-kDU.expout [new file with mode: 0644]
tests/if4-kDU.exprc [new file with mode: 0644]
tests/if4-kDU.sh [new file with mode: 0644]
tests/if4.c [new file with mode: 0644]
tests/if4.experr [new file with mode: 0644]
tests/if4.expout [new file with mode: 0644]
tests/if4.exprc [new file with mode: 0644]
tests/if4.sh [new file with mode: 0644]
tests/if5-a.experr [new file with mode: 0644]
tests/if5-a.expout [new file with mode: 0644]
tests/if5-a.exprc [new file with mode: 0644]
tests/if5-a.sh [new file with mode: 0644]
tests/if5-k.c [new file with mode: 0644]
tests/if5-k.experr [new file with mode: 0644]
tests/if5-k.expout [new file with mode: 0644]
tests/if5-k.exprc [new file with mode: 0644]
tests/if5-k.sh [new file with mode: 0644]
tests/if5-kDU.c [new file with mode: 0644]
tests/if5-kDU.experr [new file with mode: 0644]
tests/if5-kDU.expout [new file with mode: 0644]
tests/if5-kDU.exprc [new file with mode: 0644]
tests/if5-kDU.sh [new file with mode: 0644]
tests/if5.c [new file with mode: 0644]
tests/if5.experr [new file with mode: 0644]
tests/if5.expout [new file with mode: 0644]
tests/if5.exprc [new file with mode: 0644]
tests/if5.sh [new file with mode: 0644]
tests/if6.c [new file with mode: 0644]
tests/if6a.experr [new file with mode: 0644]
tests/if6a.expout [new file with mode: 0644]
tests/if6a.exprc [new file with mode: 0644]
tests/if6a.sh [new file with mode: 0644]
tests/if6b.experr [new file with mode: 0644]
tests/if6b.expout [new file with mode: 0644]
tests/if6b.exprc [new file with mode: 0644]
tests/if6b.sh [new file with mode: 0644]
tests/if6c.experr [new file with mode: 0644]
tests/if6c.expout [new file with mode: 0644]
tests/if6c.exprc [new file with mode: 0644]
tests/if6c.sh [new file with mode: 0644]
tests/if6d.experr [new file with mode: 0644]
tests/if6d.expout [new file with mode: 0644]
tests/if6d.exprc [new file with mode: 0644]
tests/if6d.sh [new file with mode: 0644]
tests/none.c [new file with mode: 0644]
tests/none.experr [new file with mode: 0644]
tests/none.expout [new file with mode: 0644]
tests/none.exprc [new file with mode: 0644]
tests/none.sh [new file with mode: 0644]
tests/outdir.experr [new file with mode: 0644]
tests/outdir.expout [new file with mode: 0644]
tests/outdir.exprc [new file with mode: 0644]
tests/outdir.sh [new file with mode: 0644]
tests/outfile.experr [new file with mode: 0644]
tests/outfile.expout [new file with mode: 0644]
tests/outfile.exprc [new file with mode: 0644]
tests/outfile.sh [new file with mode: 0644]
tests/overdir.experr [new file with mode: 0644]
tests/overdir.expout [new file with mode: 0644]
tests/overdir.exprc [new file with mode: 0644]
tests/overdir.sh [new file with mode: 0644]
tests/overwrite.experr [new file with mode: 0644]
tests/overwrite.expout [new file with mode: 0644]
tests/overwrite.exprc [new file with mode: 0644]
tests/overwrite.sh [new file with mode: 0644]
tests/small1.c [new file with mode: 0644]
tests/small1.experr [new file with mode: 0644]
tests/small1.expout [new file with mode: 0644]
tests/small1.exprc [new file with mode: 0644]
tests/small1.sh [new file with mode: 0644]
tests/small2.c [new file with mode: 0644]
tests/small2.experr [new file with mode: 0644]
tests/small2.expout [new file with mode: 0644]
tests/small2.exprc [new file with mode: 0644]
tests/small2.sh [new file with mode: 0644]
tests/spaces1.c [new file with mode: 0644]
tests/spaces1.experr [new file with mode: 0644]
tests/spaces1.expout [new file with mode: 0644]
tests/spaces1.exprc [new file with mode: 0644]
tests/spaces1.sh [new file with mode: 0644]
tests/spaces2.c [new file with mode: 0644]
tests/spaces2.experr [new file with mode: 0644]
tests/spaces2.expout [new file with mode: 0644]
tests/spaces2.exprc [new file with mode: 0644]
tests/spaces2.sh [new file with mode: 0644]
tests/spaces3.c [new file with mode: 0644]
tests/spaces3.experr [new file with mode: 0644]
tests/spaces3.expout [new file with mode: 0644]
tests/spaces3.exprc [new file with mode: 0644]
tests/spaces3.sh [new file with mode: 0644]
tests/spaces4.c [new file with mode: 0644]
tests/spaces4.experr [new file with mode: 0644]
tests/spaces4.expout [new file with mode: 0644]
tests/spaces4.exprc [new file with mode: 0644]
tests/spaces4.sh [new file with mode: 0644]
unifdef.1 [new file with mode: 0644]
unifdef.c [new file with mode: 0644]
unifdef.txt [new file with mode: 0644]
unifdefall.sh [new file with mode: 0755]
version.sh [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..d29e274
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,83 @@
+unifdef copyright licence
+-------------------------
+
+All files in this package are distributed under the two-clause BSD
+copyright licence, except for the manual page unifdef.1 which has a
+three-clause BSD copyright licence.
+
+Unifdef was derived from software contributed to Berkeley by Dave
+Yost. It was rewritten to support ANSI C by Tony Finch. The original
+version of unifdef.c carried the four-clause BSD copyright licence.
+None of its code remains in this version (though some of the names
+remain) so it now carries the more liberal two-clause licence.
+
+Unless otherwise stated, the files in this package are:
+
+  Copyright (c) 2002 - 2010 Tony Finch <dot@dotat.at>
+
+unifdefall.sh is
+
+  Copyright (c) 2002 - 2010 Tony Finch <dot@dotat.at>
+  Copyright (c) 2009 - 2010 Jonathan Nieder <jrnieder@gmail.com>
+
+Some files in the tests directory are:
+
+  Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+
+The two-clause BSD copyright licence applying to all the above files is:
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  SUCH DAMAGE.
+
+The three-clause BSD copyright licence for the manual page unifdef.1
+is below. The advertising clause was rescinded by the University of
+California Berkeley in 1999.
+ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+
+  Copyright (c) 1985, 1991, 1993
+       The Regents of the University of California.  All rights reserved.
+  Copyright (c) 2002 - 2010 Tony Finch <dot@dotat.at>.  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+  3. Neither the name of the University nor the names of its contributors
+     may be used to endorse or promote products derived from this software
+     without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  SUCH DAMAGE.
+
+- end -
diff --git a/Changelog b/Changelog
new file mode 100644 (file)
index 0000000..b7976a8
--- /dev/null
+++ b/Changelog
@@ -0,0 +1,3861 @@
+---------------------------------------------------
+2010-03-12 16:27:30 +0000 Tony Finch <dot@dotat.at>
+
+Release unifdef-2.3
+
+ web/index.html |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 16:23:35 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: upload to github before chiark
+
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 16:21:27 +0000 Tony Finch <dot@dotat.at>
+
+Tweak the home page.
+
+Add the .htaccess file which keeps old URLs working.
+
+ web/.htaccess  |   11 +++++++++++
+ web/index.html |   11 ++++++-----
+ 2 files changed, 17 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2010-03-12 15:43:19 +0000 Tony Finch <dot@dotat.at>
+
+Make the home page and gitweb titles consistent.
+
+ Makefile       |    2 +-
+ web/index.html |    4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-03-12 15:29:12 +0000 Tony Finch <dot@dotat.at>
+
+Rename get-version.sh to reversion.sh for fun.
+
+ Makefile       |    4 ++--
+ get-version.sh |   34 ----------------------------------
+ reversion.sh   |   34 ++++++++++++++++++++++++++++++++++
+ 3 files changed, 36 insertions(+), 36 deletions(-)
+
+---------------------------------------------------
+2010-03-12 15:23:40 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: do not try to build unifdef.txt by default.
+
+DISTFILES shouldn't be in non-release targets.
+
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 12:23:26 +0000 Tony Finch <dot@dotat.at>
+
+Merge commit 'book/master'
+
+---------------------------------------------------
+2010-03-12 12:22:51 +0000 Tony Finch <dot@dotat.at>
+
+Add -V and -S flags to synopses
+
+ unifdef.1 |    2 +-
+ unifdef.c |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-03-12 11:13:52 +0000 Tony Finch <dot@dotat.at>
+
+Merge commit 'book/master'
+
+---------------------------------------------------
+2010-03-12 11:07:35 +0000 Tony Finch <dot@dotat.at>
+
+web/index.html: link to github
+
+ web/index.html |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-03-12 11:07:35 +0000 Tony Finch <dot@dotat.at>
+
+web/index.html: link to github
+
+ web/index.html |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 11:03:03 +0000 Tony Finch <dot@dotat.at>
+
+README: add information about obtaining unifdef using git.
+
+ README |    9 ++++++---
+ 1 files changed, 6 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-03-12 11:01:15 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: tweak upload target
+
+Remove unsafe `git prune`. Push a copy to github.
+
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 11:00:26 +0000 Tony Finch <dot@dotat.at>
+
+web/index.html: Fix git clone URL.
+
+ web/index.html |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 10:15:18 +0000 Tony Finch <dot@dotat.at>
+
+Release unifdef-2.2
+
+ web/index.html |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 10:08:04 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: print debugging output to stderr
+
+ unifdefall.sh |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-03-12 10:04:14 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: correct exit status if the clean-up rm fails
+
+Reported-by: Bob Proulx <bob@proulx.com>
+
+ unifdefall.sh |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-12 09:52:46 +0000 Tony Finch <dot@dotat.at>
+
+get-version.sh: fix build in clean git working tree
+
+`git show` exited non-zero which aborted the build.
+
+ get-version.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-03-12 09:34:18 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: fix version.h -> unifdef.c -> unifdef dependencies.
+
+ Makefile |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2010-03-12 09:28:02 +0000 Tony Finch <dot@dotat.at>
+
+get-version.sh fixes
+
+Test for the existence of version.sh (not version.h> before sourcing it.
+Cat the version files after re-writing them.
+Use printf(1) to create version.h for portability.
+
+ get-version.sh |    8 +++++---
+ 1 files changed, 5 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-03-11 21:41:45 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: safer "realclean" target
+
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 21:17:58 +0000 Tony Finch <dot@dotat.at>
+
+Release unifdef-2.1
+
+ web/index.html |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 21:12:03 +0000 Tony Finch <dot@dotat.at>
+
+Add a -V option to print the embedded version details.
+
+ unifdef.1 |    5 ++++-
+ unifdef.c |   19 ++++++++++++++++++-
+ 2 files changed, 22 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-03-11 21:01:23 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: remove release.sh from DISTFILES
+
+ Makefile |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:59:11 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: prune .git before uploading
+
+ Makefile |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:56:29 +0000 Tony Finch <dot@dotat.at>
+
+index.html: mention the git glone command
+
+ web/index.html |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:52:26 +0000 Tony Finch <dot@dotat.at>
+
+Re-do the website handling and add an upload target.
+
+ Makefile       |   15 ++++++++++---
+ index.html.in  |   62 --------------------------------------------------------
+ web/index.html |   49 ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 60 insertions(+), 66 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:28:13 +0000 Tony Finch <dot@dotat.at>
+
+Tell git to ignore release files.
+
+ .gitignore |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:27:04 +0000 Tony Finch <dot@dotat.at>
+
+Move release script into Makefile.
+
+ Makefile   |   45 ++++++++++++++++++++++++++++++++++++---------
+ release.sh |   37 -------------------------------------
+ 2 files changed, 36 insertions(+), 46 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:08:03 +0000 Tony Finch <dot@dotat.at>
+
+Tell git to ignore output files.
+
+ .gitignore |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2010-03-11 20:04:35 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: do not clean inside .git directory.
+
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 18:57:37 +0000 Tony Finch <dot@dotat.at>
+
+Embed version information from git into the unifdef binary.
+
+ Makefile       |    9 ++++++---
+ get-version.sh |   32 ++++++++++++++++++++++++++++++++
+ unifdef.c      |    9 +++++----
+ 3 files changed, 43 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2010-03-11 18:57:15 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: clean trailing whitespace.
+
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 18:56:58 +0000 Tony Finch <dot@dotat.at>
+
+INSTALL: Note the CFLAGS and LDFLAGS make variables.
+
+ INSTALL |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-11 18:56:34 +0000 Tony Finch <dot@dotat.at>
+
+Remove sccs, cvs, and svn revision tags.
+
+ INSTALL       |    2 +-
+ Makefile      |    2 +-
+ README        |    3 +--
+ index.html.in |    1 -
+ release.sh    |    2 --
+ runtests.sh   |    2 --
+ unifdef.1     |    4 ----
+ unifdef.c     |    5 ++---
+ unifdefall.sh |    2 --
+ 9 files changed, 5 insertions(+), 18 deletions(-)
+
+---------------------------------------------------
+2010-03-10 17:42:54 +0000 Tony Finch <dot@dotat.at>
+
+Improved debugging support.
+
+Add line numbers to unifdef's debugging output. Flush the output stream
+on each line when debugging to ensure stdout and stderr are properly
+interleaved. Add a debugging mode to unifdefall.sh which outputs its
+intermediate working files.
+
+ unifdef.c     |   12 ++++++++----
+ unifdefall.sh |   20 +++++++++++++++-----
+ 2 files changed, 23 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2010-03-07 18:11:07 +0000 Tony Finch <dot@dotat.at>
+
+Forced commit to note change to test suite.
+
+ runtests.sh |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-07 17:56:06 +0000 Tony Finch <dot@dotat.at>
+
+Adjust tests for change in license header.
+
+The extra line at the beginning of if1.c caused the line numbers
+in 'diff' output to change.  Rather than playing catch-up, simplify
+the relevant tests to keep working if if1.c changes in other ways
+in the future.
+
+Submitted by: Jonathan Nieder <jrnieder@gmail.com>
+
+ tests/outdir.expout    |   30 ++++++++++++++++--------------
+ tests/outdir.sh        |    2 +-
+ tests/outfile.expout   |   30 ++++++++++++++++--------------
+ tests/outfile.sh       |    2 +-
+ tests/overdir.expout   |   30 ++++++++++++++++--------------
+ tests/overdir.sh       |    2 +-
+ tests/overwrite.expout |   30 ++++++++++++++++--------------
+ tests/overwrite.sh     |    2 +-
+ 8 files changed, 68 insertions(+), 60 deletions(-)
+
+---------------------------------------------------
+2010-03-06 14:40:15 +0000 Tony Finch <dot@dotat.at>
+
+Add the COPYING file to the release.
+
+ release.sh |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-03-06 14:38:50 +0000 Tony Finch <dot@dotat.at>
+
+Fix HTML markup snafu.
+
+ index.html.in |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-03-06 14:37:14 +0000 Tony Finch <dot@dotat.at>
+
+Put the tests under the two-clause BSD copyright licence for consistency.
+
+ tests/crlf-a.expout  |    2 +-
+ tests/crlf-b.expout  |    2 +-
+ tests/crlf-c.expout  |    2 +-
+ tests/crlf-d.expout  |    2 +-
+ tests/crlf.c         |    2 +-
+ tests/if1-a.expout   |    3 ++-
+ tests/if1-k.c        |    3 ++-
+ tests/if1-k.expout   |    3 ++-
+ tests/if1-kDU.c      |    3 ++-
+ tests/if1-kDU.expout |    3 ++-
+ tests/if1.c          |    3 ++-
+ tests/if1.expout     |    3 ++-
+ tests/if1a.expout    |    3 ++-
+ tests/if2-a.expout   |    3 ++-
+ tests/if2-k.c        |    3 ++-
+ tests/if2-k.expout   |    3 ++-
+ tests/if2-kDU.c      |    3 ++-
+ tests/if2-kDU.expout |    3 ++-
+ tests/if2.c          |    3 ++-
+ tests/if2.expout     |    3 ++-
+ tests/if3-a.expout   |    3 ++-
+ tests/if3-k.c        |    3 ++-
+ tests/if3-k.expout   |    3 ++-
+ tests/if3-kDU.c      |    3 ++-
+ tests/if3-kDU.expout |    3 ++-
+ tests/if3.c          |    3 ++-
+ tests/if3.expout     |    3 ++-
+ tests/if4-a.expout   |    3 ++-
+ tests/if4-k.c        |    3 ++-
+ tests/if4-k.expout   |    3 ++-
+ tests/if4-kDU.c      |    3 ++-
+ tests/if4-kDU.expout |    3 ++-
+ tests/if4.c          |    3 ++-
+ tests/if4.expout     |    3 ++-
+ tests/if5-a.expout   |    3 ++-
+ tests/if5-k.c        |    3 ++-
+ tests/if5-k.expout   |    3 ++-
+ tests/if5-kDU.c      |    3 ++-
+ tests/if5-kDU.expout |    3 ++-
+ tests/if5.c          |    3 ++-
+ tests/if5.expout     |    3 ++-
+ tests/none.c         |    3 ++-
+ tests/none.expout    |    3 ++-
+ tests/small1.c       |    3 ++-
+ tests/small1.expout  |    3 ++-
+ tests/small2.c       |    3 ++-
+ tests/small2.expout  |    3 ++-
+ tests/spaces1.c      |    3 ++-
+ tests/spaces1.expout |    3 ++-
+ tests/spaces2.c      |    3 ++-
+ tests/spaces2.expout |    3 ++-
+ tests/spaces3.c      |    3 ++-
+ tests/spaces3.expout |    3 ++-
+ tests/spaces4.c      |    3 ++-
+ tests/spaces4.expout |    3 ++-
+ 55 files changed, 105 insertions(+), 55 deletions(-)
+
+---------------------------------------------------
+2010-03-06 14:30:26 +0000 Tony Finch <dot@dotat.at>
+
+Add a COPYING file to consolidate licence terms in one place.
+
+Remove the public domain declaration from runtests.sh so it is under the
+same licence as the other files.
+
+Improve the wording about the licensing of contributions.
+
+ COPYING       |   83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ README        |    8 +++---
+ index.html.in |    9 +++---
+ runtests.sh   |    6 +---
+ 4 files changed, 93 insertions(+), 13 deletions(-)
+
+---------------------------------------------------
+2010-03-05 13:05:38 +0000 Tony Finch <dot@dotat.at>
+
+Adjust man page document title for backwards compatibility.
+
+Reported by: Bob Proulx <bob@proulx.com>
+
+ unifdef.1 |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-02-23 12:27:11 +0000 Tony Finch <dot@dotat.at>
+
+Actually, don't drop the 1. from the version number.
+
+Keeping it gives us more flexibility to change the numbering scheme
+while ensuring it continues to go up.
+
+ release.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-02-22 18:58:50 +0000 Tony Finch <dot@dotat.at>
+
+Drop 1. from the version number
+
+ release.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-02-22 18:58:30 +0000 Tony Finch <dot@dotat.at>
+
+Improve output of -S mode (list symbols with depths)
+
+Symbols tested in the same #if are listed on the same line.
+
+ unifdef.c |   17 +++++++++++++----
+ 1 files changed, 13 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2010-02-21 16:55:04 +0000 Tony Finch <dot@dotat.at>
+
+We don't need to compile unifdef when preparing the release.
+
+ release.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-02-21 16:53:20 +0000 Tony Finch <dot@dotat.at>
+
+Fix the release build to ensure that junk files are not included.
+
+We were failing to properly clean the tests directory.
+
+Reported-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ Makefile   |   14 +++++++-------
+ release.sh |    7 +++++--
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2010-02-19 20:43:13 +0000 Tony Finch <dot@dotat.at>
+
+Use -mdoc macro package when invoking nroff.
+
+ Makefile |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-02-19 20:25:50 +0000 Tony Finch <dot@dotat.at>
+
+Add a -S option for listing the nesting depth of symbols.
+
+Suggested by http://stackoverflow.com/questions/2012496
+
+ unifdef.1 |   23 +++++++++++++++--------
+ unifdef.c |   19 ++++++++++++-------
+ 2 files changed, 27 insertions(+), 15 deletions(-)
+
+---------------------------------------------------
+2010-02-19 20:08:37 +0000 Tony Finch <dot@dotat.at>
+
+A small tidy-up in process()
+
+ unifdef.c |    8 +++-----
+ 1 files changed, 3 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2010-02-19 19:46:41 +0000 Tony Finch <dot@dotat.at>
+
+Expand ACCESSPERMS rather than conditionally #defining it.
+
+ unifdef.c |    8 ++------
+ 1 files changed, 2 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2010-02-19 18:35:26 +0000 Tony Finch <dot@dotat.at>
+
+Define ACCESSPERMS on systems (like Cygwin) that lack it.
+
+Suggested by Mark Rushakoff.
+
+ unifdef.c |    6 +++++-
+ 1 files changed, 5 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-02-19 17:30:50 +0000 Tony Finch <dot@dotat.at>
+
+Link to freshmeat.net for release announcements.
+
+ README        |    5 ++++-
+ index.html.in |    9 ++++++---
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2010-02-19 17:15:44 +0000 Tony Finch <dot@dotat.at>
+
+Improve portability to systems with native CRLF newlines.
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2010-02-19 17:11:39 +0000 Tony Finch <dot@dotat.at>
+
+Remove FreeBSD from manual page rubric, and update its date.
+
+ unifdef.1 |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2010-02-19 16:44:02 +0000 Tony Finch <dot@dotat.at>
+
+List INSTALL file on homepage
+
+ index.html.in |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-02-19 16:37:05 +0000 Tony Finch <dot@dotat.at>
+
+Fix a long-standing cpp compatibility bug.
+
+The -DFOO argument (without an explicit value) should define FOO to 1
+not to the empty string.
+
+ tests/crlf-a.sh |    2 +-
+ tests/crlf-b.sh |    2 +-
+ tests/crlf-c.sh |    2 +-
+ tests/crlf-d.sh |    2 +-
+ tests/if6a.sh   |    2 +-
+ tests/if6b.sh   |    2 +-
+ tests/if6c.sh   |    2 +-
+ tests/if6d.sh   |    2 +-
+ unifdef.1       |   14 ++++++++------
+ unifdef.c       |    4 ++--
+ 10 files changed, 18 insertions(+), 16 deletions(-)
+
+---------------------------------------------------
+2010-02-19 16:31:08 +0000 Tony Finch <dot@dotat.at>
+
+Add support for CRLF newlines.
+
+As a side-effect, remove the dependency on strlcpy().
+
+Based on a suggestion from Mark Rushakoff.
+
+ INSTALL             |    5 +--
+ tests/crlf-a.expout |   10 +++++++++
+ tests/crlf-a.exprc  |    1 +
+ tests/crlf-a.sh     |    1 +
+ tests/crlf-b.expout |   14 +++++++++++++
+ tests/crlf-b.exprc  |    1 +
+ tests/crlf-b.sh     |    1 +
+ tests/crlf-c.expout |   16 +++++++++++++++
+ tests/crlf-c.exprc  |    1 +
+ tests/crlf-c.sh     |    1 +
+ tests/crlf-d.expout |   18 +++++++++++++++++
+ tests/crlf-d.exprc  |    1 +
+ tests/crlf-d.sh     |    1 +
+ tests/crlf.c        |   20 ++++++++++++++++++
+ unifdef.c           |   54 ++++++++++++++++++++++++++++++++++----------------
+ 15 files changed, 125 insertions(+), 20 deletions(-)
+
+---------------------------------------------------
+2010-02-19 16:29:59 +0000 Tony Finch <dot@dotat.at>
+
+Fix tests to not rely on an uncommitted change.
+
+ tests/if6a.sh |    2 +-
+ tests/if6b.sh |    2 +-
+ tests/if6c.sh |    2 +-
+ tests/if6d.sh |    2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2010-02-19 16:03:44 +0000 Tony Finch <dot@dotat.at>
+
+More tests of keyword edits
+
+ tests/if6.c       |   11 +++++++++++
+ tests/if6a.expout |    1 +
+ tests/if6a.exprc  |    1 +
+ tests/if6a.sh     |    1 +
+ tests/if6b.expout |    5 +++++
+ tests/if6b.exprc  |    1 +
+ tests/if6b.sh     |    1 +
+ tests/if6c.expout |    7 +++++++
+ tests/if6c.exprc  |    1 +
+ tests/if6c.sh     |    1 +
+ tests/if6d.expout |    9 +++++++++
+ tests/if6d.exprc  |    1 +
+ tests/if6d.sh     |    1 +
+ 13 files changed, 41 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2010-02-19 15:50:26 +0000 Tony Finch <dot@dotat.at>
+
+Test #elif -> #if edit
+
+ tests/if1a.expout |   23 +++++++++++++++++++++++
+ tests/if1a.exprc  |    1 +
+ tests/if1a.sh     |    1 +
+ 3 files changed, 25 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2010-01-20 00:48:26 +0000 Tony Finch <dot@dotat.at>
+
+unifdef.c: better diagnostics on write failure
+
+ unifdef.c |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-01-19 20:33:00 +0000 Tony Finch <dot@dotat.at>
+
+unifdef.c: fix portability to 64 bit platforms.
+
+printf("%.*s",i,s) expects an int not a ptrdiff_t
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-01-19 18:22:53 +0000 Tony Finch <dot@dotat.at>
+
+Fix English usage in wishlist comment
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-01-19 18:03:02 +0000 Tony Finch <dot@dotat.at>
+
+unifdef.c: re-arrange the introductory comment, #include lines, and
+
+embedded copyright strings so that the FreeBSD version of the code
+is tidier.
+
+ unifdef.c |   18 ++++++++----------
+ 1 files changed, 8 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2010-01-19 17:33:53 +0000 Tony Finch <dot@dotat.at>
+
+Update manual date and copyright.
+
+ unifdef.1 |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-01-19 16:23:35 +0000 Tony Finch <dot@dotat.at>
+
+Add -o outfile option, which can be used to specify an output file.  The
+
+file can even be the same as the input file.  Idea from IRIX unifdef(1).
+This version also fixes a bug in the NetBSD unifdef which refuses to
+write to a -o outfile which does not exist.
+
+Obtained from: Brian Ginsbach <ginsbach@NetBSD.org> via NetBSD
+
+ tests/outdir.expout    |   14 ++++++
+ tests/outdir.exprc     |    1 +
+ tests/outdir.sh        |    4 ++
+ tests/outfile.expout   |   14 ++++++
+ tests/outfile.exprc    |    1 +
+ tests/outfile.sh       |    3 +
+ tests/overdir.expout   |   14 ++++++
+ tests/overdir.exprc    |    1 +
+ tests/overdir.sh       |    5 ++
+ tests/overwrite.expout |   14 ++++++
+ tests/overwrite.exprc  |    1 +
+ tests/overwrite.sh     |    4 ++
+ unifdef.1              |   17 +++++++-
+ unifdef.c              |  106 ++++++++++++++++++++++++++++++++++++++++++-----
+ 14 files changed, 185 insertions(+), 14 deletions(-)
+
+---------------------------------------------------
+2010-01-19 16:09:50 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: tidy copyright notice to match unifdef.c
+
+ unifdefall.sh |    7 +++----
+ 1 files changed, 3 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2010-01-19 13:37:00 +0000 Tony Finch <dot@dotat.at>
+
+release.sh: Add INSTALL to list of tarball contents.
+
+ release.sh |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2010-01-19 13:36:22 +0000 Tony Finch <dot@dotat.at>
+
+Add Jonathan Nieder to unifdefall's copyright declaration.
+
+ unifdefall.sh |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2010-01-15 18:37:39 +0000 Tony Finch <dot@dotat.at>
+
+Clean up the Makefile.
+
+ Makefile |   27 ++++++++++++++-------------
+ 1 files changed, 14 insertions(+), 13 deletions(-)
+
+---------------------------------------------------
+2010-01-15 18:33:05 +0000 Tony Finch <dot@dotat.at>
+
+Automatic install support.
+
+Add an install target to the Makefile. Using separate ${prefix} and
+${DESTDIR} variables opens the door to hardcoding the path to unifdef
+in unifdefall if we ever need to.
+
+Move the installation instructions from the README to a new INSTALL
+file to make it easier for packagers to omit irrelevant compilation
+instructions from the binary package's documentation.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ INSTALL  |   18 ++++++++++++++++++
+ Makefile |   20 +++++++++++++++++++-
+ README   |   13 ++-----------
+ 3 files changed, 39 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2010-01-15 17:43:17 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: do not remove Changelog on clean
+
+Regenerating the Changelog requires access to the unifdef CVS
+repository.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ Makefile |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2010-01-15 17:41:21 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: look for unifdef in $(dirname $0)
+
+For debugging and for the test suite it is convenient is
+unifdefall can be run in place without relying on unifdef being
+installed elsewhere.  So change unifdefall to look for unifdef in
+the containing directory.
+
+For compatibility, if unifdef is not present in the directory
+containing unifdefall, fall back to searching the $PATH for it.
+Some one might have installed unifdef and unifdefall to
+different directories.
+
+With this change, 'make test' no longer fails in if1-a.sh when
+unifdef is not present on the $PATH.  Also, the test suite will
+be a little better at catching new regressions if an old version
+of unifdef is installed, since the unifdefall tests will no
+longer be testing the installed unifdef.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |   16 ++++++++++++----
+ 1 files changed, 12 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2009-12-02 15:21:22 +0000 Tony Finch <dot@dotat.at>
+
+Fix ident string -- gcc optimised it away.
+
+ unifdef.c |    9 ++++-----
+ 1 files changed, 4 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2009-11-27 17:30:39 +0000 Tony Finch <dot@dotat.at>
+
+Include full CVS log in the Changelog.
+
+ Makefile |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-27 17:24:25 +0000 Tony Finch <dot@dotat.at>
+
+release.sh: remove tests/CVS from tarball, and upload files faster.
+
+ release.sh |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-27 17:21:26 +0000 Tony Finch <dot@dotat.at>
+
+fix invalid array access when nesting limit exceeded
+
+If the number of nested #if blocks exceeds 64, nest() increments
+the nesting depth and then reports an error.  The message includes
+the line number for the start of the current #if block, which is
+read from past the end of the relevant array.
+
+Avoid the out-of-bounds read by reporting the error and exiting
+before the nesting depth has a chance to increase.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdef.c |    8 +++++---
+ 1 files changed, 5 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-27 17:14:32 +0000 Tony Finch <dot@dotat.at>
+
+runtests.sh: portability: . does not search current directory
+
+POSIX.1-2008 dot searches only the $PATH and not the current
+directory for pathnames with no / in them.  Accordingly, since
+version 4.0-alpha, bash does not search the current directory
+when in posix (sh) mode.  The fix is to specify ./ explicitly.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ runtests.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-27 15:40:10 +0000 Tony Finch <dot@dotat.at>
+
+Include a link to the web page in a comment in unifdef.c
+
+This is mainly for the benefit of the Linux kernel's stand-alone version.
+
+ unifdef.c |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:35:51 +0000 Tony Finch <dot@dotat.at>
+
+Consistent ordering of ${got} and ${exp} in the test script
+
+ runtests.sh |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:34:09 +0000 Tony Finch <dot@dotat.at>
+
+Include the tests in the web page
+
+ index.html.in |    4 +++-
+ release.sh    |    4 ++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:32:49 +0000 Tony Finch <dot@dotat.at>
+
+Improve phrasing on web page
+
+ index.html.in |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:30:02 +0000 Tony Finch <dot@dotat.at>
+
+Run the tests in the correct directory
+
+ Makefile    |    4 ++--
+ runtests.sh |    3 ++-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:21:36 +0000 Tony Finch <dot@dotat.at>
+
+Add some unifdefall test cases.
+
+ tests/if1-a.exprc  |    1 +
+ tests/if1-a.sh     |    1 +
+ tests/if2-a.exprc  |    1 +
+ tests/if2-a.sh     |    1 +
+ tests/if3-a.exprc  |    1 +
+ tests/if3-a.sh     |    1 +
+ tests/if4-a.exprc  |    1 +
+ tests/if4-a.sh     |    1 +
+ tests/if5-a.exprc  |    1 +
+ tests/if5-a.sh     |    1 +
+ 10 files changed, 10 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:20:59 +0000 Tony Finch <dot@dotat.at>
+
+Ensure we clean up after a successful test.
+
+ runtests.sh |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2009-11-27 14:08:08 +0000 Tony Finch <dot@dotat.at>
+
+Simplify the test suite so that runtests.sh is not specific to unifdef.
+
+ Makefile           |    5 +--
+ runtests.sh        |   65 ++++++++++++++++++---------------------------------
+ tests/args1.sh     |    1 +
+ tests/args2.sh     |    1 +
+ tests/blank0d.args |    1 -
+ tests/blank0d.sh   |    1 +
+ tests/blank0u.args |    1 -
+ tests/blank0u.sh   |    1 +
+ tests/blank1d.args |    1 -
+ tests/blank1d.sh   |    1 +
+ tests/blank1u.args |    1 -
+ tests/blank1u.sh   |    1 +
+ tests/blank2d.args |    1 -
+ tests/blank2d.sh   |    1 +
+ tests/blank2u.args |    1 -
+ tests/blank2u.sh   |    1 +
+ tests/blank3d.args |    1 -
+ tests/blank3d.sh   |    1 +
+ tests/blank3u.args |    1 -
+ tests/blank3u.sh   |    1 +
+ tests/blank4d.args |    1 -
+ tests/blank4d.sh   |    1 +
+ tests/blank4u.args |    1 -
+ tests/blank4u.sh   |    1 +
+ tests/empty.sh     |    1 +
+ tests/if1-k.args   |    1 -
+ tests/if1-k.sh     |    1 +
+ tests/if1-kDU.args |    1 -
+ tests/if1-kDU.sh   |    1 +
+ tests/if1.sh       |    1 +
+ tests/if2-k.args   |    1 -
+ tests/if2-k.sh     |    1 +
+ tests/if2-kDU.args |    1 -
+ tests/if2-kDU.sh   |    1 +
+ tests/if2.sh       |    1 +
+ tests/if3-k.args   |    1 -
+ tests/if3-k.sh     |    1 +
+ tests/if3-kDU.args |    1 -
+ tests/if3-kDU.sh   |    1 +
+ tests/if3.sh       |    1 +
+ tests/if4-k.args   |    1 -
+ tests/if4-k.sh     |    1 +
+ tests/if4-kDU.args |    1 -
+ tests/if4-kDU.sh   |    1 +
+ tests/if4.sh       |    1 +
+ tests/if5-k.args   |    1 -
+ tests/if5-k.sh     |    1 +
+ tests/if5-kDU.args |    1 -
+ tests/if5-kDU.sh   |    1 +
+ tests/if5.sh       |    1 +
+ tests/none.sh      |    1 +
+ tests/small1.sh    |    1 +
+ tests/small2.sh    |    1 +
+ tests/spaces1.sh   |    1 +
+ tests/spaces2.sh   |    1 +
+ tests/spaces3.sh   |    1 +
+ tests/spaces4.sh   |    1 +
+ 57 files changed, 60 insertions(+), 65 deletions(-)
+
+---------------------------------------------------
+2009-11-27 13:36:39 +0000 Tony Finch <dot@dotat.at>
+
+Test suite tweaks.
+
+Move the runtests script into the main source directory.
+Remove the redundant .c. from the expected output filenames.
+Run the tests in a separate working directory.
+Include the tests in the release.
+
+ Makefile               |    8 ++++--
+ release.sh             |    7 +++--
+ runtests.sh            |   17 +++++++-------
+ tests/args1.c.expout   |    1 -
+ tests/args1.c.exprc    |    1 -
+ tests/args2.c.expout   |    3 --
+ tests/args2.c.exprc    |    1 -
+ tests/blank0d.c.expout |   23 --------------------
+ tests/blank0d.c.exprc  |    1 -
+ tests/blank0u.c.expout |   22 -------------------
+ tests/blank0u.c.exprc  |    1 -
+ tests/blank1d.c.expout |   23 --------------------
+ tests/blank1d.c.exprc  |    1 -
+ tests/blank1u.c.expout |   21 ------------------
+ tests/blank1u.c.exprc  |    1 -
+ tests/blank2d.c.expout |   23 --------------------
+ tests/blank2d.c.exprc  |    1 -
+ tests/blank2u.c.expout |   20 -----------------
+ tests/blank2u.c.exprc  |    1 -
+ tests/blank3d.c.expout |   23 --------------------
+ tests/blank3d.c.exprc  |    1 -
+ tests/blank3u.c.expout |   19 ----------------
+ tests/blank3u.c.exprc  |    1 -
+ tests/blank4d.c.expout |   23 --------------------
+ tests/blank4d.c.exprc  |    1 -
+ tests/blank4u.c.expout |   18 ---------------
+ tests/blank4u.c.exprc  |    1 -
+ tests/empty.c.exprc    |    1 -
+ tests/if1-a.c.expout   |   15 -------------
+ tests/if1-k.c.expout   |   29 -------------------------
+ tests/if1-k.c.exprc    |    1 -
+ tests/if1-kDU.c.expout |   19 ----------------
+ tests/if1-kDU.c.exprc  |    1 -
+ tests/if1.c.expout     |   15 -------------
+ tests/if1.c.exprc      |    1 -
+ tests/if2-a.c.expout   |   12 ----------
+ tests/if2-k.c.expout   |   20 -----------------
+ tests/if2-k.c.exprc    |    1 -
+ tests/if2-kDU.c.expout |   16 --------------
+ tests/if2-kDU.c.exprc  |    1 -
+ tests/if2.c.expout     |   12 ----------
+ tests/if2.c.exprc      |    1 -
+ tests/if3-a.c.expout   |   12 ----------
+ tests/if3-k.c.expout   |   20 -----------------
+ tests/if3-k.c.exprc    |    1 -
+ tests/if3-kDU.c.expout |   16 --------------
+ tests/if3-kDU.c.exprc  |    1 -
+ tests/if3.c.expout     |   12 ----------
+ tests/if3.c.exprc      |    1 -
+ tests/if4-a.c.expout   |   21 ------------------
+ tests/if4-k.c.expout   |   41 -----------------------------------
+ tests/if4-k.c.exprc    |    1 -
+ tests/if4-kDU.c.expout |   25 ---------------------
+ tests/if4-kDU.c.exprc  |    1 -
+ tests/if4.c.expout     |   21 ------------------
+ tests/if4.c.exprc      |    1 -
+ tests/if5-a.c.expout   |   27 -----------------------
+ tests/if5-k.c.expout   |   55 ------------------------------------------------
+ tests/if5-k.c.exprc    |    1 -
+ tests/if5-kDU.c.expout |   31 ---------------------------
+ tests/if5-kDU.c.exprc  |    1 -
+ tests/if5.c.expout     |   27 -----------------------
+ tests/if5.c.exprc      |    1 -
+ tests/none.c.expout    |    4 ---
+ tests/none.c.exprc     |    1 -
+ tests/runtests         |   51 --------------------------------------------
+ tests/small1.c.expout  |   12 ----------
+ tests/small1.c.exprc   |    1 -
+ tests/small2.c.expout  |   12 ----------
+ tests/small2.c.exprc   |    1 -
+ tests/spaces1.c.expout |   12 ----------
+ tests/spaces1.c.exprc  |    1 -
+ tests/spaces2.c.expout |   12 ----------
+ tests/spaces2.c.exprc  |    1 -
+ tests/spaces3.c.expout |   12 ----------
+ tests/spaces3.c.exprc  |    1 -
+ tests/spaces4.c.expout |   12 ----------
+ tests/spaces4.c.exprc  |    1 -
+ 78 files changed, 18 insertions(+), 841 deletions(-)
+
+---------------------------------------------------
+2009-11-27 13:08:58 +0000 Tony Finch <dot@dotat.at>
+
+Additional tests from Bob Proulx <bob@proulx.com>
+
+Add his copyright notice to all the old tests.
+
+ runtests.sh            |    6 ++++-
+ tests/if1-a.c.expout   |   15 +++++++++++
+ tests/if1-a.expout     |   15 +++++++++++
+ tests/if1-k.args       |    1 +
+ tests/if1-k.c          |   37 ++++++++++++++++++++++++++++
+ tests/if1-k.c.expout   |   29 ++++++++++++++++++++++
+ tests/if1-k.c.exprc    |    1 +
+ tests/if1-k.expout     |   29 ++++++++++++++++++++++
+ tests/if1-k.exprc      |    1 +
+ tests/if1-kDU.args     |    1 +
+ tests/if1-kDU.c        |   37 ++++++++++++++++++++++++++++
+ tests/if1-kDU.c.expout |   19 ++++++++++++++
+ tests/if1-kDU.c.exprc  |    1 +
+ tests/if1-kDU.expout   |   19 ++++++++++++++
+ tests/if1-kDU.exprc    |    1 +
+ tests/if1.c            |    3 ++
+ tests/if1.c.expout     |    3 ++
+ tests/if1.expout       |    3 ++
+ tests/if2-a.c.expout   |   12 +++++++++
+ tests/if2-a.expout     |   12 +++++++++
+ tests/if2-k.args       |    1 +
+ tests/if2-k.c          |   28 +++++++++++++++++++++
+ tests/if2-k.c.expout   |   20 +++++++++++++++
+ tests/if2-k.c.exprc    |    1 +
+ tests/if2-k.expout     |   20 +++++++++++++++
+ tests/if2-k.exprc      |    1 +
+ tests/if2-kDU.args     |    1 +
+ tests/if2-kDU.c        |   28 +++++++++++++++++++++
+ tests/if2-kDU.c.expout |   16 ++++++++++++
+ tests/if2-kDU.c.exprc  |    1 +
+ tests/if2-kDU.expout   |   16 ++++++++++++
+ tests/if2-kDU.exprc    |    1 +
+ tests/if2.c            |    3 ++
+ tests/if2.c.expout     |    3 ++
+ tests/if2.expout       |    3 ++
+ tests/if3-a.c.expout   |   12 +++++++++
+ tests/if3-a.expout     |   12 +++++++++
+ tests/if3-k.args       |    1 +
+ tests/if3-k.c          |   28 +++++++++++++++++++++
+ tests/if3-k.c.expout   |   20 +++++++++++++++
+ tests/if3-k.c.exprc    |    1 +
+ tests/if3-k.expout     |   20 +++++++++++++++
+ tests/if3-k.exprc      |    1 +
+ tests/if3-kDU.args     |    1 +
+ tests/if3-kDU.c        |   28 +++++++++++++++++++++
+ tests/if3-kDU.c.expout |   16 ++++++++++++
+ tests/if3-kDU.c.exprc  |    1 +
+ tests/if3-kDU.expout   |   16 ++++++++++++
+ tests/if3-kDU.exprc    |    1 +
+ tests/if3.c            |    3 ++
+ tests/if3.c.expout     |    3 ++
+ tests/if3.expout       |    3 ++
+ tests/if4-a.c.expout   |   21 ++++++++++++++++
+ tests/if4-a.expout     |   21 ++++++++++++++++
+ tests/if4-k.args       |    1 +
+ tests/if4-k.c          |   49 +++++++++++++++++++++++++++++++++++++
+ tests/if4-k.c.expout   |   41 +++++++++++++++++++++++++++++++
+ tests/if4-k.c.exprc    |    1 +
+ tests/if4-k.expout     |   41 +++++++++++++++++++++++++++++++
+ tests/if4-k.exprc      |    1 +
+ tests/if4-kDU.args     |    1 +
+ tests/if4-kDU.c        |   49 +++++++++++++++++++++++++++++++++++++
+ tests/if4-kDU.c.expout |   25 +++++++++++++++++++
+ tests/if4-kDU.c.exprc  |    1 +
+ tests/if4-kDU.expout   |   25 +++++++++++++++++++
+ tests/if4-kDU.exprc    |    1 +
+ tests/if4.c            |    3 ++
+ tests/if4.c.expout     |    3 ++
+ tests/if4.expout       |    3 ++
+ tests/if5-a.c.expout   |   27 ++++++++++++++++++++
+ tests/if5-a.expout     |   27 ++++++++++++++++++++
+ tests/if5-k.args       |    1 +
+ tests/if5-k.c          |   63 ++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/if5-k.c.expout   |   55 +++++++++++++++++++++++++++++++++++++++++
+ tests/if5-k.c.exprc    |    1 +
+ tests/if5-k.expout     |   55 +++++++++++++++++++++++++++++++++++++++++
+ tests/if5-k.exprc      |    1 +
+ tests/if5-kDU.args     |    1 +
+ tests/if5-kDU.c        |   63 ++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/if5-kDU.c.expout |   31 +++++++++++++++++++++++
+ tests/if5-kDU.c.exprc  |    1 +
+ tests/if5-kDU.expout   |   31 +++++++++++++++++++++++
+ tests/if5-kDU.exprc    |    1 +
+ tests/if5.c            |    3 ++
+ tests/if5.c.expout     |    3 ++
+ tests/if5.expout       |    3 ++
+ tests/none.c           |    3 ++
+ tests/none.c.expout    |    3 ++
+ tests/none.expout      |    3 ++
+ tests/runtests         |    6 ++++-
+ tests/small1.c         |    3 ++
+ tests/small1.c.expout  |    3 ++
+ tests/small1.expout    |    3 ++
+ tests/small2.c         |    3 ++
+ tests/small2.c.expout  |    3 ++
+ tests/small2.expout    |    3 ++
+ tests/spaces1.c        |    3 ++
+ tests/spaces1.c.expout |    3 ++
+ tests/spaces1.expout   |    3 ++
+ tests/spaces2.c        |    3 ++
+ tests/spaces2.c.expout |    3 ++
+ tests/spaces2.expout   |    3 ++
+ tests/spaces3.c        |    3 ++
+ tests/spaces3.c.expout |    3 ++
+ tests/spaces3.expout   |    3 ++
+ tests/spaces4.c        |    3 ++
+ tests/spaces4.c.expout |    3 ++
+ tests/spaces4.expout   |    3 ++
+ 108 files changed, 1276 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-27 12:48:13 +0000 Tony Finch <dot@dotat.at>
+
+List significant contributions in the README
+
+ README |   28 +++++++++++++++++++++-------
+ 1 files changed, 21 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2009-11-27 12:36:54 +0000 Tony Finch <dot@dotat.at>
+
+Improve the blurb on the web page, based on the Debian package's
+
+description by Jonathan Nieder <jrnieder@gmail.com>.
+
+ index.html.in |   16 ++++++++++++----
+ 1 files changed, 12 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2009-11-26 14:12:30 +0000 Tony Finch <dot@dotat.at>
+
+Fix web page markup
+
+ index.html.in |   14 ++++++++------
+ 1 files changed, 8 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2009-11-26 14:01:26 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: clean index.html generated by release.sh
+
+ Makefile |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-26 13:56:22 +0000 Tony Finch <dot@dotat.at>
+
+Do not edit index.html in place
+
+ index.html.in |    4 ++--
+ release.sh    |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2009-11-26 13:54:10 +0000 Tony Finch <dot@dotat.at>
+
+Try again to prevent CVS keyword expansion  in the wrong part of release.sh
+
+ release.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-26 13:52:09 +0000 Tony Finch <dot@dotat.at>
+
+Do not expand CVS keywords in the wrong part of release.sh
+
+ release.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-26 13:50:10 +0000 Tony Finch <dot@dotat.at>
+
+Improved release process.
+
+Calculate the version number from the sum of the CVS idents.
+Adjust the version number in the web page.
+
+ release.sh |   12 +++++++-----
+ 1 files changed, 7 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2009-11-26 13:48:45 +0000 Tony Finch <dot@dotat.at>
+
+Add a web page. Use the same title in the README and index.html.
+
+ README        |    4 ++--
+ index.html.in |   46 ++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 48 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-26 12:54:39 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: optimise the loop that builds the unifdef command.
+
+The old code used a shell loop to convert each controlling macro
+definition into a command-line argument, reading the macro definitions
+file each time. The new code converts the list of controlling macros
+into a sed script which can run through the list of macro definitions
+in one go.
+
+Add some explanatory comments, since the code is quite meta.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |   24 ++++++++++++++++--------
+ 1 files changed, 16 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2009-11-26 02:22:24 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: Use {} instead of () for redirecting a group of commands.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-26 02:14:47 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: remove debugging remnants.
+
+ unifdefall.sh |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-25 19:54:34 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: update copyright dates.
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-25 19:33:51 +0000 Tony Finch <dot@dotat.at>
+
+Makefile: really clean more.
+
+ Makefile |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-25 19:32:40 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: portability: do not try to use EREs with sed
+
+BSD sed uses -E and GNU sed uses -r to specify that extended
+regular expressions should be used instead of BREs.
+
+Some of the sed scripts have been simplified by relying on 'cpp -dM'
+to produce lines of the form '#define MACRO value', with a single
+space as delimiting whitespace.
+
+While we're modifying the sed scripts, also change the shell
+quoting script to correctly capture more characters when they
+appear in the right-hand sides of macro definitions (e.g., $).
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |   17 ++++++++---------
+ 1 files changed, 8 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2009-11-25 19:24:59 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: fix mktemp invocation
+
+Actually remove the -t that should have gone in rev. 1.14
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-25 19:23:12 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: simplify redirections to the temporary script
+
+ unifdefall.sh |   19 ++++++++++---------
+ 1 files changed, 10 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2009-11-25 18:05:11 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: force the "C" locale to avoid braindamage
+
+Reported-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2009-11-25 18:02:41 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: clean up temporary files on failure
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |    5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-25 18:00:54 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: allow spaces in $TMPDIR
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |   28 ++++++++++++++--------------
+ 1 files changed, 14 insertions(+), 14 deletions(-)
+
+---------------------------------------------------
+2009-11-25 17:56:10 +0000 Tony Finch <dot@dotat.at>
+
+unifdefall: portability: avoid mktemp -t
+
+GNU mktemp interprets the argument after -t as the entire template
+and errors out if it contains no XXXX substring. BSD systems, on
+the other hand, treat the argument as a prefix for the mktemp
+template and use it verbatim, resulting in long, ugly filenames
+like foo.XXXXX.e30GuhHVzU if the string contains embedded Xs.
+
+So avoid -t and use TMPDIR explicitly.
+
+Submitted-by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-25 17:54:13 +0000 Tony Finch <dot@dotat.at>
+
+Use $() instead of `` in unifdefall.
+
+ unifdefall.sh |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-25 00:11:02 +0000 Tony Finch <dot@dotat.at>
+
+Improve the behaviour of the -B option.
+
+Submitted-by: Anders H Kaseorg <andersk@mit.edu>
+
+ tests/blank1d.c.expout |    1 +
+ tests/blank1d.expout   |    1 +
+ tests/blank2d.c.expout |    2 ++
+ tests/blank2d.expout   |    2 ++
+ tests/blank3d.c.expout |    3 +++
+ tests/blank3d.expout   |    3 +++
+ tests/blank4d.c.expout |    4 ++++
+ tests/blank4d.expout   |    4 ++++
+ unifdef.1              |    4 ++--
+ unifdef.c              |   17 +++++++++++------
+ 10 files changed, 33 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2009-11-25 00:03:44 +0000 Tony Finch <dot@dotat.at>
+
+Add some test cases for blank line squashing.
+
+ tests/blank0d.args     |    1 +
+ tests/blank0d.c        |   25 +++++++++++++++++++++++++
+ tests/blank0d.c.expout |   23 +++++++++++++++++++++++
+ tests/blank0d.c.exprc  |    1 +
+ tests/blank0d.expout   |   23 +++++++++++++++++++++++
+ tests/blank0d.exprc    |    1 +
+ tests/blank0u.args     |    1 +
+ tests/blank0u.c        |   25 +++++++++++++++++++++++++
+ tests/blank0u.c.expout |   22 ++++++++++++++++++++++
+ tests/blank0u.c.exprc  |    1 +
+ tests/blank0u.expout   |   22 ++++++++++++++++++++++
+ tests/blank0u.exprc    |    1 +
+ tests/blank1d.args     |    1 +
+ tests/blank1d.c        |   25 +++++++++++++++++++++++++
+ tests/blank1d.c.expout |   22 ++++++++++++++++++++++
+ tests/blank1d.c.exprc  |    1 +
+ tests/blank1d.expout   |   22 ++++++++++++++++++++++
+ tests/blank1d.exprc    |    1 +
+ tests/blank1u.args     |    1 +
+ tests/blank1u.c        |   25 +++++++++++++++++++++++++
+ tests/blank1u.c.expout |   21 +++++++++++++++++++++
+ tests/blank1u.c.exprc  |    1 +
+ tests/blank1u.expout   |   21 +++++++++++++++++++++
+ tests/blank1u.exprc    |    1 +
+ tests/blank2d.args     |    1 +
+ tests/blank2d.c        |   25 +++++++++++++++++++++++++
+ tests/blank2d.c.expout |   21 +++++++++++++++++++++
+ tests/blank2d.c.exprc  |    1 +
+ tests/blank2d.expout   |   21 +++++++++++++++++++++
+ tests/blank2d.exprc    |    1 +
+ tests/blank2u.args     |    1 +
+ tests/blank2u.c        |   25 +++++++++++++++++++++++++
+ tests/blank2u.c.expout |   20 ++++++++++++++++++++
+ tests/blank2u.c.exprc  |    1 +
+ tests/blank2u.expout   |   20 ++++++++++++++++++++
+ tests/blank2u.exprc    |    1 +
+ tests/blank3d.args     |    1 +
+ tests/blank3d.c        |   25 +++++++++++++++++++++++++
+ tests/blank3d.c.expout |   20 ++++++++++++++++++++
+ tests/blank3d.c.exprc  |    1 +
+ tests/blank3d.expout   |   20 ++++++++++++++++++++
+ tests/blank3d.exprc    |    1 +
+ tests/blank3u.args     |    1 +
+ tests/blank3u.c        |   25 +++++++++++++++++++++++++
+ tests/blank3u.c.expout |   19 +++++++++++++++++++
+ tests/blank3u.c.exprc  |    1 +
+ tests/blank3u.expout   |   19 +++++++++++++++++++
+ tests/blank3u.exprc    |    1 +
+ tests/blank4d.args     |    1 +
+ tests/blank4d.c        |   25 +++++++++++++++++++++++++
+ tests/blank4d.c.expout |   19 +++++++++++++++++++
+ tests/blank4d.c.exprc  |    1 +
+ tests/blank4d.expout   |   19 +++++++++++++++++++
+ tests/blank4d.exprc    |    1 +
+ tests/blank4u.args     |    1 +
+ tests/blank4u.c        |   25 +++++++++++++++++++++++++
+ tests/blank4u.c.expout |   18 ++++++++++++++++++
+ tests/blank4u.c.exprc  |    1 +
+ tests/blank4u.expout   |   18 ++++++++++++++++++
+ tests/blank4u.exprc    |    1 +
+ 60 files changed, 690 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2009-11-24 23:46:36 +0000 Tony Finch <dot@dotat.at>
+
+Further test script clean-ups.
+
+ runtests.sh    |   27 ++++++++++++---------------
+ tests/runtests |   27 ++++++++++++---------------
+ 2 files changed, 24 insertions(+), 30 deletions(-)
+
+---------------------------------------------------
+2009-11-24 22:40:01 +0000 Tony Finch <dot@dotat.at>
+
+Add a couple of tests for macro argument handling
+
+ tests/args1.c        |    3 +++
+ tests/args1.c.expout |    1 +
+ tests/args1.c.exprc  |    1 +
+ tests/args1.expout   |    1 +
+ tests/args1.exprc    |    1 +
+ tests/args2.c        |    3 +++
+ tests/args2.c.expout |    3 +++
+ tests/args2.c.exprc  |    1 +
+ tests/args2.expout   |    3 +++
+ tests/args2.exprc    |    1 +
+ 10 files changed, 18 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2009-11-24 22:39:36 +0000 Tony Finch <dot@dotat.at>
+
+Automatically run newly-added tests.
+
+ runtests.sh    |    7 +++----
+ tests/runtests |    7 +++----
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2009-11-24 22:32:35 +0000 Tony Finch <dot@dotat.at>
+
+Fix detection of missing test output files.
+
+ runtests.sh    |    3 +--
+ tests/runtests |    3 +--
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2009-11-24 22:25:55 +0000 Tony Finch <dot@dotat.at>
+
+Move tests/Makefile into the main Makefile.
+
+ Makefile       |    6 +++++-
+ tests/Makefile |    5 -----
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2009-11-24 22:20:26 +0000 Tony Finch <dot@dotat.at>
+
+Support non-standard test command arguments.
+
+ runtests.sh    |    7 ++++++-
+ tests/runtests |    7 ++++++-
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-24 22:13:15 +0000 Tony Finch <dot@dotat.at>
+
+Remove redundancy from the test scripts.
+
+ runtests.sh           |   47 ++++++++++++++++++++++++++++++++++++++
+ tests/Makefile        |   11 +-------
+ tests/empty.c.exprc   |    1 +
+ tests/empty.exprc     |    1 +
+ tests/if1.c.exprc     |    1 +
+ tests/if1.exprc       |    1 +
+ tests/if2.c.exprc     |    1 +
+ tests/if2.exprc       |    1 +
+ tests/if3.c.exprc     |    1 +
+ tests/if3.exprc       |    1 +
+ tests/if4.c.exprc     |    1 +
+ tests/if4.exprc       |    1 +
+ tests/if5.c.exprc     |    1 +
+ tests/if5.exprc       |    1 +
+ tests/none.c.exprc    |    1 +
+ tests/none.exprc      |    1 +
+ tests/runtests        |   47 ++++++++++++++++++++++++++++++++++++++
+ tests/simple1         |   58 -----------------------------------------------
+ tests/simple2         |   60 -------------------------------------------------
+ tests/small1.c.exprc  |    1 +
+ tests/small1.exprc    |    1 +
+ tests/small2.c.exprc  |    1 +
+ tests/small2.exprc    |    1 +
+ tests/spaces1.c.exprc |    1 +
+ tests/spaces1.exprc   |    1 +
+ tests/spaces2.c.exprc |    1 +
+ tests/spaces2.exprc   |    1 +
+ tests/spaces3.c.exprc |    1 +
+ tests/spaces3.exprc   |    1 +
+ tests/spaces4.c.exprc |    1 +
+ tests/spaces4.exprc   |    1 +
+ 31 files changed, 122 insertions(+), 127 deletions(-)
+
+---------------------------------------------------
+2009-11-24 21:32:53 +0000 Tony Finch <dot@dotat.at>
+
+Make the simple3 test script redundant.
+
+ tests/Makefile |    2 +-
+ tests/simple2  |    6 +++-
+ tests/simple3  |   58 --------------------------------------------------------
+ 3 files changed, 5 insertions(+), 61 deletions(-)
+
+---------------------------------------------------
+2009-11-24 21:27:29 +0000 Tony Finch <dot@dotat.at>
+
+Reduce repetition of the test command in the scripts.
+
+ tests/simple1 |   14 ++++++++------
+ tests/simple2 |   14 ++++++++------
+ tests/simple3 |   14 ++++++++------
+ 3 files changed, 24 insertions(+), 18 deletions(-)
+
+---------------------------------------------------
+2009-11-24 21:23:30 +0000 Tony Finch <dot@dotat.at>
+
+Fix relative path from tests to unifdef executable.
+
+ tests/simple1 |    2 +-
+ tests/simple2 |    2 +-
+ tests/simple3 |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-24 21:21:47 +0000 Tony Finch <dot@dotat.at>
+
+Import Bob Proulx's test suite from the Debian package.
+
+ tests/Makefile         |   12 ++++++++++
+ tests/if1.c            |   22 ++++++++++++++++++
+ tests/if1.c.expout     |   12 ++++++++++
+ tests/if1.expout       |   12 ++++++++++
+ tests/if2.c            |   13 +++++++++++
+ tests/if2.c.expout     |    9 +++++++
+ tests/if2.expout       |    9 +++++++
+ tests/if3.c            |   13 +++++++++++
+ tests/if3.c.expout     |    9 +++++++
+ tests/if3.expout       |    9 +++++++
+ tests/if4.c            |   34 +++++++++++++++++++++++++++++
+ tests/if4.c.expout     |   18 +++++++++++++++
+ tests/if4.expout       |   18 +++++++++++++++
+ tests/if5.c            |   48 +++++++++++++++++++++++++++++++++++++++++
+ tests/if5.c.expout     |   24 ++++++++++++++++++++
+ tests/if5.expout       |   24 ++++++++++++++++++++
+ tests/none.c           |    1 +
+ tests/none.c.expout    |    1 +
+ tests/none.expout      |    1 +
+ tests/simple1          |   56 ++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/simple2          |   56 ++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/simple3          |   56 ++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/small1.c         |   13 +++++++++++
+ tests/small1.c.expout  |    9 +++++++
+ tests/small1.expout    |    9 +++++++
+ tests/small2.c         |   13 +++++++++++
+ tests/small2.c.expout  |    9 +++++++
+ tests/small2.expout    |    9 +++++++
+ tests/spaces1.c        |   13 +++++++++++
+ tests/spaces1.c.expout |    9 +++++++
+ tests/spaces1.expout   |    9 +++++++
+ tests/spaces2.c        |   13 +++++++++++
+ tests/spaces2.c.expout |    9 +++++++
+ tests/spaces2.expout   |    9 +++++++
+ tests/spaces3.c        |   13 +++++++++++
+ tests/spaces3.c.expout |    9 +++++++
+ tests/spaces3.expout   |    9 +++++++
+ tests/spaces4.c        |   13 +++++++++++
+ tests/spaces4.c.expout |    9 +++++++
+ tests/spaces4.expout   |    9 +++++++
+ 40 files changed, 643 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2009-11-24 17:50:35 +0000 Tony Finch <dot@dotat.at>
+
+Less stilted English in the man page.
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-24 17:49:13 +0000 Tony Finch <dot@dotat.at>
+
+Handle macros with arguments.
+
+Submitted-by: Anders H Kaseorg <andersk@mit.edu>
+
+ unifdef.1 |   13 ++++++++++++-
+ unifdef.c |   32 ++++++++++++++++++++++++++++++--
+ 2 files changed, 42 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-24 16:51:38 +0000 Tony Finch <dot@dotat.at>
+
+Use isalnum() instead of isalpha() + isdigit().
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-24 12:14:37 +0000 Tony Finch <dot@dotat.at>
+
+Run the release script verbosely.
+
+ release.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-24 12:12:31 +0000 Tony Finch <dot@dotat.at>
+
+Add a non-portability note to the README.
+
+ README |    8 +++++++-
+ 1 files changed, 7 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2009-11-24 11:58:41 +0000 Tony Finch <dot@dotat.at>
+
+Rename getline() to parseline() to avoid clashing with a glibc function.
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2009-11-23 19:15:42 +0000 Tony Finch <dot@dotat.at>
+
+Add a realclean target
+
+ Makefile |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2009-11-23 19:14:02 +0000 Tony Finch <dot@dotat.at>
+
+Add a README file
+
+ Makefile   |    4 ++--
+ README     |   21 +++++++++++++++++++++
+ release.sh |    3 ++-
+ 3 files changed, 25 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2009-11-23 19:07:17 +0000 Tony Finch <dot@dotat.at>
+
+Further improvements to the release scripts.
+
+Make the generated filenames more standard.
+
+ Makefile   |   16 ++++++++--------
+ release.sh |   16 +++++++++++-----
+ 2 files changed, 19 insertions(+), 13 deletions(-)
+
+---------------------------------------------------
+2009-11-23 18:54:52 +0000 Tony Finch <dot@dotat.at>
+
+Include the Release script in the release.
+
+ release.sh |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2009-11-23 18:53:35 +0000 Tony Finch <dot@dotat.at>
+
+Revamp Makefile and add a separate Release script.
+
+ Makefile   |   20 +++++++-------------
+ release.sh |   22 ++++++++++++++++++++++
+ 2 files changed, 29 insertions(+), 13 deletions(-)
+
+---------------------------------------------------
+2009-11-23 18:37:17 +0000 Tony Finch <dot@dotat.at>
+
+Document -d flag and update copyright notices.
+
+ unifdef.1 |   11 +++++++----
+ unifdef.c |    6 +++---
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2009-11-23 18:24:55 +0000 Tony Finch <dot@dotat.at>
+
+Fix regression in ! operator.
+
+Since revision 1.180, unifdef is ignoring negations in the
+outermost expression of an #if conditional.  Fix the regression,
+and add a debug statement to help if any similar problems ever
+need to be tracked down.
+
+Submitted by: Jonathan Nieder <jrnieder@gmail.com>
+
+ unifdef.c |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-23 17:59:33 +0000 Tony Finch <dot@dotat.at>
+
+Correct the HISTORY section and add an AUTHORS section.
+
+Obtained from FreeBSD.
+
+ unifdef.1 |   10 ++++++++--
+ 1 files changed, 8 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2009-11-23 17:58:27 +0000 Tony Finch <dot@dotat.at>
+
+Add a "release" target
+
+ Makefile |   12 +++++++++++-
+ 1 files changed, 11 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2008-03-10 16:15:52 +0000 Tony Finch <dot@dotat.at>
+
+update synopsis
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2008-03-10 16:08:47 +0000 Tony Finch <dot@dotat.at>
+
+backwards compatibility option
+
+ unifdef.1 |   12 +++++++++++-
+ unifdef.c |   14 +++++++++-----
+ 2 files changed, 20 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2008-03-10 15:56:15 +0000 Tony Finch <dot@dotat.at>
+
+Fix the state transition table.
+
+ unifdef.c |   37 ++++++++++++++++++-------------------
+ 1 files changed, 18 insertions(+), 19 deletions(-)
+
+---------------------------------------------------
+2008-03-10 15:24:29 +0000 Tony Finch <dot@dotat.at>
+
+Lenient evaluation of && and || based on an idea from Ben Hutchings at
+
+Solarflare Communications.
+
+ unifdef.1 |   74 +++++++++++++++++++++++----------
+ unifdef.c |  136 +++++++++++++++++++++++++++++++++++++++---------------------
+ 2 files changed, 139 insertions(+), 71 deletions(-)
+
+---------------------------------------------------
+2008-03-10 13:01:40 +0000 Tony Finch <dot@dotat.at>
+
+Compress blank lines, based on an idea from Ben Hutchings at
+
+Solarflare Communications.
+
+ unifdef.1 |   28 ++++++++++++++++++----------
+ unifdef.c |   37 ++++++++++++++++++++++++++-----------
+ 2 files changed, 44 insertions(+), 21 deletions(-)
+
+---------------------------------------------------
+2008-03-02 22:23:32 +0000 Tony Finch <dot@dotat.at>
+
+Typo in comment spotted by Hasso Tepper at DragonFlyBSD.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2008-02-29 13:17:37 +0000 Tony Finch <dot@dotat.at>
+
+Ah, I have worked out another way of triggering the abort.
+
+I think this fix covers all the cases.
+
+ unifdef.c |   21 ++++++++++++---------
+ 1 files changed, 12 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2008-02-29 12:44:25 +0000 Tony Finch <dot@dotat.at>
+
+Remove a bit of copyright crap.
+
+ unifdef.c |   10 +++-------
+ 1 files changed, 3 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2008-02-29 12:30:36 +0000 Tony Finch <dot@dotat.at>
+
+Sync usage with synopsis in man page
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2008-02-29 12:29:34 +0000 Tony Finch <dot@dotat.at>
+
+Ensure man page is ASCII.
+
+ Makefile |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2008-02-29 12:26:04 +0000 Tony Finch <dot@dotat.at>
+
+Fix an abort caused by files that have #endif and no newline on the
+
+last line (reported by Joe Karthauser). Also fix a benign uninitialized
+variable bug.
+
+ unifdef.c |   19 ++++++++++++++-----
+ 1 files changed, 14 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2007-04-30 07:37:17 +0000 Tony Finch <dot@dotat.at>
+
+Fix explanation of copyright history.
+
+ unifdef.c |   20 +++++++++++---------
+ 1 files changed, 11 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2005-08-12 10:59:21 +0000 Tony Finch <dot@dotat.at>
+
+Allow #if defined SYM as well as #if defined(SYM)
+
+ unifdef.c |   14 +++++++++-----
+ 1 files changed, 9 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2005-03-08 12:39:01 +0000 Tony Finch <dot@dotat.at>
+
+sync with upstream
+
+ unifdef.1 |   32 ++++++++++++++++----------------
+ 1 files changed, 16 insertions(+), 16 deletions(-)
+
+---------------------------------------------------
+2005-03-08 12:38:48 +0000 Tony Finch <dot@dotat.at>
+
+copyright dates
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2005-03-08 12:07:27 +0000 Tony Finch <dot@dotat.at>
+
+Update the copyright notice to the FreeBSD standard.
+
+Do not recognize comment markers inside string and character literals.
+
+ unifdef.c |   59 ++++++++++++++++++++++++++++++++++++++++++++---------------
+ 1 files changed, 44 insertions(+), 15 deletions(-)
+
+---------------------------------------------------
+2003-08-12 20:51:30 +0000 Tony Finch <dot@dotat.at>
+
+simpler declaration of copyright[]
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-08-12 20:33:59 +0000 Tony Finch <dot@dotat.at>
+
+Make the embedded copyright and version information more portable.
+
+Remove NetBSD cvs id because it is no longer relevant. Remove FreeBSD
+cvs id because it isn't relevant upstream. Keep Berkeley runes because
+they go with the original licence.
+
+ unifdef.c |   23 ++++++-----------------
+ 1 files changed, 6 insertions(+), 17 deletions(-)
+
+---------------------------------------------------
+2003-08-12 20:32:39 +0000 Tony Finch <dot@dotat.at>
+
+FreeBSD cvs id isn't relevant in this file in the upstream version.
+
+ unifdefall.sh |    3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-08-12 20:32:12 +0000 Tony Finch <dot@dotat.at>
+
+Current FreeBSD cvs id
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-08-12 20:12:24 +0000 Tony Finch <dot@dotat.at>
+
+optionally add #line directives to the output
+
+ unifdef.1 |   11 +++++++++--
+ unifdef.c |   20 ++++++++++++++------
+ 2 files changed, 23 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2003-08-12 19:39:53 +0000 Tony Finch <dot@dotat.at>
+
+Add a little sanity checking to the state transition table code.
+
+ unifdef.c |   16 +++++++++++++---
+ 1 files changed, 13 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-08-12 19:35:31 +0000 Tony Finch <dot@dotat.at>
+
+a minor style improvement
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2003-08-12 19:23:12 +0000 Tony Finch <dot@dotat.at>
+
+Allow the user to run unifdef without defining any symbols. This is
+
+useful in conjunction with the -k flag.
+Fix a bug in the -s handling code that would have caused out-of-bounds
+array accesses.
+
+ unifdef.c |   15 +++++++--------
+ 1 files changed, 7 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2003-08-07 16:01:10 +0000 Tony Finch <dot@dotat.at>
+
+Sync with FreeBSD
+
+ unifdef.1 |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2003-07-31 08:21:00 +0000 Tony Finch <dot@dotat.at>
+
+All rights reserved
+
+ unifdef.1 |    4 ++--
+ unifdef.c |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2003-07-31 08:20:47 +0000 Tony Finch <dot@dotat.at>
+
+add FreeBSD-style copyright & licence
+
+ unifdefall.sh |   27 +++++++++++++++++++++++++--
+ 1 files changed, 25 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-07-31 08:10:39 +0000 Tony Finch <dot@dotat.at>
+
+Sync copyright and licence with the code. I've put my copyright line
+
+below Berkeley's since a lot of the old man page still remains.
+
+ unifdef.1 |   11 ++++-------
+ 1 files changed, 4 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2003-07-31 07:59:15 +0000 Tony Finch <dot@dotat.at>
+
+Remove clause three of the licence, as permitted by Berkeley. OpenBSD
+
+have done this globally, but Net- and Free- haven't. I've had two
+questions about this recently, and since I don't distribute Berkeley's
+licence change statement this is a good way to be clear.
+
+ unifdef.c |    8 ++------
+ 1 files changed, 2 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2003-07-01 15:32:48 +0000 Tony Finch <dot@dotat.at>
+
+FreeBSD ident string
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-07-01 15:21:25 +0000 Tony Finch <dot@dotat.at>
+
+style tweak
+
+ unifdef.c |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-07-01 15:13:49 +0000 Tony Finch <dot@dotat.at>
+
+Make the handling of EOF a little more elegant.
+
+ unifdef.c |   36 ++++++++++++++++--------------------
+ 1 files changed, 16 insertions(+), 20 deletions(-)
+
+---------------------------------------------------
+2003-07-01 14:53:50 +0000 Tony Finch <dot@dotat.at>
+
+clean
+
+ Makefile |    9 +++++++--
+ 1 files changed, 7 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-07-01 08:34:43 +0000 Tony Finch <dot@dotat.at>
+
+a comment about line continuations
+
+ unifdef.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2003-07-01 08:19:58 +0000 Tony Finch <dot@dotat.at>
+
+Improve the expression evaluator's debugging output.
+
+ unifdef.c |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-06-30 14:30:54 +0000 Tony Finch <dot@dotat.at>
+
+More improvements to comments regarding global variables.
+
+ unifdef.c |   12 +++++++-----
+ 1 files changed, 7 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2003-06-30 14:26:48 +0000 Tony Finch <dot@dotat.at>
+
+Make a note in a comment about the relationship between getline() and
+
+skipcomment() w.r.t. the linestate.
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-06-30 14:22:40 +0000 Tony Finch <dot@dotat.at>
+
+When in text mode, or when ignoring a symbol, skipcomment needs to
+
+adjust the linestate when it hits a newline.
+
+ unifdef.c |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-06-30 14:03:56 +0000 Tony Finch <dot@dotat.at>
+
+Sync with FreeBSD.
+
+ unifdef.c |   12 +++++++-----
+ 1 files changed, 7 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2003-01-20 14:43:55 +0000 Tony Finch <dot@dotat.at>
+
+makefile for unifdef
+
+ Makefile |   11 +++++++++++
+ 1 files changed, 11 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2003-01-20 14:37:08 +0000 Tony Finch <dot@dotat.at>
+
+Slightly more correct SYNOPSIS
+
+ unifdef.1 |   14 ++++++--------
+ unifdef.c |    4 ++--
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2003-01-20 14:01:47 +0000 Tony Finch <dot@dotat.at>
+
+add a note about probalems caused by division
+
+ unifdef.c |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-20 13:48:06 +0000 Tony Finch <dot@dotat.at>
+
+typo
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-20 12:46:08 +0000 Tony Finch <dot@dotat.at>
+
+Sync $FreeBSD$ after downstream commit
+
+ unifdef.1 |    4 ++--
+ unifdef.c |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2003-01-20 12:05:41 +0000 Tony Finch <dot@dotat.at>
+
+clean up some -o remnants
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-01-20 12:03:48 +0000 Tony Finch <dot@dotat.at>
+
+terminological consistency: s/modify/edit/
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-20 12:03:10 +0000 Tony Finch <dot@dotat.at>
+
+Compactify the Mfoo functions.
+
+ unifdef.c |   15 ++++++---------
+ 1 files changed, 6 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2003-01-20 11:46:53 +0000 Tony Finch <dot@dotat.at>
+
+more idiomatic strlcpy usage
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-20 11:45:32 +0000 Tony Finch <dot@dotat.at>
+
+Correct dodgy handling -- line continuations in keywords are always an
+
+error.
+
+ unifdef.c |   22 ++++++++++------------
+ 1 files changed, 10 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2003-01-20 11:36:12 +0000 Tony Finch <dot@dotat.at>
+
+Rename -o to -e, i.e. "less errors" instead of "allow obfuscation".
+
+ unifdef.1 |   40 ++++++++++++++++++++--------------------
+ unifdef.c |   12 ++++++------
+ 2 files changed, 26 insertions(+), 26 deletions(-)
+
+---------------------------------------------------
+2003-01-20 11:22:44 +0000 Tony Finch <dot@dotat.at>
+
+remove another spurious space
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-20 02:58:11 +0000 Tony Finch <dot@dotat.at>
+
+Improve the handling of multiline preprocessor directives. Don't complain
+
+when they don't affect the output. Add a switch that causes us to fudge
+it instead of complaining when it is possible to do so.
+
+Prompted by an error report from Poul-Henning Kamp <phk@FreeBSD.org>
+
+ unifdef.1 |   24 +++++++++-
+ unifdef.c |  142 +++++++++++++++++++++++++++++++++++++++++++-----------------
+ 2 files changed, 123 insertions(+), 43 deletions(-)
+
+---------------------------------------------------
+2003-01-20 02:53:27 +0000 Tony Finch <dot@dotat.at>
+
+replace accidentally zapped #endif
+
+ unifdef.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2003-01-20 02:50:36 +0000 Tony Finch <dot@dotat.at>
+
+Sync $FreeBSD$
+
+ unifdef.c |    5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-01-20 01:51:11 +0000 Tony Finch <dot@dotat.at>
+
+Deconfuse ingnore[] (which is a per-symbol flag) and ignoring[]
+
+(which is the stack of ignore states).
+
+ unifdef.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2003-01-20 01:32:23 +0000 Tony Finch <dot@dotat.at>
+
+Whitespace fixes from OpenBSD.
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2003-01-20 00:59:36 +0000 Tony Finch <dot@dotat.at>
+
+Be more explicit about the failure mode.
+
+Reported by: Poul-Henning Kamp <phk@FreeBSD.org>
+
+ unifdef.c |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2003-01-20 00:50:06 +0000 Tony Finch <dot@dotat.at>
+
+typo: maintin -> maintain
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-20 00:01:49 +0000 Tony Finch <dot@dotat.at>
+
+Purge strcpy() to appease OpenBSD. Consistently use the term "edit"
+
+when talking about changing preprocessor keywords in the output.
+
+Suggested by: Ted Unangst <tedu@stanford.edu>
+
+ unifdef.c |   26 +++++++++++++++++++-------
+ 1 files changed, 19 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2003-01-17 19:19:13 +0000 Tony Finch <dot@dotat.at>
+
+mdoc pedantry from FreeBSD
+
+ unifdef.1 |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2003-01-17 19:04:36 +0000 Tony Finch <dot@dotat.at>
+
+Style fix: brackets around the argument to return. From OpenBSD.
+
+ unifdef.c |   68 ++++++++++++++++++++++++++++++------------------------------
+ 1 files changed, 34 insertions(+), 34 deletions(-)
+
+---------------------------------------------------
+2003-01-17 19:03:02 +0000 Tony Finch <dot@dotat.at>
+
+Add a necessary cast to an argument of printf. From OpenBSD.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2003-01-17 19:01:59 +0000 Tony Finch <dot@dotat.at>
+
+Whitespace fixes from OpenBSD.
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-13 15:26:41 +0000 Tony Finch <dot@dotat.at>
+
+Damnit, it makes sense for flushline() to be near the #if machine,
+
+and the diff is doomed to be vast anyway.
+
+ unifdef.c |   37 ++++++++++++++++++-------------------
+ 1 files changed, 18 insertions(+), 19 deletions(-)
+
+---------------------------------------------------
+2002-12-13 15:20:05 +0000 Tony Finch <dot@dotat.at>
+
+make warns-clean in an evil manner
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-13 13:58:00 +0000 Tony Finch <dot@dotat.at>
+
+factor out an error message
+
+ unifdef.c |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:44:25 +0000 Tony Finch <dot@dotat.at>
+
+remove an XXX that has been addressed
+
+ unifdef.c |    4 +---
+ 1 files changed, 1 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:42:37 +0000 Tony Finch <dot@dotat.at>
+
+sort getopt cases
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:40:08 +0000 Tony Finch <dot@dotat.at>
+
+Use ISO/IEC 9899:1999 minimum translation limits
+
+ unifdef.c |   13 ++++++++-----
+ 1 files changed, 8 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:33:34 +0000 Tony Finch <dot@dotat.at>
+
+expand on unifdef's understanding of C
+
+ unifdef.1 |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:24:26 +0000 Tony Finch <dot@dotat.at>
+
+note the appearance of ANSI support
+
+ unifdef.1 |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:24:08 +0000 Tony Finch <dot@dotat.at>
+
+describe the limitation on preprocessor lines better
+
+ unifdef.1 |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:15:20 +0000 Tony Finch <dot@dotat.at>
+
+spot backslash-newline in a preprocessor keyword
+
+ unifdef.c |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:13:02 +0000 Tony Finch <dot@dotat.at>
+
+fix an error message
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:11:11 +0000 Tony Finch <dot@dotat.at>
+
+less obfuscated ifdef/ifndef handling
+
+ unifdef.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-12-13 11:04:43 +0000 Tony Finch <dot@dotat.at>
+
+comment the state enums
+
+ unifdef.c |   50 +++++++++++++++++++++++++-------------------------
+ 1 files changed, 25 insertions(+), 25 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:53:53 +0000 Tony Finch <dot@dotat.at>
+
+move the forward declaration of struct ops to a better place
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:52:26 +0000 Tony Finch <dot@dotat.at>
+
+move flushline() back where it used to be
+
+ unifdef.c |   38 +++++++++++++++++++-------------------
+ 1 files changed, 19 insertions(+), 19 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:50:15 +0000 Tony Finch <dot@dotat.at>
+
+more commentary on strlcmp()
+
+ unifdef.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:46:44 +0000 Tony Finch <dot@dotat.at>
+
+comment all globals
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:45:29 +0000 Tony Finch <dot@dotat.at>
+
+terminological consistency for pass states
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:43:04 +0000 Tony Finch <dot@dotat.at>
+
+fix some comments
+
+ unifdef.c |    8 ++++++--
+ 1 files changed, 6 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:42:23 +0000 Tony Finch <dot@dotat.at>
+
+re-order enums to reduce diffs with FreeBSD
+
+ unifdef.c |   50 +++++++++++++++++++++++++-------------------------
+ 1 files changed, 25 insertions(+), 25 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:38:45 +0000 Tony Finch <dot@dotat.at>
+
+remove some c&p garbage
+
+ unifdef.c |   24 +-----------------------
+ 1 files changed, 1 insertions(+), 23 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:36:23 +0000 Tony Finch <dot@dotat.at>
+
+move flushline closer to its usage point
+
+ unifdef.c |   60 +++++++++++++++++++++++++++++++++++++++++-------------------
+ 1 files changed, 41 insertions(+), 19 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:35:17 +0000 Tony Finch <dot@dotat.at>
+
+rename a variable in process() to reduce diffs with FreeBSD
+
+ unifdef.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:29:02 +0000 Tony Finch <dot@dotat.at>
+
+move the tables closer to their interpreters
+
+ unifdef.c |  317 +++++++++++++++++++++++++++++++------------------------------
+ 1 files changed, 160 insertions(+), 157 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:15:24 +0000 Tony Finch <dot@dotat.at>
+
+reduce the space used by the state transition functions
+
+ unifdef.c |  146 ++++++++++++++++++++++++-------------------------------------
+ 1 files changed, 57 insertions(+), 89 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:04:56 +0000 Tony Finch <dot@dotat.at>
+
+note another diagnostic
+
+ unifdef.1 |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-12 19:04:56 +0000 Tony Finch <dot@dotat.at>
+
+make everything static, and improve the order of declarations
+
+ unifdef.c |  328 ++++++++++++++++++++++++++++++++----------------------------
+ 1 files changed, 175 insertions(+), 153 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:59:51 +0000 Tony Finch <dot@dotat.at>
+
+Improve the state table commentary.
+
+ unifdef.c |   14 +++++++-------
+ 1 files changed, 7 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:41:39 +0000 Tony Finch <dot@dotat.at>
+
+reduce state transition table line lengths below 80
+
+ unifdef.c |   24 ++++++++++++------------
+ 1 files changed, 12 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:30:55 +0000 Tony Finch <dot@dotat.at>
+
+reduce state function line lengths below 80
+
+ unifdef.c |   28 ++++++++++++++++------------
+ 1 files changed, 16 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:24:26 +0000 Tony Finch <dot@dotat.at>
+
+Exit 1 if the output differs from the input.
+
+ unifdef.c |    9 ++++++---
+ 1 files changed, 6 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:21:22 +0000 Tony Finch <dot@dotat.at>
+
+Exit 2 on error.
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:21:04 +0000 Tony Finch <dot@dotat.at>
+
+Bring the DIAGNOSTICS in line with reality.
+
+ unifdef.1 |   12 ++++++++----
+ 1 files changed, 8 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:17:52 +0000 Tony Finch <dot@dotat.at>
+
+restore the complaint about EOF in comments
+
+ unifdef.1 |    5 ++++-
+ unifdef.c |    6 ++++--
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:12:57 +0000 Tony Finch <dot@dotat.at>
+
+skipsym doesn't need a separate test for '\0'
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:11:28 +0000 Tony Finch <dot@dotat.at>
+
+rename constexpr back to keepthis to reduce diffs
+
+ unifdef.c |   14 +++++++-------
+ 1 files changed, 7 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:06:15 +0000 Tony Finch <dot@dotat.at>
+
+stcomline isn't used any more
+
+ unifdef.c |    3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:05:00 +0000 Tony Finch <dot@dotat.at>
+
+Note that NO_COMMMENT is false, as before.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:03:37 +0000 Tony Finch <dot@dotat.at>
+
+Move the error function back to the end
+
+ unifdef.c |   21 +++++++++++----------
+ 1 files changed, 11 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:02:08 +0000 Tony Finch <dot@dotat.at>
+
+Better error messages outside #if groups
+
+ unifdef.c |    9 ++++++---
+ 1 files changed, 6 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:01:50 +0000 Tony Finch <dot@dotat.at>
+
+Note a new diagnostic for preprocessor lines we can't handle.
+
+ unifdef.1 |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-12 17:00:04 +0000 Tony Finch <dot@dotat.at>
+
+Instead of quietly ballsing up the output, bitch if we encounter a
+
+preprocessor line we can't handle.
+
+ unifdef.c |   30 +++++++++++++++++-------------
+ 1 files changed, 17 insertions(+), 13 deletions(-)
+
+---------------------------------------------------
+2002-12-12 16:04:04 +0000 Tony Finch <dot@dotat.at>
+
+Rename checkline() to getline() and move the fgets() inside it.
+
+ unifdef.c |   13 ++++++-------
+ 1 files changed, 6 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2002-12-11 20:46:06 +0000 Tony Finch <dot@dotat.at>
+
+Add a missing unignore()
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-11 20:42:47 +0000 Tony Finch <dot@dotat.at>
+
+Handle #ifs nested inside a false block correctly.
+
+ unifdef.c |   16 +++++++++-------
+ 1 files changed, 9 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2002-12-11 20:15:57 +0000 Tony Finch <dot@dotat.at>
+
+remove nul character comment
+
+ unifdef.c |    4 +---
+ 1 files changed, 1 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-11 20:05:52 +0000 Tony Finch <dot@dotat.at>
+
+Overhaul the #if state machine. It's now table-driven rather than hand-
+
+coded, and it doesn't have the old version's bugs. The debugging messages
+have also been improved.
+
+ unifdef.c |  452 ++++++++++++++++++++++++++++---------------------------------
+ 1 files changed, 205 insertions(+), 247 deletions(-)
+
+---------------------------------------------------
+2002-12-11 20:04:40 +0000 Tony Finch <dot@dotat.at>
+
+some more bugs
+
+ unifdef.1 |    9 ++++++++-
+ 1 files changed, 8 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-11 02:28:22 +0000 Tony Finch <dot@dotat.at>
+
+Rename keepthis to constexpr which is easier to think about.
+
+Re-comment and re-arrange some globals.
+
+ unifdef.c |   24 +++++++++++-------------
+ 1 files changed, 11 insertions(+), 13 deletions(-)
+
+---------------------------------------------------
+2002-12-11 02:22:44 +0000 Tony Finch <dot@dotat.at>
+
+Add a note about trigraphs.
+
+ unifdef.1 |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-11 02:13:04 +0000 Tony Finch <dot@dotat.at>
+
+Use fgets instead of getline() because the latter gets EOF wrong.
+
+ unifdef.c |   77 +-----------------------------------------------------------
+ 1 files changed, 2 insertions(+), 75 deletions(-)
+
+---------------------------------------------------
+2002-12-11 02:07:02 +0000 Tony Finch <dot@dotat.at>
+
+Overhaul the comment and preprocessor line parsers.
+
+ unifdef.1 |    4 +-
+ unifdef.c |  232 +++++++++++++++++++++++++++++++++++-------------------------
+ 2 files changed, 137 insertions(+), 99 deletions(-)
+
+---------------------------------------------------
+2002-12-11 01:44:04 +0000 Tony Finch <dot@dotat.at>
+
+Add an asymmetric variant of strncmp() called strlcmp().
+
+ unifdef.c |   20 +++++++++++++++++---
+ 1 files changed, 17 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-11 00:00:47 +0000 Tony Finch <dot@dotat.at>
+
+handle end-of-string in skipsym()
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-10 23:20:14 +0000 Tony Finch <dot@dotat.at>
+
+A neater way of handling #elif
+
+ unifdef.c |   14 ++++----------
+ 1 files changed, 4 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-12-10 23:02:11 +0000 Tony Finch <dot@dotat.at>
+
+Fix findsym()'s comment.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-12-10 23:01:04 +0000 Tony Finch <dot@dotat.at>
+
+Improve findsym().
+
+ unifdef.c |   19 +++++++------------
+ 1 files changed, 7 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-12-10 21:11:58 +0000 Tony Finch <dot@dotat.at>
+
+Remove quote handling.
+
+ unifdef.c |   70 +++++++-----------------------------------------------------
+ 1 files changed, 9 insertions(+), 61 deletions(-)
+
+---------------------------------------------------
+2002-12-10 21:11:19 +0000 Tony Finch <dot@dotat.at>
+
+Update the spec to relate better to ANSI C. Strings no longer affect
+
+the preprocessor, but line continuations do.
+
+ unifdef.1 |   19 +++++++------------
+ 1 files changed, 7 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-12-10 17:28:09 +0000 Tony Finch <dot@dotat.at>
+
+Note that string parsing needs to be fixed. Actually it just needs to
+
+be ripped out and replaced with backslash line continuation handling
+since strings can't contain newlines any more.
+
+ unifdef.1 |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-12-10 17:23:54 +0000 Tony Finch <dot@dotat.at>
+
+Sync with FreeBSD
+
+ unifdef.1 |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-12-10 17:12:58 +0000 Tony Finch <dot@dotat.at>
+
+Handle inquote more elegantly
+
+ unifdef.c |   14 ++++----------
+ 1 files changed, 4 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-12-10 17:00:39 +0000 Tony Finch <dot@dotat.at>
+
+Make the symbol table zero-based, and remove an incorrect comment.
+
+ unifdef.c |   29 +++++++++++++++--------------
+ 1 files changed, 15 insertions(+), 14 deletions(-)
+
+---------------------------------------------------
+2002-12-10 16:22:12 +0000 Tony Finch <dot@dotat.at>
+
+Terminological consistency: only use the word "ignore" to mean non-C parsing.
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-12-10 16:10:51 +0000 Tony Finch <dot@dotat.at>
+
+Ensure that cursym is always set by checkline().
+
+ unifdef.c |    5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-09-24 19:52:11 +0000 Tony Finch <dot@dotat.at>
+
+update FreeBSD IDs
+
+ unifdef.1     |    4 ++--
+ unifdef.c     |    4 ++--
+ unifdefall.sh |    4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2002-09-24 19:44:12 +0000 Tony Finch <dot@dotat.at>
+
+improve language
+
+ unifdef.1 |   20 ++++++++++----------
+ 1 files changed, 10 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-09-24 19:43:57 +0000 Tony Finch <dot@dotat.at>
+
+conform to the spec -- the -k option to unifdef is now needed
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-09-24 19:16:29 +0000 Tony Finch <dot@dotat.at>
+
+Pass through constant #ifs unless invoked with -k.
+
+ unifdef.1 |   26 +++++++++++++++++++++++---
+ unifdef.c |   24 +++++++++++++++++-------
+ 2 files changed, 40 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-05-30 11:50:13 +0000 Tony Finch <dot@dotat.at>
+
+add freebsd version string
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-05-30 11:47:26 +0000 Tony Finch <dot@dotat.at>
+
+Sync with FreeBSD's mdoc markup fixes.
+
+ unifdef.1 |   84 ++++++++++++++++++++++++++++--------------------------------
+ 1 files changed, 39 insertions(+), 45 deletions(-)
+
+---------------------------------------------------
+2002-05-21 17:33:41 +0000 Tony Finch <dot@dotat.at>
+
+style(9) whitespace
+
+ unifdef.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-05-15 19:37:50 +0000 Tony Finch <dot@dotat.at>
+
+consistent spacing in the function declarations
+
+ unifdef.c |   16 ++++++++--------
+ 1 files changed, 8 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2002-05-15 19:36:10 +0000 Tony Finch <dot@dotat.at>
+
+cast away qualifiers less evilly
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-05-15 19:34:40 +0000 Tony Finch <dot@dotat.at>
+
+Replace h0h0opt with getopt.
+
+ unifdef.c |  135 +++++++++++++++++++++++++++++++++++--------------------------
+ 1 files changed, 78 insertions(+), 57 deletions(-)
+
+---------------------------------------------------
+2002-05-15 18:55:14 +0000 Tony Finch <dot@dotat.at>
+
+Don't run off the end of command-line options inside findsym().
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-05-15 15:43:14 +0000 Tony Finch <dot@dotat.at>
+
+a typo and a formatting fix from dwmalone
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-05-15 10:31:20 +0000 Tony Finch <dot@dotat.at>
+
+FreeBSD CVS ID correctness
+
+ unifdefall.sh |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-05-14 22:15:03 +0000 Tony Finch <dot@dotat.at>
+
+be more optimistic about the level of expression support
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-05-14 22:13:21 +0000 Tony Finch <dot@dotat.at>
+
+the #ifdef and #if on the .Nd line should be .Li but this doesn't seem
+
+to be possible, so write "preprocessor conditionals" instead.
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-05-14 21:14:30 +0000 Tony Finch <dot@dotat.at>
+
+Correct the ordering and indentation of the CVS IDs according to FreeBSD style.
+
+ unifdef.1 |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-05-14 21:11:50 +0000 Tony Finch <dot@dotat.at>
+
+add a missing comma to the SEE ALSO list
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-05-14 21:11:14 +0000 Tony Finch <dot@dotat.at>
+
+Document unifdefall and the -I option.
+
+ unifdef.1 |   40 +++++++++++++++++++++++++++++++++++++---
+ 1 files changed, 37 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-05-02 12:38:29 +0000 Tony Finch <dot@dotat.at>
+
+Better function names -- doif() -> process() and doif_1() -> doif()
+
+ unifdef.c |   22 +++++++++++-----------
+ 1 files changed, 11 insertions(+), 11 deletions(-)
+
+---------------------------------------------------
+2002-05-02 12:36:22 +0000 Tony Finch <dot@dotat.at>
+
+consistent commenting
+
+ unifdef.c |   69 ++++++++++++++++++++++++++++++++++++++++++------------------
+ 1 files changed, 48 insertions(+), 21 deletions(-)
+
+---------------------------------------------------
+2002-05-02 12:17:31 +0000 Tony Finch <dot@dotat.at>
+
+Consistent spacing in declaration of local variables,
+
+and simplified flushline().
+
+ unifdef.c |   41 ++++++++++++++++++-----------------------
+ 1 files changed, 18 insertions(+), 23 deletions(-)
+
+---------------------------------------------------
+2002-05-02 00:03:41 +0000 Tony Finch <dot@dotat.at>
+
+note #line wish
+
+ unifdef.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-29 16:41:08 +0000 Tony Finch <dot@dotat.at>
+
+Handle symbols that are defined without a value correctly, again.
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-29 16:17:39 +0000 Tony Finch <dot@dotat.at>
+
+output of cpp needs to be sorted
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-29 03:08:10 +0000 Tony Finch <dot@dotat.at>
+
+clean up tmp dir
+
+ unifdefall.sh |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-29 03:07:20 +0000 Tony Finch <dot@dotat.at>
+
+tidy up
+
+ unifdefall.sh |   32 ++++++++------------------------
+ 1 files changed, 8 insertions(+), 24 deletions(-)
+
+---------------------------------------------------
+2002-04-29 03:00:58 +0000 Tony Finch <dot@dotat.at>
+
+Don't get confused by symbols that are the prefix of other symbols.
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-29 02:55:15 +0000 Tony Finch <dot@dotat.at>
+
+mention support for the comparison operators
+
+ unifdef.1 |    8 +++++++-
+ 1 files changed, 7 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-29 02:53:58 +0000 Tony Finch <dot@dotat.at>
+
+Overhaul the expression evaluator. The integer value of an expression
+
+is now calculated, rather than just the boolen value, and the evaluation
+of binary operators is now table-driven. These two things combine to
+make it easier to add support for new operators, such as comparisions.
+
+ unifdef.c |  215 +++++++++++++++++++++++++++++++++++--------------------------
+ 1 files changed, 123 insertions(+), 92 deletions(-)
+
+---------------------------------------------------
+2002-04-29 00:20:42 +0000 Tony Finch <dot@dotat.at>
+
+Handle symbols that are defined without a value correctly.
+
+ unifdefall.sh |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-29 00:18:06 +0000 Tony Finch <dot@dotat.at>
+
+-d -> --debug
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-29 00:17:11 +0000 Tony Finch <dot@dotat.at>
+
+Fix handling of bracketed expressions -- we didn't pass over the )
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-28 23:42:36 +0000 Tony Finch <dot@dotat.at>
+
+A script for stripping out as many #if's from a file as possible.
+
+ unifdefall.sh |   42 ++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 42 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2002-04-28 22:32:30 +0000 Tony Finch <dot@dotat.at>
+
+Ignore -Ifoo options so that the same options can be used with cpp -dM
+
+ unifdef.c |   14 ++++++++++----
+ 1 files changed, 10 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-04-28 22:15:26 +0000 Tony Finch <dot@dotat.at>
+
+allow a - on the command line to mean "input from stdin"
+
+ unifdef.c |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-28 22:14:07 +0000 Tony Finch <dot@dotat.at>
+
+say explicitly that at least one -D or -U is needed
+
+ unifdef.c |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-27 17:27:14 +0000 Tony Finch <dot@dotat.at>
+
+allow longer lines in the input
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-27 17:26:53 +0000 Tony Finch <dot@dotat.at>
+
+avoid a potential buffer overflow
+
+ unifdef.c |    9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-04-27 17:23:47 +0000 Tony Finch <dot@dotat.at>
+
+spell getlin() with an e
+
+ unifdef.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:44:33 +0000 Tony Finch <dot@dotat.at>
+
+remove redundant function
+
+ unifdef.c |   15 +++------------
+ 1 files changed, 3 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:32:23 +0000 Tony Finch <dot@dotat.at>
+
+Multiple __RCSID()s is not portable, so use __IDSTRING() instead.
+
+ unifdef.c |    8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:23:09 +0000 Tony Finch <dot@dotat.at>
+
+move a #define to a better place
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:18:07 +0000 Tony Finch <dot@dotat.at>
+
+add a couple of missing [=val] phrases
+
+ unifdef.1 |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:17:35 +0000 Tony Finch <dot@dotat.at>
+
+use .Li for #if directives
+
+ unifdef.1 |   33 ++++++++++++++++++++++++++-------
+ 1 files changed, 26 insertions(+), 7 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:09:37 +0000 Tony Finch <dot@dotat.at>
+
+change the #if bug into an expression handling bug
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:08:45 +0000 Tony Finch <dot@dotat.at>
+
+mention the elif diagnostic
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:07:49 +0000 Tony Finch <dot@dotat.at>
+
+see also cpp(1)
+
+ unifdef.1 |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:07:29 +0000 Tony Finch <dot@dotat.at>
+
+remove spurious historical note
+
+ unifdef.1 |    7 +++----
+ 1 files changed, 3 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:05:12 +0000 Tony Finch <dot@dotat.at>
+
+explain the -s option
+
+ unifdef.1 |   18 +++++++++++++++++-
+ 1 files changed, 17 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-26 20:01:06 +0000 Tony Finch <dot@dotat.at>
+
+Improve the explanation of the -D and -U options.
+
+ unifdef.1 |   28 +++++++++++++---------------
+ 1 files changed, 13 insertions(+), 15 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:54:54 +0000 Tony Finch <dot@dotat.at>
+
+better introductory paragraph
+
+ unifdef.1 |   10 ++++++----
+ 1 files changed, 6 insertions(+), 4 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:51:20 +0000 Tony Finch <dot@dotat.at>
+
+remove -compact from the flag list
+
+ unifdef.1 |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:50:54 +0000 Tony Finch <dot@dotat.at>
+
+expand the introduction to explain the new functionality
+
+ unifdef.1 |   27 ++++++++++++++++++++++-----
+ 1 files changed, 22 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:26:10 +0000 Tony Finch <dot@dotat.at>
+
+add a paragraph gap between -l and -t
+
+ unifdef.1 |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:24:47 +0000 Tony Finch <dot@dotat.at>
+
+Add the optional symbol value to the various places -Dsym is mentioned,
+
+and add the -s flag to the synopsis.
+
+ unifdef.1 |   12 ++++++------
+ 1 files changed, 6 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:20:34 +0000 Tony Finch <dot@dotat.at>
+
+update document date and one-line description
+
+ unifdef.1 |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:15:55 +0000 Tony Finch <dot@dotat.at>
+
+add $dotat$
+
+ unifdef.1 |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:15:14 +0000 Tony Finch <dot@dotat.at>
+
+add my name to the copyright section
+
+ unifdef.1 |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:14:35 +0000 Tony Finch <dot@dotat.at>
+
+add unifdef manual page from FreeBSD
+
+ unifdef.1 |  173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 173 insertions(+), 0 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:12:22 +0000 Tony Finch <dot@dotat.at>
+
+Add a new option for printing a list of the symbols found in #if expressions.
+
+ unifdef.c |   16 +++++++++++++---
+ 1 files changed, 13 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:03:48 +0000 Tony Finch <dot@dotat.at>
+
+option variables in alphabetical order
+
+ unifdef.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-26 19:02:45 +0000 Tony Finch <dot@dotat.at>
+
+parse options in alphabetical order
+
+ unifdef.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-04-26 18:56:55 +0000 Tony Finch <dot@dotat.at>
+
+fix some h0h0 formatting
+
+ unifdef.c |    8 ++------
+ 1 files changed, 2 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2002-04-26 18:51:19 +0000 Tony Finch <dot@dotat.at>
+
+Fix the handling of #elif.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 18:13:43 +0000 Tony Finch <dot@dotat.at>
+
+put my name in the copyright section
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:42:31 +0000 Tony Finch <dot@dotat.at>
+
+Move all the global stuff to the start of the program in the order
+
+types, variables, function declarations, and ensure that all functions
+are declared. The program now compiles cleanly with $FANFCFLAGS.
+
+ unifdef.c |  141 +++++++++++++++++++++++++++++++------------------------------
+ 1 files changed, 72 insertions(+), 69 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:33:47 +0000 Tony Finch <dot@dotat.at>
+
+use enums where appropriate
+
+ unifdef.c |   64 ++++++++++++++++++++++++++++++++++--------------------------
+ 1 files changed, 36 insertions(+), 28 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:25:50 +0000 Tony Finch <dot@dotat.at>
+
+blank lines after functions
+
+ unifdef.c |   14 +++++++++++++-
+ 1 files changed, 13 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:23:57 +0000 Tony Finch <dot@dotat.at>
+
+const correctness
+
+ unifdef.c |  110 +++++++++++++++++++++++++++++-------------------------------
+ 1 files changed, 53 insertions(+), 57 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:05:23 +0000 Tony Finch <dot@dotat.at>
+
+more bool correctness
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:02:17 +0000 Tony Finch <dot@dotat.at>
+
+Since MAXSYMS is bigger than CHAR_MAX, nsyms has to be an int.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 17:01:38 +0000 Tony Finch <dot@dotat.at>
+
+ANSI function definitions
+
+ unifdef.c |   62 ++++++++++++++++++------------------------------------------
+ 1 files changed, 19 insertions(+), 43 deletions(-)
+
+---------------------------------------------------
+2002-04-26 16:56:34 +0000 Tony Finch <dot@dotat.at>
+
+Replace the homegrown Bool/YES/NO with stdbool.h things, and ensure
+
+that boolean variables are declared consistently.
+
+ unifdef.c |  110 +++++++++++++++++++++++++++++-------------------------------
+ 1 files changed, 53 insertions(+), 57 deletions(-)
+
+---------------------------------------------------
+2002-04-26 16:49:11 +0000 Tony Finch <dot@dotat.at>
+
+Add __FBSDID and conditionalize the __RCSIDs
+
+ unifdef.c |    7 ++++++-
+ 1 files changed, 6 insertions(+), 1 deletions(-)
+
+---------------------------------------------------
+2002-04-26 16:47:53 +0000 Tony Finch <dot@dotat.at>
+
+add some debugging code
+
+ unifdef.c |   35 +++++++++++++++++++++++++++++++++--
+ 1 files changed, 33 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 15:47:04 +0000 Tony Finch <dot@dotat.at>
+
+fix the line number reporting in the last change
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 15:38:59 +0000 Tony Finch <dot@dotat.at>
+
+Improve error reporting -- include the start line of the current #if.
+
+ unifdef.c |   16 +++++++++++++---
+ 1 files changed, 13 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-26 15:34:44 +0000 Tony Finch <dot@dotat.at>
+
+Remove some slight punning between comment types and booleans.
+
+ unifdef.c |   12 +++++++-----
+ 1 files changed, 7 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-04-26 15:06:30 +0000 Tony Finch <dot@dotat.at>
+
+Avoid reparsing the line that causes doif() to return to doif_1().
+
+ unifdef.c |   17 ++++++++---------
+ 1 files changed, 8 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2002-04-26 13:54:16 +0000 Tony Finch <dot@dotat.at>
+
+put the newline on the #endif that replaces #elif lines
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-26 13:51:41 +0000 Tony Finch <dot@dotat.at>
+
+Finish implementation of #elif and nesting.
+
+This version passes some initial tests.
+
+ unifdef.c |  133 +++++++++++++++++++++++++++++++++++++++++++------------------
+ 1 files changed, 94 insertions(+), 39 deletions(-)
+
+---------------------------------------------------
+2002-04-25 23:46:55 +0000 Tony Finch <dot@dotat.at>
+
+partial implementation of #elif and properly nesting #ifs.
+
+ unifdef.c |  216 +++++++++++++++++++++++++++++++++++++------------------------
+ 1 files changed, 130 insertions(+), 86 deletions(-)
+
+---------------------------------------------------
+2002-04-25 23:27:40 +0000 Tony Finch <dot@dotat.at>
+
+remove redundant stline variable
+
+ unifdef.c |    4 +---
+ 1 files changed, 1 insertions(+), 3 deletions(-)
+
+---------------------------------------------------
+2002-04-25 23:25:31 +0000 Tony Finch <dot@dotat.at>
+
+simplify error line number handling
+
+ unifdef.c |   21 ++++++++++-----------
+ 1 files changed, 10 insertions(+), 11 deletions(-)
+
+---------------------------------------------------
+2002-04-25 23:02:51 +0000 Tony Finch <dot@dotat.at>
+
+simplify error handling
+
+ unifdef.c |   59 +++++++++++++++++++++--------------------------------------
+ 1 files changed, 21 insertions(+), 38 deletions(-)
+
+---------------------------------------------------
+2002-04-25 21:44:51 +0000 Tony Finch <dot@dotat.at>
+
+fix a comment to reflect the previous change
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 21:43:07 +0000 Tony Finch <dot@dotat.at>
+
+Change the "unknown symbol" return value from findsym() from -1 to 0.
+
+ unifdef.c |   21 +++++++++------------
+ 1 files changed, 9 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-04-25 21:19:55 +0000 Tony Finch <dot@dotat.at>
+
+remove an unnecessary variable inside doif()
+
+ unifdef.c |   11 +++++------
+ 1 files changed, 5 insertions(+), 6 deletions(-)
+
+---------------------------------------------------
+2002-04-25 20:24:16 +0000 Tony Finch <dot@dotat.at>
+
+Remove the inif argument to doif() entirely, since inif == (depth != 0).
+
+ unifdef.c |   19 +++++++++----------
+ 1 files changed, 9 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-04-25 20:20:05 +0000 Tony Finch <dot@dotat.at>
+
+Move the gall to getlin() up to doif() so that it will be able to
+
+examine the same line more than once.
+
+ unifdef.c |   48 +++++++++++++++++++++---------------------------
+ 1 files changed, 21 insertions(+), 27 deletions(-)
+
+---------------------------------------------------
+2002-04-25 19:59:46 +0000 Tony Finch <dot@dotat.at>
+
+Simplify doif()'s inif argument to just a boolean, since the IN_ELSE
+
+value isn't very different from IN_IF, and the idea doesn't work well
+with #elif.
+
+ unifdef.c |   19 +++++++------------
+ 1 files changed, 7 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-04-25 18:45:54 +0000 Tony Finch <dot@dotat.at>
+
+purge LT_OTHER since it's a synonym for LT_IF
+
+ unifdef.c |    8 +++-----
+ 1 files changed, 3 insertions(+), 5 deletions(-)
+
+---------------------------------------------------
+2002-04-25 18:17:09 +0000 Tony Finch <dot@dotat.at>
+
+Restore the requirement that at least one -D or -U must be present on the
+
+command line, which was broken when #if handling was added.
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 18:15:23 +0000 Tony Finch <dot@dotat.at>
+
+use __RCSID for the sccs id and remove redundant #ifndef lint lines
+
+ unifdef.c |   12 ++----------
+ 1 files changed, 2 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-04-25 18:10:00 +0000 Tony Finch <dot@dotat.at>
+
+Initial version of #if handling.
+
+Symbol 0 is used for tracking the state of #if/#else activity.
+TODO: #elif, nested #if
+
+ unifdef.c |  155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 files changed, 145 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-04-25 16:16:26 +0000 Tony Finch <dot@dotat.at>
+
+allow whitespace before #
+
+ unifdef.c |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 16:12:23 +0000 Tony Finch <dot@dotat.at>
+
+fix location of a {
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 16:11:54 +0000 Tony Finch <dot@dotat.at>
+
+add a function that will evaluate if expressions
+
+ unifdef.c |   13 +++++++++++--
+ 1 files changed, 11 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 16:05:30 +0000 Tony Finch <dot@dotat.at>
+
+remove spurious fflush()
+
+ unifdef.c |    3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 16:04:55 +0000 Tony Finch <dot@dotat.at>
+
+style: #include ordering; variable alignment
+
+ unifdef.c |   22 +++++++++++-----------
+ 1 files changed, 11 insertions(+), 11 deletions(-)
+
+---------------------------------------------------
+2002-04-25 16:03:16 +0000 Tony Finch <dot@dotat.at>
+
+use err()
+
+ unifdef.c |   83 +++++++++++++++++++++++++------------------------------------
+ 1 files changed, 34 insertions(+), 49 deletions(-)
+
+---------------------------------------------------
+2002-04-25 15:51:42 +0000 Tony Finch <dot@dotat.at>
+
+another formatting improvement
+
+ unifdef.c |   17 +++++++----------
+ 1 files changed, 7 insertions(+), 10 deletions(-)
+
+---------------------------------------------------
+2002-04-25 15:37:25 +0000 Tony Finch <dot@dotat.at>
+
+sensible else if formatting
+
+ unifdef.c |  150 +++++++++++++++++++++++++++----------------------------------
+ 1 files changed, 67 insertions(+), 83 deletions(-)
+
+---------------------------------------------------
+2002-04-25 15:31:28 +0000 Tony Finch <dot@dotat.at>
+
+deal with -Dsym=value
+
+ unifdef.c |   30 +++++++++++++++++++++---------
+ 1 files changed, 21 insertions(+), 9 deletions(-)
+
+---------------------------------------------------
+2002-04-25 15:02:48 +0000 Tony Finch <dot@dotat.at>
+
+move #endif comments to a better place
+
+ unifdef.c |   16 ++++++++--------
+ 1 files changed, 8 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2002-04-25 14:59:59 +0000 Tony Finch <dot@dotat.at>
+
+allow a reasonable number of symbols
+
+ unifdef.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+---------------------------------------------------
+2002-04-25 14:57:56 +0000 Tony Finch <dot@dotat.at>
+
+remove BSS cruft
+
+ unifdef.c |   39 +++++++++++++++++++--------------------
+ 1 files changed, 19 insertions(+), 20 deletions(-)
+
+---------------------------------------------------
+2002-04-25 14:55:27 +0000 Tony Finch <dot@dotat.at>
+
+remove __P
+
+ unifdef.c |   24 ++++++++++++------------
+ 1 files changed, 12 insertions(+), 12 deletions(-)
+
+---------------------------------------------------
+2002-04-25 14:52:54 +0000 Tony Finch <dot@dotat.at>
+
+revert to the CSRG copyright/sccs rubric and add $dotat$
+
+ unifdef.c |   21 +++++++++++++--------
+ 1 files changed, 13 insertions(+), 8 deletions(-)
+
+---------------------------------------------------
+2002-04-25 14:50:23 +0000 Tony Finch <dot@dotat.at>
+
+import from NetBSD
+
+ unifdef.c |  684 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 684 insertions(+), 0 deletions(-)
+---------------------------------------------------
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..8507ac3
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,18 @@
+unifdef installation instructions
+
+
+To build, type `make`. You can adjust the compilation options
+using the POSIX standard CFLAGS and LDFLAGS make variables.
+
+To install in your home directory, type `make install`
+or to install in /usr type `make prefix=/usr install`.
+See the start of the Makefile for the install location
+variables.
+
+
+Non-portable dependencies:
+
+This program requires the BSD err.h functions, and C99 stdbool.h.
+
+
+- end -
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..7c0f914
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,84 @@
+# Makefile for unifdef
+
+prefix =       ${HOME}
+bindir =       ${prefix}/bin
+mandir =       ${prefix}/share/man
+man1dir=       ${mandir}/man1
+
+bindest=       ${DESTDIR}${bindir}
+man1dest=      ${DESTDIR}${man1dir}
+
+
+all: unifdef
+
+unifdef: unifdef.c
+unifdef.c: version.h
+version.h version.sh::
+       ./reversion.sh
+
+test: unifdef
+       ./runtests.sh tests
+
+install: unifdef unifdefall.sh unifdef.1
+       : commands
+       install -m 755 -d  ${bindest}
+       install -m 755 unifdef  ${bindest}/
+       install -m 755 unifdefall.sh  ${bindest}/unifdefall
+       : manual
+       install -m 755 -d  ${man1dest}
+       install -m 644 unifdef.1  ${man1dest}/
+       ln -s unifdef.1  ${man1dest}/unifdefall.1
+
+clean:
+       rm -f unifdef unifdef.txt version.h
+       rm -f tests/*.out tests/*.err tests/*.rc
+
+realclean: clean
+       [ ! -d .git ] || rm -f Changelog version.sh
+       find . -name .git -prune -o \( \
+               -name '*~' -o -name '.#*' -o \
+               -name '*.orig' -o -name '*.core' \
+               \) -delete
+
+DISTFILES=             \
+       Changelog      \
+       COPYING        \
+       INSTALL        \
+       Makefile       \
+       README         \
+       reversion.sh   \
+       runtests.sh    \
+       tests          \
+       unifdef.c      \
+       unifdef.1      \
+       unifdef.txt    \
+       unifdefall.sh  \
+       version.sh
+
+release: version.sh unifdef.txt Changelog
+       . version.sh; \
+       mkdir web/$$V; cp -R ${DISTFILES} web/$$V; \
+       cd web; tar cfz $$V.tar.gz $$V; rm -R $$V
+
+unifdef.txt: unifdef.1
+       nroff -Tascii -mdoc unifdef.1 | sed -e 's/.\b//g' >unifdef.txt
+       cp unifdef.txt web
+
+Changelog:
+       line="---------------------------------------------------"; \
+       git log --stat --pretty=format:"$$line%n%ai %an <%ae>%n%n%s%n%n%b" |\
+       awk '/^$$/ { n++ } \
+            /./ && !n { print } \
+            /./ && n  { print ""; print; n=0 } \
+            END { print "'$$line'" }' >Changelog
+
+upload:
+       git gc
+       git update-server-info
+       git push --all github
+       touch .git/git-daemon-export-ok
+       echo "selectively remove C preprocessor conditionals" >.git/description
+       rsync --delete --recursive --links .git/ chiark:public-git/unifdef.git/
+       rsync --delete --recursive --links  web/ chiark:public-html/prog/unifdef/
+
+# eof
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..bc33365
--- /dev/null
+++ b/README
@@ -0,0 +1,37 @@
+unifdef - selectively remove C preprocessor conditionals
+
+Written by Tony Finch <dot@dotat.at> - http://dotat.at/prog/unifdef/
+
+Please see the INSTALL file for installation instructions.
+
+Pre-formatted documentation can be found in unifdef.txt
+
+You can subscribe to release announcements at:
+       http://freshmeat.net/projects/unifdef
+
+You can clone the development repository using:
+       git clone http://dotat.at/git/unifdef.git
+
+I also maintain a copy at http://github.com/fanf2/unifdef
+
+Please send bug reports and patches to me. Unless you state otherwise,
+I will assume that any contributions are under the two-clause BSD
+licence. See the COPYING file for details.
+
+Thanks to the following people for their contributions:
+
+Bob Proulx <bob@proulx.com>
+ - test suite
+
+Jonathan Nieder <jrnieder@gmail.com>
+ - bug fixes, improved unifdefall
+
+Anders H Kaseorg <andersk@mit.edu>
+ - bug fixes and other improvements
+
+Ben Hutchings at Solarflare Communications
+ - lenient evaluation of && and ||
+
+Other contributions are listed in the Changelog.
+
+- end -
diff --git a/packaging/unifdef.spec b/packaging/unifdef.spec
new file mode 100644 (file)
index 0000000..db70e18
--- /dev/null
@@ -0,0 +1,57 @@
+Summary: Removes ifdefs from C files.
+Name: unifdef
+Version: 2.3
+Release: 1
+License: BSD
+Group: Development/Tools
+URL: http://dotat.at/prog/unifdef/
+Source: http://dotat.at/prog/unifdef/%name-%version.tar.gz
+BuildRoot: %_tmppath/%name-%version-%release
+
+%description
+Unifdef is useful for removing ifdef'ed lines from a file while otherwise
+leaving the file alone.  Unifdef acts on #ifdef, #ifndef, #else, and #en­
+dif lines, and it knows only enough about C to know when one of these is
+inactive because it is inside a comment, or a single or double quote.
+
+%track
+prog %name = {
+       url = http://dotat.at/prog/unifdef/
+       version = %version
+       regex = %name-(__VER__)\.tar\.gz
+}
+
+%prep
+%setup
+make clean
+
+%build
+make %?_smp_mflags CC=%__cc CFLAGS="$RPM_OPT_FLAGS"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR="$RPM_BUILD_ROOT" prefix=%_prefix
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%_bindir/unifdef
+%_bindir/unifdefall
+%_mandir/man1/unifdef.1*
+%_mandir/man1/unifdefall.1*
+
+%changelog
+* Wed May 12 2010 Bernhard Rosenkraenzer <bero@arklinux.org> 2.3-1ark
+- 2.3
+- Allow crosscompiling
+
+* Sun Jan 27 2008 Bernhard Rosenkraenzer <bero@arklinux.org> 1.0-3ark
+- Rebuild to get a package into the x86_64 tree
+
+* Sat Jul 15 2006 Bernhard Rosenkraenzer <bero@arklinux.org> 1.0-2ark
+- Compile it instead of allowing make install to use the binary in the
+  tarball
+
+* Tue May 23 2006 Bernhard Rosenkraenzer <bero@arklinux.org> 1.0-1ark
+- initial package
diff --git a/reversion.sh b/reversion.sh
new file mode 100755 (executable)
index 0000000..a9183da
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+[ ! -f version.sh ] && [ ! -d .git ] && exit 1
+
+[ -f version.sh ] && . version.sh
+
+if [ -d .git ]
+then
+       GV=$(git describe --abbrev=4)
+       git update-index -q --refresh
+       if git diff-index --quiet HEAD
+       then
+               GD="$(git show --pretty=format:%ai --quiet HEAD)"
+       else
+               GD="$(date +'%Y-%m-%d %H:%M:%S %z')"
+               GV=$GV-dirty
+       fi
+       if [ "$GV $GD" != "$V $D" ]
+       then
+               V="$GV"
+               D="$GD"
+               echo "V=\"$V\""  >version.sh
+               echo "D=\"$D\"" >>version.sh
+               cat version.sh
+               rm -f version.h
+       fi
+fi
+
+if [ ! -f version.h ]
+then
+       printf '"@(#) $Version: %s $\\n"\n' "$V" >version.h
+       printf '"@(#) $Date: %s $\\n"\n'   "$D" >>version.h
+       cat version.h
+fi
diff --git a/runtests.sh b/runtests.sh
new file mode 100755 (executable)
index 0000000..8b42679
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+${1:+cd} ${1:-:}
+for cmd in *.sh
+do
+       t=${cmd%.sh}
+
+       . ./${cmd} >${t}.out 2>${t}.err
+       echo $? >${t}.rc
+
+       ok=true
+       for e in out err rc
+       do
+               exp=${t}.exp${e}
+               got=${t}.${e}
+               if ! cmp -s ${exp} ${got}
+               then
+                       echo FAILED: ${got}: $(cat ${cmd})
+                       diff -u ${exp} ${got}
+                       ok=false
+               fi
+       done
+
+       if ${ok}
+       then rm -f ${t}.out ${t}.err ${t}.rc
+       else rc=1
+       fi
+done
+exit ${rc}
diff --git a/tests/args1.c b/tests/args1.c
new file mode 100644 (file)
index 0000000..1cb5546
--- /dev/null
@@ -0,0 +1,3 @@
+#if defined(DUMMY) || FOO(arg)
+hello
+#endif
diff --git a/tests/args1.experr b/tests/args1.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/args1.expout b/tests/args1.expout
new file mode 100644 (file)
index 0000000..ce01362
--- /dev/null
@@ -0,0 +1 @@
+hello
diff --git a/tests/args1.exprc b/tests/args1.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/args1.sh b/tests/args1.sh
new file mode 100644 (file)
index 0000000..0a909f4
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR args1.c
diff --git a/tests/args2.c b/tests/args2.c
new file mode 100644 (file)
index 0000000..8fe476b
--- /dev/null
@@ -0,0 +1,3 @@
+#if defined(FOO) || BAR(arg)
+hello
+#endif
diff --git a/tests/args2.experr b/tests/args2.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/args2.expout b/tests/args2.expout
new file mode 100644 (file)
index 0000000..8fe476b
--- /dev/null
@@ -0,0 +1,3 @@
+#if defined(FOO) || BAR(arg)
+hello
+#endif
diff --git a/tests/args2.exprc b/tests/args2.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/args2.sh b/tests/args2.sh
new file mode 100644 (file)
index 0000000..0b246e2
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR args2.c
diff --git a/tests/blank0d.c b/tests/blank0d.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank0d.experr b/tests/blank0d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank0d.expout b/tests/blank0d.expout
new file mode 100644 (file)
index 0000000..9c22614
--- /dev/null
@@ -0,0 +1,23 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+zero
diff --git a/tests/blank0d.exprc b/tests/blank0d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank0d.sh b/tests/blank0d.sh
new file mode 100644 (file)
index 0000000..225da11
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -DFOO0 blank0d.c
diff --git a/tests/blank0u.c b/tests/blank0u.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank0u.experr b/tests/blank0u.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank0u.expout b/tests/blank0u.expout
new file mode 100644 (file)
index 0000000..165d0a9
--- /dev/null
@@ -0,0 +1,22 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
diff --git a/tests/blank0u.exprc b/tests/blank0u.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank0u.sh b/tests/blank0u.sh
new file mode 100644 (file)
index 0000000..18c8624
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -UFOO0 blank0u.c
diff --git a/tests/blank1d.c b/tests/blank1d.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank1d.experr b/tests/blank1d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank1d.expout b/tests/blank1d.expout
new file mode 100644 (file)
index 0000000..05f6bc5
--- /dev/null
@@ -0,0 +1,23 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+one
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank1d.exprc b/tests/blank1d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank1d.sh b/tests/blank1d.sh
new file mode 100644 (file)
index 0000000..907b8a3
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -DFOO1 blank1d.c
diff --git a/tests/blank1u.c b/tests/blank1u.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank1u.experr b/tests/blank1u.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank1u.expout b/tests/blank1u.expout
new file mode 100644 (file)
index 0000000..f793379
--- /dev/null
@@ -0,0 +1,21 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank1u.exprc b/tests/blank1u.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank1u.sh b/tests/blank1u.sh
new file mode 100644 (file)
index 0000000..e04da88
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -UFOO1 blank1u.c
diff --git a/tests/blank2d.c b/tests/blank2d.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank2d.experr b/tests/blank2d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank2d.expout b/tests/blank2d.expout
new file mode 100644 (file)
index 0000000..ba127f5
--- /dev/null
@@ -0,0 +1,23 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+two
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank2d.exprc b/tests/blank2d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank2d.sh b/tests/blank2d.sh
new file mode 100644 (file)
index 0000000..e4919c4
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -DFOO2 blank2d.c
diff --git a/tests/blank2u.c b/tests/blank2u.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank2u.experr b/tests/blank2u.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank2u.expout b/tests/blank2u.expout
new file mode 100644 (file)
index 0000000..cee6dd7
--- /dev/null
@@ -0,0 +1,20 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank2u.exprc b/tests/blank2u.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank2u.sh b/tests/blank2u.sh
new file mode 100644 (file)
index 0000000..ae35299
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -UFOO2 blank2u.c
diff --git a/tests/blank3d.c b/tests/blank3d.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank3d.experr b/tests/blank3d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank3d.expout b/tests/blank3d.expout
new file mode 100644 (file)
index 0000000..31a633a
--- /dev/null
@@ -0,0 +1,23 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+three
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank3d.exprc b/tests/blank3d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank3d.sh b/tests/blank3d.sh
new file mode 100644 (file)
index 0000000..649e521
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -DFOO3 blank3d.c
diff --git a/tests/blank3u.c b/tests/blank3u.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank3u.experr b/tests/blank3u.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank3u.expout b/tests/blank3u.expout
new file mode 100644 (file)
index 0000000..d90cca9
--- /dev/null
@@ -0,0 +1,19 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank3u.exprc b/tests/blank3u.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank3u.sh b/tests/blank3u.sh
new file mode 100644 (file)
index 0000000..7c7ef85
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -UFOO3 blank3u.c
diff --git a/tests/blank4d.c b/tests/blank4d.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank4d.experr b/tests/blank4d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank4d.expout b/tests/blank4d.expout
new file mode 100644 (file)
index 0000000..782ff9d
--- /dev/null
@@ -0,0 +1,23 @@
+four
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank4d.exprc b/tests/blank4d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank4d.sh b/tests/blank4d.sh
new file mode 100644 (file)
index 0000000..d78b1f0
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -DFOO4 blank4d.c
diff --git a/tests/blank4u.c b/tests/blank4u.c
new file mode 100644 (file)
index 0000000..c435ac5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef FOO4
+four
+#endif
+
+
+
+
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank4u.experr b/tests/blank4u.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/blank4u.expout b/tests/blank4u.expout
new file mode 100644 (file)
index 0000000..72f0fa7
--- /dev/null
@@ -0,0 +1,18 @@
+#ifdef FOO3
+three
+#endif
+
+
+
+#ifdef FOO2
+two
+#endif
+
+
+#ifdef FOO1
+one
+#endif
+
+#ifdef FOO0
+zero
+#endif
diff --git a/tests/blank4u.exprc b/tests/blank4u.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/blank4u.sh b/tests/blank4u.sh
new file mode 100644 (file)
index 0000000..6ee2c17
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -B -UFOO4 blank4u.c
diff --git a/tests/crlf-a.experr b/tests/crlf-a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/crlf-a.expout b/tests/crlf-a.expout
new file mode 100644 (file)
index 0000000..29e1b63
--- /dev/null
@@ -0,0 +1,10 @@
+int f1() { return 0; }\r
+\/\r
+/\\r
+comment\r
+/\\r
+*\\r
+comment\r
+*\\r
+/\\r
+eof
diff --git a/tests/crlf-a.exprc b/tests/crlf-a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-a.sh b/tests/crlf-a.sh
new file mode 100644 (file)
index 0000000..1c48951
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF1 crlf.c
diff --git a/tests/crlf-b.experr b/tests/crlf-b.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/crlf-b.expout b/tests/crlf-b.expout
new file mode 100644 (file)
index 0000000..011b81a
--- /dev/null
@@ -0,0 +1,14 @@
+#if F1\r
+int f1() { return 0; }\r
+#else\r
+int f2() { return 0; }\r
+#endif\r
+\/\r
+/\\r
+comment\r
+/\\r
+*\\r
+comment\r
+*\\r
+/\\r
+eof
diff --git a/tests/crlf-b.exprc b/tests/crlf-b.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-b.sh b/tests/crlf-b.sh
new file mode 100644 (file)
index 0000000..e6c46d6
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF2 crlf.c
diff --git a/tests/crlf-c.experr b/tests/crlf-c.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/crlf-c.expout b/tests/crlf-c.expout
new file mode 100644 (file)
index 0000000..f9fdaf8
--- /dev/null
@@ -0,0 +1,16 @@
+#if F1\r
+int f1() { return 0; }\r
+#elif F2\r
+int f2() { return 0; }\r
+#else\r
+int f3() { return 0; }\r
+#endif\r
+\/\r
+/\\r
+comment\r
+/\\r
+*\\r
+comment\r
+*\\r
+/\\r
+eof
diff --git a/tests/crlf-c.exprc b/tests/crlf-c.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-c.sh b/tests/crlf-c.sh
new file mode 100644 (file)
index 0000000..68f7dda
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF3 crlf.c
diff --git a/tests/crlf-d.experr b/tests/crlf-d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/crlf-d.expout b/tests/crlf-d.expout
new file mode 100644 (file)
index 0000000..295d337
--- /dev/null
@@ -0,0 +1,18 @@
+#if F1\r
+int f1() { return 0; }\r
+#elif F2\r
+int f2() { return 0; }\r
+#elif F3\r
+int f3() { return 0; }\r
+#else\r
+int f4() { return 0; }\r
+#endif\r
+\/\r
+/\\r
+comment\r
+/\\r
+*\\r
+comment\r
+*\\r
+/\\r
+eof
diff --git a/tests/crlf-d.exprc b/tests/crlf-d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-d.sh b/tests/crlf-d.sh
new file mode 100644 (file)
index 0000000..50111be
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF4 crlf.c
diff --git a/tests/crlf.c b/tests/crlf.c
new file mode 100644 (file)
index 0000000..ad911dc
--- /dev/null
@@ -0,0 +1,20 @@
+#if F1\r
+int f1() { return 0; }\r
+#elif F2\r
+int f2() { return 0; }\r
+#elif F3\r
+int f3() { return 0; }\r
+#elif F4\r
+int f4() { return 0; }\r
+#else\r
+int f() { return 0; }\r
+#endif\r
+\/\r
+/\\r
+comment\r
+/\\r
+*\\r
+comment\r
+*\\r
+/\\r
+eof
diff --git a/tests/empty.c b/tests/empty.c
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/empty.experr b/tests/empty.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/empty.expout b/tests/empty.expout
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/empty.exprc b/tests/empty.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/empty.sh b/tests/empty.sh
new file mode 100644 (file)
index 0000000..a4e994a
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR empty.c
diff --git a/tests/if1-a.experr b/tests/if1-a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if1-a.expout b/tests/if1-a.expout
new file mode 100644 (file)
index 0000000..56ae03c
--- /dev/null
@@ -0,0 +1,16 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1-a.exprc b/tests/if1-a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-a.sh b/tests/if1-a.sh
new file mode 100644 (file)
index 0000000..e59baa2
--- /dev/null
@@ -0,0 +1 @@
+../unifdefall.sh -DFOO=1 -DFOOB=42 -UBAR if1.c
diff --git a/tests/if1-k.c b/tests/if1-k.c
new file mode 100644 (file)
index 0000000..712350f
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is commented out. "#if 1 else" */
+#endif
+
+#if FOO
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+#if BAR
+int foo() { return 0; }
+#elif FOO
+int bar() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1-k.experr b/tests/if1-k.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if1-k.expout b/tests/if1-k.expout
new file mode 100644 (file)
index 0000000..2be8567
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+#if FOO
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+#if BAR
+int foo() { return 0; }
+#elif FOO
+int bar() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1-k.exprc b/tests/if1-k.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-k.sh b/tests/if1-k.sh
new file mode 100644 (file)
index 0000000..e6d9615
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k if1-k.c
diff --git a/tests/if1-kDU.c b/tests/if1-kDU.c
new file mode 100644 (file)
index 0000000..712350f
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is commented out. "#if 1 else" */
+#endif
+
+#if FOO
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+#if BAR
+int foo() { return 0; }
+#elif FOO
+int bar() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1-kDU.experr b/tests/if1-kDU.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if1-kDU.expout b/tests/if1-kDU.expout
new file mode 100644 (file)
index 0000000..c308e43
--- /dev/null
@@ -0,0 +1,20 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1-kDU.exprc b/tests/if1-kDU.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-kDU.sh b/tests/if1-kDU.sh
new file mode 100644 (file)
index 0000000..502df38
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k -DFOO=1 -DFOOB=42 -UBAR if1-kDU.c
diff --git a/tests/if1.c b/tests/if1.c
new file mode 100644 (file)
index 0000000..9e588c2
--- /dev/null
@@ -0,0 +1,26 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if FOO
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+#if BAR
+int foo() { return 0; }
+#elif FOO
+int bar() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1.experr b/tests/if1.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if1.expout b/tests/if1.expout
new file mode 100644 (file)
index 0000000..56ae03c
--- /dev/null
@@ -0,0 +1,16 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1.exprc b/tests/if1.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if1.sh b/tests/if1.sh
new file mode 100644 (file)
index 0000000..df22c5e
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR if1.c
diff --git a/tests/if1a.experr b/tests/if1a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if1a.expout b/tests/if1a.expout
new file mode 100644 (file)
index 0000000..956eea0
--- /dev/null
@@ -0,0 +1,24 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if FOO
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+#if   FOO
+int bar() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/if1a.exprc b/tests/if1a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if1a.sh b/tests/if1a.sh
new file mode 100644 (file)
index 0000000..bcf251c
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -UBAR if1.c
diff --git a/tests/if2-a.experr b/tests/if2-a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if2-a.expout b/tests/if2-a.expout
new file mode 100644 (file)
index 0000000..b64cfc2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2-a.exprc b/tests/if2-a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if2-a.sh b/tests/if2-a.sh
new file mode 100644 (file)
index 0000000..a4dc6a0
--- /dev/null
@@ -0,0 +1 @@
+../unifdefall.sh -DFOO=1 -DFOOB=42 -UBAR if2.c
diff --git a/tests/if2-k.c b/tests/if2-k.c
new file mode 100644 (file)
index 0000000..b5a9109
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if defined(FOO)
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2-k.experr b/tests/if2-k.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if2-k.expout b/tests/if2-k.expout
new file mode 100644 (file)
index 0000000..6a173a4
--- /dev/null
@@ -0,0 +1,21 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+#if defined(FOO)
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2-k.exprc b/tests/if2-k.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if2-k.sh b/tests/if2-k.sh
new file mode 100644 (file)
index 0000000..693be85
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k if2-k.c
diff --git a/tests/if2-kDU.c b/tests/if2-kDU.c
new file mode 100644 (file)
index 0000000..b5a9109
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if defined(FOO)
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2-kDU.experr b/tests/if2-kDU.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if2-kDU.expout b/tests/if2-kDU.expout
new file mode 100644 (file)
index 0000000..7cf0ddc
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2-kDU.exprc b/tests/if2-kDU.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if2-kDU.sh b/tests/if2-kDU.sh
new file mode 100644 (file)
index 0000000..258cbeb
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k -DFOO=1 -DFOOB=42 -UBAR if2-kDU.c
diff --git a/tests/if2.c b/tests/if2.c
new file mode 100644 (file)
index 0000000..44fdae0
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(FOO)
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2.experr b/tests/if2.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if2.expout b/tests/if2.expout
new file mode 100644 (file)
index 0000000..b64cfc2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if2.exprc b/tests/if2.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if2.sh b/tests/if2.sh
new file mode 100644 (file)
index 0000000..425942d
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR if2.c
diff --git a/tests/if3-a.experr b/tests/if3-a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if3-a.expout b/tests/if3-a.expout
new file mode 100644 (file)
index 0000000..b64cfc2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3-a.exprc b/tests/if3-a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if3-a.sh b/tests/if3-a.sh
new file mode 100644 (file)
index 0000000..6ca0298
--- /dev/null
@@ -0,0 +1 @@
+../unifdefall.sh -DFOO=1 -DFOOB=42 -UBAR if3.c
diff --git a/tests/if3-k.c b/tests/if3-k.c
new file mode 100644 (file)
index 0000000..c901021
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if ! defined(BAR)
+int foo() { return 0; }
+#else
+#error BAR defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3-k.experr b/tests/if3-k.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if3-k.expout b/tests/if3-k.expout
new file mode 100644 (file)
index 0000000..e0e2386
--- /dev/null
@@ -0,0 +1,21 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+#if ! defined(BAR)
+int foo() { return 0; }
+#else
+#error BAR defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3-k.exprc b/tests/if3-k.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if3-k.sh b/tests/if3-k.sh
new file mode 100644 (file)
index 0000000..b6765a0
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k if3-k.c
diff --git a/tests/if3-kDU.c b/tests/if3-kDU.c
new file mode 100644 (file)
index 0000000..c901021
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if ! defined(BAR)
+int foo() { return 0; }
+#else
+#error BAR defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3-kDU.experr b/tests/if3-kDU.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if3-kDU.expout b/tests/if3-kDU.expout
new file mode 100644 (file)
index 0000000..7cf0ddc
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3-kDU.exprc b/tests/if3-kDU.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if3-kDU.sh b/tests/if3-kDU.sh
new file mode 100644 (file)
index 0000000..51db801
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k -DFOO=1 -DFOOB=42 -UBAR if3-kDU.c
diff --git a/tests/if3.c b/tests/if3.c
new file mode 100644 (file)
index 0000000..2a87102
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if ! defined(BAR)
+int foo() { return 0; }
+#else
+#error BAR defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3.experr b/tests/if3.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if3.expout b/tests/if3.expout
new file mode 100644 (file)
index 0000000..b64cfc2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/if3.exprc b/tests/if3.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if3.sh b/tests/if3.sh
new file mode 100644 (file)
index 0000000..ced7e98
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR if3.c
diff --git a/tests/if4-a.experr b/tests/if4-a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if4-a.expout b/tests/if4-a.expout
new file mode 100644 (file)
index 0000000..55dfe32
--- /dev/null
@@ -0,0 +1,22 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo1() { return 0; }
+
+int foo2() { return 0; }
+
+int foo3() { return 0; }
+
+int foo4() { return 0; }
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4-a.exprc b/tests/if4-a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if4-a.sh b/tests/if4-a.sh
new file mode 100644 (file)
index 0000000..7b7cb92
--- /dev/null
@@ -0,0 +1 @@
+../unifdefall.sh -DFOO=1 -DFOOB=42 -UBAR if4.c
diff --git a/tests/if4-k.c b/tests/if4-k.c
new file mode 100644 (file)
index 0000000..b31bca4
--- /dev/null
@@ -0,0 +1,50 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if defined(FOO) || defined(FOOB)
+int foo1() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOOB) || defined(FOO)
+int foo2() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOO) && defined(FOOB)
+int foo3() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+#if defined(FOOB) && defined(FOO)
+int foo4() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4-k.experr b/tests/if4-k.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if4-k.expout b/tests/if4-k.expout
new file mode 100644 (file)
index 0000000..bb94d6a
--- /dev/null
@@ -0,0 +1,42 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+#if defined(FOO) || defined(FOOB)
+int foo1() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOOB) || defined(FOO)
+int foo2() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOO) && defined(FOOB)
+int foo3() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+#if defined(FOOB) && defined(FOO)
+int foo4() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4-k.exprc b/tests/if4-k.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if4-k.sh b/tests/if4-k.sh
new file mode 100644 (file)
index 0000000..8b69c0e
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k if4-k.c
diff --git a/tests/if4-kDU.c b/tests/if4-kDU.c
new file mode 100644 (file)
index 0000000..b31bca4
--- /dev/null
@@ -0,0 +1,50 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if defined(FOO) || defined(FOOB)
+int foo1() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOOB) || defined(FOO)
+int foo2() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOO) && defined(FOOB)
+int foo3() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+#if defined(FOOB) && defined(FOO)
+int foo4() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4-kDU.experr b/tests/if4-kDU.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if4-kDU.expout b/tests/if4-kDU.expout
new file mode 100644 (file)
index 0000000..919bd63
--- /dev/null
@@ -0,0 +1,26 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+int foo1() { return 0; }
+
+int foo2() { return 0; }
+
+int foo3() { return 0; }
+
+int foo4() { return 0; }
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4-kDU.exprc b/tests/if4-kDU.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if4-kDU.sh b/tests/if4-kDU.sh
new file mode 100644 (file)
index 0000000..6568e10
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k -DFOO=1 -DFOOB=42 -UBAR if4-kDU.c
diff --git a/tests/if4.c b/tests/if4.c
new file mode 100644 (file)
index 0000000..a8be348
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(FOO) || defined(FOOB)
+int foo1() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOOB) || defined(FOO)
+int foo2() { return 0; }
+#else
+#error FOO or FOOB not defined
+#endif
+
+#if defined(FOO) && defined(FOOB)
+int foo3() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+#if defined(FOOB) && defined(FOO)
+int foo4() { return 0; }
+#else
+#error FOO and FOOB not defined
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4.experr b/tests/if4.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if4.expout b/tests/if4.expout
new file mode 100644 (file)
index 0000000..55dfe32
--- /dev/null
@@ -0,0 +1,22 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo1() { return 0; }
+
+int foo2() { return 0; }
+
+int foo3() { return 0; }
+
+int foo4() { return 0; }
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/tests/if4.exprc b/tests/if4.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if4.sh b/tests/if4.sh
new file mode 100644 (file)
index 0000000..366da40
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR if4.c
diff --git a/tests/if5-a.experr b/tests/if5-a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if5-a.expout b/tests/if5-a.expout
new file mode 100644 (file)
index 0000000..b0f8cd2
--- /dev/null
@@ -0,0 +1,28 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo1() { return 0; }
+
+int foo2() { return 0; }
+
+intx foo3() { return 0; }
+
+int foo4() { return 0; }
+
+int foo5() { return 0; }
+
+int foo6() { return 0; }
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5-a.exprc b/tests/if5-a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if5-a.sh b/tests/if5-a.sh
new file mode 100644 (file)
index 0000000..a52ab0f
--- /dev/null
@@ -0,0 +1 @@
+../unifdefall.sh -DFOO=1 -DFOOB=42 -UBAR if5.c
diff --git a/tests/if5-k.c b/tests/if5-k.c
new file mode 100644 (file)
index 0000000..2be1847
--- /dev/null
@@ -0,0 +1,64 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if FOOB == 42
+int foo1() { return 0; }
+#else
+#error FOOB not 42
+#endif
+
+#if FOOB != 42
+#error FOO is 2
+#else
+int foo2() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO == 1
+intx foo3() { return 0; }
+#else
+#error FOO not 1 or BAR not 1
+#endif
+
+#if FOOB != 42 && FOO != 1
+#error FOOB not 42 and FOO not 1
+#else
+int foo4() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO != 1
+int foo5() { return 0; }
+#else
+#error FOOB is 42 or FOO is not 1
+#endif
+
+#if FOO != 1 || FOOB != 42
+#error FOO is 1 or FOOB is 42
+#else
+int foo6() { return 0; }
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5-k.experr b/tests/if5-k.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if5-k.expout b/tests/if5-k.expout
new file mode 100644 (file)
index 0000000..4ae22c6
--- /dev/null
@@ -0,0 +1,56 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+#if FOOB == 42
+int foo1() { return 0; }
+#else
+#error FOOB not 42
+#endif
+
+#if FOOB != 42
+#error FOO is 2
+#else
+int foo2() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO == 1
+intx foo3() { return 0; }
+#else
+#error FOO not 1 or BAR not 1
+#endif
+
+#if FOOB != 42 && FOO != 1
+#error FOOB not 42 and FOO not 1
+#else
+int foo4() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO != 1
+int foo5() { return 0; }
+#else
+#error FOOB is 42 or FOO is not 1
+#endif
+
+#if FOO != 1 || FOOB != 42
+#error FOO is 1 or FOOB is 42
+#else
+int foo6() { return 0; }
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5-k.exprc b/tests/if5-k.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if5-k.sh b/tests/if5-k.sh
new file mode 100644 (file)
index 0000000..6a8d7a8
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k if5-k.c
diff --git a/tests/if5-kDU.c b/tests/if5-kDU.c
new file mode 100644 (file)
index 0000000..2be1847
--- /dev/null
@@ -0,0 +1,64 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if 0
+/* This code is commented out. "#if 0 then" */
+#else
+/* This code is passed through. "#if 0 else" */
+#endif
+
+#if 1
+/* This code is passed through. "#if 1 then" */
+#else
+/* This code is passed through. "#if 1 else" */
+#endif
+
+#if FOOB == 42
+int foo1() { return 0; }
+#else
+#error FOOB not 42
+#endif
+
+#if FOOB != 42
+#error FOO is 2
+#else
+int foo2() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO == 1
+intx foo3() { return 0; }
+#else
+#error FOO not 1 or BAR not 1
+#endif
+
+#if FOOB != 42 && FOO != 1
+#error FOOB not 42 and FOO not 1
+#else
+int foo4() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO != 1
+int foo5() { return 0; }
+#else
+#error FOOB is 42 or FOO is not 1
+#endif
+
+#if FOO != 1 || FOOB != 42
+#error FOO is 1 or FOOB is 42
+#else
+int foo6() { return 0; }
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5-kDU.experr b/tests/if5-kDU.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if5-kDU.expout b/tests/if5-kDU.expout
new file mode 100644 (file)
index 0000000..a8de2a1
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright 2004, 2008 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* This code is passed through. "#if 0 else" */
+
+/* This code is passed through. "#if 1 then" */
+
+int foo1() { return 0; }
+
+int foo2() { return 0; }
+
+intx foo3() { return 0; }
+
+int foo4() { return 0; }
+
+int foo5() { return 0; }
+
+int foo6() { return 0; }
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5-kDU.exprc b/tests/if5-kDU.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if5-kDU.sh b/tests/if5-kDU.sh
new file mode 100644 (file)
index 0000000..375f53b
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -k -DFOO=1 -DFOOB=42 -UBAR if5-kDU.c
diff --git a/tests/if5.c b/tests/if5.c
new file mode 100644 (file)
index 0000000..d40b3cb
--- /dev/null
@@ -0,0 +1,52 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if FOOB == 42
+int foo1() { return 0; }
+#else
+#error FOOB not 42
+#endif
+
+#if FOOB != 42
+#error FOO is 2
+#else
+int foo2() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO == 1
+intx foo3() { return 0; }
+#else
+#error FOO not 1 or BAR not 1
+#endif
+
+#if FOOB != 42 && FOO != 1
+#error FOOB not 42 and FOO not 1
+#else
+int foo4() { return 0; }
+#endif
+
+#if FOOB == 42 || FOO != 1
+int foo5() { return 0; }
+#else
+#error FOOB is 42 or FOO is not 1
+#endif
+
+#if FOO != 1 || FOOB != 42
+#error FOO is 1 or FOOB is 42
+#else
+int foo6() { return 0; }
+#endif
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5.experr b/tests/if5.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if5.expout b/tests/if5.expout
new file mode 100644 (file)
index 0000000..b0f8cd2
--- /dev/null
@@ -0,0 +1,28 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo1() { return 0; }
+
+int foo2() { return 0; }
+
+intx foo3() { return 0; }
+
+int foo4() { return 0; }
+
+int foo5() { return 0; }
+
+int foo6() { return 0; }
+
+int main()
+{
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+  foo5();
+  foo6();
+}
diff --git a/tests/if5.exprc b/tests/if5.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if5.sh b/tests/if5.sh
new file mode 100644 (file)
index 0000000..f1ee817
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR if5.c
diff --git a/tests/if6.c b/tests/if6.c
new file mode 100644 (file)
index 0000000..6abadb1
--- /dev/null
@@ -0,0 +1,11 @@
+#if F1
+int f1() { return 0; }
+#elif F2
+int f2() { return 0; }
+#elif F3
+int f3() { return 0; }
+#elif F4
+int f4() { return 0; }
+#else
+int f() { return 0; }
+#endif
diff --git a/tests/if6a.experr b/tests/if6a.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if6a.expout b/tests/if6a.expout
new file mode 100644 (file)
index 0000000..c51d7a6
--- /dev/null
@@ -0,0 +1 @@
+int f1() { return 0; }
diff --git a/tests/if6a.exprc b/tests/if6a.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if6a.sh b/tests/if6a.sh
new file mode 100644 (file)
index 0000000..a0ba172
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF1 if6.c
diff --git a/tests/if6b.experr b/tests/if6b.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if6b.expout b/tests/if6b.expout
new file mode 100644 (file)
index 0000000..0b7aa04
--- /dev/null
@@ -0,0 +1,5 @@
+#if F1
+int f1() { return 0; }
+#else
+int f2() { return 0; }
+#endif
diff --git a/tests/if6b.exprc b/tests/if6b.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if6b.sh b/tests/if6b.sh
new file mode 100644 (file)
index 0000000..d6ab237
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF2 if6.c
diff --git a/tests/if6c.experr b/tests/if6c.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if6c.expout b/tests/if6c.expout
new file mode 100644 (file)
index 0000000..03341d9
--- /dev/null
@@ -0,0 +1,7 @@
+#if F1
+int f1() { return 0; }
+#elif F2
+int f2() { return 0; }
+#else
+int f3() { return 0; }
+#endif
diff --git a/tests/if6c.exprc b/tests/if6c.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if6c.sh b/tests/if6c.sh
new file mode 100644 (file)
index 0000000..f707a8f
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF3 if6.c
diff --git a/tests/if6d.experr b/tests/if6d.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/if6d.expout b/tests/if6d.expout
new file mode 100644 (file)
index 0000000..76d7011
--- /dev/null
@@ -0,0 +1,9 @@
+#if F1
+int f1() { return 0; }
+#elif F2
+int f2() { return 0; }
+#elif F3
+int f3() { return 0; }
+#else
+int f4() { return 0; }
+#endif
diff --git a/tests/if6d.exprc b/tests/if6d.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/if6d.sh b/tests/if6d.sh
new file mode 100644 (file)
index 0000000..f85d137
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DF4 if6.c
diff --git a/tests/none.c b/tests/none.c
new file mode 100644 (file)
index 0000000..09d66b6
--- /dev/null
@@ -0,0 +1,5 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+int foo() { return 0; }
diff --git a/tests/none.experr b/tests/none.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/none.expout b/tests/none.expout
new file mode 100644 (file)
index 0000000..09d66b6
--- /dev/null
@@ -0,0 +1,5 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+int foo() { return 0; }
diff --git a/tests/none.exprc b/tests/none.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/none.sh b/tests/none.sh
new file mode 100644 (file)
index 0000000..828a4ef
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR none.c
diff --git a/tests/outdir.experr b/tests/outdir.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/outdir.expout b/tests/outdir.expout
new file mode 100644 (file)
index 0000000..56ae03c
--- /dev/null
@@ -0,0 +1,16 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/outdir.exprc b/tests/outdir.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/outdir.sh b/tests/outdir.sh
new file mode 100644 (file)
index 0000000..29b4910
--- /dev/null
@@ -0,0 +1,4 @@
+mkdir -p outdir
+../unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutdir/outfile.c if1.c
+cat outdir/outfile.c
+rm -r outdir
diff --git a/tests/outfile.experr b/tests/outfile.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/outfile.expout b/tests/outfile.expout
new file mode 100644 (file)
index 0000000..56ae03c
--- /dev/null
@@ -0,0 +1,16 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/outfile.exprc b/tests/outfile.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/outfile.sh b/tests/outfile.sh
new file mode 100644 (file)
index 0000000..0a434c2
--- /dev/null
@@ -0,0 +1,3 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutfile.c if1.c
+cat outfile.c
+rm outfile.c
diff --git a/tests/overdir.experr b/tests/overdir.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/overdir.expout b/tests/overdir.expout
new file mode 100644 (file)
index 0000000..56ae03c
--- /dev/null
@@ -0,0 +1,16 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/overdir.exprc b/tests/overdir.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/overdir.sh b/tests/overdir.sh
new file mode 100644 (file)
index 0000000..97734f8
--- /dev/null
@@ -0,0 +1,5 @@
+mkdir -p overdir
+cp if1.c overdir/overwrite.c
+../unifdef -DFOO=1 -DFOOB=42 -UBAR -ooverdir/overwrite.c overdir/overwrite.c
+cat overdir/overwrite.c
+rm -r overdir
diff --git a/tests/overwrite.experr b/tests/overwrite.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/overwrite.expout b/tests/overwrite.expout
new file mode 100644 (file)
index 0000000..56ae03c
--- /dev/null
@@ -0,0 +1,16 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int bar() { return 0; }
+
+int main()
+{
+  foo();
+  bar();
+}
diff --git a/tests/overwrite.exprc b/tests/overwrite.exprc
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/overwrite.sh b/tests/overwrite.sh
new file mode 100644 (file)
index 0000000..ba09def
--- /dev/null
@@ -0,0 +1,4 @@
+cp if1.c overwrite.c
+../unifdef -DFOO=1 -DFOOB=42 -UBAR -ooverwrite.c overwrite.c
+cat overwrite.c
+rm overwrite.c
diff --git a/tests/small1.c b/tests/small1.c
new file mode 100644 (file)
index 0000000..eb1c26d
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef FOO
+int foo() { return 0; }
+#else
+#error FOO not defined
+#endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/small1.experr b/tests/small1.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/small1.expout b/tests/small1.expout
new file mode 100644 (file)
index 0000000..b64cfc2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/small1.exprc b/tests/small1.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/small1.sh b/tests/small1.sh
new file mode 100644 (file)
index 0000000..2db693b
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR small1.c
diff --git a/tests/small2.c b/tests/small2.c
new file mode 100644 (file)
index 0000000..4a5c813
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef BAR
+int bar() { return 0; }
+#else
+#error BAR not defined
+#endif
+
+int main()
+{
+  bar();
+}
diff --git a/tests/small2.experr b/tests/small2.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/small2.expout b/tests/small2.expout
new file mode 100644 (file)
index 0000000..5c1f8b4
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int bar() { return 0; }
+
+int main()
+{
+  bar();
+}
diff --git a/tests/small2.exprc b/tests/small2.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/small2.sh b/tests/small2.sh
new file mode 100644 (file)
index 0000000..fde6ef2
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR small2.c
diff --git a/tests/spaces1.c b/tests/spaces1.c
new file mode 100644 (file)
index 0000000..947dacf
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+# include <stdlib.h>
+
+# ifdef FOO
+int foo() { return 0; }
+# else
+#  error FOO not defined
+# endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/spaces1.experr b/tests/spaces1.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/spaces1.expout b/tests/spaces1.expout
new file mode 100644 (file)
index 0000000..766f235
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+# include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/spaces1.exprc b/tests/spaces1.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces1.sh b/tests/spaces1.sh
new file mode 100644 (file)
index 0000000..452033a
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR spaces1.c
diff --git a/tests/spaces2.c b/tests/spaces2.c
new file mode 100644 (file)
index 0000000..f5a250a
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+# include <stdlib.h>
+
+# ifndef BAR
+int bar() { return 0; }
+# else
+#  error BAR defined
+# endif
+
+int main()
+{
+  bar();
+}
diff --git a/tests/spaces2.experr b/tests/spaces2.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/spaces2.expout b/tests/spaces2.expout
new file mode 100644 (file)
index 0000000..7d37759
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+# include <stdlib.h>
+
+int bar() { return 0; }
+
+int main()
+{
+  bar();
+}
diff --git a/tests/spaces2.exprc b/tests/spaces2.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces2.sh b/tests/spaces2.sh
new file mode 100644 (file)
index 0000000..9771d25
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR spaces2.c
diff --git a/tests/spaces3.c b/tests/spaces3.c
new file mode 100644 (file)
index 0000000..7284634
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+ # include <stdlib.h>
+
+ # ifndef BAR
+int bar() { return 0; }
+ # else
+   # error BAR defined
+ # endif
+
+int main()
+{
+  bar();
+}
diff --git a/tests/spaces3.experr b/tests/spaces3.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/spaces3.expout b/tests/spaces3.expout
new file mode 100644 (file)
index 0000000..60aceee
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+ # include <stdlib.h>
+
+int bar() { return 0; }
+
+int main()
+{
+  bar();
+}
diff --git a/tests/spaces3.exprc b/tests/spaces3.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces3.sh b/tests/spaces3.sh
new file mode 100644 (file)
index 0000000..3a46246
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR spaces3.c
diff --git a/tests/spaces4.c b/tests/spaces4.c
new file mode 100644 (file)
index 0000000..6fbc6f2
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+ # include <stdlib.h>
+
+ # ifdef FOO
+int foo() { return 0; }
+ # else
+   # error FOO defined
+ # endif
+
+int main()
+{
+  foo();
+}
diff --git a/tests/spaces4.experr b/tests/spaces4.experr
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/spaces4.expout b/tests/spaces4.expout
new file mode 100644 (file)
index 0000000..fbf0d3c
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright 2004 Bob Proulx <bob@proulx.com>
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+# include <stdio.h>
+ # include <stdlib.h>
+
+int foo() { return 0; }
+
+int main()
+{
+  foo();
+}
diff --git a/tests/spaces4.exprc b/tests/spaces4.exprc
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces4.sh b/tests/spaces4.sh
new file mode 100644 (file)
index 0000000..ae297ab
--- /dev/null
@@ -0,0 +1 @@
+../unifdef -DFOO=1 -DFOOB=42 -UBAR spaces4.c
diff --git a/unifdef.1 b/unifdef.1
new file mode 100644 (file)
index 0000000..406870b
--- /dev/null
+++ b/unifdef.1
@@ -0,0 +1,413 @@
+.\" Copyright (c) 1985, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\" Copyright (c) 2002 - 2010 Tony Finch <dot@dotat.at>.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" 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
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd March 11, 2010
+.Dt UNIFDEF 1 PRM
+.Os " "
+.Sh NAME
+.Nm unifdef , unifdefall
+.Nd remove preprocessor conditionals from code
+.Sh SYNOPSIS
+.Nm
+.Op Fl bBcdeKknsStV
+.Op Fl I Ns Ar path
+.Op Fl D Ns Ar sym Ns Op = Ns Ar val
+.Op Fl U Ns Ar sym
+.Op Fl iD Ns Ar sym Ns Op = Ns Ar val
+.Op Fl iU Ns Ar sym
+.Ar ...
+.Op Fl o Ar outfile
+.Op Ar infile
+.Nm unifdefall
+.Op Fl I Ns Ar path
+.Ar ...
+.Ar file
+.Sh DESCRIPTION
+The
+.Nm
+utility selectively processes conditional
+.Xr cpp 1
+directives.
+It removes from a file
+both the directives
+and any additional text that they specify should be removed,
+while otherwise leaving the file alone.
+.Pp
+The
+.Nm
+utility acts on
+.Ic #if , #ifdef , #ifndef , #elif , #else ,
+and
+.Ic #endif
+lines.
+A directive is only processed
+if the symbols specified on the command line are sufficient to allow
+.Nm
+to get a definite value for its control expression.
+If the result is false,
+the directive and the following lines under its control are removed.
+If the result is true,
+only the directive is removed.
+An
+.Ic #ifdef
+or
+.Ic #ifndef
+directive is passed through unchanged
+if its controlling symbol is not specified on the command line.
+Any
+.Ic #if
+or
+.Ic #elif
+control expression that has an unknown value or that
+.Nm
+cannot parse is passed through unchanged.
+By default,
+.Nm
+ignores
+.Ic #if
+and
+.Ic #elif
+lines with constant expressions;
+it can be told to process them by specifying the
+.Fl k
+flag on the command line.
+.Pp
+It understands a commonly-used subset
+of the expression syntax for
+.Ic #if
+and
+.Ic #elif
+lines:
+integer constants,
+integer values of symbols defined on the command line,
+the
+.Fn defined
+operator,
+the operators
+.Ic \&! , < , > , <= , >= , == , != , && , || ,
+and parenthesized expressions.
+A kind of
+.Dq "short circuit"
+evaluation is used for the
+.Ic &&
+operator:
+if either operand is definitely false then the result is false,
+even if the value of the other operand is unknown.
+Similarly,
+if either operand of
+.Ic ||
+is definitely true then the result is true.
+.Pp
+In most cases, the
+.Nm
+utility does not distinguish between object-like macros
+(without arguments) and function-like arguments (with arguments).
+If a macro is not explicitly defined, or is defined with the
+.Fl D
+flag on the command-line, its arguments are ignored.
+If a macro is explicitly undefined on the command line with the
+.Fl U
+flag, it may not have any arguments since this leads to a syntax error.
+.Pp
+The
+.Nm
+utility understands just enough about C
+to know when one of the directives is inactive
+because it is inside
+a comment,
+or affected by a backslash-continued line.
+It spots unusually-formatted preprocessor directives
+and knows when the layout is too odd for it to handle.
+.Pp
+A script called
+.Nm unifdefall
+can be used to remove all conditional
+.Xr cpp 1
+directives from a file.
+It uses
+.Nm Fl s
+and
+.Nm cpp Fl dM
+to get lists of all the controlling symbols
+and their definitions (or lack thereof),
+then invokes
+.Nm
+with appropriate arguments to process the file.
+.Sh OPTIONS
+.Pp
+.Bl -tag -width indent -compact
+.It Fl D Ns Ar sym Ns = Ns Ar val
+Specify that a symbol is defined to a given value
+which is used when evaluating
+.Ic #if
+and
+.Ic #elif
+control expressions.
+.Pp
+.It Fl D Ns Ar sym
+Specify that a symbol is defined to the value 1.
+.Pp
+.It Fl U Ns Ar sym
+Specify that a symbol is undefined.
+If the same symbol appears in more than one argument,
+the last occurrence dominates.
+.Pp
+.It Fl b
+Replace removed lines with blank lines
+instead of deleting them.
+Mutually exclusive with the
+.Fl B
+option.
+.Pp
+.It Fl B
+Compress blank lines around a deleted section.
+Mutually exclusive with the
+.Fl b
+option.
+.Pp
+.It Fl c
+If the
+.Fl c
+flag is specified,
+then the operation of
+.Nm
+is complemented,
+i.e., the lines that would have been removed or blanked
+are retained and vice versa.
+.Pp
+.It Fl d
+Turn on printing of degugging messages.
+.Pp
+.It Fl e
+Because
+.Nm
+processes its input one line at a time,
+it cannot remove preprocessor directives that span more than one line.
+The most common example of this is a directive with a multi-line
+comment hanging off its right hand end.
+By default,
+if
+.Nm
+has to process such a directive,
+it will complain that the line is too obfuscated.
+The
+.Fl e
+option changes the behaviour so that,
+where possible,
+such lines are left unprocessed instead of reporting an error.
+.Pp
+.It Fl K
+Always treat the result of
+.Ic &&
+and
+.Ic ||
+operators as unknown if either operand is unknown,
+instead of short-circuiting when unknown operands can't affect the result.
+This option is for compatibility with older versions of
+.Nm .
+.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
+.Dq 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 n
+Add
+.Li #line
+directives to the output following any deleted lines,
+so that errors produced when compiling the output file correspond to
+line numbers in the input file.
+.Pp
+.It Fl o Ar outfile
+Write output to the file
+.Ar outfile
+instead of the standard output.
+If
+.Ar outfile
+is the same as the input file,
+the output is written to a temporary file
+which is renamed into place when
+.Nm
+completes successfully.
+.Pp
+.It Fl s
+Instead of processing the input file as usual,
+this option causes
+.Nm
+to produce a list of symbols that appear in expressions
+that
+.Nm
+understands.
+It is useful in conjunction with the
+.Fl dM
+option of
+.Xr cpp 1
+for creating
+.Nm
+command lines.
+.Pp
+.It Fl S
+Like the
+.Fl s
+option, but the nesting depth of each symbol is also printed.
+This is useful for working out the number of possible combinations
+of interdependent defined/undefined symbols.
+.Pp
+.It Fl t
+Disables parsing for C comments
+and line continuations,
+which is useful
+for plain text.
+.Pp
+.It Fl iD Ns Ar sym Ns Op = Ns Ar val
+.It Fl iU Ns Ar sym
+Ignore
+.Ic #ifdef Ns s .
+If your C code uses
+.Ic #ifdef Ns s
+to delimit non-C lines,
+such as comments
+or code which is under construction,
+then you must tell
+.Nm
+which symbols are used for that purpose so that it will not try to parse
+comments
+and line continuations
+inside those
+.Ic #ifdef Ns s .
+You can specify ignored symbols with
+.Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc
+and
+.Fl iU Ns Ar sym
+similar to
+.Fl D Ns Ar sym Ns Op = Ns Ar val
+and
+.Fl U Ns Ar sym
+above.
+.Pp
+.It Fl I Ns Ar path
+Specifies to
+.Nm unifdefall
+an additional place to look for
+.Ic #include
+files.
+This option is ignored by
+.Nm
+for compatibility with
+.Xr cpp 1
+and to simplify the implementation of
+.Nm unifdefall .
+.Pp
+.It Fl V
+Print version details.
+.El
+.Pp
+The
+.Nm
+utility copies its output to
+.Em stdout
+and will take its input from
+.Em stdin
+if no
+.Ar file
+argument is given.
+.Pp
+The
+.Nm
+utility works nicely with the
+.Fl D Ns Ar sym
+option of
+.Xr diff 1 .
+.Sh EXIT STATUS
+The
+.Nm
+utility exits 0 if the output is an exact copy of the input,
+1 if not, and 2 if in trouble.
+.Sh DIAGNOSTICS
+.Bl -item
+.It
+Too many levels of nesting.
+.It
+Inappropriate
+.Ic #elif ,
+.Ic #else
+or
+.Ic #endif .
+.It
+Obfuscated preprocessor control line.
+.It
+Premature
+.Tn EOF
+(with the line number of the most recent unterminated
+.Ic #if ) .
+.It
+.Tn EOF
+in comment.
+.El
+.Sh SEE ALSO
+.Xr cpp 1 ,
+.Xr diff 1
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 2.9 .
+.Tn ANSI\~C
+support was added in
+.Fx 4.7 .
+.Sh AUTHORS
+The original implementation was written by
+.An Dave Yost Aq Dave@Yost.com .
+.An Tony Finch Aq dot@dotat.at
+rewrote it to support
+.Tn ANSI\~C .
+.Sh BUGS
+Expression evaluation is very limited.
+.Pp
+Preprocessor control lines split across more than one physical line
+(because of comments or backslash-newline)
+cannot be handled in every situation.
+.Pp
+Trigraphs are not recognized.
+.Pp
+There is no support for symbols with different definitions at
+different points in the source file.
+.Pp
+The text-mode and ignore functionality does not correspond to modern
+.Xr cpp 1
+behaviour.
diff --git a/unifdef.c b/unifdef.c
new file mode 100644 (file)
index 0000000..fcc27bf
--- /dev/null
+++ b/unifdef.c
@@ -0,0 +1,1230 @@
+/*
+ * Copyright (c) 2002 - 2010 Tony Finch <dot@dotat.at>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * unifdef - remove ifdef'ed lines
+ *
+ * This code was derived from software contributed to Berkeley by Dave Yost.
+ * It was rewritten to support ANSI C by Tony Finch. The original version
+ * of unifdef carried the 4-clause BSD copyright licence. None of its code
+ * remains in this version (though some of the names remain) so it now
+ * carries a more liberal licence.
+ *
+ *  Wishlist:
+ *      provide an option which will append the name of the
+ *        appropriate symbol after #else's and #endif's
+ *      provide an option which will check symbols after
+ *        #else's and #endif's to see that they match their
+ *        corresponding #ifdef or #ifndef
+ *
+ *   These require better buffer handling, which would also make
+ *   it possible to handle all "dodgy" directives correctly.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+const char copyright[] =
+    #include "version.h"
+    "@(#) $Author: Tony Finch (dot@dotat.at) $\n"
+    "@(#) $URL: http://dotat.at/prog/unifdef $\n"
+;
+
+/* types of input lines: */
+typedef enum {
+       LT_TRUEI,               /* a true #if with ignore flag */
+       LT_FALSEI,              /* a false #if with ignore flag */
+       LT_IF,                  /* an unknown #if */
+       LT_TRUE,                /* a true #if */
+       LT_FALSE,               /* a false #if */
+       LT_ELIF,                /* an unknown #elif */
+       LT_ELTRUE,              /* a true #elif */
+       LT_ELFALSE,             /* a false #elif */
+       LT_ELSE,                /* #else */
+       LT_ENDIF,               /* #endif */
+       LT_DODGY,               /* flag: directive is not on one line */
+       LT_DODGY_LAST = LT_DODGY + LT_ENDIF,
+       LT_PLAIN,               /* ordinary line */
+       LT_EOF,                 /* end of file */
+       LT_ERROR,               /* unevaluable #if */
+       LT_COUNT
+} Linetype;
+
+static char const * const linetype_name[] = {
+       "TRUEI", "FALSEI", "IF", "TRUE", "FALSE",
+       "ELIF", "ELTRUE", "ELFALSE", "ELSE", "ENDIF",
+       "DODGY TRUEI", "DODGY FALSEI",
+       "DODGY IF", "DODGY TRUE", "DODGY FALSE",
+       "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE",
+       "DODGY ELSE", "DODGY ENDIF",
+       "PLAIN", "EOF", "ERROR"
+};
+
+/* state of #if processing */
+typedef enum {
+       IS_OUTSIDE,
+       IS_FALSE_PREFIX,        /* false #if followed by false #elifs */
+       IS_TRUE_PREFIX,         /* first non-false #(el)if is true */
+       IS_PASS_MIDDLE,         /* first non-false #(el)if is unknown */
+       IS_FALSE_MIDDLE,        /* a false #elif after a pass state */
+       IS_TRUE_MIDDLE,         /* a true #elif after a pass state */
+       IS_PASS_ELSE,           /* an else after a pass state */
+       IS_FALSE_ELSE,          /* an else after a true state */
+       IS_TRUE_ELSE,           /* an else after only false states */
+       IS_FALSE_TRAILER,       /* #elifs after a true are false */
+       IS_COUNT
+} Ifstate;
+
+static char const * const ifstate_name[] = {
+       "OUTSIDE", "FALSE_PREFIX", "TRUE_PREFIX",
+       "PASS_MIDDLE", "FALSE_MIDDLE", "TRUE_MIDDLE",
+       "PASS_ELSE", "FALSE_ELSE", "TRUE_ELSE",
+       "FALSE_TRAILER"
+};
+
+/* state of comment parser */
+typedef enum {
+       NO_COMMENT = false,     /* outside a comment */
+       C_COMMENT,              /* in a comment like this one */
+       CXX_COMMENT,            /* between // and end of line */
+       STARTING_COMMENT,       /* just after slash-backslash-newline */
+       FINISHING_COMMENT,      /* star-backslash-newline in a C comment */
+       CHAR_LITERAL,           /* inside '' */
+       STRING_LITERAL          /* inside "" */
+} Comment_state;
+
+static char const * const comment_name[] = {
+       "NO", "C", "CXX", "STARTING", "FINISHING", "CHAR", "STRING"
+};
+
+/* state of preprocessor line parser */
+typedef enum {
+       LS_START,               /* only space and comments on this line */
+       LS_HASH,                /* only space, comments, and a hash */
+       LS_DIRTY                /* this line can't be a preprocessor line */
+} Line_state;
+
+static char const * const linestate_name[] = {
+       "START", "HASH", "DIRTY"
+};
+
+/*
+ * Minimum translation limits from ISO/IEC 9899:1999 5.2.4.1
+ */
+#define        MAXDEPTH        64                      /* maximum #if nesting */
+#define        MAXLINE         4096                    /* maximum length of line */
+#define        MAXSYMS         4096                    /* maximum number of symbols */
+
+/*
+ * Sometimes when editing a keyword the replacement text is longer, so
+ * we leave some space at the end of the tline buffer to accommodate this.
+ */
+#define        EDITSLOP        10
+
+/*
+ * For temporary filenames
+ */
+#define TEMPLATE        "unifdef.XXXXXX"
+
+/*
+ * Globals.
+ */
+
+static bool             compblank;             /* -B: compress blank lines */
+static bool             lnblank;               /* -b: blank deleted lines */
+static bool             complement;            /* -c: do the complement */
+static bool             debugging;             /* -d: debugging reports */
+static bool             iocccok;               /* -e: fewer IOCCC errors */
+static bool             strictlogic;           /* -K: keep ambiguous #ifs */
+static bool             killconsts;            /* -k: eval constant #ifs */
+static bool             lnnum;                 /* -n: add #line directives */
+static bool             symlist;               /* -s: output symbol list */
+static bool             symdepth;              /* -S: output symbol depth */
+static bool             text;                  /* -t: this is a text file */
+
+static const char      *symname[MAXSYMS];      /* symbol name */
+static const char      *value[MAXSYMS];                /* -Dsym=value */
+static bool             ignore[MAXSYMS];       /* -iDsym or -iUsym */
+static int              nsyms;                 /* number of symbols */
+
+static FILE            *input;                 /* input file pointer */
+static const char      *filename;              /* input file name */
+static int              linenum;               /* current line number */
+static FILE            *output;                        /* output file pointer */
+static const char      *ofilename;             /* output file name */
+static bool             overwriting;           /* output overwrites input */
+static char             tempname[FILENAME_MAX];        /* used when overwriting */
+
+static char             tline[MAXLINE+EDITSLOP];/* input buffer plus space */
+static char            *keyword;               /* used for editing #elif's */
+
+static const char      *newline;               /* input file format */
+static const char       newline_unix[] = "\n";
+static const char       newline_crlf[] = "\r\n";
+
+static Comment_state    incomment;             /* comment parser state */
+static Line_state       linestate;             /* #if line parser state */
+static Ifstate          ifstate[MAXDEPTH];     /* #if processor state */
+static bool             ignoring[MAXDEPTH];    /* ignore comments state */
+static int              stifline[MAXDEPTH];    /* start of current #if */
+static int              depth;                 /* current #if nesting */
+static int              delcount;              /* count of deleted lines */
+static unsigned         blankcount;            /* count of blank lines */
+static unsigned         blankmax;              /* maximum recent blankcount */
+static bool             constexpr;             /* constant #if expression */
+static bool             zerosyms = true;       /* to format symdepth output */
+static bool             firstsym;              /* ditto */
+
+static int              exitstat;              /* program exit status */
+
+static void             addsym(bool, bool, char *);
+static void             closeout(void);
+static void             debug(const char *, ...);
+static void             done(void);
+static void             error(const char *);
+static int              findsym(const char *);
+static void             flushline(bool);
+static Linetype         parseline(void);
+static Linetype         ifeval(const char **);
+static void             ignoreoff(void);
+static void             ignoreon(void);
+static void             keywordedit(const char *);
+static void             nest(void);
+static void             process(void);
+static const char      *skipargs(const char *);
+static const char      *skipcomment(const char *);
+static const char      *skipsym(const char *);
+static void             state(Ifstate);
+static int              strlcmp(const char *, const char *, size_t);
+static void             unnest(void);
+static void             usage(void);
+static void             version(void);
+
+#define endsym(c) (!isalnum((unsigned char)c) && c != '_')
+
+/*
+ * The main program.
+ */
+int
+main(int argc, char *argv[])
+{
+       int opt;
+
+       while ((opt = getopt(argc, argv, "i:D:U:I:o:bBcdeKklnsStV")) != -1)
+               switch (opt) {
+               case 'i': /* treat stuff controlled by these symbols as text */
+                       /*
+                        * For strict backwards-compatibility the U or D
+                        * should be immediately after the -i but it doesn't
+                        * matter much if we relax that requirement.
+                        */
+                       opt = *optarg++;
+                       if (opt == 'D')
+                               addsym(true, true, optarg);
+                       else if (opt == 'U')
+                               addsym(true, false, optarg);
+                       else
+                               usage();
+                       break;
+               case 'D': /* define a symbol */
+                       addsym(false, true, optarg);
+                       break;
+               case 'U': /* undef a symbol */
+                       addsym(false, false, optarg);
+                       break;
+               case 'I': /* no-op for compatibility with cpp */
+                       break;
+               case 'b': /* blank deleted lines instead of omitting them */
+               case 'l': /* backwards compatibility */
+                       lnblank = true;
+                       break;
+               case 'B': /* compress blank lines around removed section */
+                       compblank = true;
+                       break;
+               case 'c': /* treat -D as -U and vice versa */
+                       complement = true;
+                       break;
+               case 'd':
+                       debugging = true;
+                       break;
+               case 'e': /* fewer errors from dodgy lines */
+                       iocccok = true;
+                       break;
+               case 'K': /* keep ambiguous #ifs */
+                       strictlogic = true;
+                       break;
+               case 'k': /* process constant #ifs */
+                       killconsts = true;
+                       break;
+               case 'n': /* add #line directive after deleted lines */
+                       lnnum = true;
+                       break;
+               case 'o': /* output to a file */
+                       ofilename = optarg;
+                       break;
+               case 's': /* only output list of symbols that control #ifs */
+                       symlist = true;
+                       break;
+               case 'S': /* list symbols with their nesting depth */
+                       symlist = symdepth = true;
+                       break;
+               case 't': /* don't parse C comments */
+                       text = true;
+                       break;
+               case 'V': /* print version */
+                       version();
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+       if (compblank && lnblank)
+               errx(2, "-B and -b are mutually exclusive");
+       if (argc > 1) {
+               errx(2, "can only do one file");
+       } else if (argc == 1 && strcmp(*argv, "-") != 0) {
+               filename = *argv;
+               input = fopen(filename, "rb");
+               if (input == NULL)
+                       err(2, "can't open %s", filename);
+       } else {
+               filename = "[stdin]";
+               input = stdin;
+       }
+       if (ofilename == NULL) {
+               ofilename = "[stdout]";
+               output = stdout;
+       } else {
+               struct stat ist, ost;
+               memset(&ist, 0, sizeof(ist));
+               memset(&ost, 0, sizeof(ost));
+
+               if (fstat(fileno(input), &ist) != 0)
+                       err(2, "can't fstat %s", filename);
+               if (stat(ofilename, &ost) != 0 && errno != ENOENT)
+                       warn("can't stat %s", ofilename);
+
+               overwriting = (ist.st_dev == ost.st_dev
+                           && ist.st_ino == ost.st_ino);
+               if (overwriting) {
+                       const char *dirsep;
+                       int ofd;
+
+                       dirsep = strrchr(ofilename, '/');
+                       if (dirsep != NULL)
+                               snprintf(tempname, sizeof(tempname),
+                                   "%.*s/" TEMPLATE,
+                                   (int)(dirsep - ofilename), ofilename);
+                       else
+                               snprintf(tempname, sizeof(tempname),
+                                   TEMPLATE);
+                       ofd = mkstemp(tempname);
+                       if (ofd != -1)
+                               output = fdopen(ofd, "wb+");
+                       if (output == NULL)
+                               err(2, "can't create temporary file");
+                       fchmod(ofd, ist.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO));
+               } else {
+                       output = fopen(ofilename, "wb");
+                       if (output == NULL)
+                               err(2, "can't open %s", ofilename);
+               }
+       }
+       process();
+       abort(); /* bug */
+}
+
+static void
+version(void)
+{
+       const char *c = copyright;
+       for (;;) {
+               while (*++c != '$')
+                       if (*c == '\0')
+                               exit(0);
+               while (*++c != '$')
+                       putc(*c, stderr);
+               putc('\n', stderr);
+       }
+}
+
+static void
+usage(void)
+{
+       fprintf(stderr, "usage: unifdef [-bBcdeKknsStV] [-Ipath]"
+           " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
+       exit(2);
+}
+
+/*
+ * 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.
+ *
+ * Nesting is handled by keeping a stack of states; some transition
+ * functions increase or decrease the depth. They also maintain the
+ * ignore state on a stack. In some complicated cases they have to
+ * alter the preprocessor directive, as follows.
+ *
+ * When we have processed a group that starts off with a known-false
+ * #if/#elif sequence (which has therefore been deleted) followed by a
+ * #elif that we don't understand and therefore must keep, we edit the
+ * latter into a #if to keep the nesting correct.
+ *
+ * When we find a true #elif in a group, the following block will
+ * always be kept and the rest of the sequence after the next #elif or
+ * #else will be discarded. We edit the #elif into a #else and the
+ * following directive to #endif since this has the desired behaviour.
+ *
+ * "Dodgy" directives are split across multiple lines, the most common
+ * example being a multi-line comment hanging off the right of the
+ * directive. We can handle them correctly only if there is no change
+ * from printing to dropping (or vice versa) caused by that directive.
+ * If the directive is the first of a group we have a choice between
+ * failing with an error, or passing it through unchanged instead of
+ * evaluating it. The latter is not the default to avoid questions from
+ * users about unifdef unexpectedly leaving behind preprocessor directives.
+ */
+typedef void state_fn(void);
+
+/* report an error */
+static void Eelif (void) { error("Inappropriate #elif"); }
+static void Eelse (void) { error("Inappropriate #else"); }
+static void Eendif(void) { error("Inappropriate #endif"); }
+static void Eeof  (void) { error("Premature EOF"); }
+static void Eioccc(void) { error("Obfuscated preprocessor control line"); }
+/* plain line handling */
+static void print (void) { flushline(true); }
+static void drop  (void) { flushline(false); }
+/* output lacks group's start line */
+static void Strue (void) { drop();  ignoreoff(); state(IS_TRUE_PREFIX); }
+static void Sfalse(void) { drop();  ignoreoff(); state(IS_FALSE_PREFIX); }
+static void Selse (void) { drop();               state(IS_TRUE_ELSE); }
+/* print/pass this block */
+static void Pelif (void) { print(); ignoreoff(); state(IS_PASS_MIDDLE); }
+static void Pelse (void) { print();              state(IS_PASS_ELSE); }
+static void Pendif(void) { print(); unnest(); }
+/* discard this block */
+static void Dfalse(void) { drop();  ignoreoff(); state(IS_FALSE_TRAILER); }
+static void Delif (void) { drop();  ignoreoff(); state(IS_FALSE_MIDDLE); }
+static void Delse (void) { drop();               state(IS_FALSE_ELSE); }
+static void Dendif(void) { drop();  unnest(); }
+/* first line of group */
+static void Fdrop (void) { nest();  Dfalse(); }
+static void Fpass (void) { nest();  Pelif(); }
+static void Ftrue (void) { nest();  Strue(); }
+static void Ffalse(void) { nest();  Sfalse(); }
+/* variable pedantry for obfuscated lines */
+static void Oiffy (void) { if (!iocccok) Eioccc(); Fpass(); ignoreon(); }
+static void Oif   (void) { if (!iocccok) Eioccc(); Fpass(); }
+static void Oelif (void) { if (!iocccok) Eioccc(); Pelif(); }
+/* ignore comments in this block */
+static void Idrop (void) { Fdrop();  ignoreon(); }
+static void Itrue (void) { Ftrue();  ignoreon(); }
+static void Ifalse(void) { Ffalse(); ignoreon(); }
+/* edit this line */
+static void Mpass (void) { strncpy(keyword, "if  ", 4); Pelif(); }
+static void Mtrue (void) { keywordedit("else");  state(IS_TRUE_MIDDLE); }
+static void Melif (void) { keywordedit("endif"); state(IS_FALSE_TRAILER); }
+static void Melse (void) { keywordedit("endif"); state(IS_FALSE_ELSE); }
+
+static state_fn * const trans_table[IS_COUNT][LT_COUNT] = {
+/* IS_OUTSIDE */
+{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif,
+  Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Eendif,
+  print, done,  abort },
+/* IS_FALSE_PREFIX */
+{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif,
+  Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc,
+  drop,  Eeof,  abort },
+/* IS_TRUE_PREFIX */
+{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif,
+  Oiffy, Oiffy, Fpass, Oif,   Oif,   Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
+  print, Eeof,  abort },
+/* IS_PASS_MIDDLE */
+{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif,
+  Oiffy, Oiffy, Fpass, Oif,   Oif,   Pelif, Oelif, Oelif, Pelse, Pendif,
+  print, Eeof,  abort },
+/* IS_FALSE_MIDDLE */
+{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif,
+  Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
+  drop,  Eeof,  abort },
+/* IS_TRUE_MIDDLE */
+{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif,
+  Oiffy, Oiffy, Fpass, Oif,   Oif,   Eioccc,Eioccc,Eioccc,Eioccc,Pendif,
+  print, Eeof,  abort },
+/* IS_PASS_ELSE */
+{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif,
+  Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Pendif,
+  print, Eeof,  abort },
+/* IS_FALSE_ELSE */
+{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif,
+  Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc,
+  drop,  Eeof,  abort },
+/* IS_TRUE_ELSE */
+{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif,
+  Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Eioccc,
+  print, Eeof,  abort },
+/* IS_FALSE_TRAILER */
+{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif,
+  Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc,
+  drop,  Eeof,  abort }
+/*TRUEI  FALSEI IF     TRUE   FALSE  ELIF   ELTRUE ELFALSE ELSE  ENDIF
+  TRUEI  FALSEI IF     TRUE   FALSE  ELIF   ELTRUE ELFALSE ELSE  ENDIF (DODGY)
+  PLAIN  EOF    ERROR */
+};
+
+/*
+ * State machine utility functions
+ */
+static void
+ignoreoff(void)
+{
+       if (depth == 0)
+               abort(); /* bug */
+       ignoring[depth] = ignoring[depth-1];
+}
+static void
+ignoreon(void)
+{
+       ignoring[depth] = true;
+}
+static void
+keywordedit(const char *replacement)
+{
+       snprintf(keyword, tline + sizeof(tline) - keyword,
+           "%s%s", replacement, newline);
+       print();
+}
+static void
+nest(void)
+{
+       if (depth > MAXDEPTH-1)
+               abort(); /* bug */
+       if (depth == MAXDEPTH-1)
+               error("Too many levels of nesting");
+       depth += 1;
+       stifline[depth] = linenum;
+}
+static void
+unnest(void)
+{
+       if (depth == 0)
+               abort(); /* bug */
+       depth -= 1;
+}
+static void
+state(Ifstate is)
+{
+       ifstate[depth] = is;
+}
+
+/*
+ * Write a line to the output or not, according to command line options.
+ */
+static void
+flushline(bool keep)
+{
+       if (symlist)
+               return;
+       if (keep ^ complement) {
+               bool blankline = tline[strspn(tline, " \t\r\n")] == '\0';
+               if (blankline && compblank && blankcount != blankmax) {
+                       delcount += 1;
+                       blankcount += 1;
+               } else {
+                       if (lnnum && delcount > 0)
+                               printf("#line %d%s", linenum, newline);
+                       fputs(tline, output);
+                       delcount = 0;
+                       blankmax = blankcount = blankline ? blankcount + 1 : 0;
+               }
+       } else {
+               if (lnblank)
+                       fputs(newline, output);
+               exitstat = 1;
+               delcount += 1;
+               blankcount = 0;
+       }
+       if (debugging)
+               fflush(output);
+}
+
+/*
+ * The driver for the state machine.
+ */
+static void
+process(void)
+{
+       /* When compressing blank lines, act as if the file
+          is preceded by a large number of blank lines. */
+       blankmax = blankcount = 1000;
+       for (;;) {
+               Linetype lineval = parseline();
+               trans_table[ifstate[depth]][lineval]();
+               debug("process line %d %s -> %s depth %d",
+                   linenum, linetype_name[lineval],
+                   ifstate_name[ifstate[depth]], depth);
+       }
+}
+
+/*
+ * Flush the output and handle errors.
+ */
+static void
+closeout(void)
+{
+       if (symdepth && !zerosyms)
+               printf("\n");
+       if (fclose(output) == EOF) {
+               warn("couldn't write to %s", ofilename);
+               if (overwriting) {
+                       unlink(tempname);
+                       errx(2, "%s unchanged", filename);
+               } else {
+                       exit(2);
+               }
+       }
+}
+
+/*
+ * Clean up and exit.
+ */
+static void
+done(void)
+{
+       if (incomment)
+               error("EOF in comment");
+       closeout();
+       if (overwriting && rename(tempname, filename) == -1) {
+               warn("couldn't rename temporary file");
+               unlink(tempname);
+               errx(2, "%s unchanged", filename);
+       }
+       exit(exitstat);
+}
+
+/*
+ * Parse a line and determine its type. We keep the preprocessor line
+ * parser state between calls in the global variable linestate, with
+ * help from skipcomment().
+ */
+static Linetype
+parseline(void)
+{
+       const char *cp;
+       int cursym;
+       int kwlen;
+       Linetype retval;
+       Comment_state wascomment;
+
+       linenum++;
+       if (fgets(tline, MAXLINE, input) == NULL)
+               return (LT_EOF);
+       if (newline == NULL) {
+               if (strrchr(tline, '\n') == strrchr(tline, '\r') + 1)
+                       newline = newline_crlf;
+               else
+                       newline = newline_unix;
+       }
+       retval = LT_PLAIN;
+       wascomment = incomment;
+       cp = skipcomment(tline);
+       if (linestate == LS_START) {
+               if (*cp == '#') {
+                       linestate = LS_HASH;
+                       firstsym = true;
+                       cp = skipcomment(cp + 1);
+               } else if (*cp != '\0')
+                       linestate = LS_DIRTY;
+       }
+       if (!incomment && linestate == LS_HASH) {
+               keyword = tline + (cp - tline);
+               cp = skipsym(cp);
+               kwlen = cp - keyword;
+               /* no way can we deal with a continuation inside a keyword */
+               if (strncmp(cp, "\\\r\n", 3) == 0 ||
+                   strncmp(cp, "\\\n", 2) == 0)
+                       Eioccc();
+               if (strlcmp("ifdef", keyword, kwlen) == 0 ||
+                   strlcmp("ifndef", keyword, kwlen) == 0) {
+                       cp = skipcomment(cp);
+                       if ((cursym = findsym(cp)) < 0)
+                               retval = LT_IF;
+                       else {
+                               retval = (keyword[2] == 'n')
+                                   ? LT_FALSE : LT_TRUE;
+                               if (value[cursym] == NULL)
+                                       retval = (retval == LT_TRUE)
+                                           ? LT_FALSE : LT_TRUE;
+                               if (ignore[cursym])
+                                       retval = (retval == LT_TRUE)
+                                           ? LT_TRUEI : LT_FALSEI;
+                       }
+                       cp = skipsym(cp);
+               } else if (strlcmp("if", keyword, kwlen) == 0)
+                       retval = ifeval(&cp);
+               else if (strlcmp("elif", keyword, kwlen) == 0)
+                       retval = ifeval(&cp) - LT_IF + LT_ELIF;
+               else if (strlcmp("else", keyword, kwlen) == 0)
+                       retval = LT_ELSE;
+               else if (strlcmp("endif", keyword, kwlen) == 0)
+                       retval = LT_ENDIF;
+               else {
+                       linestate = LS_DIRTY;
+                       retval = LT_PLAIN;
+               }
+               cp = skipcomment(cp);
+               if (*cp != '\0') {
+                       linestate = LS_DIRTY;
+                       if (retval == LT_TRUE || retval == LT_FALSE ||
+                           retval == LT_TRUEI || retval == LT_FALSEI)
+                               retval = LT_IF;
+                       if (retval == LT_ELTRUE || retval == LT_ELFALSE)
+                               retval = LT_ELIF;
+               }
+               if (retval != LT_PLAIN && (wascomment || incomment)) {
+                       retval += LT_DODGY;
+                       if (incomment)
+                               linestate = LS_DIRTY;
+               }
+               /* skipcomment normally changes the state, except
+                  if the last line of the file lacks a newline, or
+                  if there is too much whitespace in a directive */
+               if (linestate == LS_HASH) {
+                       size_t len = cp - tline;
+                       if (fgets(tline + len, MAXLINE - len, input) == NULL) {
+                               /* append the missing newline */
+                               strcpy(tline + len, newline);
+                               cp += strlen(newline);
+                               linestate = LS_START;
+                       } else {
+                               linestate = LS_DIRTY;
+                       }
+               }
+       }
+       if (linestate == LS_DIRTY) {
+               while (*cp != '\0')
+                       cp = skipcomment(cp + 1);
+       }
+       debug("parser line %d state %s comment %s line", linenum,
+           comment_name[incomment], linestate_name[linestate]);
+       return (retval);
+}
+
+/*
+ * These are the binary operators that are supported by the expression
+ * evaluator.
+ */
+static Linetype op_strict(int *p, int v, Linetype at, Linetype bt) {
+       if(at == LT_IF || bt == LT_IF) return (LT_IF);
+       return (*p = v, v ? LT_TRUE : LT_FALSE);
+}
+static Linetype op_lt(int *p, Linetype at, int a, Linetype bt, int b) {
+       return op_strict(p, a < b, at, bt);
+}
+static Linetype op_gt(int *p, Linetype at, int a, Linetype bt, int b) {
+       return op_strict(p, a > b, at, bt);
+}
+static Linetype op_le(int *p, Linetype at, int a, Linetype bt, int b) {
+       return op_strict(p, a <= b, at, bt);
+}
+static Linetype op_ge(int *p, Linetype at, int a, Linetype bt, int b) {
+       return op_strict(p, a >= b, at, bt);
+}
+static Linetype op_eq(int *p, Linetype at, int a, Linetype bt, int b) {
+       return op_strict(p, a == b, at, bt);
+}
+static Linetype op_ne(int *p, Linetype at, int a, Linetype bt, int b) {
+       return op_strict(p, a != b, at, bt);
+}
+static Linetype op_or(int *p, Linetype at, int a, Linetype bt, int b) {
+       if (!strictlogic && (at == LT_TRUE || bt == LT_TRUE))
+               return (*p = 1, LT_TRUE);
+       return op_strict(p, a || b, at, bt);
+}
+static Linetype op_and(int *p, Linetype at, int a, Linetype bt, int b) {
+       if (!strictlogic && (at == LT_FALSE || bt == LT_FALSE))
+               return (*p = 0, LT_FALSE);
+       return op_strict(p, a && b, at, bt);
+}
+
+/*
+ * An evaluation function takes three arguments, as follows: (1) a pointer to
+ * an element of the precedence table which lists the operators at the current
+ * level of precedence; (2) a pointer to an integer which will receive the
+ * value of the expression; and (3) a pointer to a char* that points to the
+ * expression to be evaluated and that is updated to the end of the expression
+ * when evaluation is complete. The function returns LT_FALSE if the value of
+ * the expression is zero, LT_TRUE if it is non-zero, LT_IF if the expression
+ * depends on an unknown symbol, or LT_ERROR if there is a parse failure.
+ */
+struct ops;
+
+typedef Linetype eval_fn(const struct ops *, int *, const char **);
+
+static eval_fn eval_table, eval_unary;
+
+/*
+ * The precedence table. Expressions involving binary operators are evaluated
+ * in a table-driven way by eval_table. When it evaluates a subexpression it
+ * calls the inner function with its first argument pointing to the next
+ * element of the table. Innermost expressions have special non-table-driven
+ * handling.
+ */
+static const struct ops {
+       eval_fn *inner;
+       struct op {
+               const char *str;
+               Linetype (*fn)(int *, Linetype, int, Linetype, int);
+       } op[5];
+} eval_ops[] = {
+       { eval_table, { { "||", op_or } } },
+       { eval_table, { { "&&", op_and } } },
+       { eval_table, { { "==", op_eq },
+                       { "!=", op_ne } } },
+       { eval_unary, { { "<=", op_le },
+                       { ">=", op_ge },
+                       { "<", op_lt },
+                       { ">", op_gt } } }
+};
+
+/*
+ * Function for evaluating the innermost parts of expressions,
+ * viz. !expr (expr) number defined(symbol) symbol
+ * We reset the constexpr flag in the last two cases.
+ */
+static Linetype
+eval_unary(const struct ops *ops, int *valp, const char **cpp)
+{
+       const char *cp;
+       char *ep;
+       int sym;
+       bool defparen;
+       Linetype lt;
+
+       cp = skipcomment(*cpp);
+       if (*cp == '!') {
+               debug("eval%d !", ops - eval_ops);
+               cp++;
+               lt = eval_unary(ops, valp, &cp);
+               if (lt == LT_ERROR)
+                       return (LT_ERROR);
+               if (lt != LT_IF) {
+                       *valp = !*valp;
+                       lt = *valp ? LT_TRUE : LT_FALSE;
+               }
+       } else if (*cp == '(') {
+               cp++;
+               debug("eval%d (", ops - eval_ops);
+               lt = eval_table(eval_ops, valp, &cp);
+               if (lt == LT_ERROR)
+                       return (LT_ERROR);
+               cp = skipcomment(cp);
+               if (*cp++ != ')')
+                       return (LT_ERROR);
+       } else if (isdigit((unsigned char)*cp)) {
+               debug("eval%d number", ops - eval_ops);
+               *valp = strtol(cp, &ep, 0);
+               if (ep == cp)
+                       return (LT_ERROR);
+               lt = *valp ? LT_TRUE : LT_FALSE;
+               cp = skipsym(cp);
+       } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) {
+               cp = skipcomment(cp+7);
+               debug("eval%d defined", ops - eval_ops);
+               if (*cp == '(') {
+                       cp = skipcomment(cp+1);
+                       defparen = true;
+               } else {
+                       defparen = false;
+               }
+               sym = findsym(cp);
+               if (sym < 0) {
+                       lt = LT_IF;
+               } else {
+                       *valp = (value[sym] != NULL);
+                       lt = *valp ? LT_TRUE : LT_FALSE;
+               }
+               cp = skipsym(cp);
+               cp = skipcomment(cp);
+               if (defparen && *cp++ != ')')
+                       return (LT_ERROR);
+               constexpr = false;
+       } else if (!endsym(*cp)) {
+               debug("eval%d symbol", ops - eval_ops);
+               sym = findsym(cp);
+               cp = skipsym(cp);
+               if (sym < 0) {
+                       lt = LT_IF;
+                       cp = skipargs(cp);
+               } else if (value[sym] == NULL) {
+                       *valp = 0;
+                       lt = LT_FALSE;
+               } else {
+                       *valp = strtol(value[sym], &ep, 0);
+                       if (*ep != '\0' || ep == value[sym])
+                               return (LT_ERROR);
+                       lt = *valp ? LT_TRUE : LT_FALSE;
+                       cp = skipargs(cp);
+               }
+               constexpr = false;
+       } else {
+               debug("eval%d bad expr", ops - eval_ops);
+               return (LT_ERROR);
+       }
+
+       *cpp = cp;
+       debug("eval%d = %d", ops - eval_ops, *valp);
+       return (lt);
+}
+
+/*
+ * Table-driven evaluation of binary operators.
+ */
+static Linetype
+eval_table(const struct ops *ops, int *valp, const char **cpp)
+{
+       const struct op *op;
+       const char *cp;
+       int val;
+       Linetype lt, rt;
+
+       debug("eval%d", ops - eval_ops);
+       cp = *cpp;
+       lt = ops->inner(ops+1, valp, &cp);
+       if (lt == LT_ERROR)
+               return (LT_ERROR);
+       for (;;) {
+               cp = skipcomment(cp);
+               for (op = ops->op; op->str != NULL; op++)
+                       if (strncmp(cp, op->str, strlen(op->str)) == 0)
+                               break;
+               if (op->str == NULL)
+                       break;
+               cp += strlen(op->str);
+               debug("eval%d %s", ops - eval_ops, op->str);
+               rt = ops->inner(ops+1, &val, &cp);
+               if (rt == LT_ERROR)
+                       return (LT_ERROR);
+               lt = op->fn(valp, lt, *valp, rt, val);
+       }
+
+       *cpp = cp;
+       debug("eval%d = %d", ops - eval_ops, *valp);
+       debug("eval%d lt = %s", ops - eval_ops, linetype_name[lt]);
+       return (lt);
+}
+
+/*
+ * 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.
+ */
+static Linetype
+ifeval(const char **cpp)
+{
+       int ret;
+       int val = 0;
+
+       debug("eval %s", *cpp);
+       constexpr = killconsts ? false : true;
+       ret = eval_table(eval_ops, &val, cpp);
+       debug("eval = %d", val);
+       return (constexpr ? LT_IF : ret == LT_ERROR ? LT_IF : ret);
+}
+
+/*
+ * Skip over comments, strings, and character literals and stop at the
+ * next character position that is 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]) {
+               for (; isspace((unsigned char)*cp); cp++)
+                       if (*cp == '\n')
+                               linestate = LS_START;
+               return (cp);
+       }
+       while (*cp != '\0')
+               /* don't reset to LS_START after a line continuation */
+               if (strncmp(cp, "\\\r\n", 3) == 0)
+                       cp += 3;
+               else if (strncmp(cp, "\\\n", 2) == 0)
+                       cp += 2;
+               else switch (incomment) {
+               case NO_COMMENT:
+                       if (strncmp(cp, "/\\\r\n", 4) == 0) {
+                               incomment = STARTING_COMMENT;
+                               cp += 4;
+                       } else if (strncmp(cp, "/\\\n", 3) == 0) {
+                               incomment = STARTING_COMMENT;
+                               cp += 3;
+                       } else if (strncmp(cp, "/*", 2) == 0) {
+                               incomment = C_COMMENT;
+                               cp += 2;
+                       } else if (strncmp(cp, "//", 2) == 0) {
+                               incomment = CXX_COMMENT;
+                               cp += 2;
+                       } else if (strncmp(cp, "\'", 1) == 0) {
+                               incomment = CHAR_LITERAL;
+                               linestate = LS_DIRTY;
+                               cp += 1;
+                       } else if (strncmp(cp, "\"", 1) == 0) {
+                               incomment = STRING_LITERAL;
+                               linestate = LS_DIRTY;
+                               cp += 1;
+                       } else if (strncmp(cp, "\n", 1) == 0) {
+                               linestate = LS_START;
+                               cp += 1;
+                       } else if (strchr(" \r\t", *cp) != NULL) {
+                               cp += 1;
+                       } else
+                               return (cp);
+                       continue;
+               case CXX_COMMENT:
+                       if (strncmp(cp, "\n", 1) == 0) {
+                               incomment = NO_COMMENT;
+                               linestate = LS_START;
+                       }
+                       cp += 1;
+                       continue;
+               case CHAR_LITERAL:
+               case STRING_LITERAL:
+                       if ((incomment == CHAR_LITERAL && cp[0] == '\'') ||
+                           (incomment == STRING_LITERAL && cp[0] == '\"')) {
+                               incomment = NO_COMMENT;
+                               cp += 1;
+                       } else if (cp[0] == '\\') {
+                               if (cp[1] == '\0')
+                                       cp += 1;
+                               else
+                                       cp += 2;
+                       } else if (strncmp(cp, "\n", 1) == 0) {
+                               if (incomment == CHAR_LITERAL)
+                                       error("unterminated char literal");
+                               else
+                                       error("unterminated string literal");
+                       } else
+                               cp += 1;
+                       continue;
+               case C_COMMENT:
+                       if (strncmp(cp, "*\\\r\n", 4) == 0) {
+                               incomment = FINISHING_COMMENT;
+                               cp += 4;
+                       } else if (strncmp(cp, "*\\\n", 3) == 0) {
+                               incomment = FINISHING_COMMENT;
+                               cp += 3;
+                       } else if (strncmp(cp, "*/", 2) == 0) {
+                               incomment = NO_COMMENT;
+                               cp += 2;
+                       } else
+                               cp += 1;
+                       continue;
+               case STARTING_COMMENT:
+                       if (*cp == '*') {
+                               incomment = C_COMMENT;
+                               cp += 1;
+                       } else if (*cp == '/') {
+                               incomment = CXX_COMMENT;
+                               cp += 1;
+                       } else {
+                               incomment = NO_COMMENT;
+                               linestate = LS_DIRTY;
+                       }
+                       continue;
+               case FINISHING_COMMENT:
+                       if (*cp == '/') {
+                               incomment = NO_COMMENT;
+                               cp += 1;
+                       } else
+                               incomment = C_COMMENT;
+                       continue;
+               default:
+                       abort(); /* bug */
+               }
+       return (cp);
+}
+
+/*
+ * Skip macro arguments.
+ */
+static const char *
+skipargs(const char *cp)
+{
+       const char *ocp = cp;
+       int level = 0;
+       cp = skipcomment(cp);
+       if (*cp != '(')
+               return (cp);
+       do {
+               if (*cp == '(')
+                       level++;
+               if (*cp == ')')
+                       level--;
+               cp = skipcomment(cp+1);
+       } while (level != 0 && *cp != '\0');
+       if (level == 0)
+               return (cp);
+       else
+       /* Rewind and re-detect the syntax error later. */
+               return (ocp);
+}
+
+/*
+ * Skip over an identifier.
+ */
+static const char *
+skipsym(const char *cp)
+{
+       while (!endsym(*cp))
+               ++cp;
+       return (cp);
+}
+
+/*
+ * Look for the symbol in the symbol table. If it is found, we return
+ * the symbol table index, else we return -1.
+ */
+static int
+findsym(const char *str)
+{
+       const char *cp;
+       int symind;
+
+       cp = skipsym(str);
+       if (cp == str)
+               return (-1);
+       if (symlist) {
+               if (symdepth && firstsym)
+                       printf("%s%3d", zerosyms ? "" : "\n", depth);
+               firstsym = zerosyms = false;
+               printf("%s%.*s%s",
+                   symdepth ? " " : "",
+                   (int)(cp-str), str,
+                   symdepth ? "" : "\n");
+               /* we don't care about the value of the symbol */
+               return (0);
+       }
+       for (symind = 0; symind < nsyms; ++symind) {
+               if (strlcmp(symname[symind], str, cp-str) == 0) {
+                       debug("findsym %s %s", symname[symind],
+                           value[symind] ? value[symind] : "");
+                       return (symind);
+               }
+       }
+       return (-1);
+}
+
+/*
+ * Add a symbol to the symbol table.
+ */
+static void
+addsym(bool ignorethis, bool definethis, char *sym)
+{
+       int symind;
+       char *val;
+
+       symind = findsym(sym);
+       if (symind < 0) {
+               if (nsyms >= MAXSYMS)
+                       errx(2, "too many symbols");
+               symind = nsyms++;
+       }
+       symname[symind] = sym;
+       ignore[symind] = ignorethis;
+       val = sym + (skipsym(sym) - sym);
+       if (definethis) {
+               if (*val == '=') {
+                       value[symind] = val+1;
+                       *val = '\0';
+               } else if (*val == '\0')
+                       value[symind] = "1";
+               else
+                       usage();
+       } else {
+               if (*val != '\0')
+                       usage();
+               value[symind] = NULL;
+       }
+       debug("addsym %s=%s", symname[symind],
+           value[symind] ? value[symind] : "undef");
+}
+
+/*
+ * Compare s with n characters of t.
+ * The same as strncmp() except that it checks that s[n] == '\0'.
+ */
+static int
+strlcmp(const char *s, const char *t, size_t n)
+{
+       while (n-- && *t != '\0')
+               if (*s != *t)
+                       return ((unsigned char)*s - (unsigned char)*t);
+               else
+                       ++s, ++t;
+       return ((unsigned char)*s);
+}
+
+/*
+ * Diagnostics.
+ */
+static void
+debug(const char *msg, ...)
+{
+       va_list ap;
+
+       if (debugging) {
+               va_start(ap, msg);
+               vwarnx(msg, ap);
+               va_end(ap);
+       }
+}
+
+static void
+error(const char *msg)
+{
+       if (depth == 0)
+               warnx("%s: %d: %s", filename, linenum, msg);
+       else
+               warnx("%s: %d: %s (#if line %d depth %d)",
+                   filename, linenum, msg, stifline[depth], depth);
+       closeout();
+       errx(2, "output may be truncated");
+}
diff --git a/unifdef.txt b/unifdef.txt
new file mode 100644 (file)
index 0000000..f6b5973
--- /dev/null
@@ -0,0 +1,180 @@
+UNIFDEF(1)                    Programmer's Manual                   UNIFDEF(1)
+
+NAME
+     unifdef, unifdefall -- remove preprocessor conditionals from code
+
+SYNOPSIS
+     unifdef [-bBcdeKknsStV] [-Ipath] [-Dsym[=val]] [-Usym] [-iDsym[=val]]
+             [-iUsym] ... [-o outfile] [infile]
+     unifdefall [-Ipath] ... file
+
+DESCRIPTION
+     The unifdef utility selectively processes conditional cpp(1) directives.
+     It removes from a file both the directives and any additional text that
+     they specify should be removed, while otherwise leaving the file alone.
+
+     The unifdef utility acts on #if, #ifdef, #ifndef, #elif, #else, and
+     #endif lines.  A directive is only processed if the symbols specified on
+     the command line are sufficient to allow unifdef to get a definite value
+     for its control expression.  If the result is false, the directive and
+     the following lines under its control are removed.  If the result is
+     true, only the directive is removed.  An #ifdef or #ifndef directive is
+     passed through unchanged if its controlling symbol is not specified on
+     the command line.  Any #if or #elif control expression that has an
+     unknown value or that unifdef cannot parse is passed through unchanged.
+     By default, unifdef ignores #if and #elif lines with constant expres-
+     sions; it can be told to process them by specifying the -k flag on the
+     command line.
+
+     It understands a commonly-used subset of the expression syntax for #if
+     and #elif lines: integer constants, integer values of symbols defined on
+     the command line, the defined() operator, the operators !, <, >, <=, >=,
+     ==, !=, &&, ||, and parenthesized expressions.  A kind of ``short
+     circuit'' evaluation is used for the && operator: if either operand is
+     definitely false then the result is false, even if the value of the other
+     operand is unknown.  Similarly, if either operand of || is definitely
+     true then the result is true.
+
+     In most cases, the unifdef utility does not distinguish between object-
+     like macros (without arguments) and function-like arguments (with argu-
+     ments).  If a macro is not explicitly defined, or is defined with the -D
+     flag on the command-line, its arguments are ignored.  If a macro is
+     explicitly undefined on the command line with the -U flag, it may not
+     have any arguments since this leads to a syntax error.
+
+     The unifdef utility understands just enough about C to know when one of
+     the directives is inactive because it is inside a comment, or affected by
+     a backslash-continued line.  It spots unusually-formatted preprocessor
+     directives and knows when the layout is too odd for it to handle.
+
+     A script called unifdefall can be used to remove all conditional cpp(1)
+     directives from a file.  It uses unifdef -s and cpp -dM to get lists of
+     all the controlling symbols and their definitions (or lack thereof), then
+     invokes unifdef with appropriate arguments to process the file.
+
+OPTIONS
+     -Dsym=val
+             Specify that a symbol is defined to a given value which is used
+             when evaluating #if and #elif control expressions.
+
+     -Dsym   Specify that a symbol is defined to the value 1.
+
+     -Usym   Specify that a symbol is undefined.  If the same symbol appears
+             in more than one argument, the last occurrence dominates.
+
+     -b      Replace removed lines with blank lines instead of deleting them.
+             Mutually exclusive with the -B option.
+
+     -B      Compress blank lines around a deleted section.  Mutually exclu-
+             sive with the -b option.
+
+     -c      If the -c flag is specified, then the operation of unifdef is
+             complemented, i.e., the lines that would have been removed or
+             blanked are retained and vice versa.
+
+     -d      Turn on printing of degugging messages.
+
+     -e      Because unifdef processes its input one line at a time, it cannot
+             remove preprocessor directives that span more than one line.  The
+             most common example of this is a directive with a multi-line com-
+             ment hanging off its right hand end.  By default, if unifdef has
+             to process such a directive, it will complain that the line is
+             too obfuscated.  The -e option changes the behaviour so that,
+             where possible, such lines are left unprocessed instead of
+             reporting an error.
+
+     -K      Always treat the result of && and || operators as unknown if
+             either operand is unknown, instead of short-circuiting when
+             unknown operands can't affect the result.  This option is for
+             compatibility with older versions of unifdef.
+
+     -k      Process #if and #elif lines with constant expressions.  By
+             default, sections controlled by such lines are passed through
+             unchanged because they typically start ``#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.
+
+     -n      Add #line directives to the output following any deleted lines,
+             so that errors produced when compiling the output file correspond
+             to line numbers in the input file.
+
+     -o outfile
+             Write output to the file outfile instead of the standard output.
+             If outfile is the same as the input file, the output is written
+             to a temporary file which is renamed into place when unifdef com-
+             pletes successfully.
+
+     -s      Instead of processing the input file as usual, this option causes
+             unifdef to produce a list of symbols that appear in expressions
+             that unifdef understands.  It is useful in conjunction with the
+             -dM option of cpp(1) for creating unifdef command lines.
+
+     -S      Like the -s option, but the nesting depth of each symbol is also
+             printed.  This is useful for working out the number of possible
+             combinations of interdependent defined/undefined symbols.
+
+     -t      Disables parsing for C comments and line continuations, which is
+             useful for plain text.
+
+     -iDsym[=val]
+     -iUsym  Ignore #ifdefs.  If your C code uses #ifdefs to delimit non-C
+             lines, such as comments or code which is under construction, then
+             you must tell unifdef which symbols are used for that purpose so
+             that it will not try to parse comments and line continuations
+             inside those #ifdefs.  You can specify ignored symbols with
+             -iDsym[=val] and -iUsym similar to -Dsym[=val] and -Usym above.
+
+     -Ipath  Specifies to unifdefall an additional place to look for #include
+             files.  This option is ignored by unifdef for compatibility with
+             cpp(1) and to simplify the implementation of unifdefall.
+
+     -V      Print version details.
+
+     The unifdef utility copies its output to stdout and will take its input
+     from stdin if no file argument is given.
+
+     The unifdef utility works nicely with the -Dsym option of diff(1).
+
+EXIT STATUS
+     The unifdef utility exits 0 if the output is an exact copy of the input,
+     1 if not, and 2 if in trouble.
+
+DIAGNOSTICS
+     Too many levels of nesting.
+
+     Inappropriate #elif, #else or #endif.
+
+     Obfuscated preprocessor control line.
+
+     Premature EOF (with the line number of the most recent unterminated #if).
+
+     EOF in comment.
+
+SEE ALSO
+     cpp(1), diff(1)
+
+HISTORY
+     The unifdef command appeared in 2.9BSD.  ANSI C support was added in
+     FreeBSD 4.7.
+
+AUTHORS
+     The original implementation was written by Dave Yost <Dave@Yost.com>.
+     Tony Finch <dot@dotat.at> rewrote it to support ANSI C.
+
+BUGS
+     Expression evaluation is very limited.
+
+     Preprocessor control lines split across more than one physical line
+     (because of comments or backslash-newline) cannot be handled in every
+     situation.
+
+     Trigraphs are not recognized.
+
+     There is no support for symbols with different definitions at different
+     points in the source file.
+
+     The text-mode and ignore functionality does not correspond to modern
+     cpp(1) behaviour.
+
+                                March 11, 2010
diff --git a/unifdefall.sh b/unifdefall.sh
new file mode 100755 (executable)
index 0000000..79e4dec
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/sh
+#
+# unifdefall: remove all the #if's from a source file
+#
+# Copyright (c) 2002 - 2010 Tony Finch <dot@dotat.at>
+# Copyright (c) 2009 - 2010 Jonathan Nieder <jrnieder@gmail.com>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+set -e
+
+unifdef="$(dirname "$0")/unifdef"
+if [ ! -e "$unifdef" ]
+then
+       unifdef=unifdef
+fi
+
+case "$@" in
+"-d "*)        echo DEBUGGING 1>&2
+       debug=-d
+       shift
+esac
+
+basename=$(basename "$0")
+tmp=$(mktemp -d "${TMPDIR:-/tmp}/$basename.XXXXXXXXXX") || exit 2
+trap 'rm -r "$tmp" || exit 2' EXIT
+
+export LC_ALL=C
+
+# list of all controlling macros
+"$unifdef" $debug -s "$@" | sort | uniq >"$tmp/ctrl"
+# list of all macro definitions
+cpp -dM "$@" | sort | sed 's/^#define //' >"$tmp/hashdefs"
+# list of defined macro names
+sed 's/[^A-Za-z0-9_].*$//' <"$tmp/hashdefs" >"$tmp/alldef"
+# list of undefined and defined controlling macros
+comm -23 "$tmp/ctrl" "$tmp/alldef" >"$tmp/undef"
+comm -12 "$tmp/ctrl" "$tmp/alldef" >"$tmp/def"
+# create a sed script that extracts the controlling macro definitions
+# and converts them to unifdef command-line arguments
+sed 's|.*|s/^&\\(([^)]*)\\)\\{0,1\\} /-D&=/p|' <"$tmp/def" >"$tmp/script"
+# create the final unifdef command
+{      echo "$unifdef" $debug -k '\'
+       # convert the controlling undefined macros to -U arguments
+       sed 's/.*/-U& \\/' <"$tmp/undef"
+       # convert the controlling defined macros to quoted -D arguments
+       sed -nf "$tmp/script" <"$tmp/hashdefs" |
+               sed "s/'/'\\\\''/g;s/.*/'&' \\\\/"
+       echo '"$@"'
+} >"$tmp/cmd"
+case $debug in
+-d)    for i in ctrl hashdefs alldef undef def script cmd
+       do      echo ==== $i
+               cat "$tmp/$i"
+       done 1>&2
+esac
+# run the command we just created
+sh "$tmp/cmd" "$@"
diff --git a/version.sh b/version.sh
new file mode 100644 (file)
index 0000000..27ed991
--- /dev/null
@@ -0,0 +1,2 @@
+V="unifdef-2.3"
+D="2010-03-12 16:27:30 +0000"