]>
Commit | Line | Data |
---|---|---|
563f4f96 A |
1 | #!/usr/bin/perl |
2 | # | |
d8f41ccd | 3 | # Copyright (c) 2003-2004,2006,2008,2012,2014 Apple Inc. All Rights Reserved. |
563f4f96 A |
4 | # |
5 | # @APPLE_LICENSE_HEADER_START@ | |
6 | # | |
7 | # This file contains Original Code and/or Modifications of Original Code | |
8 | # as defined in and that are subject to the Apple Public Source License | |
9 | # Version 2.0 (the 'License'). You may not use this file except in | |
10 | # compliance with the License. Please obtain a copy of the License at | |
11 | # http://www.opensource.apple.com/apsl/ and read it before using this | |
12 | # file. | |
13 | # | |
14 | # The Original Code and all software distributed under the License are | |
15 | # distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
16 | # EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
17 | # INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
18 | # FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
19 | # Please see the License for the specific language governing rights and | |
20 | # limitations under the License. | |
21 | # | |
22 | # @APPLE_LICENSE_HEADER_END@ | |
23 | # | |
f380ce78 | 24 | # generateErrStrings.pl - create error strings files from the Security header files |
563f4f96 A |
25 | # |
26 | # Usage: | |
563f4f96 | 27 | # |
f380ce78 A |
28 | # perl generateErrStrings.pl <GENDEBUGSTRS?> <NAME_OF_STRINGS_FILE> <input files> |
29 | # | |
30 | # Currently supported files are SecBase.h, SecureTransport.h,cssmapple.h, | |
31 | # cssmerr.h and Authorization.h. These are used by: | |
32 | # | |
33 | # void cssmPerror(const char *how, CSSM_RETURN error); | |
34 | # | |
35 | # which is in SecBase.cpp. | |
36 | # | |
37 | # Paths of input files: | |
38 | # | |
39 | # ./libsecurity_authorization/lib/Authorization.h | |
40 | # ./libsecurity_cssm/lib/cssmapple.h | |
41 | # ./libsecurity_cssm/lib/cssmerr.h | |
42 | # ./libsecurity_keychain/lib/SecBase.h | |
43 | # ./libsecurity_ssl/lib/SecureTransport.h | |
44 | # | |
45 | # Sample run: | |
46 | # | |
47 | # perl generateErrStrings.pl "YES" "SecErrorMessages.strings" Authorization.h SecBase.h \ | |
48 | # cssmapple.h cssmerr.h SecureTransport.h | |
49 | # | |
50 | # Input to script: header file(s) containing enum declarations | |
51 | # Output: C++ program with one cout statement per decl | |
52 | # | |
53 | # The input headers are scanned for enums containing error numbers and | |
54 | # optional comments. Only certain prefixes for the identifiers in the | |
55 | # enums are considered, to avoid non-error message type defines. See | |
56 | # the line in the file with CSSM_ERRCODE for acceptable prefixes. | |
563f4f96 | 57 | # |
f380ce78 | 58 | # There are three styles of comments that this script parses: |
563f4f96 | 59 | # |
f380ce78 | 60 | # Style A [see /System/Library/Frameworks/Security.framework/Headers/SecBase.h]: |
563f4f96 A |
61 | # |
62 | # errSSLProtocol = -9800, /* SSL protocol error */ | |
563f4f96 | 63 | # |
f380ce78 A |
64 | # Style B [see /System/Library/Frameworks/Security.framework/Headers/cssmapple.h]: |
65 | # | |
66 | # /* a code signature match failed */ | |
67 | # CSSMERR_CSP_APPLE_SIGNATURE_MISMATCH = CSSM_CSP_PRIVATE_ERROR + 2, | |
68 | # | |
69 | # Style C [see /System/Library/Frameworks/Security.framework/Headers/cssmerr.h]: | |
70 | # | |
71 | # CSSM_CSSM_BASE_CSSM_ERROR = | |
72 | # CSSM_CSSM_BASE_ERROR + CSSM_ERRORCODE_COMMON_EXTENT + 0x10, | |
73 | # CSSMERR_CSSM_SCOPE_NOT_SUPPORTED = CSSM_CSSM_BASE_CSSM_ERROR + 1, | |
74 | # | |
ecaf5866 | 75 | # Style A has the comment after the value. Style has the comment before the value, |
f380ce78 A |
76 | # and Style C has no comment. In cases where both Style A and B apply, the |
77 | # comment at the end of the line is used. | |
78 | # | |
79 | # The final output after the generated Objective-C++ program is run looks like: | |
563f4f96 A |
80 | # |
81 | # /* errSSLProtocol */ | |
82 | # "-9800" = "SSL protocol error"; | |
83 | # | |
84 | # /* errSSLNegotiation */ | |
85 | # "-9801" = "Cipher Suite negotiation failure"; | |
86 | # | |
f380ce78 A |
87 | # The appropriate byte order marker for UTF-16 is written to the start of the file. |
88 | # Note that the list of errors must be numerically unique across all input files, | |
89 | # or the strings file will be invalid. Comments in "Style B" may span multiple lines. | |
993ca007 A |
90 | # C++ style comments are not supported. Double quotes in a comment are hardened with |
91 | # "\" in the output. | |
f380ce78 A |
92 | # |
93 | # The English versions of the error messages can be seen with: | |
563f4f96 | 94 | # |
b54c578e | 95 | # cat /System/Library/Frameworks/Security.framework/Resources/en.lproj/SecErrorMessages.strings |
f380ce78 A |
96 | # |
97 | # find -H -X -x . -name "*.h" -print0 2>/dev/null | xargs -0 grep -ri err | |
98 | # ----------------------------------------------------------------------------------- | |
563f4f96 | 99 | |
f380ce78 A |
100 | # Style questions: |
101 | # - what should I make PROGNAME? | |
102 | # - should I use a special call to make the temp file in the .mm file? | |
103 | # | |
563f4f96 | 104 | |
f380ce78 A |
105 | #use strict; |
106 | #use warnings; | |
563f4f96 | 107 | |
f380ce78 A |
108 | die "Usage: $0 <gendebug> <tmpdir> <.strings file> <list of headers>\n" if ($#ARGV < 3); |
109 | ||
110 | $GENDEBUGSTRINGS=$ARGV[0]; # If "YES", include all strings & don't localize | |
111 | $TMPDIR=$ARGV[1]; # temporary directory for program compile, link, run | |
112 | $TARGETSTR=$ARGV[2]; # path of .strings file, e.g. | |
b54c578e | 113 | # ${DERIVED_SRC}/en.lproj/SecErrorMessages.strings |
f380ce78 A |
114 | @INPUTFILES=@ARGV[3 .. 9999]; # list of input files |
115 | ||
116 | $#INPUTFILES = $#ARGV - 3; # truncate to actual number of files | |
117 | ||
118 | print "gend: $GENDEBUGSTRINGS, tmpdir: $TMPDIR, targetstr: $TARGETSTR\n"; | |
ecaf5866 A |
119 | open STRINGFILE, "> $TARGETSTR" or die "can't open $TARGETSTR: $!"; |
120 | select STRINGFILE; | |
121 | binmode STRINGFILE, ":encoding(UTF-16)"; | |
f380ce78 A |
122 | |
123 | # ----------------------------------------------------------------------------------- | |
124 | # Parse error headers and build array of all relevant lines | |
125 | open(ERR, "cat " . join(" ", @INPUTFILES) . "|") or die "Cannot open error header files"; | |
126 | $/="\};"; #We set the section termination string - very important | |
127 | processInput(); | |
563f4f96 | 128 | close(ERR); |
f380ce78 | 129 | # ----------------------------------------------------------------------------------- |
563f4f96 | 130 | |
f380ce78 A |
131 | # 4: Done! |
132 | exit; | |
133 | ||
134 | # ----------------------------------------------------------------------------------- | |
135 | # Subroutines | |
136 | # ----------------------------------------------------------------------------------- | |
137 | ||
138 | sub processInput | |
139 | { | |
ecaf5866 A |
140 | # 3: Read input, process each line, output it. |
141 | while ( $line = <ERR>) | |
142 | { | |
143 | ($enum) = ($line =~ /\n\s*(?:enum|CF_ENUM\(OSStatus\))\s*{\s*([^}]*)};/); | |
144 | while ($enum ne '') #basic filter for badly formed enums | |
145 | { | |
146 | #Drop leading whitespace | |
147 | $enum =~ s/^\s+//; | |
148 | ||
149 | ($leadingcomment) = ($enum =~ m%^(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)%); | |
150 | if ($leadingcomment ne '') | |
151 | { | |
152 | $enum = substr($enum, length($leadingcomment)); | |
153 | $leadingcomment = substr($leadingcomment, 2); # drop leading "/*" | |
154 | $leadingcomment = substr($leadingcomment, 0, -2); # drop trailing "*/" | |
155 | $leadingcomment = cleanupComment($leadingcomment); | |
156 | } | |
157 | next if ($enum eq ''); #basic filter for badly formed enums | |
158 | ||
159 | # Check for C++ style comments at start of line | |
160 | if ($enum =~ /\s*(\/\/)/) | |
161 | { | |
162 | #Drop everything before the end of line | |
163 | $enum =~ s/[^\n]*[\n]*//; | |
164 | next; | |
165 | } | |
166 | ($identifier) = ($enum =~ /\s*([_A-Za-z][_A-Za-z0-9]*)/); | |
167 | #print "identifier: ", $identifier,"\n" if ($identifier ne ''); | |
168 | ||
169 | ($value) = ($enum =~ /\s*[_A-Za-z][_A-Za-z0-9]*\s*=\s*(-?[0-9]*),/); | |
170 | #print "value: ", $value,"\n" if ($value ne ''); | |
171 | ||
172 | #Drop everything before the comma, end of line or trailing comment | |
866f8763 | 173 | $enum =~ s/[^,]*(,|\n|(\/\*))//; |
ecaf5866 A |
174 | |
175 | # Now look for trailing comment. We only consider them | |
176 | # trailing if they come before the end of the line | |
177 | ($trailingcomment) = ($enum =~ /^[ \t]*\/\*((.)*)?\*\//); | |
178 | $trailingcomment = cleanupComment($trailingcomment); | |
179 | ||
180 | #Drop everything before the end of line | |
181 | $enum =~ s/[^\n]*[\n]*//; | |
182 | ||
183 | #print "lc:$leadingcomment, id:$identifier, v:$value, tc:$trailingcomment\n"; | |
184 | #print "===========================================\n"; | |
185 | ||
186 | writecomment($leadingcomment, $identifier, $trailingcomment, $value); | |
187 | } | |
188 | } | |
f380ce78 A |
189 | } |
190 | ||
191 | sub writecomment | |
563f4f96 | 192 | { |
f380ce78 A |
193 | # Leading comment, id, trailing comment |
194 | # To aid localizers, we will not output a line with no comment | |
195 | # | |
196 | # Output is e.g. | |
197 | # tmp << "/* errAuthorizationSuccess */\n\"" << errAuthorizationSuccess | |
198 | # << "\" = \"The operation completed successfully.\"\n" << endl; | |
199 | ||
ecaf5866 | 200 | my($mylc,$myid,$mytc,$myvalue) = @_; |
f380ce78 A |
201 | if ($myid =~ /(CSSM_ERRCODE|CSSMERR_|errSec|errCS|errAuth|errSSL)[_A-Za-z][_A-Za-z0-9]*/) |
202 | { | |
203 | $errormessage = ''; | |
204 | if ($mytc ne '') | |
205 | { $errormessage = $mytc; } | |
206 | elsif ($mylc ne '') | |
207 | { $errormessage = $mylc; } | |
208 | elsif ($GENDEBUGSTRINGS eq "YES") | |
209 | { $errormessage = $myid; } | |
210 | ||
211 | if ($errormessage ne '') | |
212 | { | |
ecaf5866 A |
213 | print "/* ", $myid, " */\n\""; |
214 | print $myvalue, "\" = \""; | |
215 | print $errormessage, "\";\n\n"; | |
f380ce78 A |
216 | } |
217 | } | |
563f4f96 | 218 | }; |
563f4f96 | 219 | |
f380ce78 A |
220 | sub cleanupComment |
221 | { | |
222 | my $comment = shift @_; | |
223 | # print "A:",$comment,"\n"; | |
224 | if ($comment ne '') | |
225 | { | |
226 | $comment =~ s/\s\s+/ /g; # Squeeze multiple spaces to one | |
227 | $comment =~ s/^\s+//; # Drop leading whitespace | |
228 | $comment =~ s/\s+$//; # Drop trailing whitespace | |
ecaf5866 | 229 | $comment =~ s/[\"]/\\\"/g; # Replace double quotes with \" (backslash is sextupled to make it through regex and printf) |
f380ce78 A |
230 | } |
231 | # print "B:",$comment,"\n"; | |
232 | $comment; | |
f380ce78 | 233 | } |