]> git.saurik.com Git - apple/security.git/blame - OSX/libsecurity_cdsa_utilities/lib/generator.pl
Security-58286.41.2.tar.gz
[apple/security.git] / OSX / libsecurity_cdsa_utilities / lib / generator.pl
CommitLineData
b1ab9ed8
A
1#!/usr/bin/perl
2#
3# generator.pl - derive various and sundry C++ code from the CDSA header files
4#
5# Usage:
6# perl generator.pl input-directory output-directory
7#
8# Perry The Cynic, Fall 1999.
9#
10$ERR_H="cssmerr.h";
11$APPLE_ERR_H="cssmapple.h";
12
13$SOURCEDIR=$ARGV[0]; # directory with cdsa headers
14$TARGETDIR=$ARGV[1]; # where to put the output file
15@INPUTFILES=@ARGV[2 .. 9999]; # list of input files
16
17$TABLES="$TARGETDIR/errorcodes.gen"; # error name tables
18
19$tabs = "\t\t\t"; # argument indentation (noncritical)
20$warning = "This file was automatically generated. Do not edit on penalty of futility!";
21
22
23#
24# Parse CSSM error header and build table of all named codes
25#
26open(ERR, "$SOURCEDIR/$ERR_H") or die "Cannot open $ERR_H: $^E";
27open(APPLE_ERR, "$SOURCEDIR/$APPLE_ERR_H") or die "Cannot open $APPLE_ERR_H: $^E";
28$/=undef; # big gulp mode
29$errors = <ERR> . <APPLE_ERR>;
30close(ERR); close(APPLE_ERR);
31
32@fullErrors = $errors =~ /^\s+CSSMERR_([A-Z_]+)/gm;
33@convertibles = $errors =~ /^\s+CSSM_ERRCODE_([A-Z_]+)\s*=\s*([0-9xXA-Fa-f]+)/gm;
34
35while ($name = shift @convertibles) {
36 $value = shift @convertibles or die;
37 $convErrors[hex $value] = $name;
38};
39
40
41#
42# Read Keychain-level headers for more error codes (errSecBlahBlah)
43#
44open(ERR, "cat " . join(" ", @INPUTFILES) . "|") or die "Cannot open error header files";
45$/=undef; # still gulping
46$_ = <ERR>;
47@kcerrors = /err((?:Sec|Authorization)\w+)\s*=\s*-?\d+/gm;
48close(ERR);
49
50
51#
52# Now we will generate the error name tables.
53#
54open(OUT, ">$TABLES") or die "Cannot write $TABLES: $^E";
55select OUT;
56
57print <<HDR;
58//
59// CSSM error code tables.
60// $warning
61//
62static const Mapping errorList[] = {
63HDR
64foreach $name (@fullErrors) {
65 print " { CSSMERR_$name, \"$name\" },\n";
66};
67foreach $err (@kcerrors) {
68 print " { err$err, \"$err\" },\n";
69};
70print <<MID;
71};
72
73static const char * const convErrorList [] = {
74MID
75for ($n = 0; $n <= $#convErrors; $n++) {
76 if ($name = $convErrors[$n]) {
77 print " \"$name\",\n";
78 } else {
79 print " NULL,\n";
80 };
81};
82print "};\n";
83
84close(OUT);
85select(STDOUT);
86
87$nFull = $#fullErrors + 1;
88$nConv = $#convertibles + 1;
89print "$nFull errors available to error translation functions.\n";