acmecert: Fix cryptography bugs.
[utils.git] / sztest
diff --git a/sztest b/sztest
index fd7505c..9ca4e1f 100755 (executable)
--- a/sztest
+++ b/sztest
@@ -1,21 +1,40 @@
-#!/bin/sh
+#!/bin/bash
 
-if [ $# -lt 1 ]; then
-    echo "usage: sztest [-H HEADER] TYPE [CCFLAGS...]" >&2
-    exit 1
-fi
+usage() {
+    echo "usage: sztest [-hab] [-H SYS-HEADER] [-L LOCAL-HEADER] TYPE [CCFLAGS...]"
+}
 
-headers=
+mode=size
+sheaders=
+lheaders=
 while [ "${1:0:1}" = "-" ]; do
     opt="$1"
     shift
     case "$opt" in
+       "-h")
+           usage
+           exit 0
+           ;;
+       "-a")
+           mode=align
+           ;;
+       "-b")
+           mode=both
+           ;;
        "-H")
-           headers="$headers $1"
+           sheaders="$sheaders $1"
+           shift
+           ;;
+       "-L")
+           lheaders="$lheaders $1"
            shift
            ;;
     esac
 done
+if [ $# -lt 1 ]; then
+    usage >&2
+    exit 1
+fi
 type="$1"
 shift
 file="$(mktemp /tmp/sztestXXXXXX)"
@@ -26,18 +45,33 @@ cat >"$file.c" <<EOF
 #include <unistd.h>
 #include <sys/stat.h>
 EOF
-for header in $headers; do
+for header in $sheaders; do
     echo "#include <$header>" >>"$file.c"
 done
+for header in $lheaders; do
+    echo "#include \"$header\"" >>"$file.c"
+done
 cat >>"$file.c" <<EOF
 int main(int argc, char **argv)
 {
-    printf("%zi\n", sizeof($type));
+EOF
+case "$mode" in
+    size)
+       echo "    printf(\"%zi\\n\", sizeof($type));" >>"$file.c"
+       ;;
+    align)
+       echo "    printf(\"%zi\\n\", __alignof__($type));" >>"$file.c"
+       ;;
+    both)
+       echo "    printf(\"%zi %zi\\n\", sizeof($type), __alignof__($type));" >>"$file.c"
+       ;;
+esac
+cat >>"$file.c" <<EOF
     return(0);
 }
 EOF
 
-if ! gcc "$@" -g -Wall -o "$file" "$file.c"; then
+if ! gcc "$@" -iquote. -g -Wall -o "$file" "$file.c"; then
     rm -f "$file" "$file.c"
     exit 1
 fi