--- /dev/null
+#n
+# Checks for key bits in English declarations. This file is itself parsed
+# to determine the things checked for: lines containing "=yes" are assumed
+# to be variables to be tested, and must be followed by a # and a comment
+# stating the feature being tested.
+#
+# Copyright © 2012 Nick Bowler
+#
+# License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+# This is free software: you are free to do what the fuck you want to.
+# There is NO WARRANTY, to the extent permitted by law.
+10000q
+/^declare/i\
+declaration=yes # declaration of an identifier
+/^type/i\
+abstract=yes # type name
+/inline/i\
+inline=yes # inline function
+/inline inline/i\
+redundant_funcspec=yes # redundant function specifiers
+/function ([[:alnum:]_]* as/i\
+named_parameter=yes # named function parameter
+/function (void)/i\
+empty_prototype=yes # empty prototype declaration
+/function returning/i\
+non_prototype=yes # non-prototype function declaration.
+/\.\.\.)/i\
+variadic=yes # variadic function
+/const/i\
+const=yes # const qualifier
+/volatile/i\
+volatile=yes # volatile qualifier
+/restrict/i\
+restrict=yes # restrict qualifier
+/const const/i\
+redundant_qualifier=yes # redundant type qualifiers
+/variable-length array/i\
+vla=yes # variable-length array
+/static/i\
+static=yes # static storage-class specifier
+/extern/i\
+extern=yes # extern storage-class specifier
+/typedef/i\
+typedef=yes # typedef storage-class specifier
+/auto/i\
+auto=yes # auto storage-class specifier
+/register/i\
+register=yes # register storage-class specifier
+/void/i\
+void=yes # void type specifier
+/char/i\
+char=yes # char type specifier
+/short/i\
+short=yes # short type specifier
+/int/i\
+int=yes # int type specifier
+/long/i\
+long=yes # long type specifier
+/float/i\
+float=yes # float type specifier
+/double/i\
+double=yes # double type specifier
+/signed/i\
+signed=yes # signed type specifier
+/unsigned/i\
+unsigned=yes # unsigned type specifier
+/_Bool/i\
+bool=yes # _Bool type specifier
+/_Complex/i\
+complex=yes # _Complex type specifier
+/_Imaginary/i\
+imaginary=yes # _Imaginary type specifier
+/struct/i\
+struct=yes # struct type specifier
+/union/i\
+union=yes # union type specifier
+/enum/i\
+enum=yes # enum type specifier
+/pointer to array/i\
+pointer_to_array=yes # pointer to an array
+/pointer to function/i\
+pointer_to_function=yes # pointer to a function
--- /dev/null
+#!/bin/sh
+#
+# Copyright © 2012 Nick Bowler
+#
+# Check randomdecl's output to make sure it actually generates a variety
+# of declarations.
+#
+# License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+# This is free software: you are free to do what the fuck you want to.
+# There is NO WARRANTY, to the extent permitted by law.
+
+randomdecl=test/randomdecl$EXEEXT
+test -x $randomdecl || exit 77
+
+proc() {
+ sed -f tests/randomdecl-sanity.sed || { echo "result=fail"; return 1; }
+}
+
+printf '%s: randomized test using RANDOMSEED=%d\n' "$0" "$RANDOMSEED"
+
+result=pass
+eval_cmd=`exec 3>&1
+ { $randomdecl -E -s "$RANDOMSEED" 3>&-
+ echo gen_status=$? >&3
+ } | proc >&3`
+eval "$eval_cmd"
+
+eval_cmd=`sed -ne 's/^\(.*\)=yes #\(.*\)$/\
+ test x"$\1" = x"yes" || { echo no \2; result=fail; }/p' \
+ tests/randomdecl-sanity.sed`
+eval "$eval_cmd"
+
+if test x"$result" != x"pass"; then
+ printf '%s: test failed\n' "$0"
+ exit 1
+fi