aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2023-08-21 17:33:26 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2023-08-21 17:33:26 +0000
commit9b3517a49d4e15b97a68bf9e9d68ddda104bf79d (patch)
tree4673aad9f1a0a0ac19089f22aaa91d7c0b62a50e /tests
Diffstat (limited to 'tests')
-rw-r--r--tests/NetBSD-42628.c25
-rw-r--r--tests/NetBSD-42628.experr0
-rw-r--r--tests/NetBSD-42628.expout6
-rw-r--r--tests/NetBSD-42628.exprc1
-rw-r--r--tests/NetBSD-42628.sh1
-rw-r--r--tests/NetBSD-47068.c2
-rw-r--r--tests/NetBSD-47068.experr0
-rw-r--r--tests/NetBSD-47068.expout2
-rw-r--r--tests/NetBSD-47068.exprc1
-rw-r--r--tests/NetBSD-47068.sh1
-rw-r--r--tests/args1.c3
-rw-r--r--tests/args1.experr0
-rw-r--r--tests/args1.expout1
-rw-r--r--tests/args1.exprc1
-rw-r--r--tests/args1.sh1
-rw-r--r--tests/args2.c3
-rw-r--r--tests/args2.experr0
-rw-r--r--tests/args2.expout3
-rw-r--r--tests/args2.exprc1
-rw-r--r--tests/args2.sh1
-rw-r--r--tests/blank0d.c25
-rw-r--r--tests/blank0d.experr0
-rw-r--r--tests/blank0d.expout23
-rw-r--r--tests/blank0d.exprc1
-rw-r--r--tests/blank0d.sh1
-rw-r--r--tests/blank0u.c25
-rw-r--r--tests/blank0u.experr0
-rw-r--r--tests/blank0u.expout22
-rw-r--r--tests/blank0u.exprc1
-rw-r--r--tests/blank0u.sh1
-rw-r--r--tests/blank1d.c25
-rw-r--r--tests/blank1d.experr0
-rw-r--r--tests/blank1d.expout23
-rw-r--r--tests/blank1d.exprc1
-rw-r--r--tests/blank1d.sh1
-rw-r--r--tests/blank1u.c25
-rw-r--r--tests/blank1u.experr0
-rw-r--r--tests/blank1u.expout21
-rw-r--r--tests/blank1u.exprc1
-rw-r--r--tests/blank1u.sh1
-rw-r--r--tests/blank2d.c25
-rw-r--r--tests/blank2d.experr0
-rw-r--r--tests/blank2d.expout23
-rw-r--r--tests/blank2d.exprc1
-rw-r--r--tests/blank2d.sh1
-rw-r--r--tests/blank2u.c25
-rw-r--r--tests/blank2u.experr0
-rw-r--r--tests/blank2u.expout20
-rw-r--r--tests/blank2u.exprc1
-rw-r--r--tests/blank2u.sh1
-rw-r--r--tests/blank3d.c25
-rw-r--r--tests/blank3d.experr0
-rw-r--r--tests/blank3d.expout23
-rw-r--r--tests/blank3d.exprc1
-rw-r--r--tests/blank3d.sh1
-rw-r--r--tests/blank3u.c25
-rw-r--r--tests/blank3u.experr0
-rw-r--r--tests/blank3u.expout19
-rw-r--r--tests/blank3u.exprc1
-rw-r--r--tests/blank3u.sh1
-rw-r--r--tests/blank4d.c25
-rw-r--r--tests/blank4d.experr0
-rw-r--r--tests/blank4d.expout23
-rw-r--r--tests/blank4d.exprc1
-rw-r--r--tests/blank4d.sh1
-rw-r--r--tests/blank4u.c25
-rw-r--r--tests/blank4u.experr0
-rw-r--r--tests/blank4u.expout18
-rw-r--r--tests/blank4u.exprc1
-rw-r--r--tests/blank4u.sh1
-rw-r--r--tests/broken2.h1
-rw-r--r--tests/broken3.h1
-rw-r--r--tests/broken4.h2
-rw-r--r--tests/crlf-a.experr0
-rw-r--r--tests/crlf-a.expout10
-rw-r--r--tests/crlf-a.exprc1
-rw-r--r--tests/crlf-a.sh1
-rw-r--r--tests/crlf-b.experr0
-rw-r--r--tests/crlf-b.expout14
-rw-r--r--tests/crlf-b.exprc1
-rw-r--r--tests/crlf-b.sh1
-rw-r--r--tests/crlf-c.experr0
-rw-r--r--tests/crlf-c.expout16
-rw-r--r--tests/crlf-c.exprc1
-rw-r--r--tests/crlf-c.sh1
-rw-r--r--tests/crlf-d.experr0
-rw-r--r--tests/crlf-d.expout18
-rw-r--r--tests/crlf-d.exprc1
-rw-r--r--tests/crlf-d.sh1
-rw-r--r--tests/crlf.c20
-rw-r--r--tests/debian-603860.c8
-rw-r--r--tests/debian-603860.experr0
-rw-r--r--tests/debian-603860.expout2
-rw-r--r--tests/debian-603860.exprc1
-rw-r--r--tests/debian-603860.sh1
-rw-r--r--tests/defundef-broken2.experr2
-rw-r--r--tests/defundef-broken2.expout0
-rw-r--r--tests/defundef-broken2.exprc1
-rw-r--r--tests/defundef-broken2.sh1
-rw-r--r--tests/defundef-broken3.experr2
-rw-r--r--tests/defundef-broken3.expout0
-rw-r--r--tests/defundef-broken3.exprc1
-rw-r--r--tests/defundef-broken3.sh1
-rw-r--r--tests/defundef-broken4.experr2
-rw-r--r--tests/defundef-broken4.expout0
-rw-r--r--tests/defundef-broken4.exprc1
-rw-r--r--tests/defundef-broken4.sh1
-rw-r--r--tests/defundef-funlike.experr0
-rw-r--r--tests/defundef-funlike.expout13
-rw-r--r--tests/defundef-funlike.exprc1
-rw-r--r--tests/defundef-funlike.sh1
-rw-r--r--tests/defundef-undefdef.experr0
-rw-r--r--tests/defundef-undefdef.expout1
-rw-r--r--tests/defundef-undefdef.exprc1
-rw-r--r--tests/defundef-undefdef.sh1
-rw-r--r--tests/div.c3
-rw-r--r--tests/div.experr0
-rw-r--r--tests/div.expout10
-rw-r--r--tests/div.exprc1
-rw-r--r--tests/div.sh10
-rw-r--r--tests/empty.c0
-rw-r--r--tests/empty.experr0
-rw-r--r--tests/empty.expout0
-rw-r--r--tests/empty.exprc1
-rw-r--r--tests/empty.sh1
-rw-r--r--tests/error.c4
-rw-r--r--tests/error.experr0
-rw-r--r--tests/error.expout2
-rw-r--r--tests/error.exprc1
-rw-r--r--tests/error.sh1
-rw-r--r--tests/exitmode0a.experr0
-rw-r--r--tests/exitmode0a.expout16
-rw-r--r--tests/exitmode0a.exprc1
-rw-r--r--tests/exitmode0a.sh1
-rw-r--r--tests/exitmode0b.experr0
-rw-r--r--tests/exitmode0b.expout26
-rw-r--r--tests/exitmode0b.exprc1
-rw-r--r--tests/exitmode0b.sh1
-rw-r--r--tests/exitmode1a.experr0
-rw-r--r--tests/exitmode1a.expout16
-rw-r--r--tests/exitmode1a.exprc1
-rw-r--r--tests/exitmode1a.sh1
-rw-r--r--tests/exitmode1b.experr0
-rw-r--r--tests/exitmode1b.expout26
-rw-r--r--tests/exitmode1b.exprc1
-rw-r--r--tests/exitmode1b.sh1
-rw-r--r--tests/exitmode2a.experr0
-rw-r--r--tests/exitmode2a.expout16
-rw-r--r--tests/exitmode2a.exprc1
-rw-r--r--tests/exitmode2a.sh1
-rw-r--r--tests/exitmode2b.experr0
-rw-r--r--tests/exitmode2b.expout26
-rw-r--r--tests/exitmode2b.exprc1
-rw-r--r--tests/exitmode2b.sh1
-rw-r--r--tests/exitstat.c3
-rw-r--r--tests/exitstat.experr0
-rw-r--r--tests/exitstat.expout3
-rw-r--r--tests/exitstat.exprc1
-rw-r--r--tests/exitstat.sh1
-rw-r--r--tests/funlike.h1
-rw-r--r--tests/if1-a.experr0
-rw-r--r--tests/if1-a.expout16
-rw-r--r--tests/if1-a.exprc1
-rw-r--r--tests/if1-a.sh1
-rw-r--r--tests/if1-f.experr0
-rw-r--r--tests/if1-f.expout16
-rw-r--r--tests/if1-f.exprc1
-rw-r--r--tests/if1-f.sh1
-rw-r--r--tests/if1-k.c38
-rw-r--r--tests/if1-k.experr0
-rw-r--r--tests/if1-k.expout30
-rw-r--r--tests/if1-k.exprc1
-rw-r--r--tests/if1-k.sh1
-rw-r--r--tests/if1-kDU.c38
-rw-r--r--tests/if1-kDU.experr0
-rw-r--r--tests/if1-kDU.expout20
-rw-r--r--tests/if1-kDU.exprc1
-rw-r--r--tests/if1-kDU.sh1
-rw-r--r--tests/if1.c26
-rw-r--r--tests/if1.experr0
-rw-r--r--tests/if1.expout16
-rw-r--r--tests/if1.exprc1
-rw-r--r--tests/if1.h3
-rw-r--r--tests/if1.sh1
-rw-r--r--tests/if1a.experr0
-rw-r--r--tests/if1a.expout24
-rw-r--r--tests/if1a.exprc1
-rw-r--r--tests/if1a.sh1
-rw-r--r--tests/if2-a.experr0
-rw-r--r--tests/if2-a.expout13
-rw-r--r--tests/if2-a.exprc1
-rw-r--r--tests/if2-a.sh1
-rw-r--r--tests/if2-k.c29
-rw-r--r--tests/if2-k.experr0
-rw-r--r--tests/if2-k.expout21
-rw-r--r--tests/if2-k.exprc1
-rw-r--r--tests/if2-k.sh1
-rw-r--r--tests/if2-kDU.c29
-rw-r--r--tests/if2-kDU.experr0
-rw-r--r--tests/if2-kDU.expout17
-rw-r--r--tests/if2-kDU.exprc1
-rw-r--r--tests/if2-kDU.sh1
-rw-r--r--tests/if2.c17
-rw-r--r--tests/if2.experr0
-rw-r--r--tests/if2.expout13
-rw-r--r--tests/if2.exprc1
-rw-r--r--tests/if2.sh1
-rw-r--r--tests/if3-a.experr0
-rw-r--r--tests/if3-a.expout13
-rw-r--r--tests/if3-a.exprc1
-rw-r--r--tests/if3-a.sh1
-rw-r--r--tests/if3-k.c29
-rw-r--r--tests/if3-k.experr0
-rw-r--r--tests/if3-k.expout21
-rw-r--r--tests/if3-k.exprc1
-rw-r--r--tests/if3-k.sh1
-rw-r--r--tests/if3-kDU.c29
-rw-r--r--tests/if3-kDU.experr0
-rw-r--r--tests/if3-kDU.expout17
-rw-r--r--tests/if3-kDU.exprc1
-rw-r--r--tests/if3-kDU.sh1
-rw-r--r--tests/if3.c17
-rw-r--r--tests/if3.experr0
-rw-r--r--tests/if3.expout13
-rw-r--r--tests/if3.exprc1
-rw-r--r--tests/if3.sh1
-rw-r--r--tests/if4-a.experr0
-rw-r--r--tests/if4-a.expout22
-rw-r--r--tests/if4-a.exprc1
-rw-r--r--tests/if4-a.sh1
-rw-r--r--tests/if4-k.c50
-rw-r--r--tests/if4-k.experr0
-rw-r--r--tests/if4-k.expout42
-rw-r--r--tests/if4-k.exprc1
-rw-r--r--tests/if4-k.sh1
-rw-r--r--tests/if4-kDU.c50
-rw-r--r--tests/if4-kDU.experr0
-rw-r--r--tests/if4-kDU.expout26
-rw-r--r--tests/if4-kDU.exprc1
-rw-r--r--tests/if4-kDU.sh1
-rw-r--r--tests/if4.c38
-rw-r--r--tests/if4.experr0
-rw-r--r--tests/if4.expout22
-rw-r--r--tests/if4.exprc1
-rw-r--r--tests/if4.sh1
-rw-r--r--tests/if5-a.experr0
-rw-r--r--tests/if5-a.expout40
-rw-r--r--tests/if5-a.exprc1
-rw-r--r--tests/if5-a.sh1
-rw-r--r--tests/if5-k.c64
-rw-r--r--tests/if5-k.experr0
-rw-r--r--tests/if5-k.expout56
-rw-r--r--tests/if5-k.exprc1
-rw-r--r--tests/if5-k.sh1
-rw-r--r--tests/if5-kDU.c64
-rw-r--r--tests/if5-kDU.experr0
-rw-r--r--tests/if5-kDU.expout32
-rw-r--r--tests/if5-kDU.exprc1
-rw-r--r--tests/if5-kDU.sh1
-rw-r--r--tests/if5.c80
-rw-r--r--tests/if5.experr0
-rw-r--r--tests/if5.expout40
-rw-r--r--tests/if5.exprc1
-rw-r--r--tests/if5.sh1
-rw-r--r--tests/if6.c11
-rw-r--r--tests/if6.h2
-rw-r--r--tests/if6a.experr0
-rw-r--r--tests/if6a.expout1
-rw-r--r--tests/if6a.exprc1
-rw-r--r--tests/if6a.sh1
-rw-r--r--tests/if6b.experr0
-rw-r--r--tests/if6b.expout5
-rw-r--r--tests/if6b.exprc1
-rw-r--r--tests/if6b.sh1
-rw-r--r--tests/if6c.experr0
-rw-r--r--tests/if6c.expout7
-rw-r--r--tests/if6c.exprc1
-rw-r--r--tests/if6c.sh1
-rw-r--r--tests/if6d.experr0
-rw-r--r--tests/if6d.expout9
-rw-r--r--tests/if6d.exprc1
-rw-r--r--tests/if6d.sh1
-rw-r--r--tests/if7.c94
-rw-r--r--tests/if7.experr0
-rw-r--r--tests/if7.expout46
-rw-r--r--tests/if7.exprc1
-rw-r--r--tests/if7.sh1
-rw-r--r--tests/indirect.experr0
-rw-r--r--tests/indirect.expout16
-rw-r--r--tests/indirect.exprc1
-rw-r--r--tests/indirect.sh1
-rw-r--r--tests/multi-generic-sh15
-rw-r--r--tests/multi.experr0
-rw-r--r--tests/multi.expout36
-rw-r--r--tests/multi.exprc1
-rw-r--r--tests/multi.sh3
-rw-r--r--tests/multilnnum.experr0
-rw-r--r--tests/multilnnum.expout42
-rw-r--r--tests/multilnnum.exprc1
-rw-r--r--tests/multilnnum.sh3
-rw-r--r--tests/multimissing.experr4
-rw-r--r--tests/multimissing.expout22
-rw-r--r--tests/multimissing.exprc1
-rw-r--r--tests/multimissing.sh3
-rw-r--r--tests/multinewline.experr0
-rw-r--r--tests/multinewline.expout39
-rw-r--r--tests/multinewline.exprc1
-rw-r--r--tests/multinewline.sh3
-rw-r--r--tests/none.c5
-rw-r--r--tests/none.experr0
-rw-r--r--tests/none.expout5
-rw-r--r--tests/none.exprc1
-rw-r--r--tests/none.sh1
-rw-r--r--tests/outdir.experr0
-rw-r--r--tests/outdir.expout16
-rw-r--r--tests/outdir.exprc1
-rw-r--r--tests/outdir.sh6
-rw-r--r--tests/outeperm.experr1
-rw-r--r--tests/outeperm.expout0
-rw-r--r--tests/outeperm.exprc1
-rw-r--r--tests/outeperm.sh6
-rw-r--r--tests/outfile.experr0
-rw-r--r--tests/outfile.expout16
-rw-r--r--tests/outfile.exprc1
-rw-r--r--tests/outfile.sh5
-rw-r--r--tests/outperms.experr1
-rw-r--r--tests/outperms.expout16
-rw-r--r--tests/outperms.exprc1
-rw-r--r--tests/outperms.sh7
-rw-r--r--tests/overdir.experr0
-rw-r--r--tests/overdir.expout16
-rw-r--r--tests/overdir.exprc1
-rw-r--r--tests/overdir.sh7
-rw-r--r--tests/overenoent.experr1
-rw-r--r--tests/overenoent.expout0
-rw-r--r--tests/overenoent.exprc1
-rw-r--r--tests/overenoent.sh5
-rw-r--r--tests/overin.experr0
-rw-r--r--tests/overin.expout16
-rw-r--r--tests/overin.exprc1
-rw-r--r--tests/overin.sh6
-rw-r--r--tests/overlnnum.experr0
-rw-r--r--tests/overlnnum.expout20
-rw-r--r--tests/overlnnum.exprc1
-rw-r--r--tests/overlnnum.sh6
-rw-r--r--tests/overperms.experr2
-rw-r--r--tests/overperms.expout16
-rw-r--r--tests/overperms.exprc1
-rw-r--r--tests/overperms.sh9
-rw-r--r--tests/overunchanged.experr0
-rw-r--r--tests/overunchanged.expout0
-rw-r--r--tests/overunchanged.exprc1
-rw-r--r--tests/overunchanged.sh8
-rw-r--r--tests/overwrite.experr0
-rw-r--r--tests/overwrite.expout16
-rw-r--r--tests/overwrite.exprc1
-rw-r--r--tests/overwrite.sh6
-rw-r--r--tests/recursive.experr120
-rw-r--r--tests/recursive.expout26
-rw-r--r--tests/recursive.exprc1
-rw-r--r--tests/recursive.sh1
-rw-r--r--tests/small1.c17
-rw-r--r--tests/small1.experr0
-rw-r--r--tests/small1.expout13
-rw-r--r--tests/small1.exprc1
-rw-r--r--tests/small1.sh1
-rw-r--r--tests/small2.c17
-rw-r--r--tests/small2.experr0
-rw-r--r--tests/small2.expout13
-rw-r--r--tests/small2.exprc1
-rw-r--r--tests/small2.sh1
-rw-r--r--tests/spaces1.c17
-rw-r--r--tests/spaces1.experr0
-rw-r--r--tests/spaces1.expout13
-rw-r--r--tests/spaces1.exprc1
-rw-r--r--tests/spaces1.sh1
-rw-r--r--tests/spaces2.c17
-rw-r--r--tests/spaces2.experr0
-rw-r--r--tests/spaces2.expout13
-rw-r--r--tests/spaces2.exprc1
-rw-r--r--tests/spaces2.sh1
-rw-r--r--tests/spaces3.c17
-rw-r--r--tests/spaces3.experr0
-rw-r--r--tests/spaces3.expout13
-rw-r--r--tests/spaces3.exprc1
-rw-r--r--tests/spaces3.sh1
-rw-r--r--tests/spaces4.c17
-rw-r--r--tests/spaces4.experr0
-rw-r--r--tests/spaces4.expout13
-rw-r--r--tests/spaces4.exprc1
-rw-r--r--tests/spaces4.sh1
-rw-r--r--tests/whitespace-1.experr2
-rw-r--r--tests/whitespace-1.expout1
-rw-r--r--tests/whitespace-1.exprc1
-rw-r--r--tests/whitespace-1.sh1
-rw-r--r--tests/whitespace-2.experr0
-rw-r--r--tests/whitespace-2.expout5
-rw-r--r--tests/whitespace-2.exprc1
-rw-r--r--tests/whitespace-2.sh1
-rw-r--r--tests/whitespace.c7
-rw-r--r--tests/xterm.experr3
-rw-r--r--tests/xterm.expout83
-rw-r--r--tests/xterm.exprc1
-rw-r--r--tests/xterm.sh35
404 files changed, 3115 insertions, 0 deletions
diff --git a/tests/NetBSD-42628.c b/tests/NetBSD-42628.c
new file mode 100644
index 000000000000..9de6a94a0773
--- /dev/null
+++ b/tests/NetBSD-42628.c
@@ -0,0 +1,25 @@
+#if defined(__FreeBSD__)
+#include <netinet/if_fddi.h>
+#else
+#include <net/if_fddi.h>
+#endif
+
+#if defined(__FreeBSD__)
+ #include <stdbool.h>
+ #include <stdbool.h>
+ #include <stdbool.h>
+ #include <stdbool.h>
+ #include <stdbool.h>
+ #include <stdbool.h>
+#else
+#include <stdint.h>
+#endif
+
+#if defined(__FreeBSD__)
+#endif
+
+#ifdef __FreeBSD__
+#include <unistd.h>
+#else
+#include <inttypes.h>
+#endif
diff --git a/tests/NetBSD-42628.experr b/tests/NetBSD-42628.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/NetBSD-42628.experr
diff --git a/tests/NetBSD-42628.expout b/tests/NetBSD-42628.expout
new file mode 100644
index 000000000000..2d52e9e7ae29
--- /dev/null
+++ b/tests/NetBSD-42628.expout
@@ -0,0 +1,6 @@
+#include <net/if_fddi.h>
+
+#include <stdint.h>
+
+
+#include <inttypes.h>
diff --git a/tests/NetBSD-42628.exprc b/tests/NetBSD-42628.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/NetBSD-42628.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/NetBSD-42628.sh b/tests/NetBSD-42628.sh
new file mode 100644
index 000000000000..87ac1aa9c4e8
--- /dev/null
+++ b/tests/NetBSD-42628.sh
@@ -0,0 +1 @@
+unifdef -U__FreeBSD__ NetBSD-42628.c
diff --git a/tests/NetBSD-47068.c b/tests/NetBSD-47068.c
new file mode 100644
index 000000000000..515f50b6eafd
--- /dev/null
+++ b/tests/NetBSD-47068.c
@@ -0,0 +1,2 @@
+#ifdef foo
+#endif \ No newline at end of file
diff --git a/tests/NetBSD-47068.experr b/tests/NetBSD-47068.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/NetBSD-47068.experr
diff --git a/tests/NetBSD-47068.expout b/tests/NetBSD-47068.expout
new file mode 100644
index 000000000000..1fb9d525074e
--- /dev/null
+++ b/tests/NetBSD-47068.expout
@@ -0,0 +1,2 @@
+#ifdef foo
+#endif
diff --git a/tests/NetBSD-47068.exprc b/tests/NetBSD-47068.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/NetBSD-47068.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/NetBSD-47068.sh b/tests/NetBSD-47068.sh
new file mode 100644
index 000000000000..2ec1bbef00a1
--- /dev/null
+++ b/tests/NetBSD-47068.sh
@@ -0,0 +1 @@
+unifdef -Ubar NetBSD-47068.c
diff --git a/tests/args1.c b/tests/args1.c
new file mode 100644
index 000000000000..1cb554688c37
--- /dev/null
+++ b/tests/args1.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/args1.experr
diff --git a/tests/args1.expout b/tests/args1.expout
new file mode 100644
index 000000000000..ce013625030b
--- /dev/null
+++ b/tests/args1.expout
@@ -0,0 +1 @@
+hello
diff --git a/tests/args1.exprc b/tests/args1.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/args1.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/args1.sh b/tests/args1.sh
new file mode 100644
index 000000000000..051baf41118a
--- /dev/null
+++ b/tests/args1.sh
@@ -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
index 000000000000..8fe476b18ee2
--- /dev/null
+++ b/tests/args2.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/args2.experr
diff --git a/tests/args2.expout b/tests/args2.expout
new file mode 100644
index 000000000000..8fe476b18ee2
--- /dev/null
+++ b/tests/args2.expout
@@ -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
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/args2.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/args2.sh b/tests/args2.sh
new file mode 100644
index 000000000000..19fb26136b0b
--- /dev/null
+++ b/tests/args2.sh
@@ -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
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank0d.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank0d.experr
diff --git a/tests/blank0d.expout b/tests/blank0d.expout
new file mode 100644
index 000000000000..9c2261485ba5
--- /dev/null
+++ b/tests/blank0d.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank0d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank0d.sh b/tests/blank0d.sh
new file mode 100644
index 000000000000..f0af220989d1
--- /dev/null
+++ b/tests/blank0d.sh
@@ -0,0 +1 @@
+unifdef -B -DFOO0 blank0d.c
diff --git a/tests/blank0u.c b/tests/blank0u.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank0u.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank0u.experr
diff --git a/tests/blank0u.expout b/tests/blank0u.expout
new file mode 100644
index 000000000000..165d0a903525
--- /dev/null
+++ b/tests/blank0u.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank0u.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank0u.sh b/tests/blank0u.sh
new file mode 100644
index 000000000000..22a8360282c2
--- /dev/null
+++ b/tests/blank0u.sh
@@ -0,0 +1 @@
+unifdef -B -UFOO0 blank0u.c
diff --git a/tests/blank1d.c b/tests/blank1d.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank1d.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank1d.experr
diff --git a/tests/blank1d.expout b/tests/blank1d.expout
new file mode 100644
index 000000000000..05f6bc538b88
--- /dev/null
+++ b/tests/blank1d.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank1d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank1d.sh b/tests/blank1d.sh
new file mode 100644
index 000000000000..4820efd723b9
--- /dev/null
+++ b/tests/blank1d.sh
@@ -0,0 +1 @@
+unifdef -B -DFOO1 blank1d.c
diff --git a/tests/blank1u.c b/tests/blank1u.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank1u.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank1u.experr
diff --git a/tests/blank1u.expout b/tests/blank1u.expout
new file mode 100644
index 000000000000..f79337918e0e
--- /dev/null
+++ b/tests/blank1u.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank1u.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank1u.sh b/tests/blank1u.sh
new file mode 100644
index 000000000000..1dbd849b018f
--- /dev/null
+++ b/tests/blank1u.sh
@@ -0,0 +1 @@
+unifdef -B -UFOO1 blank1u.c
diff --git a/tests/blank2d.c b/tests/blank2d.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank2d.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank2d.experr
diff --git a/tests/blank2d.expout b/tests/blank2d.expout
new file mode 100644
index 000000000000..ba127f52e4f1
--- /dev/null
+++ b/tests/blank2d.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank2d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank2d.sh b/tests/blank2d.sh
new file mode 100644
index 000000000000..a38cb0cee808
--- /dev/null
+++ b/tests/blank2d.sh
@@ -0,0 +1 @@
+unifdef -B -DFOO2 blank2d.c
diff --git a/tests/blank2u.c b/tests/blank2u.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank2u.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank2u.experr
diff --git a/tests/blank2u.expout b/tests/blank2u.expout
new file mode 100644
index 000000000000..cee6dd72eb9a
--- /dev/null
+++ b/tests/blank2u.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank2u.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank2u.sh b/tests/blank2u.sh
new file mode 100644
index 000000000000..70b5440fe28c
--- /dev/null
+++ b/tests/blank2u.sh
@@ -0,0 +1 @@
+unifdef -B -UFOO2 blank2u.c
diff --git a/tests/blank3d.c b/tests/blank3d.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank3d.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank3d.experr
diff --git a/tests/blank3d.expout b/tests/blank3d.expout
new file mode 100644
index 000000000000..31a633a0ea57
--- /dev/null
+++ b/tests/blank3d.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank3d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank3d.sh b/tests/blank3d.sh
new file mode 100644
index 000000000000..8e71cbec759f
--- /dev/null
+++ b/tests/blank3d.sh
@@ -0,0 +1 @@
+unifdef -B -DFOO3 blank3d.c
diff --git a/tests/blank3u.c b/tests/blank3u.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank3u.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank3u.experr
diff --git a/tests/blank3u.expout b/tests/blank3u.expout
new file mode 100644
index 000000000000..d90cca9c6168
--- /dev/null
+++ b/tests/blank3u.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank3u.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank3u.sh b/tests/blank3u.sh
new file mode 100644
index 000000000000..c1e8f20d2bc8
--- /dev/null
+++ b/tests/blank3u.sh
@@ -0,0 +1 @@
+unifdef -B -UFOO3 blank3u.c
diff --git a/tests/blank4d.c b/tests/blank4d.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank4d.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank4d.experr
diff --git a/tests/blank4d.expout b/tests/blank4d.expout
new file mode 100644
index 000000000000..782ff9d74faf
--- /dev/null
+++ b/tests/blank4d.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank4d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank4d.sh b/tests/blank4d.sh
new file mode 100644
index 000000000000..9471b63f06f5
--- /dev/null
+++ b/tests/blank4d.sh
@@ -0,0 +1 @@
+unifdef -B -DFOO4 blank4d.c
diff --git a/tests/blank4u.c b/tests/blank4u.c
new file mode 100644
index 000000000000..c435ac5b6224
--- /dev/null
+++ b/tests/blank4u.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/blank4u.experr
diff --git a/tests/blank4u.expout b/tests/blank4u.expout
new file mode 100644
index 000000000000..72f0fa7987fd
--- /dev/null
+++ b/tests/blank4u.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/blank4u.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/blank4u.sh b/tests/blank4u.sh
new file mode 100644
index 000000000000..16065df4669f
--- /dev/null
+++ b/tests/blank4u.sh
@@ -0,0 +1 @@
+unifdef -B -UFOO4 blank4u.c
diff --git a/tests/broken2.h b/tests/broken2.h
new file mode 100644
index 000000000000..4221f04abf3b
--- /dev/null
+++ b/tests/broken2.h
@@ -0,0 +1 @@
+#define /* nothing */
diff --git a/tests/broken3.h b/tests/broken3.h
new file mode 100644
index 000000000000..c7c82c1bd8bf
--- /dev/null
+++ b/tests/broken3.h
@@ -0,0 +1 @@
+#undef &%^$&%$##@^$
diff --git a/tests/broken4.h b/tests/broken4.h
new file mode 100644
index 000000000000..138cf65b583a
--- /dev/null
+++ b/tests/broken4.h
@@ -0,0 +1,2 @@
+#define FOO \
+ bar
diff --git a/tests/crlf-a.experr b/tests/crlf-a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/crlf-a.experr
diff --git a/tests/crlf-a.expout b/tests/crlf-a.expout
new file mode 100644
index 000000000000..29e1b63ab239
--- /dev/null
+++ b/tests/crlf-a.expout
@@ -0,0 +1,10 @@
+int f1() { return 0; }
+\/
+/\
+comment
+/\
+*\
+comment
+*\
+/\
+eof
diff --git a/tests/crlf-a.exprc b/tests/crlf-a.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/crlf-a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-a.sh b/tests/crlf-a.sh
new file mode 100644
index 000000000000..2acc2bfa0488
--- /dev/null
+++ b/tests/crlf-a.sh
@@ -0,0 +1 @@
+unifdef -DF1 crlf.c
diff --git a/tests/crlf-b.experr b/tests/crlf-b.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/crlf-b.experr
diff --git a/tests/crlf-b.expout b/tests/crlf-b.expout
new file mode 100644
index 000000000000..011b81a6cedd
--- /dev/null
+++ b/tests/crlf-b.expout
@@ -0,0 +1,14 @@
+#if F1
+int f1() { return 0; }
+#else
+int f2() { return 0; }
+#endif
+\/
+/\
+comment
+/\
+*\
+comment
+*\
+/\
+eof
diff --git a/tests/crlf-b.exprc b/tests/crlf-b.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/crlf-b.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-b.sh b/tests/crlf-b.sh
new file mode 100644
index 000000000000..57d9de5f7c34
--- /dev/null
+++ b/tests/crlf-b.sh
@@ -0,0 +1 @@
+unifdef -DF2 crlf.c
diff --git a/tests/crlf-c.experr b/tests/crlf-c.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/crlf-c.experr
diff --git a/tests/crlf-c.expout b/tests/crlf-c.expout
new file mode 100644
index 000000000000..f9fdaf832c7f
--- /dev/null
+++ b/tests/crlf-c.expout
@@ -0,0 +1,16 @@
+#if F1
+int f1() { return 0; }
+#elif F2
+int f2() { return 0; }
+#else
+int f3() { return 0; }
+#endif
+\/
+/\
+comment
+/\
+*\
+comment
+*\
+/\
+eof
diff --git a/tests/crlf-c.exprc b/tests/crlf-c.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/crlf-c.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-c.sh b/tests/crlf-c.sh
new file mode 100644
index 000000000000..ad6f131379bb
--- /dev/null
+++ b/tests/crlf-c.sh
@@ -0,0 +1 @@
+unifdef -DF3 crlf.c
diff --git a/tests/crlf-d.experr b/tests/crlf-d.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/crlf-d.experr
diff --git a/tests/crlf-d.expout b/tests/crlf-d.expout
new file mode 100644
index 000000000000..295d337d5c74
--- /dev/null
+++ b/tests/crlf-d.expout
@@ -0,0 +1,18 @@
+#if F1
+int f1() { return 0; }
+#elif F2
+int f2() { return 0; }
+#elif F3
+int f3() { return 0; }
+#else
+int f4() { return 0; }
+#endif
+\/
+/\
+comment
+/\
+*\
+comment
+*\
+/\
+eof
diff --git a/tests/crlf-d.exprc b/tests/crlf-d.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/crlf-d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/crlf-d.sh b/tests/crlf-d.sh
new file mode 100644
index 000000000000..719c05b6df46
--- /dev/null
+++ b/tests/crlf-d.sh
@@ -0,0 +1 @@
+unifdef -DF4 crlf.c
diff --git a/tests/crlf.c b/tests/crlf.c
new file mode 100644
index 000000000000..ad911dc63a32
--- /dev/null
+++ b/tests/crlf.c
@@ -0,0 +1,20 @@
+#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
+\/
+/\
+comment
+/\
+*\
+comment
+*\
+/\
+eof
diff --git a/tests/debian-603860.c b/tests/debian-603860.c
new file mode 100644
index 000000000000..ae40ce1809c1
--- /dev/null
+++ b/tests/debian-603860.c
@@ -0,0 +1,8 @@
+#ifdef FOO
+int a;
+#endif
+char foo[] = "rm -rf /*";
+#ifdef FOO
+int b;
+#endif
+/* baz */
diff --git a/tests/debian-603860.experr b/tests/debian-603860.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/debian-603860.experr
diff --git a/tests/debian-603860.expout b/tests/debian-603860.expout
new file mode 100644
index 000000000000..e04772cc230b
--- /dev/null
+++ b/tests/debian-603860.expout
@@ -0,0 +1,2 @@
+char foo[] = "rm -rf /*";
+/* baz */
diff --git a/tests/debian-603860.exprc b/tests/debian-603860.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/debian-603860.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/debian-603860.sh b/tests/debian-603860.sh
new file mode 100644
index 000000000000..b77ae9cc10e3
--- /dev/null
+++ b/tests/debian-603860.sh
@@ -0,0 +1 @@
+unifdef -UFOO debian-603860.c
diff --git a/tests/defundef-broken2.experr b/tests/defundef-broken2.experr
new file mode 100644
index 000000000000..fdfd6e237c23
--- /dev/null
+++ b/tests/defundef-broken2.experr
@@ -0,0 +1,2 @@
+unifdef: broken2.h: 1: Missing macro name in #define
+unifdef: Output may be truncated
diff --git a/tests/defundef-broken2.expout b/tests/defundef-broken2.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/defundef-broken2.expout
diff --git a/tests/defundef-broken2.exprc b/tests/defundef-broken2.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/defundef-broken2.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/defundef-broken2.sh b/tests/defundef-broken2.sh
new file mode 100644
index 000000000000..16c7384d8cdd
--- /dev/null
+++ b/tests/defundef-broken2.sh
@@ -0,0 +1 @@
+unifdef -f broken2.h if1.c
diff --git a/tests/defundef-broken3.experr b/tests/defundef-broken3.experr
new file mode 100644
index 000000000000..0b0b63a4b71c
--- /dev/null
+++ b/tests/defundef-broken3.experr
@@ -0,0 +1,2 @@
+unifdef: broken3.h: 1: Missing macro name in #undef
+unifdef: Output may be truncated
diff --git a/tests/defundef-broken3.expout b/tests/defundef-broken3.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/defundef-broken3.expout
diff --git a/tests/defundef-broken3.exprc b/tests/defundef-broken3.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/defundef-broken3.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/defundef-broken3.sh b/tests/defundef-broken3.sh
new file mode 100644
index 000000000000..123e725715dd
--- /dev/null
+++ b/tests/defundef-broken3.sh
@@ -0,0 +1 @@
+unifdef -f broken3.h if1.c
diff --git a/tests/defundef-broken4.experr b/tests/defundef-broken4.experr
new file mode 100644
index 000000000000..65c0ad5ad240
--- /dev/null
+++ b/tests/defundef-broken4.experr
@@ -0,0 +1,2 @@
+unifdef: broken4.h: 1: Obfuscated preprocessor control line
+unifdef: Output may be truncated
diff --git a/tests/defundef-broken4.expout b/tests/defundef-broken4.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/defundef-broken4.expout
diff --git a/tests/defundef-broken4.exprc b/tests/defundef-broken4.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/defundef-broken4.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/defundef-broken4.sh b/tests/defundef-broken4.sh
new file mode 100644
index 000000000000..1c85536f7c58
--- /dev/null
+++ b/tests/defundef-broken4.sh
@@ -0,0 +1 @@
+unifdef -f broken4.h if1.c
diff --git a/tests/defundef-funlike.experr b/tests/defundef-funlike.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/defundef-funlike.experr
diff --git a/tests/defundef-funlike.expout b/tests/defundef-funlike.expout
new file mode 100644
index 000000000000..b64cfc265bd2
--- /dev/null
+++ b/tests/defundef-funlike.expout
@@ -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/defundef-funlike.exprc b/tests/defundef-funlike.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/defundef-funlike.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/defundef-funlike.sh b/tests/defundef-funlike.sh
new file mode 100644
index 000000000000..91c91af4cd0b
--- /dev/null
+++ b/tests/defundef-funlike.sh
@@ -0,0 +1 @@
+unifdef -f funlike.h small1.c
diff --git a/tests/defundef-undefdef.experr b/tests/defundef-undefdef.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/defundef-undefdef.experr
diff --git a/tests/defundef-undefdef.expout b/tests/defundef-undefdef.expout
new file mode 100644
index 000000000000..c51d7a6bec42
--- /dev/null
+++ b/tests/defundef-undefdef.expout
@@ -0,0 +1 @@
+int f1() { return 0; }
diff --git a/tests/defundef-undefdef.exprc b/tests/defundef-undefdef.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/defundef-undefdef.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/defundef-undefdef.sh b/tests/defundef-undefdef.sh
new file mode 100644
index 000000000000..4af30c7f1eba
--- /dev/null
+++ b/tests/defundef-undefdef.sh
@@ -0,0 +1 @@
+unifdef -f if6.h if6.c
diff --git a/tests/div.c b/tests/div.c
new file mode 100644
index 000000000000..f825bec5effd
--- /dev/null
+++ b/tests/div.c
@@ -0,0 +1,3 @@
+#if 10 / DENOM
+DIVISION
+#endif
diff --git a/tests/div.experr b/tests/div.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/div.experr
diff --git a/tests/div.expout b/tests/div.expout
new file mode 100644
index 000000000000..769481fd8910
--- /dev/null
+++ b/tests/div.expout
@@ -0,0 +1,10 @@
+undef
+#if 10 / DENOM
+DIVISION
+#endif
+one
+DIVISION
+zero
+#if 10 / DENOM
+DIVISION
+#endif
diff --git a/tests/div.exprc b/tests/div.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/div.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/div.sh b/tests/div.sh
new file mode 100644
index 000000000000..f526f9f1a1ca
--- /dev/null
+++ b/tests/div.sh
@@ -0,0 +1,10 @@
+echo undef
+if ! unifdef div.c
+then unifdef -d div.c
+fi
+echo one
+unifdef -DDENOM div.c
+echo zero
+if ! unifdef -UDENOM div.c
+then unifdef -d -UDENOM div.c
+fi
diff --git a/tests/empty.c b/tests/empty.c
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/empty.c
diff --git a/tests/empty.experr b/tests/empty.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/empty.experr
diff --git a/tests/empty.expout b/tests/empty.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/empty.expout
diff --git a/tests/empty.exprc b/tests/empty.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/empty.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/empty.sh b/tests/empty.sh
new file mode 100644
index 000000000000..c2dd1671d623
--- /dev/null
+++ b/tests/empty.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR empty.c
diff --git a/tests/error.c b/tests/error.c
new file mode 100644
index 000000000000..7cd15e7d966a
--- /dev/null
+++ b/tests/error.c
@@ -0,0 +1,4 @@
+#if FOO != 5
+#error
+#endif
+bar
diff --git a/tests/error.experr b/tests/error.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/error.experr
diff --git a/tests/error.expout b/tests/error.expout
new file mode 100644
index 000000000000..274284345ca2
--- /dev/null
+++ b/tests/error.expout
@@ -0,0 +1,2 @@
+#error
+bar
diff --git a/tests/error.exprc b/tests/error.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/error.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/error.sh b/tests/error.sh
new file mode 100644
index 000000000000..1267f0f0d603
--- /dev/null
+++ b/tests/error.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 error.c
diff --git a/tests/exitmode0a.experr b/tests/exitmode0a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitmode0a.experr
diff --git a/tests/exitmode0a.expout b/tests/exitmode0a.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/exitmode0a.expout
@@ -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/exitmode0a.exprc b/tests/exitmode0a.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/exitmode0a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/exitmode0a.sh b/tests/exitmode0a.sh
new file mode 100644
index 000000000000..6c171732a6cf
--- /dev/null
+++ b/tests/exitmode0a.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR -x0 if1.c
diff --git a/tests/exitmode0b.experr b/tests/exitmode0b.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitmode0b.experr
diff --git a/tests/exitmode0b.expout b/tests/exitmode0b.expout
new file mode 100644
index 000000000000..9e588c22791c
--- /dev/null
+++ b/tests/exitmode0b.expout
@@ -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/exitmode0b.exprc b/tests/exitmode0b.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/exitmode0b.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/exitmode0b.sh b/tests/exitmode0b.sh
new file mode 100644
index 000000000000..339bb3e4149d
--- /dev/null
+++ b/tests/exitmode0b.sh
@@ -0,0 +1 @@
+unifdef -x0 if1.c
diff --git a/tests/exitmode1a.experr b/tests/exitmode1a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitmode1a.experr
diff --git a/tests/exitmode1a.expout b/tests/exitmode1a.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/exitmode1a.expout
@@ -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/exitmode1a.exprc b/tests/exitmode1a.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/exitmode1a.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/exitmode1a.sh b/tests/exitmode1a.sh
new file mode 100644
index 000000000000..4d40a13f69db
--- /dev/null
+++ b/tests/exitmode1a.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR -x1 if1.c
diff --git a/tests/exitmode1b.experr b/tests/exitmode1b.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitmode1b.experr
diff --git a/tests/exitmode1b.expout b/tests/exitmode1b.expout
new file mode 100644
index 000000000000..9e588c22791c
--- /dev/null
+++ b/tests/exitmode1b.expout
@@ -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/exitmode1b.exprc b/tests/exitmode1b.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/exitmode1b.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/exitmode1b.sh b/tests/exitmode1b.sh
new file mode 100644
index 000000000000..19bf1c196660
--- /dev/null
+++ b/tests/exitmode1b.sh
@@ -0,0 +1 @@
+unifdef -x1 if1.c
diff --git a/tests/exitmode2a.experr b/tests/exitmode2a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitmode2a.experr
diff --git a/tests/exitmode2a.expout b/tests/exitmode2a.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/exitmode2a.expout
@@ -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/exitmode2a.exprc b/tests/exitmode2a.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/exitmode2a.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/exitmode2a.sh b/tests/exitmode2a.sh
new file mode 100644
index 000000000000..42db886dc5da
--- /dev/null
+++ b/tests/exitmode2a.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR -x2 if1.c
diff --git a/tests/exitmode2b.experr b/tests/exitmode2b.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitmode2b.experr
diff --git a/tests/exitmode2b.expout b/tests/exitmode2b.expout
new file mode 100644
index 000000000000..9e588c22791c
--- /dev/null
+++ b/tests/exitmode2b.expout
@@ -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/exitmode2b.exprc b/tests/exitmode2b.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/exitmode2b.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/exitmode2b.sh b/tests/exitmode2b.sh
new file mode 100644
index 000000000000..30bdd3ba33b9
--- /dev/null
+++ b/tests/exitmode2b.sh
@@ -0,0 +1 @@
+unifdef -x2 if1.c
diff --git a/tests/exitstat.c b/tests/exitstat.c
new file mode 100644
index 000000000000..5413a07a46fc
--- /dev/null
+++ b/tests/exitstat.c
@@ -0,0 +1,3 @@
+#if FALSE
+#elif TRUE
+#endif
diff --git a/tests/exitstat.experr b/tests/exitstat.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/exitstat.experr
diff --git a/tests/exitstat.expout b/tests/exitstat.expout
new file mode 100644
index 000000000000..e08e8fb49178
--- /dev/null
+++ b/tests/exitstat.expout
@@ -0,0 +1,3 @@
+#if FALSE
+#else
+#endif
diff --git a/tests/exitstat.exprc b/tests/exitstat.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/exitstat.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/exitstat.sh b/tests/exitstat.sh
new file mode 100644
index 000000000000..df0060f73638
--- /dev/null
+++ b/tests/exitstat.sh
@@ -0,0 +1 @@
+unifdef -DTRUE=1 exitstat.c
diff --git a/tests/funlike.h b/tests/funlike.h
new file mode 100644
index 000000000000..5e657946e36b
--- /dev/null
+++ b/tests/funlike.h
@@ -0,0 +1 @@
+#define FOO(a,b,c) a+b+c
diff --git a/tests/if1-a.experr b/tests/if1-a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if1-a.experr
diff --git a/tests/if1-a.expout b/tests/if1-a.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/if1-a.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if1-a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-a.sh b/tests/if1-a.sh
new file mode 100644
index 000000000000..57b7cd5b7a56
--- /dev/null
+++ b/tests/if1-a.sh
@@ -0,0 +1 @@
+unifdefall.sh -DFOO=1 -DFOOB=42 -UBAR if1.c
diff --git a/tests/if1-f.experr b/tests/if1-f.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if1-f.experr
diff --git a/tests/if1-f.expout b/tests/if1-f.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/if1-f.expout
@@ -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-f.exprc b/tests/if1-f.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if1-f.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-f.sh b/tests/if1-f.sh
new file mode 100644
index 000000000000..4a9698c08d3c
--- /dev/null
+++ b/tests/if1-f.sh
@@ -0,0 +1 @@
+unifdef -f if1.h if1.c
diff --git a/tests/if1-k.c b/tests/if1-k.c
new file mode 100644
index 000000000000..712350f9c13c
--- /dev/null
+++ b/tests/if1-k.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if1-k.experr
diff --git a/tests/if1-k.expout b/tests/if1-k.expout
new file mode 100644
index 000000000000..2be8567b970c
--- /dev/null
+++ b/tests/if1-k.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if1-k.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-k.sh b/tests/if1-k.sh
new file mode 100644
index 000000000000..dc33e1afbda0
--- /dev/null
+++ b/tests/if1-k.sh
@@ -0,0 +1 @@
+unifdef -k if1-k.c
diff --git a/tests/if1-kDU.c b/tests/if1-kDU.c
new file mode 100644
index 000000000000..712350f9c13c
--- /dev/null
+++ b/tests/if1-kDU.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if1-kDU.experr
diff --git a/tests/if1-kDU.expout b/tests/if1-kDU.expout
new file mode 100644
index 000000000000..c308e43b5a09
--- /dev/null
+++ b/tests/if1-kDU.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if1-kDU.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if1-kDU.sh b/tests/if1-kDU.sh
new file mode 100644
index 000000000000..49231b7a4d9a
--- /dev/null
+++ b/tests/if1-kDU.sh
@@ -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
index 000000000000..9e588c22791c
--- /dev/null
+++ b/tests/if1.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if1.experr
diff --git a/tests/if1.expout b/tests/if1.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/if1.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if1.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if1.h b/tests/if1.h
new file mode 100644
index 000000000000..3441c1bd8b85
--- /dev/null
+++ b/tests/if1.h
@@ -0,0 +1,3 @@
+#define FOO 1
+#define FOOB 42
+#undef BAR
diff --git a/tests/if1.sh b/tests/if1.sh
new file mode 100644
index 000000000000..36a1cef8285a
--- /dev/null
+++ b/tests/if1.sh
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if1a.experr
diff --git a/tests/if1a.expout b/tests/if1a.expout
new file mode 100644
index 000000000000..956eea0b20b2
--- /dev/null
+++ b/tests/if1a.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if1a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if1a.sh b/tests/if1a.sh
new file mode 100644
index 000000000000..ac54227c7502
--- /dev/null
+++ b/tests/if1a.sh
@@ -0,0 +1 @@
+unifdef -UBAR if1.c
diff --git a/tests/if2-a.experr b/tests/if2-a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if2-a.experr
diff --git a/tests/if2-a.expout b/tests/if2-a.expout
new file mode 100644
index 000000000000..b64cfc265bd2
--- /dev/null
+++ b/tests/if2-a.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if2-a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if2-a.sh b/tests/if2-a.sh
new file mode 100644
index 000000000000..acefce8f833c
--- /dev/null
+++ b/tests/if2-a.sh
@@ -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
index 000000000000..b5a9109d6ff9
--- /dev/null
+++ b/tests/if2-k.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if2-k.experr
diff --git a/tests/if2-k.expout b/tests/if2-k.expout
new file mode 100644
index 000000000000..6a173a4e0a3b
--- /dev/null
+++ b/tests/if2-k.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if2-k.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if2-k.sh b/tests/if2-k.sh
new file mode 100644
index 000000000000..5875af3227cd
--- /dev/null
+++ b/tests/if2-k.sh
@@ -0,0 +1 @@
+unifdef -k if2-k.c
diff --git a/tests/if2-kDU.c b/tests/if2-kDU.c
new file mode 100644
index 000000000000..b5a9109d6ff9
--- /dev/null
+++ b/tests/if2-kDU.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if2-kDU.experr
diff --git a/tests/if2-kDU.expout b/tests/if2-kDU.expout
new file mode 100644
index 000000000000..7cf0ddc9c796
--- /dev/null
+++ b/tests/if2-kDU.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if2-kDU.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if2-kDU.sh b/tests/if2-kDU.sh
new file mode 100644
index 000000000000..567ca0af4ac9
--- /dev/null
+++ b/tests/if2-kDU.sh
@@ -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
index 000000000000..44fdae070f3e
--- /dev/null
+++ b/tests/if2.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if2.experr
diff --git a/tests/if2.expout b/tests/if2.expout
new file mode 100644
index 000000000000..b64cfc265bd2
--- /dev/null
+++ b/tests/if2.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if2.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if2.sh b/tests/if2.sh
new file mode 100644
index 000000000000..e10159a1f9f5
--- /dev/null
+++ b/tests/if2.sh
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if3-a.experr
diff --git a/tests/if3-a.expout b/tests/if3-a.expout
new file mode 100644
index 000000000000..b64cfc265bd2
--- /dev/null
+++ b/tests/if3-a.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if3-a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if3-a.sh b/tests/if3-a.sh
new file mode 100644
index 000000000000..f6b1500a2d2c
--- /dev/null
+++ b/tests/if3-a.sh
@@ -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
index 000000000000..c90102155f4d
--- /dev/null
+++ b/tests/if3-k.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if3-k.experr
diff --git a/tests/if3-k.expout b/tests/if3-k.expout
new file mode 100644
index 000000000000..e0e23867de64
--- /dev/null
+++ b/tests/if3-k.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if3-k.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if3-k.sh b/tests/if3-k.sh
new file mode 100644
index 000000000000..4bd48da7c5b7
--- /dev/null
+++ b/tests/if3-k.sh
@@ -0,0 +1 @@
+unifdef -k if3-k.c
diff --git a/tests/if3-kDU.c b/tests/if3-kDU.c
new file mode 100644
index 000000000000..c90102155f4d
--- /dev/null
+++ b/tests/if3-kDU.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if3-kDU.experr
diff --git a/tests/if3-kDU.expout b/tests/if3-kDU.expout
new file mode 100644
index 000000000000..7cf0ddc9c796
--- /dev/null
+++ b/tests/if3-kDU.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if3-kDU.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if3-kDU.sh b/tests/if3-kDU.sh
new file mode 100644
index 000000000000..795e54f25c5f
--- /dev/null
+++ b/tests/if3-kDU.sh
@@ -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
index 000000000000..2a87102fab5a
--- /dev/null
+++ b/tests/if3.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if3.experr
diff --git a/tests/if3.expout b/tests/if3.expout
new file mode 100644
index 000000000000..b64cfc265bd2
--- /dev/null
+++ b/tests/if3.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if3.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if3.sh b/tests/if3.sh
new file mode 100644
index 000000000000..9345010283ff
--- /dev/null
+++ b/tests/if3.sh
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if4-a.experr
diff --git a/tests/if4-a.expout b/tests/if4-a.expout
new file mode 100644
index 000000000000..55dfe32d1272
--- /dev/null
+++ b/tests/if4-a.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if4-a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if4-a.sh b/tests/if4-a.sh
new file mode 100644
index 000000000000..888f9014f0a5
--- /dev/null
+++ b/tests/if4-a.sh
@@ -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
index 000000000000..b31bca49c443
--- /dev/null
+++ b/tests/if4-k.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if4-k.experr
diff --git a/tests/if4-k.expout b/tests/if4-k.expout
new file mode 100644
index 000000000000..bb94d6a14e64
--- /dev/null
+++ b/tests/if4-k.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if4-k.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if4-k.sh b/tests/if4-k.sh
new file mode 100644
index 000000000000..277d248a1328
--- /dev/null
+++ b/tests/if4-k.sh
@@ -0,0 +1 @@
+unifdef -k if4-k.c
diff --git a/tests/if4-kDU.c b/tests/if4-kDU.c
new file mode 100644
index 000000000000..b31bca49c443
--- /dev/null
+++ b/tests/if4-kDU.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if4-kDU.experr
diff --git a/tests/if4-kDU.expout b/tests/if4-kDU.expout
new file mode 100644
index 000000000000..919bd63a8eda
--- /dev/null
+++ b/tests/if4-kDU.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if4-kDU.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if4-kDU.sh b/tests/if4-kDU.sh
new file mode 100644
index 000000000000..57c3e93d1c8b
--- /dev/null
+++ b/tests/if4-kDU.sh
@@ -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
index 000000000000..a8be34883d02
--- /dev/null
+++ b/tests/if4.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if4.experr
diff --git a/tests/if4.expout b/tests/if4.expout
new file mode 100644
index 000000000000..55dfe32d1272
--- /dev/null
+++ b/tests/if4.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if4.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if4.sh b/tests/if4.sh
new file mode 100644
index 000000000000..efbdbcfacc33
--- /dev/null
+++ b/tests/if4.sh
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if5-a.experr
diff --git a/tests/if5-a.expout b/tests/if5-a.expout
new file mode 100644
index 000000000000..ffacc5e5a97f
--- /dev/null
+++ b/tests/if5-a.expout
@@ -0,0 +1,40 @@
+/* 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 foo5() { return 0; }
+
+int foo6() { return 0; }
+
+int foo7() { return 0; }
+
+int foo8() { return 0; }
+
+int foo9() { return 0; }
+
+int foo10() { return 0; }
+
+int main()
+{
+ foo1();
+ foo2();
+ foo3();
+ foo4();
+ foo5();
+ foo6();
+ foo7();
+ foo8();
+ foo9();
+ foo10();
+}
diff --git a/tests/if5-a.exprc b/tests/if5-a.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if5-a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if5-a.sh b/tests/if5-a.sh
new file mode 100644
index 000000000000..6c30b1f6d8cc
--- /dev/null
+++ b/tests/if5-a.sh
@@ -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
index 000000000000..2be184790ce8
--- /dev/null
+++ b/tests/if5-k.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if5-k.experr
diff --git a/tests/if5-k.expout b/tests/if5-k.expout
new file mode 100644
index 000000000000..4ae22c63d84a
--- /dev/null
+++ b/tests/if5-k.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if5-k.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if5-k.sh b/tests/if5-k.sh
new file mode 100644
index 000000000000..01d92be152b3
--- /dev/null
+++ b/tests/if5-k.sh
@@ -0,0 +1 @@
+unifdef -k if5-k.c
diff --git a/tests/if5-kDU.c b/tests/if5-kDU.c
new file mode 100644
index 000000000000..2be184790ce8
--- /dev/null
+++ b/tests/if5-kDU.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if5-kDU.experr
diff --git a/tests/if5-kDU.expout b/tests/if5-kDU.expout
new file mode 100644
index 000000000000..a8de2a19e987
--- /dev/null
+++ b/tests/if5-kDU.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if5-kDU.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if5-kDU.sh b/tests/if5-kDU.sh
new file mode 100644
index 000000000000..71f1677ee424
--- /dev/null
+++ b/tests/if5-kDU.sh
@@ -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
index 000000000000..5edba56817dc
--- /dev/null
+++ b/tests/if5.c
@@ -0,0 +1,80 @@
+/* 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
+int 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
+
+#if FOO > FOOB
+#error FOO is greater than FOOB
+#else
+int foo7() { return 0; }
+#endif
+
+#if FOOB < FOO
+#error FOOB is less than FOO
+#else
+int foo8() { return 0; }
+#endif
+
+#if FOO >= FOOB
+#error FOO is greater than or equal FOOB
+#else
+int foo9() { return 0; }
+#endif
+
+#if FOOB <= FOO
+#error FOOB is less than or equal FOO
+#else
+int foo10() { return 0; }
+#endif
+
+int main()
+{
+ foo1();
+ foo2();
+ foo3();
+ foo4();
+ foo5();
+ foo6();
+ foo7();
+ foo8();
+ foo9();
+ foo10();
+}
diff --git a/tests/if5.experr b/tests/if5.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if5.experr
diff --git a/tests/if5.expout b/tests/if5.expout
new file mode 100644
index 000000000000..ffacc5e5a97f
--- /dev/null
+++ b/tests/if5.expout
@@ -0,0 +1,40 @@
+/* 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 foo5() { return 0; }
+
+int foo6() { return 0; }
+
+int foo7() { return 0; }
+
+int foo8() { return 0; }
+
+int foo9() { return 0; }
+
+int foo10() { return 0; }
+
+int main()
+{
+ foo1();
+ foo2();
+ foo3();
+ foo4();
+ foo5();
+ foo6();
+ foo7();
+ foo8();
+ foo9();
+ foo10();
+}
diff --git a/tests/if5.exprc b/tests/if5.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if5.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if5.sh b/tests/if5.sh
new file mode 100644
index 000000000000..e9417fbc800c
--- /dev/null
+++ b/tests/if5.sh
@@ -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
index 000000000000..6abadb1106e2
--- /dev/null
+++ b/tests/if6.c
@@ -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/if6.h b/tests/if6.h
new file mode 100644
index 000000000000..5c2faa2d6223
--- /dev/null
+++ b/tests/if6.h
@@ -0,0 +1,2 @@
+#undef gruntfuttock
+#define F1 1
diff --git a/tests/if6a.experr b/tests/if6a.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if6a.experr
diff --git a/tests/if6a.expout b/tests/if6a.expout
new file mode 100644
index 000000000000..c51d7a6bec42
--- /dev/null
+++ b/tests/if6a.expout
@@ -0,0 +1 @@
+int f1() { return 0; }
diff --git a/tests/if6a.exprc b/tests/if6a.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if6a.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if6a.sh b/tests/if6a.sh
new file mode 100644
index 000000000000..fec1e5f9ff27
--- /dev/null
+++ b/tests/if6a.sh
@@ -0,0 +1 @@
+unifdef -DF1 if6.c
diff --git a/tests/if6b.experr b/tests/if6b.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if6b.experr
diff --git a/tests/if6b.expout b/tests/if6b.expout
new file mode 100644
index 000000000000..0b7aa04243fb
--- /dev/null
+++ b/tests/if6b.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if6b.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if6b.sh b/tests/if6b.sh
new file mode 100644
index 000000000000..bc46c0065c66
--- /dev/null
+++ b/tests/if6b.sh
@@ -0,0 +1 @@
+unifdef -DF2 if6.c
diff --git a/tests/if6c.experr b/tests/if6c.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if6c.experr
diff --git a/tests/if6c.expout b/tests/if6c.expout
new file mode 100644
index 000000000000..03341d93d850
--- /dev/null
+++ b/tests/if6c.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if6c.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if6c.sh b/tests/if6c.sh
new file mode 100644
index 000000000000..996a50dae773
--- /dev/null
+++ b/tests/if6c.sh
@@ -0,0 +1 @@
+unifdef -DF3 if6.c
diff --git a/tests/if6d.experr b/tests/if6d.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if6d.experr
diff --git a/tests/if6d.expout b/tests/if6d.expout
new file mode 100644
index 000000000000..76d70116976d
--- /dev/null
+++ b/tests/if6d.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if6d.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if6d.sh b/tests/if6d.sh
new file mode 100644
index 000000000000..a9f180788cce
--- /dev/null
+++ b/tests/if6d.sh
@@ -0,0 +1 @@
+unifdef -DF4 if6.c
diff --git a/tests/if7.c b/tests/if7.c
new file mode 100644
index 000000000000..1f86f8f598ea
--- /dev/null
+++ b/tests/if7.c
@@ -0,0 +1,94 @@
+/*
+Distributed under the two-clause BSD licence;
+see the COPYING file for details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if (FOOB | FOO) == 43
+int foo1() { return 0; }
+#else
+#error FOOB bitwise-or FOO is not 43
+#endif
+
+#if (FOO ^ FOO) == 0
+int foo2() { return 0; }
+#else
+#error FOO bitwise-xor FOO is not 0
+#endif
+
+#if (FOOB & 2) == 2
+int foo3() { return 0; }
+#else
+#error FOOB bitwise-and 2 is not 2
+#endif
+
+#if (FOO << 1) == 2
+int foo4() { return 0; }
+#else
+#error FOO left-shift 2 is not 2
+#endif
+
+#if (FOOB >> 4) == 2
+int foo5() { return 0; }
+#else
+#error FOOB right-shift 2 is not 2
+#endif
+
+#if (FOOB + FOO) == 43
+int foo6() { return 0; }
+#else
+#error FOOB add FOO is not 43
+#endif
+
+#if (FOOB - FOO) == 41
+int foo7() { return 0; }
+#else
+#error FOOB subtract FOO is not 41
+#endif
+
+#if (FOOB * 2) == 84
+int foo8() { return 0; }
+#else
+#error FOOB multiply 2 is not 84
+#endif
+
+#if (FOOB / 2) == 21
+int foo9() { return 0; }
+#else
+#error FOOB divided 2 is not 21
+#endif
+
+#if (FOOB % FOO) == 0
+int foo10() { return 0; }
+#else
+#error FOOB modulo FOO is not 0
+#endif
+
+#if ~(FOOB) == -43
+int foo11() { return 0; }
+#else
+#error bitwise-not FOOB is not -43
+#endif
+
+#if -(FOOB) == -42
+int foo12() { return 0; }
+#else
+#error negate FOOB is not -42
+#endif
+
+int main()
+{
+ foo1();
+ foo2();
+ foo3();
+ foo4();
+ foo5();
+ foo6();
+ foo7();
+ foo8();
+ foo9();
+ foo10();
+ foo11();
+ foo12();
+}
diff --git a/tests/if7.experr b/tests/if7.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/if7.experr
diff --git a/tests/if7.expout b/tests/if7.expout
new file mode 100644
index 000000000000..136a82a41bf6
--- /dev/null
+++ b/tests/if7.expout
@@ -0,0 +1,46 @@
+/*
+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 foo5() { return 0; }
+
+int foo6() { return 0; }
+
+int foo7() { return 0; }
+
+int foo8() { return 0; }
+
+int foo9() { return 0; }
+
+int foo10() { return 0; }
+
+int foo11() { return 0; }
+
+int foo12() { return 0; }
+
+int main()
+{
+ foo1();
+ foo2();
+ foo3();
+ foo4();
+ foo5();
+ foo6();
+ foo7();
+ foo8();
+ foo9();
+ foo10();
+ foo11();
+ foo12();
+}
diff --git a/tests/if7.exprc b/tests/if7.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/if7.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/if7.sh b/tests/if7.sh
new file mode 100644
index 000000000000..107d5ed739ed
--- /dev/null
+++ b/tests/if7.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR if7.c
diff --git a/tests/indirect.experr b/tests/indirect.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/indirect.experr
diff --git a/tests/indirect.expout b/tests/indirect.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/indirect.expout
@@ -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/indirect.exprc b/tests/indirect.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/indirect.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/indirect.sh b/tests/indirect.sh
new file mode 100644
index 000000000000..32fdee059b22
--- /dev/null
+++ b/tests/indirect.sh
@@ -0,0 +1 @@
+unifdef -DFOO=ZIG -DZIG -DFOOB=42 -UBAR if1.c
diff --git a/tests/multi-generic-sh b/tests/multi-generic-sh
new file mode 100644
index 000000000000..80e568a72c30
--- /dev/null
+++ b/tests/multi-generic-sh
@@ -0,0 +1,15 @@
+mfiles=""
+for f in $files
+do
+ rm -f m$f
+ [ -f $f ] && cp $f m$f
+ mfiles="$mfiles m$f"
+done
+unifdef -M~ $opts $mfiles
+e=$?
+for f in $mfiles
+do
+ diff -u $f~ $f | sed '/^[+-]\{3\} /s/ .*//'
+ rm -f $f~ $f
+done
+exit $e
diff --git a/tests/multi.experr b/tests/multi.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/multi.experr
diff --git a/tests/multi.expout b/tests/multi.expout
new file mode 100644
index 000000000000..c05227749e20
--- /dev/null
+++ b/tests/multi.expout
@@ -0,0 +1,36 @@
+--- mif1.c~
++++ mif1.c
+@@ -5,19 +5,9 @@
+ #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()
+ {
+--- mif2.c~
++++ mif2.c
+@@ -5,11 +5,7 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+
+-#if defined(FOO)
+ int foo() { return 0; }
+-#else
+-#error FOO not defined
+-#endif
+
+ int main()
+ {
diff --git a/tests/multi.exprc b/tests/multi.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/multi.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/multi.sh b/tests/multi.sh
new file mode 100644
index 000000000000..b0553ffea051
--- /dev/null
+++ b/tests/multi.sh
@@ -0,0 +1,3 @@
+opts="-DFOO=1 -DFOOB=42 -UBAR"
+files="if1.c if2.c"
+. ./multi-generic-sh
diff --git a/tests/multilnnum.experr b/tests/multilnnum.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/multilnnum.experr
diff --git a/tests/multilnnum.expout b/tests/multilnnum.expout
new file mode 100644
index 000000000000..628b359512f0
--- /dev/null
+++ b/tests/multilnnum.expout
@@ -0,0 +1,42 @@
+--- mif1.c~
++++ mif1.c
+@@ -5,19 +5,13 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+
+-#if FOO
++#line 9 "mif1.c"
+ int foo() { return 0; }
+-#else
+-#error FOO not defined
+-#endif
++#line 13 "mif1.c"
+
+-#if BAR
+-int foo() { return 0; }
+-#elif FOO
++#line 17 "mif1.c"
+ int bar() { return 0; }
+-#else
+-#error FOO not defined
+-#endif
++#line 21 "mif1.c"
+
+ int main()
+ {
+--- mif2.c~
++++ mif2.c
+@@ -5,11 +5,9 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+
+-#if defined(FOO)
++#line 9 "mif2.c"
+ int foo() { return 0; }
+-#else
+-#error FOO not defined
+-#endif
++#line 13 "mif2.c"
+
+ int main()
+ {
diff --git a/tests/multilnnum.exprc b/tests/multilnnum.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/multilnnum.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/multilnnum.sh b/tests/multilnnum.sh
new file mode 100644
index 000000000000..df0953ebc2ef
--- /dev/null
+++ b/tests/multilnnum.sh
@@ -0,0 +1,3 @@
+opts="-DFOO=1 -DFOOB=42 -UBAR -n"
+files="if1.c if2.c"
+. ./multi-generic-sh
diff --git a/tests/multimissing.experr b/tests/multimissing.experr
new file mode 100644
index 000000000000..d31b29f67d00
--- /dev/null
+++ b/tests/multimissing.experr
@@ -0,0 +1,4 @@
+unifdef: can't open mifmissing.c: No such file or directory
+diff: mifmissing.c~: No such file or directory
+diff: mifmissing.c: No such file or directory
+diff: mif2.c~: No such file or directory
diff --git a/tests/multimissing.expout b/tests/multimissing.expout
new file mode 100644
index 000000000000..e130b731ac79
--- /dev/null
+++ b/tests/multimissing.expout
@@ -0,0 +1,22 @@
+--- mif1.c~
++++ mif1.c
+@@ -5,19 +5,9 @@
+ #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()
+ {
diff --git a/tests/multimissing.exprc b/tests/multimissing.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/multimissing.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/multimissing.sh b/tests/multimissing.sh
new file mode 100644
index 000000000000..9c51147863b9
--- /dev/null
+++ b/tests/multimissing.sh
@@ -0,0 +1,3 @@
+opts="-DFOO=1 -DFOOB=42 -UBAR"
+files="if1.c ifmissing.c if2.c"
+. ./multi-generic-sh
diff --git a/tests/multinewline.experr b/tests/multinewline.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/multinewline.experr
diff --git a/tests/multinewline.expout b/tests/multinewline.expout
new file mode 100644
index 000000000000..ff6118e57b6f
--- /dev/null
+++ b/tests/multinewline.expout
@@ -0,0 +1,39 @@
+--- mcrlf.c~
++++ mcrlf.c
+@@ -1,14 +1,4 @@
+-#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
+ \/
+ /\
+ comment
+--- mif1.c~
++++ mif1.c
+@@ -5,18 +5,12 @@
+ #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
++int bar() { return 0; }
+ #endif
+
+ int main()
diff --git a/tests/multinewline.exprc b/tests/multinewline.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/multinewline.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/multinewline.sh b/tests/multinewline.sh
new file mode 100644
index 000000000000..19287a6340f6
--- /dev/null
+++ b/tests/multinewline.sh
@@ -0,0 +1,3 @@
+opts="-DFOO -DF1"
+files="crlf.c if1.c"
+. ./multi-generic-sh
diff --git a/tests/none.c b/tests/none.c
new file mode 100644
index 000000000000..09d66b69ba9f
--- /dev/null
+++ b/tests/none.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/none.experr
diff --git a/tests/none.expout b/tests/none.expout
new file mode 100644
index 000000000000..09d66b69ba9f
--- /dev/null
+++ b/tests/none.expout
@@ -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
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/none.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/none.sh b/tests/none.sh
new file mode 100644
index 000000000000..622f53b28434
--- /dev/null
+++ b/tests/none.sh
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/outdir.experr
diff --git a/tests/outdir.expout b/tests/outdir.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/outdir.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/outdir.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/outdir.sh b/tests/outdir.sh
new file mode 100644
index 000000000000..c2de8547e646
--- /dev/null
+++ b/tests/outdir.sh
@@ -0,0 +1,6 @@
+mkdir -p outdir
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutdir/outfile.c if1.c
+e=$?
+cat outdir/outfile.c
+rm -r outdir
+exit $e
diff --git a/tests/outeperm.experr b/tests/outeperm.experr
new file mode 100644
index 000000000000..bed245174cf6
--- /dev/null
+++ b/tests/outeperm.experr
@@ -0,0 +1 @@
+unifdef: can't create outdir/outfile.c: Permission denied
diff --git a/tests/outeperm.expout b/tests/outeperm.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/outeperm.expout
diff --git a/tests/outeperm.exprc b/tests/outeperm.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/outeperm.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/outeperm.sh b/tests/outeperm.sh
new file mode 100644
index 000000000000..5f5abf0e41bd
--- /dev/null
+++ b/tests/outeperm.sh
@@ -0,0 +1,6 @@
+mkdir -p outdir
+chmod 555 outdir
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutdir/outfile.c if1.c
+e=$?
+rmdir outdir
+exit $e
diff --git a/tests/outfile.experr b/tests/outfile.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/outfile.experr
diff --git a/tests/outfile.expout b/tests/outfile.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/outfile.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/outfile.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/outfile.sh b/tests/outfile.sh
new file mode 100644
index 000000000000..cdae73da9a44
--- /dev/null
+++ b/tests/outfile.sh
@@ -0,0 +1,5 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutfile.c if1.c
+e=$?
+cat outfile.c
+rm outfile.c
+exit $e
diff --git a/tests/outperms.experr b/tests/outperms.experr
new file mode 100644
index 000000000000..a2ef92c4c82d
--- /dev/null
+++ b/tests/outperms.experr
@@ -0,0 +1 @@
+-rw-r-----
diff --git a/tests/outperms.expout b/tests/outperms.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/outperms.expout
@@ -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/outperms.exprc b/tests/outperms.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/outperms.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/outperms.sh b/tests/outperms.sh
new file mode 100644
index 000000000000..9d134620aecd
--- /dev/null
+++ b/tests/outperms.sh
@@ -0,0 +1,7 @@
+umask 027
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutfile.c if1.c
+e=$?
+ls -l outfile.c | cut -d' ' -f1 1>&2
+cat outfile.c
+rm outfile.c
+exit $e
diff --git a/tests/overdir.experr b/tests/overdir.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overdir.experr
diff --git a/tests/overdir.expout b/tests/overdir.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/overdir.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/overdir.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/overdir.sh b/tests/overdir.sh
new file mode 100644
index 000000000000..44124272f6f4
--- /dev/null
+++ b/tests/overdir.sh
@@ -0,0 +1,7 @@
+mkdir -p overdir
+cp if1.c overdir/overwrite.c
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooverdir/overwrite.c overdir/overwrite.c
+e=$?
+cat overdir/overwrite.c
+rm -r overdir
+exit $e
diff --git a/tests/overenoent.experr b/tests/overenoent.experr
new file mode 100644
index 000000000000..f4e962f30651
--- /dev/null
+++ b/tests/overenoent.experr
@@ -0,0 +1 @@
+unifdef: can't create outfile.c: No such file or directory
diff --git a/tests/overenoent.expout b/tests/overenoent.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overenoent.expout
diff --git a/tests/overenoent.exprc b/tests/overenoent.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/overenoent.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/overenoent.sh b/tests/overenoent.sh
new file mode 100644
index 000000000000..9cbf2ab332ac
--- /dev/null
+++ b/tests/overenoent.sh
@@ -0,0 +1,5 @@
+ln -s nonexistent/path outfile.c
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooutfile.c if1.c
+e=$?
+rm -f outfile.c
+exit $e
diff --git a/tests/overin.experr b/tests/overin.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overin.experr
diff --git a/tests/overin.expout b/tests/overin.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/overin.expout
@@ -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/overin.exprc b/tests/overin.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/overin.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/overin.sh b/tests/overin.sh
new file mode 100644
index 000000000000..78eb75ab4b80
--- /dev/null
+++ b/tests/overin.sh
@@ -0,0 +1,6 @@
+cp if1.c overin.c
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooverin.c <overin.c
+e=$?
+cat overin.c
+rm overin.c
+exit $e
diff --git a/tests/overlnnum.experr b/tests/overlnnum.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overlnnum.experr
diff --git a/tests/overlnnum.expout b/tests/overlnnum.expout
new file mode 100644
index 000000000000..c3f5787a98c4
--- /dev/null
+++ b/tests/overlnnum.expout
@@ -0,0 +1,20 @@
+/* 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>
+
+#line 9 "overwrite.c"
+int foo() { return 0; }
+#line 13 "overwrite.c"
+
+#line 17 "overwrite.c"
+int bar() { return 0; }
+#line 21 "overwrite.c"
+
+int main()
+{
+ foo();
+ bar();
+}
diff --git a/tests/overlnnum.exprc b/tests/overlnnum.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/overlnnum.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/overlnnum.sh b/tests/overlnnum.sh
new file mode 100644
index 000000000000..f6090bdc0018
--- /dev/null
+++ b/tests/overlnnum.sh
@@ -0,0 +1,6 @@
+cp if1.c overwrite.c
+unifdef -DFOO=1 -DFOOB=42 -UBAR -n -ooverwrite.c overwrite.c
+e=$?
+cat overwrite.c
+rm overwrite.c
+exit $e
diff --git a/tests/overperms.experr b/tests/overperms.experr
new file mode 100644
index 000000000000..9fc8473109d5
--- /dev/null
+++ b/tests/overperms.experr
@@ -0,0 +1,2 @@
+-rw-r-----
+-rw-r-----
diff --git a/tests/overperms.expout b/tests/overperms.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/overperms.expout
@@ -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/overperms.exprc b/tests/overperms.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/overperms.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/overperms.sh b/tests/overperms.sh
new file mode 100644
index 000000000000..6de7e5341bb4
--- /dev/null
+++ b/tests/overperms.sh
@@ -0,0 +1,9 @@
+cp if1.c outfile.c
+chmod 640 outfile.c
+ls -l outfile.c | cut -d' ' -f1 1>&2
+unifdef -DFOO=1 -DFOOB=42 -UBAR -m outfile.c
+e=$?
+ls -l outfile.c | cut -d' ' -f1 1>&2
+cat outfile.c
+rm outfile.c
+exit $e
diff --git a/tests/overunchanged.experr b/tests/overunchanged.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overunchanged.experr
diff --git a/tests/overunchanged.expout b/tests/overunchanged.expout
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overunchanged.expout
diff --git a/tests/overunchanged.exprc b/tests/overunchanged.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/overunchanged.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/overunchanged.sh b/tests/overunchanged.sh
new file mode 100644
index 000000000000..a4a4c790ee14
--- /dev/null
+++ b/tests/overunchanged.sh
@@ -0,0 +1,8 @@
+cp if1.c overunchanged.c
+ls -i overunchanged.c >overunchanged-before
+unifdef -DWEASEL=1 -ooverunchanged.c overunchanged.c
+e=$?
+ls -i overunchanged.c >overunchanged-after
+diff overunchanged-before overunchanged-after
+rm -f overunchanged-before overunchanged-after overunchanged.c
+exit $e
diff --git a/tests/overwrite.experr b/tests/overwrite.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/overwrite.experr
diff --git a/tests/overwrite.expout b/tests/overwrite.expout
new file mode 100644
index 000000000000..56ae03cc38de
--- /dev/null
+++ b/tests/overwrite.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/overwrite.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/overwrite.sh b/tests/overwrite.sh
new file mode 100644
index 000000000000..8d9a9c7d7ecf
--- /dev/null
+++ b/tests/overwrite.sh
@@ -0,0 +1,6 @@
+cp if1.c overwrite.c
+unifdef -DFOO=1 -DFOOB=42 -UBAR -ooverwrite.c overwrite.c
+e=$?
+cat overwrite.c
+rm overwrite.c
+exit $e
diff --git a/tests/recursive.experr b/tests/recursive.experr
new file mode 100644
index 000000000000..bcb00f76d094
--- /dev/null
+++ b/tests/recursive.experr
@@ -0,0 +1,120 @@
+unifdef: addsym FOO=BAR
+unifdef: addsym BAR=ZIG
+unifdef: addsym ZIG=BAR
+unifdef: addsym QUX=QUX
+unifdef: findsym BAR=ZIG
+unifdef: indir... FOO=BAR
+unifdef: ...ectsym FOO=ZIG
+unifdef: findsym ZIG=BAR
+unifdef: indir... BAR=ZIG
+unifdef: ...ectsym BAR=BAR
+unifdef: findsym BAR=BAR
+unifdef: findsym QUX=QUX
+unifdef: findsym ZIG=BAR
+unifdef: indir... FOO=ZIG
+unifdef: ...ectsym FOO=BAR
+unifdef: findsym BAR=BAR
+unifdef: findsym BAR=BAR
+unifdef: findsym QUX=QUX
+unifdef: findsym BAR=BAR
+unifdef: findsym BAR=BAR
+unifdef: findsym BAR=BAR
+unifdef: findsym QUX=QUX
+unifdef: parser line 1 state C comment START line
+unifdef: process line 1 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 2 state C comment START line
+unifdef: process line 2 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 3 state NO comment START line
+unifdef: process line 3 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 4 state NO comment START line
+unifdef: process line 4 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 5 state NO comment START line
+unifdef: process line 5 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 6 state NO comment START line
+unifdef: process line 6 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 7 state NO comment START line
+unifdef: process line 7 PLAIN -> OUTSIDE depth 0
+unifdef: eval FOO
+
+unifdef: eval0
+unifdef: eval1
+unifdef: eval2
+unifdef: eval3
+unifdef: eval4
+unifdef: eval5
+unifdef: eval6
+unifdef: eval7
+unifdef: eval8
+unifdef: eval9
+unifdef: eval10 symbol
+unifdef: findsym FOO=BAR
+unifdef: eval = 0
+unifdef: parser line 8 state NO comment START line
+unifdef: process line 8 IF -> PASS_MIDDLE depth 1
+unifdef: parser line 9 state NO comment START line
+unifdef: process line 9 PLAIN -> PASS_MIDDLE depth 1
+unifdef: parser line 10 state NO comment START line
+unifdef: process line 10 ELSE -> PASS_ELSE depth 1
+unifdef: parser line 11 state NO comment START line
+unifdef: process line 11 PLAIN -> PASS_ELSE depth 1
+unifdef: parser line 12 state NO comment START line
+unifdef: process line 12 ENDIF -> OUTSIDE depth 0
+unifdef: parser line 13 state NO comment START line
+unifdef: process line 13 PLAIN -> OUTSIDE depth 0
+unifdef: eval BAR
+
+unifdef: eval0
+unifdef: eval1
+unifdef: eval2
+unifdef: eval3
+unifdef: eval4
+unifdef: eval5
+unifdef: eval6
+unifdef: eval7
+unifdef: eval8
+unifdef: eval9
+unifdef: eval10 symbol
+unifdef: findsym BAR=BAR
+unifdef: eval = 0
+unifdef: parser line 14 state NO comment START line
+unifdef: process line 14 IF -> PASS_MIDDLE depth 1
+unifdef: parser line 15 state NO comment START line
+unifdef: process line 15 PLAIN -> PASS_MIDDLE depth 1
+unifdef: eval FOO
+
+unifdef: eval0
+unifdef: eval1
+unifdef: eval2
+unifdef: eval3
+unifdef: eval4
+unifdef: eval5
+unifdef: eval6
+unifdef: eval7
+unifdef: eval8
+unifdef: eval9
+unifdef: eval10 symbol
+unifdef: findsym FOO=BAR
+unifdef: eval = 0
+unifdef: parser line 16 state NO comment START line
+unifdef: process line 16 ELIF -> PASS_MIDDLE depth 1
+unifdef: parser line 17 state NO comment START line
+unifdef: process line 17 PLAIN -> PASS_MIDDLE depth 1
+unifdef: parser line 18 state NO comment START line
+unifdef: process line 18 ELSE -> PASS_ELSE depth 1
+unifdef: parser line 19 state NO comment START line
+unifdef: process line 19 PLAIN -> PASS_ELSE depth 1
+unifdef: parser line 20 state NO comment START line
+unifdef: process line 20 ENDIF -> OUTSIDE depth 0
+unifdef: parser line 21 state NO comment START line
+unifdef: process line 21 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 22 state NO comment START line
+unifdef: process line 22 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 23 state NO comment START line
+unifdef: process line 23 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 24 state NO comment START line
+unifdef: process line 24 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 25 state NO comment START line
+unifdef: process line 25 PLAIN -> OUTSIDE depth 0
+unifdef: parser line 26 state NO comment START line
+unifdef: process line 26 PLAIN -> OUTSIDE depth 0
+unifdef: process line 27 EOF -> OUTSIDE depth 0
diff --git a/tests/recursive.expout b/tests/recursive.expout
new file mode 100644
index 000000000000..9e588c22791c
--- /dev/null
+++ b/tests/recursive.expout
@@ -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/recursive.exprc b/tests/recursive.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/recursive.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/recursive.sh b/tests/recursive.sh
new file mode 100644
index 000000000000..eb857de7e133
--- /dev/null
+++ b/tests/recursive.sh
@@ -0,0 +1 @@
+unifdef -d -DFOO=BAR -DBAR=ZIG -DZIG=BAR -DQUX=QUX if1.c
diff --git a/tests/small1.c b/tests/small1.c
new file mode 100644
index 000000000000..eb1c26d0851c
--- /dev/null
+++ b/tests/small1.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/small1.experr
diff --git a/tests/small1.expout b/tests/small1.expout
new file mode 100644
index 000000000000..b64cfc265bd2
--- /dev/null
+++ b/tests/small1.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/small1.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/small1.sh b/tests/small1.sh
new file mode 100644
index 000000000000..b948726042ec
--- /dev/null
+++ b/tests/small1.sh
@@ -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
index 000000000000..4a5c813cb0f4
--- /dev/null
+++ b/tests/small2.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/small2.experr
diff --git a/tests/small2.expout b/tests/small2.expout
new file mode 100644
index 000000000000..5c1f8b4f23f0
--- /dev/null
+++ b/tests/small2.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/small2.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/small2.sh b/tests/small2.sh
new file mode 100644
index 000000000000..fdedd7d88f2e
--- /dev/null
+++ b/tests/small2.sh
@@ -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
index 000000000000..947dacf55fa1
--- /dev/null
+++ b/tests/spaces1.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/spaces1.experr
diff --git a/tests/spaces1.expout b/tests/spaces1.expout
new file mode 100644
index 000000000000..766f2358b55e
--- /dev/null
+++ b/tests/spaces1.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/spaces1.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces1.sh b/tests/spaces1.sh
new file mode 100644
index 000000000000..e5ef62bc65bb
--- /dev/null
+++ b/tests/spaces1.sh
@@ -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
index 000000000000..f5a250a1ee69
--- /dev/null
+++ b/tests/spaces2.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/spaces2.experr
diff --git a/tests/spaces2.expout b/tests/spaces2.expout
new file mode 100644
index 000000000000..7d377599b7c3
--- /dev/null
+++ b/tests/spaces2.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/spaces2.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces2.sh b/tests/spaces2.sh
new file mode 100644
index 000000000000..cb80f89d5b75
--- /dev/null
+++ b/tests/spaces2.sh
@@ -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
index 000000000000..7284634a2968
--- /dev/null
+++ b/tests/spaces3.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/spaces3.experr
diff --git a/tests/spaces3.expout b/tests/spaces3.expout
new file mode 100644
index 000000000000..60aceee7571d
--- /dev/null
+++ b/tests/spaces3.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/spaces3.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces3.sh b/tests/spaces3.sh
new file mode 100644
index 000000000000..0bce1847ab0c
--- /dev/null
+++ b/tests/spaces3.sh
@@ -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
index 000000000000..6fbc6f239891
--- /dev/null
+++ b/tests/spaces4.c
@@ -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
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/spaces4.experr
diff --git a/tests/spaces4.expout b/tests/spaces4.expout
new file mode 100644
index 000000000000..fbf0d3cba46b
--- /dev/null
+++ b/tests/spaces4.expout
@@ -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
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/spaces4.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/spaces4.sh b/tests/spaces4.sh
new file mode 100644
index 000000000000..1390ab7870ac
--- /dev/null
+++ b/tests/spaces4.sh
@@ -0,0 +1 @@
+unifdef -DFOO=1 -DFOOB=42 -UBAR spaces4.c
diff --git a/tests/whitespace-1.experr b/tests/whitespace-1.experr
new file mode 100644
index 000000000000..6c7d2adb314a
--- /dev/null
+++ b/tests/whitespace-1.experr
@@ -0,0 +1,2 @@
+unifdef: whitespace.c: 3: Obfuscated preprocessor control line (#if line 1 depth 1)
+unifdef: Output may be truncated
diff --git a/tests/whitespace-1.expout b/tests/whitespace-1.expout
new file mode 100644
index 000000000000..257cc5642cb1
--- /dev/null
+++ b/tests/whitespace-1.expout
@@ -0,0 +1 @@
+foo
diff --git a/tests/whitespace-1.exprc b/tests/whitespace-1.exprc
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/tests/whitespace-1.exprc
@@ -0,0 +1 @@
+2
diff --git a/tests/whitespace-1.sh b/tests/whitespace-1.sh
new file mode 100644
index 000000000000..51ad39bc1768
--- /dev/null
+++ b/tests/whitespace-1.sh
@@ -0,0 +1 @@
+unifdef -DFOO whitespace.c
diff --git a/tests/whitespace-2.experr b/tests/whitespace-2.experr
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tests/whitespace-2.experr
diff --git a/tests/whitespace-2.expout b/tests/whitespace-2.expout
new file mode 100644
index 000000000000..84cabfea1056
--- /dev/null
+++ b/tests/whitespace-2.expout
@@ -0,0 +1,5 @@
+#ifdef FOO
+foo
+#endif //spong
+
+bar
diff --git a/tests/whitespace-2.exprc b/tests/whitespace-2.exprc
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/tests/whitespace-2.exprc
@@ -0,0 +1 @@
+1
diff --git a/tests/whitespace-2.sh b/tests/whitespace-2.sh
new file mode 100644
index 000000000000..1aa178b5e071
--- /dev/null
+++ b/tests/whitespace-2.sh
@@ -0,0 +1 @@
+unifdef -DBAR whitespace.c
diff --git a/tests/whitespace.c b/tests/whitespace.c
new file mode 100644
index 000000000000..de0b9e4be176
--- /dev/null
+++ b/tests/whitespace.c
@@ -0,0 +1,7 @@
+#ifdef FOO
+foo
+#endif //spong
+
+#ifdef BAR
+bar
+#endif \ No newline at end of file
diff --git a/tests/xterm.experr b/tests/xterm.experr
new file mode 100644
index 000000000000..7938dcdde861
--- /dev/null
+++ b/tests/xterm.experr
@@ -0,0 +1,3 @@
+0
+1
+0
diff --git a/tests/xterm.expout b/tests/xterm.expout
new file mode 100644
index 000000000000..d05d26545dbb
--- /dev/null
+++ b/tests/xterm.expout
@@ -0,0 +1,83 @@
+#define RES_OFFSET(field) XtOffsetOf(XTERM_RESOURCE, field)
+#include <xterm.h>
+#include <version.h>
+#include <X11/cursorfont.h>
+#include <X11/Xlocale.h>
+#include <pwd.h>
+#include <ctype.h>
+#include <data.h>
+#include <error.h>
+#include <menu.h>
+#include <main.h>
+#include <xstrings.h>
+#include <xtermcap.h>
+#include <xterm_io.h>
+#include <sys/stat.h>
+#include <sys/resource.h>
+#define HAS_BSD_GROUPS
+#include <sys/param.h> /* for NOFILE */
+#define WTMP
+#include <stdio.h>
+#define UTMP_STR utmp
+#include <libutil.h> /* openpty() */
+#include <signal.h>
+#include <sys/wait.h>
+#define TERMCAP_ERASE "kb"
+#define VAL_INITIAL_ERASE A2E(8)
+#define VAL_LINE_SPEED B38400
+#define TERMIO_STRUCT struct termios
+#define ttySetAttr(fd, datap) tcsetattr(fd, TCSANOW, datap)
+#define ttyGetAttr(fd, datap) tcgetattr(fd, datap)
+#define ttyFlush(fd) tcflush(fd, TCOFLUSH)
+#define TTYMODE(name) { name, sizeof(name)-1, 0, 0 }
+#define XTTYMODE_intr 0
+#define XTTYMODE_quit 1
+#define XTTYMODE_erase 2
+#define XTTYMODE_kill 3
+#define XTTYMODE_eof 4
+#define XTTYMODE_eol 5
+#define XTTYMODE_swtch 6
+#define XTTYMODE_start 7
+#define XTTYMODE_stop 8
+#define XTTYMODE_brk 9
+#define XTTYMODE_susp 10
+#define XTTYMODE_dsusp 11
+#define XTTYMODE_rprnt 12
+#define XTTYMODE_flush 13
+#define XTTYMODE_weras 14
+#define XTTYMODE_lnext 15
+#define XTTYMODE_status 16
+#define XTTYMODE_erase2 17
+#define XTTYMODE_eol2 18
+#define validTtyChar(data, n) \
+#define TMODE(ind,var) if (ttymodelist[ind].set) var = (cc_t) ttymodelist[ind].value
+#include <X11/Xmu/SysUtil.h> /* XmuGetHostname */
+#define MIT_CONSOLE_LEN 12
+#define MIT_CONSOLE "MIT_CONSOLE_"
+#define SetUtmpHost(dst, screen) \
+{"#", ".iconGeometry",XrmoptionStickyArg, (XPointer) NULL},
+{ "#geom", "icon window geometry" },
+ TRACE(("...decode_keyvalue %#x\n", value));
+#define isOption(string) (Boolean)((string)[0] == '-' || (string)[0] == '+')
+#define DATA(option,kind) { option, NULL, kind, (XtPointer) NULL }
+#undef DATA
+#define ITEM(n) ((Cardinal)(n) < XtNumber(optionDescList) \
+#undef ITEM
+#define disableSetUid() /* nothing */
+#define disableSetGid() /* nothing */
+#define DATA(name) { #name, es##name }
+#undef DATA
+#define USE_OPENPTY 1
+#define NO_FDS {-1, -1}
+#define TRACE_HANDSHAKE(tag, data) /* nothing */
+ TRACE(("set_owner(%s, uid=%d, gid=%d, mode=%#o\n",
+ TRACE(("...stat uid=%d, gid=%d, mode=%#o\n",
+#define close_fd(fd) close(fd), fd = -1
+#define USE_NO_DEV_TTY 1
+ if ((ptr1 = x_strindex(oldtc, "co#")) == NULL) {
+ strcat(oldtc, "co#80:");
+ ptr1 = x_strindex(oldtc, "co#");
+ if ((ptr2 = x_strindex(oldtc, "li#")) == NULL) {
+ strcat(oldtc, "li#24:");
+ ptr2 = x_strindex(oldtc, "li#");
+ TRACE(("...parsed #%d: %s=%#x\n", count, mp->name, c));
diff --git a/tests/xterm.exprc b/tests/xterm.exprc
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/tests/xterm.exprc
@@ -0,0 +1 @@
+0
diff --git a/tests/xterm.sh b/tests/xterm.sh
new file mode 100644
index 000000000000..88c856bceef4
--- /dev/null
+++ b/tests/xterm.sh
@@ -0,0 +1,35 @@
+# hacks so we don't have to distribute huge chunks of XTerm
+
+if [ ! -f xterm-really ]
+then
+ cat xterm.expout
+ cat xterm.experr 1>&2
+ exit $(cat xterm.exprc)
+fi
+if [ -f xterm-clean ]
+then
+ rm xterm.tar.gz xterm-defs.h xterm-main.c
+fi
+
+if [ ! -f xterm.tar.gz ]
+then
+ wget -q http://invisible-island.net/datafiles/release/xterm.tar.gz
+fi
+if [ ! -f xterm-main.c ]
+then
+ tar xf xterm.tar.gz
+ cd xterm-[0-9][0-9][0-9]
+ gcc -I/usr/X11R6/include -I. -E -dM \
+ main.c > ../xterm-defs.h
+ cat main.c > ../xterm-main.c
+ cd ..
+ rm -r xterm-[0-9][0-9][0-9]
+fi
+
+unifdef -s xterm-main.c | sed 's/^/#undef /' >xterm-undefs.h
+echo $? 1>&2
+unifdef -f xterm-undefs.h -f xterm-defs.h xterm-main.c >xterm-out.c
+echo $? 1>&2
+grep '#' xterm-out.c
+echo $? 1>&2
+rm -f xterm-undefs.h xterm-out.c