]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_cdsa_utilities/lib/generator.pl
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_cdsa_utilities / lib / generator.pl
diff --git a/OSX/libsecurity_cdsa_utilities/lib/generator.pl b/OSX/libsecurity_cdsa_utilities/lib/generator.pl
new file mode 100644 (file)
index 0000000..1b3fd9a
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/perl
+#
+# generator.pl - derive various and sundry C++ code from the CDSA header files
+#
+# Usage:
+#      perl generator.pl input-directory output-directory
+#
+# Perry The Cynic, Fall 1999.
+#
+$ERR_H="cssmerr.h";
+$APPLE_ERR_H="cssmapple.h";
+
+$SOURCEDIR=$ARGV[0];                                           # directory with cdsa headers
+$TARGETDIR=$ARGV[1];                                           # where to put the output file
+@INPUTFILES=@ARGV[2 .. 9999];                          # list of input files
+
+$TABLES="$TARGETDIR/errorcodes.gen";           # error name tables
+
+$tabs = "\t\t\t";      # argument indentation (noncritical)
+$warning = "This file was automatically generated. Do not edit on penalty of futility!";
+
+
+#
+# Parse CSSM error header and build table of all named codes
+#
+open(ERR, "$SOURCEDIR/$ERR_H") or die "Cannot open $ERR_H: $^E";
+open(APPLE_ERR, "$SOURCEDIR/$APPLE_ERR_H") or die "Cannot open $APPLE_ERR_H: $^E";
+$/=undef;      # big gulp mode
+$errors = <ERR> . <APPLE_ERR>;
+close(ERR); close(APPLE_ERR);
+
+@fullErrors = $errors =~ /^\s+CSSMERR_([A-Z_]+)/gm;
+@convertibles = $errors =~ /^\s+CSSM_ERRCODE_([A-Z_]+)\s*=\s*([0-9xXA-Fa-f]+)/gm;
+
+while ($name = shift @convertibles) {
+  $value = shift @convertibles or die;
+  $convErrors[hex $value] = $name;
+};
+
+
+#
+# Read Keychain-level headers for more error codes (errSecBlahBlah)
+#
+open(ERR, "cat " . join(" ", @INPUTFILES) . "|") or die "Cannot open error header files";
+$/=undef;      # still gulping
+$_ = <ERR>;
+@kcerrors = /err((?:Sec|Authorization)\w+)\s*=\s*-?\d+/gm;
+close(ERR);
+
+
+#
+# Now we will generate the error name tables.
+#
+open(OUT, ">$TABLES") or die "Cannot write $TABLES: $^E";
+select OUT;
+
+print <<HDR;
+//
+// CSSM error code tables.
+// $warning
+//
+static const Mapping errorList[] = {
+HDR
+foreach $name (@fullErrors) {
+  print "  { CSSMERR_$name, \"$name\" },\n";
+};
+foreach $err (@kcerrors) {
+  print "  { err$err, \"$err\" },\n";
+};
+print <<MID;
+};
+
+static const char * const convErrorList [] = {
+MID
+for ($n = 0; $n <= $#convErrors; $n++) {
+  if ($name = $convErrors[$n]) {
+    print "  \"$name\",\n";
+  } else {
+    print "  NULL,\n";
+  };
+};
+print "};\n";
+
+close(OUT);
+select(STDOUT);
+
+$nFull = $#fullErrors + 1;
+$nConv = $#convertibles + 1;
+print "$nFull errors available to error translation functions.\n";