diff options
author | beck <> | 2002-05-15 02:29:21 +0000 |
---|---|---|
committer | beck <> | 2002-05-15 02:29:21 +0000 |
commit | b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9 (patch) | |
tree | fa27cf82a1250b64ed3bf5f4a18c7354d470bbcc /src/lib/libcrypto/util/mkdef.pl | |
parent | e471e1ea98d673597b182ea85f29e30c97cd08b5 (diff) | |
download | openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.gz openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.bz2 openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.zip |
OpenSSL 0.9.7 stable 2002 05 08 merge
Diffstat (limited to 'src/lib/libcrypto/util/mkdef.pl')
-rw-r--r-- | src/lib/libcrypto/util/mkdef.pl | 980 |
1 files changed, 697 insertions, 283 deletions
diff --git a/src/lib/libcrypto/util/mkdef.pl b/src/lib/libcrypto/util/mkdef.pl index ba453358cf..071036a6d2 100644 --- a/src/lib/libcrypto/util/mkdef.pl +++ b/src/lib/libcrypto/util/mkdef.pl | |||
@@ -37,34 +37,38 @@ | |||
37 | # - "platforms" is empty if it exists on all platforms, otherwise it contains | 37 | # - "platforms" is empty if it exists on all platforms, otherwise it contains |
38 | # comma-separated list of the platform, just as they are if the symbol exists | 38 | # comma-separated list of the platform, just as they are if the symbol exists |
39 | # for those platforms, or prepended with a "!" if not. This helps resolve | 39 | # for those platforms, or prepended with a "!" if not. This helps resolve |
40 | # symbol name replacements for platforms where the names are too long for the | 40 | # symbol name variants for platforms where the names are too long for the |
41 | # compiler or linker, or if the systems is case insensitive and there is a | 41 | # compiler or linker, or if the systems is case insensitive and there is a |
42 | # clash. This script assumes those redefinitions are place in the file | 42 | # clash, or the symbol is implemented differently (see |
43 | # crypto/symhacks.h. | 43 | # EXPORT_VAR_AS_FUNCTION). This script assumes renaming of symbols is found |
44 | # The semantics for the platforms list is a bit complicated. The rule of | 44 | # in the file crypto/symhacks.h. |
45 | # thumb is that the list is exclusive, but it seems to mean different things. | 45 | # The semantics for the platforms is that every item is checked against the |
46 | # So, if the list is all negatives (like "!VMS,!WIN16"), the symbol exists | 46 | # enviroment. For the negative items ("!FOO"), if any of them is false |
47 | # on all platforms except those listed. If the list is all positives (like | 47 | # (i.e. "FOO" is true) in the enviroment, the corresponding symbol can't be |
48 | # "VMS,WIN16"), the symbol exists only on those platforms and nowhere else. | 48 | # used. For the positive itms, if all of them are false in the environment, |
49 | # The combination of positives and negatives will act as if the positives | 49 | # the corresponding symbol can't be used. Any combination of positive and |
50 | # weren't there. | 50 | # negative items are possible, and of course leave room for some redundancy. |
51 | # - "kind" is "FUNCTION" or "VARIABLE". The meaning of that is obvious. | 51 | # - "kind" is "FUNCTION" or "VARIABLE". The meaning of that is obvious. |
52 | # - "algorithms" is a comma-separated list of algorithm names. This helps | 52 | # - "algorithms" is a comma-separated list of algorithm names. This helps |
53 | # exclude symbols that are part of an algorithm that some user wants to | 53 | # exclude symbols that are part of an algorithm that some user wants to |
54 | # exclude. | 54 | # exclude. |
55 | # | 55 | # |
56 | 56 | ||
57 | my $debug=0; | ||
58 | |||
57 | my $crypto_num= "util/libeay.num"; | 59 | my $crypto_num= "util/libeay.num"; |
58 | my $ssl_num= "util/ssleay.num"; | 60 | my $ssl_num= "util/ssleay.num"; |
59 | 61 | ||
60 | my $do_update = 0; | 62 | my $do_update = 0; |
61 | my $do_rewrite = 0; | 63 | my $do_rewrite = 1; |
62 | my $do_crypto = 0; | 64 | my $do_crypto = 0; |
63 | my $do_ssl = 0; | 65 | my $do_ssl = 0; |
64 | my $do_ctest = 0; | 66 | my $do_ctest = 0; |
65 | my $do_ctestall = 0; | 67 | my $do_ctestall = 0; |
66 | my $rsaref = 0; | 68 | my $do_checkexist = 0; |
67 | 69 | ||
70 | my $VMSVAX=0; | ||
71 | my $VMSAlpha=0; | ||
68 | my $VMS=0; | 72 | my $VMS=0; |
69 | my $W32=0; | 73 | my $W32=0; |
70 | my $W16=0; | 74 | my $W16=0; |
@@ -72,11 +76,20 @@ my $NT=0; | |||
72 | # Set this to make typesafe STACK definitions appear in DEF | 76 | # Set this to make typesafe STACK definitions appear in DEF |
73 | my $safe_stack_def = 0; | 77 | my $safe_stack_def = 0; |
74 | 78 | ||
75 | my @known_platforms = ( "__FreeBSD__", "VMS", "WIN16", "WIN32", | 79 | my @known_platforms = ( "__FreeBSD__", "PERL5", "NeXT", |
76 | "WINNT", "PERL5", "NeXT" ); | 80 | "EXPORT_VAR_AS_FUNCTION" ); |
81 | my @known_ossl_platforms = ( "VMS", "WIN16", "WIN32", "WINNT" ); | ||
77 | my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF", | 82 | my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF", |
78 | "CAST", "MD2", "MD4", "MD5", "SHA", "RIPEMD", | 83 | "CAST", "MD2", "MD4", "MD5", "SHA", "SHA0", "SHA1", |
79 | "MDC2", "RSA", "DSA", "DH", "HMAC", "FP_API" ); | 84 | "RIPEMD", |
85 | "MDC2", "RSA", "DSA", "DH", "EC", "HMAC", "AES", | ||
86 | # Envelope "algorithms" | ||
87 | "EVP", "X509", "ASN1_TYPEDEFS", | ||
88 | # Helper "algorithms" | ||
89 | "BIO", "COMP", "BUFFER", "LHASH", "STACK", "ERR", | ||
90 | "LOCKING", | ||
91 | # External "algorithms" | ||
92 | "FP_API", "STDIO", "SOCK", "KRB5" ); | ||
80 | 93 | ||
81 | my $options=""; | 94 | my $options=""; |
82 | open(IN,"<Makefile.ssl") || die "unable to open Makefile.ssl!\n"; | 95 | open(IN,"<Makefile.ssl") || die "unable to open Makefile.ssl!\n"; |
@@ -91,19 +104,28 @@ close(IN); | |||
91 | my $no_rc2; my $no_rc4; my $no_rc5; my $no_idea; my $no_des; my $no_bf; | 104 | my $no_rc2; my $no_rc4; my $no_rc5; my $no_idea; my $no_des; my $no_bf; |
92 | my $no_cast; | 105 | my $no_cast; |
93 | my $no_md2; my $no_md4; my $no_md5; my $no_sha; my $no_ripemd; my $no_mdc2; | 106 | my $no_md2; my $no_md4; my $no_md5; my $no_sha; my $no_ripemd; my $no_mdc2; |
94 | my $no_rsa; my $no_dsa; my $no_dh; my $no_hmac=0; | 107 | my $no_rsa; my $no_dsa; my $no_dh; my $no_hmac=0; my $no_aes; my $no_krb5; |
108 | my $no_ec; | ||
95 | my $no_fp_api; | 109 | my $no_fp_api; |
96 | 110 | ||
97 | foreach (@ARGV, split(/ /, $options)) | 111 | foreach (@ARGV, split(/ /, $options)) |
98 | { | 112 | { |
113 | $debug=1 if $_ eq "debug"; | ||
99 | $W32=1 if $_ eq "32"; | 114 | $W32=1 if $_ eq "32"; |
100 | $W16=1 if $_ eq "16"; | 115 | $W16=1 if $_ eq "16"; |
101 | if($_ eq "NT") { | 116 | if($_ eq "NT") { |
102 | $W32 = 1; | 117 | $W32 = 1; |
103 | $NT = 1; | 118 | $NT = 1; |
104 | } | 119 | } |
120 | if ($_ eq "VMS-VAX") { | ||
121 | $VMS=1; | ||
122 | $VMSVAX=1; | ||
123 | } | ||
124 | if ($_ eq "VMS-Alpha") { | ||
125 | $VMS=1; | ||
126 | $VMSAlpha=1; | ||
127 | } | ||
105 | $VMS=1 if $_ eq "VMS"; | 128 | $VMS=1 if $_ eq "VMS"; |
106 | $rsaref=1 if $_ eq "rsaref"; | ||
107 | 129 | ||
108 | $do_ssl=1 if $_ eq "ssleay"; | 130 | $do_ssl=1 if $_ eq "ssleay"; |
109 | $do_ssl=1 if $_ eq "ssl"; | 131 | $do_ssl=1 if $_ eq "ssl"; |
@@ -113,6 +135,7 @@ foreach (@ARGV, split(/ /, $options)) | |||
113 | $do_rewrite=1 if $_ eq "rewrite"; | 135 | $do_rewrite=1 if $_ eq "rewrite"; |
114 | $do_ctest=1 if $_ eq "ctest"; | 136 | $do_ctest=1 if $_ eq "ctest"; |
115 | $do_ctestall=1 if $_ eq "ctestall"; | 137 | $do_ctestall=1 if $_ eq "ctestall"; |
138 | $do_checkexist=1 if $_ eq "exist"; | ||
116 | #$safe_stack_def=1 if $_ eq "-DDEBUG_SAFESTACK"; | 139 | #$safe_stack_def=1 if $_ eq "-DDEBUG_SAFESTACK"; |
117 | 140 | ||
118 | if (/^no-rc2$/) { $no_rc2=1; } | 141 | if (/^no-rc2$/) { $no_rc2=1; } |
@@ -131,7 +154,19 @@ foreach (@ARGV, split(/ /, $options)) | |||
131 | elsif (/^no-rsa$/) { $no_rsa=1; } | 154 | elsif (/^no-rsa$/) { $no_rsa=1; } |
132 | elsif (/^no-dsa$/) { $no_dsa=1; } | 155 | elsif (/^no-dsa$/) { $no_dsa=1; } |
133 | elsif (/^no-dh$/) { $no_dh=1; } | 156 | elsif (/^no-dh$/) { $no_dh=1; } |
157 | elsif (/^no-ec$/) { $no_ec=1; } | ||
134 | elsif (/^no-hmac$/) { $no_hmac=1; } | 158 | elsif (/^no-hmac$/) { $no_hmac=1; } |
159 | elsif (/^no-aes$/) { $no_aes=1; } | ||
160 | elsif (/^no-evp$/) { $no_evp=1; } | ||
161 | elsif (/^no-lhash$/) { $no_lhash=1; } | ||
162 | elsif (/^no-stack$/) { $no_stack=1; } | ||
163 | elsif (/^no-err$/) { $no_err=1; } | ||
164 | elsif (/^no-buffer$/) { $no_buffer=1; } | ||
165 | elsif (/^no-bio$/) { $no_bio=1; } | ||
166 | #elsif (/^no-locking$/) { $no_locking=1; } | ||
167 | elsif (/^no-comp$/) { $no_comp=1; } | ||
168 | elsif (/^no-dso$/) { $no_dso=1; } | ||
169 | elsif (/^no-krb5$/) { $no_krb5=1; } | ||
135 | } | 170 | } |
136 | 171 | ||
137 | 172 | ||
@@ -147,7 +182,7 @@ if ($W16) { | |||
147 | 182 | ||
148 | if (!$do_ssl && !$do_crypto) | 183 | if (!$do_ssl && !$do_crypto) |
149 | { | 184 | { |
150 | print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | NT ] [rsaref]\n"; | 185 | print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | NT ]\n"; |
151 | exit(1); | 186 | exit(1); |
152 | } | 187 | } |
153 | 188 | ||
@@ -157,51 +192,58 @@ $max_ssl = $max_num; | |||
157 | $max_crypto = $max_num; | 192 | $max_crypto = $max_num; |
158 | 193 | ||
159 | my $ssl="ssl/ssl.h"; | 194 | my $ssl="ssl/ssl.h"; |
195 | $ssl.=" ssl/kssl.h"; | ||
160 | 196 | ||
161 | my $crypto ="crypto/crypto.h"; | 197 | my $crypto ="crypto/crypto.h"; |
162 | $crypto.=" crypto/des/des.h" unless $no_des; | 198 | $crypto.=" crypto/des/des.h crypto/des/des_old.h" ; # unless $no_des; |
163 | $crypto.=" crypto/idea/idea.h" unless $no_idea; | 199 | $crypto.=" crypto/idea/idea.h" ; # unless $no_idea; |
164 | $crypto.=" crypto/rc4/rc4.h" unless $no_rc4; | 200 | $crypto.=" crypto/rc4/rc4.h" ; # unless $no_rc4; |
165 | $crypto.=" crypto/rc5/rc5.h" unless $no_rc5; | 201 | $crypto.=" crypto/rc5/rc5.h" ; # unless $no_rc5; |
166 | $crypto.=" crypto/rc2/rc2.h" unless $no_rc2; | 202 | $crypto.=" crypto/rc2/rc2.h" ; # unless $no_rc2; |
167 | $crypto.=" crypto/bf/blowfish.h" unless $no_bf; | 203 | $crypto.=" crypto/bf/blowfish.h" ; # unless $no_bf; |
168 | $crypto.=" crypto/cast/cast.h" unless $no_cast; | 204 | $crypto.=" crypto/cast/cast.h" ; # unless $no_cast; |
169 | $crypto.=" crypto/md2/md2.h" unless $no_md2; | 205 | $crypto.=" crypto/md2/md2.h" ; # unless $no_md2; |
170 | $crypto.=" crypto/md4/md4.h" unless $no_md4; | 206 | $crypto.=" crypto/md4/md4.h" ; # unless $no_md4; |
171 | $crypto.=" crypto/md5/md5.h" unless $no_md5; | 207 | $crypto.=" crypto/md5/md5.h" ; # unless $no_md5; |
172 | $crypto.=" crypto/mdc2/mdc2.h" unless $no_mdc2; | 208 | $crypto.=" crypto/mdc2/mdc2.h" ; # unless $no_mdc2; |
173 | $crypto.=" crypto/sha/sha.h" unless $no_sha; | 209 | $crypto.=" crypto/sha/sha.h" ; # unless $no_sha; |
174 | $crypto.=" crypto/ripemd/ripemd.h" unless $no_ripemd; | 210 | $crypto.=" crypto/ripemd/ripemd.h" ; # unless $no_ripemd; |
211 | $crypto.=" crypto/aes/aes.h" ; # unless $no_aes; | ||
175 | 212 | ||
176 | $crypto.=" crypto/bn/bn.h"; | 213 | $crypto.=" crypto/bn/bn.h"; |
177 | $crypto.=" crypto/rsa/rsa.h" unless $no_rsa; | 214 | $crypto.=" crypto/rsa/rsa.h" ; # unless $no_rsa; |
178 | $crypto.=" crypto/dsa/dsa.h" unless $no_dsa; | 215 | $crypto.=" crypto/dsa/dsa.h" ; # unless $no_dsa; |
179 | $crypto.=" crypto/dh/dh.h" unless $no_dh; | 216 | $crypto.=" crypto/dh/dh.h" ; # unless $no_dh; |
180 | $crypto.=" crypto/hmac/hmac.h" unless $no_hmac; | 217 | $crypto.=" crypto/ec/ec.h" ; # unless $no_ec; |
218 | $crypto.=" crypto/hmac/hmac.h" ; # unless $no_hmac; | ||
181 | 219 | ||
182 | $crypto.=" crypto/engine/engine.h"; | 220 | $crypto.=" crypto/engine/engine.h"; |
183 | $crypto.=" crypto/stack/stack.h"; | 221 | $crypto.=" crypto/stack/stack.h" ; # unless $no_stack; |
184 | $crypto.=" crypto/buffer/buffer.h"; | 222 | $crypto.=" crypto/buffer/buffer.h" ; # unless $no_buffer; |
185 | $crypto.=" crypto/bio/bio.h"; | 223 | $crypto.=" crypto/bio/bio.h" ; # unless $no_bio; |
186 | $crypto.=" crypto/dso/dso.h"; | 224 | $crypto.=" crypto/dso/dso.h" ; # unless $no_dso; |
187 | $crypto.=" crypto/lhash/lhash.h"; | 225 | $crypto.=" crypto/lhash/lhash.h" ; # unless $no_lhash; |
188 | $crypto.=" crypto/conf/conf.h"; | 226 | $crypto.=" crypto/conf/conf.h"; |
189 | $crypto.=" crypto/txt_db/txt_db.h"; | 227 | $crypto.=" crypto/txt_db/txt_db.h"; |
190 | 228 | ||
191 | $crypto.=" crypto/evp/evp.h"; | 229 | $crypto.=" crypto/evp/evp.h" ; # unless $no_evp; |
192 | $crypto.=" crypto/objects/objects.h"; | 230 | $crypto.=" crypto/objects/objects.h"; |
193 | $crypto.=" crypto/pem/pem.h"; | 231 | $crypto.=" crypto/pem/pem.h"; |
194 | #$crypto.=" crypto/meth/meth.h"; | 232 | #$crypto.=" crypto/meth/meth.h"; |
195 | $crypto.=" crypto/asn1/asn1.h"; | 233 | $crypto.=" crypto/asn1/asn1.h"; |
234 | $crypto.=" crypto/asn1/asn1t.h"; | ||
196 | $crypto.=" crypto/asn1/asn1_mac.h"; | 235 | $crypto.=" crypto/asn1/asn1_mac.h"; |
197 | $crypto.=" crypto/err/err.h"; | 236 | $crypto.=" crypto/err/err.h" ; # unless $no_err; |
198 | $crypto.=" crypto/pkcs7/pkcs7.h"; | 237 | $crypto.=" crypto/pkcs7/pkcs7.h"; |
199 | $crypto.=" crypto/pkcs12/pkcs12.h"; | 238 | $crypto.=" crypto/pkcs12/pkcs12.h"; |
200 | $crypto.=" crypto/x509/x509.h"; | 239 | $crypto.=" crypto/x509/x509.h"; |
201 | $crypto.=" crypto/x509/x509_vfy.h"; | 240 | $crypto.=" crypto/x509/x509_vfy.h"; |
202 | $crypto.=" crypto/x509v3/x509v3.h"; | 241 | $crypto.=" crypto/x509v3/x509v3.h"; |
203 | $crypto.=" crypto/rand/rand.h"; | 242 | $crypto.=" crypto/rand/rand.h"; |
204 | $crypto.=" crypto/comp/comp.h"; | 243 | $crypto.=" crypto/comp/comp.h" ; # unless $no_comp; |
244 | $crypto.=" crypto/ocsp/ocsp.h"; | ||
245 | $crypto.=" crypto/ui/ui.h crypto/ui/ui_compat.h"; | ||
246 | $crypto.=" crypto/krb5/krb5_asn.h"; | ||
205 | $crypto.=" crypto/tmdiff.h"; | 247 | $crypto.=" crypto/tmdiff.h"; |
206 | 248 | ||
207 | my $symhacks="crypto/symhacks.h"; | 249 | my $symhacks="crypto/symhacks.h"; |
@@ -217,7 +259,6 @@ if ($do_ssl == 1) { | |||
217 | if ($do_rewrite == 1) { | 259 | if ($do_rewrite == 1) { |
218 | open(OUT, ">$ssl_num"); | 260 | open(OUT, ">$ssl_num"); |
219 | &rewrite_numbers(*OUT,"SSLEAY",*ssl_list,@ssl_symbols); | 261 | &rewrite_numbers(*OUT,"SSLEAY",*ssl_list,@ssl_symbols); |
220 | close OUT; | ||
221 | } else { | 262 | } else { |
222 | open(OUT, ">>$ssl_num"); | 263 | open(OUT, ">>$ssl_num"); |
223 | } | 264 | } |
@@ -238,6 +279,11 @@ if($do_crypto == 1) { | |||
238 | close OUT; | 279 | close OUT; |
239 | } | 280 | } |
240 | 281 | ||
282 | } elsif ($do_checkexist) { | ||
283 | &check_existing(*ssl_list, @ssl_symbols) | ||
284 | if $do_ssl == 1; | ||
285 | &check_existing(*crypto_list, @crypto_symbols) | ||
286 | if $do_crypto == 1; | ||
241 | } elsif ($do_ctest || $do_ctestall) { | 287 | } elsif ($do_ctest || $do_ctestall) { |
242 | 288 | ||
243 | print <<"EOF"; | 289 | print <<"EOF"; |
@@ -277,16 +323,21 @@ sub do_defs | |||
277 | my %platform; # For anything undefined, we assume "" | 323 | my %platform; # For anything undefined, we assume "" |
278 | my %kind; # For anything undefined, we assume "FUNCTION" | 324 | my %kind; # For anything undefined, we assume "FUNCTION" |
279 | my %algorithm; # For anything undefined, we assume "" | 325 | my %algorithm; # For anything undefined, we assume "" |
280 | my %rename; | 326 | my %variant; |
327 | my %variant_cnt; # To be able to allocate "name{n}" if "name" | ||
328 | # is the same name as the original. | ||
281 | my $cpp; | 329 | my $cpp; |
330 | my %unknown_algorithms = (); | ||
282 | 331 | ||
283 | foreach $file (split(/\s+/,$symhacksfile." ".$files)) | 332 | foreach $file (split(/\s+/,$symhacksfile." ".$files)) |
284 | { | 333 | { |
334 | print STDERR "DEBUG: starting on $file:\n" if $debug; | ||
285 | open(IN,"<$file") || die "unable to open $file:$!\n"; | 335 | open(IN,"<$file") || die "unable to open $file:$!\n"; |
286 | my $line = "", my $def= ""; | 336 | my $line = "", my $def= ""; |
287 | my %tag = ( | 337 | my %tag = ( |
288 | (map { $_ => 0 } @known_platforms), | 338 | (map { $_ => 0 } @known_platforms), |
289 | (map { "NO_".$_ => 0 } @known_algorithms), | 339 | (map { "OPENSSL_SYS_".$_ => 0 } @known_ossl_platforms), |
340 | (map { "OPENSSL_NO_".$_ => 0 } @known_algorithms), | ||
290 | NOPROTO => 0, | 341 | NOPROTO => 0, |
291 | PERL5 => 0, | 342 | PERL5 => 0, |
292 | _WINDLL => 0, | 343 | _WINDLL => 0, |
@@ -294,14 +345,70 @@ sub do_defs | |||
294 | TRUE => 1, | 345 | TRUE => 1, |
295 | ); | 346 | ); |
296 | my $symhacking = $file eq $symhacksfile; | 347 | my $symhacking = $file eq $symhacksfile; |
348 | my @current_platforms = (); | ||
349 | my @current_algorithms = (); | ||
350 | |||
351 | # params: symbol, alias, platforms, kind | ||
352 | # The reason to put this subroutine in a variable is that | ||
353 | # it will otherwise create it's own, unshared, version of | ||
354 | # %tag and %variant... | ||
355 | my $make_variant = sub | ||
356 | { | ||
357 | my ($s, $a, $p, $k) = @_; | ||
358 | my ($a1, $a2); | ||
359 | |||
360 | print STDERR "DEBUG: make_variant: Entered with ",$s,", ",$a,", ",(defined($p)?$p:""),", ",(defined($k)?$k:""),"\n" if $debug; | ||
361 | if (defined($p)) | ||
362 | { | ||
363 | $a1 = join(",",$p, | ||
364 | grep(!/^$/, | ||
365 | map { $tag{$_} == 1 ? $_ : "" } | ||
366 | @known_platforms)); | ||
367 | } | ||
368 | else | ||
369 | { | ||
370 | $a1 = join(",", | ||
371 | grep(!/^$/, | ||
372 | map { $tag{$_} == 1 ? $_ : "" } | ||
373 | @known_platforms)); | ||
374 | } | ||
375 | $a2 = join(",", | ||
376 | grep(!/^$/, | ||
377 | map { $tag{"OPENSSL_SYS_".$_} == 1 ? $_ : "" } | ||
378 | @known_ossl_platforms)); | ||
379 | print STDERR "DEBUG: make_variant: a1 = $a1; a2 = $a2\n" if $debug; | ||
380 | if ($a1 eq "") { $a1 = $a2; } | ||
381 | elsif ($a1 ne "" && $a2 ne "") { $a1 .= ",".$a2; } | ||
382 | if ($a eq $s) | ||
383 | { | ||
384 | if (!defined($variant_cnt{$s})) | ||
385 | { | ||
386 | $variant_cnt{$s} = 0; | ||
387 | } | ||
388 | $variant_cnt{$s}++; | ||
389 | $a .= "{$variant_cnt{$s}}"; | ||
390 | } | ||
391 | my $toadd = $a.":".$a1.(defined($k)?":".$k:""); | ||
392 | my $togrep = $s.'(\{[0-9]+\})?:'.$a1.(defined($k)?":".$k:""); | ||
393 | if (!grep(/^$togrep$/, | ||
394 | split(/;/, defined($variant{$s})?$variant{$s}:""))) { | ||
395 | if (defined($variant{$s})) { $variant{$s} .= ";"; } | ||
396 | $variant{$s} .= $toadd; | ||
397 | } | ||
398 | print STDERR "DEBUG: make_variant: Exit with variant of ",$s," = ",$variant{$s},"\n" if $debug; | ||
399 | }; | ||
400 | |||
401 | print STDERR "DEBUG: parsing ----------\n" if $debug; | ||
297 | while(<IN>) { | 402 | while(<IN>) { |
298 | last if (/BEGIN ERROR CODES/); | 403 | last if (/\/\* Error codes for the \w+ functions\. \*\//); |
299 | if ($line ne '') { | 404 | if ($line ne '') { |
300 | $_ = $line . $_; | 405 | $_ = $line . $_; |
301 | $line = ''; | 406 | $line = ''; |
302 | } | 407 | } |
303 | 408 | ||
304 | if (/\\$/) { | 409 | if (/\\$/) { |
410 | chomp; # remove eol | ||
411 | chop; # remove ending backslash | ||
305 | $line = $_; | 412 | $line = $_; |
306 | next; | 413 | next; |
307 | } | 414 | } |
@@ -314,134 +421,344 @@ sub do_defs | |||
314 | 421 | ||
315 | s/\/\*.*?\*\///gs; # ignore comments | 422 | s/\/\*.*?\*\///gs; # ignore comments |
316 | s/{[^{}]*}//gs; # ignore {} blocks | 423 | s/{[^{}]*}//gs; # ignore {} blocks |
317 | if (/^\#\s*ifndef (.*)/) { | 424 | print STDERR "DEBUG: \$_=\"$_\"\n" if $debug; |
425 | if (/^\#\s*ifndef\s+(.*)/) { | ||
426 | push(@tag,"-"); | ||
318 | push(@tag,$1); | 427 | push(@tag,$1); |
319 | $tag{$1}=-1; | 428 | $tag{$1}=-1; |
320 | } elsif (/^\#\s*if !defined\(([^\)]+)\)/) { | 429 | print STDERR "DEBUG: $file: found tag $1 = -1\n" if $debug; |
321 | push(@tag,$1); | 430 | } elsif (/^\#\s*if\s+!defined\(([^\)]+)\)/) { |
322 | $tag{$1}=-1; | 431 | push(@tag,"-"); |
323 | } elsif (/^\#\s*ifdef (.*)/) { | 432 | if (/^\#\s*if\s+(!defined\(([^\)]+)\)(\s+\&\&\s+!defined\(([^\)]+)\))*)$/) { |
324 | push(@tag,$1); | 433 | my $tmp_1 = $1; |
325 | $tag{$1}=1; | 434 | my $tmp_; |
326 | } elsif (/^\#\s*if defined\(([^\)]+)\)/) { | 435 | foreach $tmp_ (split '\&\&',$tmp_1) { |
436 | $tmp_ =~ /!defined\(([^\)]+)\)/; | ||
437 | print STDERR "DEBUG: $file: found tag $1 = -1\n" if $debug; | ||
438 | push(@tag,$1); | ||
439 | $tag{$1}=-1; | ||
440 | } | ||
441 | } else { | ||
442 | print STDERR "Warning: $file: complicated expression: $_" if $debug; # because it is O... | ||
443 | print STDERR "DEBUG: $file: found tag $1 = -1\n" if $debug; | ||
444 | push(@tag,$1); | ||
445 | $tag{$1}=-1; | ||
446 | } | ||
447 | } elsif (/^\#\s*ifdef\s+(.*)/) { | ||
448 | push(@tag,"-"); | ||
327 | push(@tag,$1); | 449 | push(@tag,$1); |
328 | $tag{$1}=1; | 450 | $tag{$1}=1; |
451 | print STDERR "DEBUG: $file: found tag $1 = 1\n" if $debug; | ||
452 | } elsif (/^\#\s*if\s+defined\(([^\)]+)\)/) { | ||
453 | push(@tag,"-"); | ||
454 | if (/^\#\s*if\s+(defined\(([^\)]+)\)(\s+\|\|\s+defined\(([^\)]+)\))*)$/) { | ||
455 | my $tmp_1 = $1; | ||
456 | my $tmp_; | ||
457 | foreach $tmp_ (split '\|\|',$tmp_1) { | ||
458 | $tmp_ =~ /defined\(([^\)]+)\)/; | ||
459 | print STDERR "DEBUG: $file: found tag $1 = 1\n" if $debug; | ||
460 | push(@tag,$1); | ||
461 | $tag{$1}=1; | ||
462 | } | ||
463 | } else { | ||
464 | print STDERR "Warning: $file: complicated expression: $_\n" if $debug; # because it is O... | ||
465 | print STDERR "DEBUG: $file: found tag $1 = 1\n" if $debug; | ||
466 | push(@tag,$1); | ||
467 | $tag{$1}=1; | ||
468 | } | ||
329 | } elsif (/^\#\s*error\s+(\w+) is disabled\./) { | 469 | } elsif (/^\#\s*error\s+(\w+) is disabled\./) { |
330 | if ($tag[$#tag] eq "NO_".$1) { | 470 | my $tag_i = $#tag; |
331 | $tag{$tag[$#tag]}=2; | 471 | while($tag[$tag_i] ne "-") { |
472 | if ($tag[$tag_i] eq "OPENSSL_NO_".$1) { | ||
473 | $tag{$tag[$tag_i]}=2; | ||
474 | print STDERR "DEBUG: $file: chaged tag $1 = 2\n" if $debug; | ||
475 | } | ||
476 | $tag_i--; | ||
332 | } | 477 | } |
333 | } elsif (/^\#\s*endif/) { | 478 | } elsif (/^\#\s*endif/) { |
334 | if ($tag{$tag[$#tag]}==2) { | 479 | my $tag_i = $#tag; |
335 | $tag{$tag[$#tag]}=-1; | 480 | while($tag[$tag_i] ne "-") { |
336 | } else { | 481 | my $t=$tag[$tag_i]; |
337 | $tag{$tag[$#tag]}=0; | 482 | print STDERR "DEBUG: \$t=\"$t\"\n" if $debug; |
483 | if ($tag{$t}==2) { | ||
484 | $tag{$t}=-1; | ||
485 | } else { | ||
486 | $tag{$t}=0; | ||
487 | } | ||
488 | print STDERR "DEBUG: $file: changed tag ",$t," = ",$tag{$t},"\n" if $debug; | ||
489 | pop(@tag); | ||
490 | if ($t =~ /^OPENSSL_NO_([A-Z0-9_]+)$/) { | ||
491 | $t=$1; | ||
492 | } else { | ||
493 | $t=""; | ||
494 | } | ||
495 | if ($t ne "" | ||
496 | && !grep(/^$t$/, @known_algorithms)) { | ||
497 | $unknown_algorithms{$t} = 1; | ||
498 | #print STDERR "DEBUG: Added as unknown algorithm: $t\n" if $debug; | ||
499 | } | ||
500 | $tag_i--; | ||
338 | } | 501 | } |
339 | pop(@tag); | 502 | pop(@tag); |
340 | } elsif (/^\#\s*else/) { | 503 | } elsif (/^\#\s*else/) { |
341 | my $t=$tag[$#tag]; | 504 | my $tag_i = $#tag; |
342 | $tag{$t}= -$tag{$t}; | 505 | while($tag[$tag_i] ne "-") { |
506 | my $t=$tag[$tag_i]; | ||
507 | $tag{$t}= -$tag{$t}; | ||
508 | print STDERR "DEBUG: $file: changed tag ",$t," = ",$tag{$t},"\n" if $debug; | ||
509 | $tag_i--; | ||
510 | } | ||
343 | } elsif (/^\#\s*if\s+1/) { | 511 | } elsif (/^\#\s*if\s+1/) { |
512 | push(@tag,"-"); | ||
344 | # Dummy tag | 513 | # Dummy tag |
345 | push(@tag,"TRUE"); | 514 | push(@tag,"TRUE"); |
346 | $tag{"TRUE"}=1; | 515 | $tag{"TRUE"}=1; |
516 | print STDERR "DEBUG: $file: found 1\n" if $debug; | ||
347 | } elsif (/^\#\s*if\s+0/) { | 517 | } elsif (/^\#\s*if\s+0/) { |
518 | push(@tag,"-"); | ||
348 | # Dummy tag | 519 | # Dummy tag |
349 | push(@tag,"TRUE"); | 520 | push(@tag,"TRUE"); |
350 | $tag{"TRUE"}=-1; | 521 | $tag{"TRUE"}=-1; |
522 | print STDERR "DEBUG: $file: found 0\n" if $debug; | ||
351 | } elsif (/^\#\s*define\s+(\w+)\s+(\w+)/ | 523 | } elsif (/^\#\s*define\s+(\w+)\s+(\w+)/ |
352 | && $symhacking) { | 524 | && $symhacking && $tag{'TRUE'} != -1) { |
353 | my $s = $1; | 525 | # This is for aliasing. When we find an alias, |
354 | my $a = | 526 | # we have to invert |
355 | $2.":".join(",", grep(!/^$/, | 527 | &$make_variant($1,$2); |
356 | map { $tag{$_} == 1 ? | 528 | print STDERR "DEBUG: $file: defined $1 = $2\n" if $debug; |
357 | $_ : "" } | ||
358 | @known_platforms)); | ||
359 | $rename{$s} = $a; | ||
360 | } | 529 | } |
361 | if (/^\#/) { | 530 | if (/^\#/) { |
362 | my @p = grep(!/^$/, | 531 | @current_platforms = |
363 | map { $tag{$_} == 1 ? $_ : | 532 | grep(!/^$/, |
364 | $tag{$_} == -1 ? "!".$_ : "" } | 533 | map { $tag{$_} == 1 ? $_ : |
365 | @known_platforms); | 534 | $tag{$_} == -1 ? "!".$_ : "" } |
366 | my @a = grep(!/^$/, | 535 | @known_platforms); |
367 | map { $tag{"NO_".$_} == -1 ? $_ : "" } | 536 | push @current_platforms |
368 | @known_algorithms); | 537 | , grep(!/^$/, |
369 | $def .= "#INFO:".join(',',@p).":".join(',',@a).";"; | 538 | map { $tag{"OPENSSL_SYS_".$_} == 1 ? $_ : |
539 | $tag{"OPENSSL_SYS_".$_} == -1 ? "!".$_ : "" } | ||
540 | @known_ossl_platforms); | ||
541 | @current_algorithms = | ||
542 | grep(!/^$/, | ||
543 | map { $tag{"OPENSSL_NO_".$_} == -1 ? $_ : "" } | ||
544 | @known_algorithms); | ||
545 | $def .= | ||
546 | "#INFO:" | ||
547 | .join(',',@current_platforms).":" | ||
548 | .join(',',@current_algorithms).";"; | ||
370 | next; | 549 | next; |
371 | } | 550 | } |
372 | if (/^\s*DECLARE_STACK_OF\s*\(\s*(\w*)\s*\)/) { | 551 | if ($tag{'TRUE'} != -1) { |
373 | next; | 552 | if (/^\s*DECLARE_STACK_OF\s*\(\s*(\w*)\s*\)/) { |
374 | } elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) { | 553 | next; |
375 | next; | 554 | } elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) { |
376 | } elsif (/^\s*DECLARE_ASN1_SET_OF\s*\(\s*(\w*)\s*\)/) { | 555 | $def .= "int d2i_$3(void);"; |
377 | next; | 556 | $def .= "int i2d_$3(void);"; |
378 | } elsif (/^DECLARE_PEM_rw\s*\(\s*(\w*)\s*,/ || | 557 | # Variant for platforms that do not |
379 | /^DECLARE_PEM_rw_cb\s*\(\s*(\w*)\s*,/ ) { | 558 | # have to access globale variables |
380 | # Things not in Win16 | 559 | # in shared libraries through functions |
381 | $syms{"PEM_read_${1}"} = 1; | 560 | $def .= |
382 | $platform{"PEM_read_${1}"} = "!WIN16"; | 561 | "#INFO:" |
383 | $syms{"PEM_write_${1}"} = 1; | 562 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" |
384 | $platform{"PEM_write_${1}"} = "!WIN16"; | 563 | .join(',',@current_algorithms).";"; |
385 | # Things that are everywhere | 564 | $def .= "OPENSSL_EXTERN int $2_it;"; |
386 | $syms{"PEM_read_bio_${1}"} = 1; | 565 | $def .= |
387 | $syms{"PEM_write_bio_${1}"} = 1; | 566 | "#INFO:" |
388 | if ($1 eq "RSAPrivateKey" || | 567 | .join(',',@current_platforms).":" |
389 | $1 eq "RSAPublicKey" || | 568 | .join(',',@current_algorithms).";"; |
390 | $1 eq "RSA_PUBKEY") { | 569 | # Variant for platforms that have to |
391 | $algorithm{"PEM_read_${1}"} = "RSA"; | 570 | # access globale variables in shared |
392 | $algorithm{"PEM_write_${1}"} = "RSA"; | 571 | # libraries through functions |
393 | $algorithm{"PEM_read_bio_${1}"} = "RSA"; | 572 | &$make_variant("$2_it","$2_it", |
394 | $algorithm{"PEM_write_bio_${1}"} = "RSA"; | 573 | "EXPORT_VAR_AS_FUNCTION", |
395 | } | 574 | "FUNCTION"); |
396 | elsif ($1 eq "DSAPrivateKey" || | 575 | next; |
397 | $1 eq "DSAparams" || | 576 | } elsif (/^\s*DECLARE_ASN1_FUNCTIONS_fname\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) { |
398 | $1 eq "RSA_PUBKEY") { | 577 | $def .= "int d2i_$3(void);"; |
399 | $algorithm{"PEM_read_${1}"} = "DSA"; | 578 | $def .= "int i2d_$3(void);"; |
400 | $algorithm{"PEM_write_${1}"} = "DSA"; | 579 | $def .= "int $3_free(void);"; |
401 | $algorithm{"PEM_read_bio_${1}"} = "DSA"; | 580 | $def .= "int $3_new(void);"; |
402 | $algorithm{"PEM_write_bio_${1}"} = "DSA"; | 581 | # Variant for platforms that do not |
403 | } | 582 | # have to access globale variables |
404 | elsif ($1 eq "DHparams") { | 583 | # in shared libraries through functions |
405 | $algorithm{"PEM_read_${1}"} = "DH"; | 584 | $def .= |
406 | $algorithm{"PEM_write_${1}"} = "DH"; | 585 | "#INFO:" |
407 | $algorithm{"PEM_read_bio_${1}"} = "DH"; | 586 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" |
408 | $algorithm{"PEM_write_bio_${1}"} = "DH"; | 587 | .join(',',@current_algorithms).";"; |
409 | } | 588 | $def .= "OPENSSL_EXTERN int $2_it;"; |
410 | } elsif (/^DECLARE_PEM_write\s*\(\s*(\w*)\s*,/ || | 589 | $def .= |
411 | /^DECLARE_PEM_write_cb\s*\(\s*(\w*)\s*,/ ) { | 590 | "#INFO:" |
412 | # Things not in Win16 | 591 | .join(',',@current_platforms).":" |
413 | $syms{"PEM_write_${1}"} = 1; | 592 | .join(',',@current_algorithms).";"; |
414 | $platform{"PEM_write_${1}"} .= ",!WIN16"; | 593 | # Variant for platforms that have to |
415 | # Things that are everywhere | 594 | # access globale variables in shared |
416 | $syms{"PEM_write_bio_${1}"} = 1; | 595 | # libraries through functions |
417 | if ($1 eq "RSAPrivateKey" || | 596 | &$make_variant("$2_it","$2_it", |
418 | $1 eq "RSAPublicKey" || | 597 | "EXPORT_VAR_AS_FUNCTION", |
419 | $1 eq "RSA_PUBKEY") { | 598 | "FUNCTION"); |
420 | $algorithm{"PEM_write_${1}"} = "RSA"; | 599 | next; |
421 | $algorithm{"PEM_write_bio_${1}"} = "RSA"; | 600 | } elsif (/^\s*DECLARE_ASN1_FUNCTIONS\s*\(\s*(\w*)\s*\)/ || |
422 | } | 601 | /^\s*DECLARE_ASN1_FUNCTIONS_const\s*\(\s*(\w*)\s*\)/) { |
423 | elsif ($1 eq "DSAPrivateKey" || | 602 | $def .= "int d2i_$1(void);"; |
424 | $1 eq "DSAparams" || | 603 | $def .= "int i2d_$1(void);"; |
425 | $1 eq "RSA_PUBKEY") { | 604 | $def .= "int $1_free(void);"; |
426 | $algorithm{"PEM_write_${1}"} = "DSA"; | 605 | $def .= "int $1_new(void);"; |
427 | $algorithm{"PEM_write_bio_${1}"} = "DSA"; | 606 | # Variant for platforms that do not |
428 | } | 607 | # have to access globale variables |
429 | elsif ($1 eq "DHparams") { | 608 | # in shared libraries through functions |
430 | $algorithm{"PEM_write_${1}"} = "DH"; | 609 | $def .= |
431 | $algorithm{"PEM_write_bio_${1}"} = "DH"; | 610 | "#INFO:" |
432 | } | 611 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" |
433 | } elsif (/^DECLARE_PEM_read\s*\(\s*(\w*)\s*,/ || | 612 | .join(',',@current_algorithms).";"; |
434 | /^DECLARE_PEM_read_cb\s*\(\s*(\w*)\s*,/ ) { | 613 | $def .= "OPENSSL_EXTERN int $1_it;"; |
435 | # Things not in Win16 | 614 | $def .= |
436 | $syms{"PEM_read_${1}"} = 1; | 615 | "#INFO:" |
437 | $platform{"PEM_read_${1}"} .= ",!WIN16"; | 616 | .join(',',@current_platforms).":" |
438 | # Things that are everywhere | 617 | .join(',',@current_algorithms).";"; |
439 | $syms{"PEM_read_bio_${1}"} = 1; | 618 | # Variant for platforms that have to |
440 | } elsif ( | 619 | # access globale variables in shared |
441 | ($tag{'TRUE'} != -1) | 620 | # libraries through functions |
442 | && ($tag{'CONST_STRICT'} != 1) | 621 | &$make_variant("$1_it","$1_it", |
443 | ) | 622 | "EXPORT_VAR_AS_FUNCTION", |
444 | { | 623 | "FUNCTION"); |
624 | next; | ||
625 | } elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS_const\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) { | ||
626 | $def .= "int d2i_$2(void);"; | ||
627 | $def .= "int i2d_$2(void);"; | ||
628 | # Variant for platforms that do not | ||
629 | # have to access globale variables | ||
630 | # in shared libraries through functions | ||
631 | $def .= | ||
632 | "#INFO:" | ||
633 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" | ||
634 | .join(',',@current_algorithms).";"; | ||
635 | $def .= "OPENSSL_EXTERN int $2_it;"; | ||
636 | $def .= | ||
637 | "#INFO:" | ||
638 | .join(',',@current_platforms).":" | ||
639 | .join(',',@current_algorithms).";"; | ||
640 | # Variant for platforms that have to | ||
641 | # access globale variables in shared | ||
642 | # libraries through functions | ||
643 | &$make_variant("$2_it","$2_it", | ||
644 | "EXPORT_VAR_AS_FUNCTION", | ||
645 | "FUNCTION"); | ||
646 | next; | ||
647 | } elsif (/^\s*DECLARE_ASN1_FUNCTIONS_name\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) { | ||
648 | $def .= "int d2i_$2(void);"; | ||
649 | $def .= "int i2d_$2(void);"; | ||
650 | $def .= "int $2_free(void);"; | ||
651 | $def .= "int $2_new(void);"; | ||
652 | # Variant for platforms that do not | ||
653 | # have to access globale variables | ||
654 | # in shared libraries through functions | ||
655 | $def .= | ||
656 | "#INFO:" | ||
657 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" | ||
658 | .join(',',@current_algorithms).";"; | ||
659 | $def .= "OPENSSL_EXTERN int $2_it;"; | ||
660 | $def .= | ||
661 | "#INFO:" | ||
662 | .join(',',@current_platforms).":" | ||
663 | .join(',',@current_algorithms).";"; | ||
664 | # Variant for platforms that have to | ||
665 | # access globale variables in shared | ||
666 | # libraries through functions | ||
667 | &$make_variant("$2_it","$2_it", | ||
668 | "EXPORT_VAR_AS_FUNCTION", | ||
669 | "FUNCTION"); | ||
670 | next; | ||
671 | } elsif (/^\s*DECLARE_ASN1_ITEM\s*\(\s*(\w*)\s*\)/) { | ||
672 | # Variant for platforms that do not | ||
673 | # have to access globale variables | ||
674 | # in shared libraries through functions | ||
675 | $def .= | ||
676 | "#INFO:" | ||
677 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" | ||
678 | .join(',',@current_algorithms).";"; | ||
679 | $def .= "OPENSSL_EXTERN int $1_it;"; | ||
680 | $def .= | ||
681 | "#INFO:" | ||
682 | .join(',',@current_platforms).":" | ||
683 | .join(',',@current_algorithms).";"; | ||
684 | # Variant for platforms that have to | ||
685 | # access globale variables in shared | ||
686 | # libraries through functions | ||
687 | &$make_variant("$1_it","$1_it", | ||
688 | "EXPORT_VAR_AS_FUNCTION", | ||
689 | "FUNCTION"); | ||
690 | next; | ||
691 | } elsif (/^\s*DECLARE_ASN1_SET_OF\s*\(\s*(\w*)\s*\)/) { | ||
692 | next; | ||
693 | } elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) { | ||
694 | next; | ||
695 | } elsif (/^DECLARE_PEM_rw\s*\(\s*(\w*)\s*,/ || | ||
696 | /^DECLARE_PEM_rw_cb\s*\(\s*(\w*)\s*,/ ) { | ||
697 | # Things not in Win16 | ||
698 | $def .= | ||
699 | "#INFO:" | ||
700 | .join(',',"!WIN16",@current_platforms).":" | ||
701 | .join(',',@current_algorithms).";"; | ||
702 | $def .= "int PEM_read_$1(void);"; | ||
703 | $def .= "int PEM_write_$1(void);"; | ||
704 | $def .= | ||
705 | "#INFO:" | ||
706 | .join(',',@current_platforms).":" | ||
707 | .join(',',@current_algorithms).";"; | ||
708 | # Things that are everywhere | ||
709 | $def .= "int PEM_read_bio_$1(void);"; | ||
710 | $def .= "int PEM_write_bio_$1(void);"; | ||
711 | next; | ||
712 | } elsif (/^DECLARE_PEM_write\s*\(\s*(\w*)\s*,/ || | ||
713 | /^DECLARE_PEM_write_cb\s*\(\s*(\w*)\s*,/ ) { | ||
714 | # Things not in Win16 | ||
715 | $def .= | ||
716 | "#INFO:" | ||
717 | .join(',',"!WIN16",@current_platforms).":" | ||
718 | .join(',',@current_algorithms).";"; | ||
719 | $def .= "int PEM_write_$1(void);"; | ||
720 | $def .= | ||
721 | "#INFO:" | ||
722 | .join(',',@current_platforms).":" | ||
723 | .join(',',@current_algorithms).";"; | ||
724 | # Things that are everywhere | ||
725 | $def .= "int PEM_write_bio_$1(void);"; | ||
726 | next; | ||
727 | } elsif (/^DECLARE_PEM_read\s*\(\s*(\w*)\s*,/ || | ||
728 | /^DECLARE_PEM_read_cb\s*\(\s*(\w*)\s*,/ ) { | ||
729 | # Things not in Win16 | ||
730 | $def .= | ||
731 | "#INFO:" | ||
732 | .join(',',"!WIN16",@current_platforms).":" | ||
733 | .join(',',@current_algorithms).";"; | ||
734 | $def .= "int PEM_read_$1(void);"; | ||
735 | $def .= | ||
736 | "#INFO:" | ||
737 | .join(',',@current_platforms).":" | ||
738 | .join(',',@current_algorithms).";"; | ||
739 | # Things that are everywhere | ||
740 | $def .= "int PEM_read_bio_$1(void);"; | ||
741 | next; | ||
742 | } elsif (/^OPENSSL_DECLARE_GLOBAL\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) { | ||
743 | # Variant for platforms that do not | ||
744 | # have to access globale variables | ||
745 | # in shared libraries through functions | ||
746 | $def .= | ||
747 | "#INFO:" | ||
748 | .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":" | ||
749 | .join(',',@current_algorithms).";"; | ||
750 | $def .= "OPENSSL_EXTERN int _shadow_$2;"; | ||
751 | $def .= | ||
752 | "#INFO:" | ||
753 | .join(',',@current_platforms).":" | ||
754 | .join(',',@current_algorithms).";"; | ||
755 | # Variant for platforms that have to | ||
756 | # access globale variables in shared | ||
757 | # libraries through functions | ||
758 | &$make_variant("_shadow_$2","_shadow_$2", | ||
759 | "EXPORT_VAR_AS_FUNCTION", | ||
760 | "FUNCTION"); | ||
761 | } elsif ($tag{'CONST_STRICT'} != 1) { | ||
445 | if (/\{|\/\*|\([^\)]*$/) { | 762 | if (/\{|\/\*|\([^\)]*$/) { |
446 | $line = $_; | 763 | $line = $_; |
447 | } else { | 764 | } else { |
@@ -449,11 +766,13 @@ sub do_defs | |||
449 | } | 766 | } |
450 | } | 767 | } |
451 | } | 768 | } |
769 | } | ||
452 | close(IN); | 770 | close(IN); |
453 | 771 | ||
454 | my $algs; | 772 | my $algs; |
455 | my $plays; | 773 | my $plays; |
456 | 774 | ||
775 | print STDERR "DEBUG: postprocessing ----------\n" if $debug; | ||
457 | foreach (split /;/, $def) { | 776 | foreach (split /;/, $def) { |
458 | my $s; my $k = "FUNCTION"; my $p; my $a; | 777 | my $s; my $k = "FUNCTION"; my $p; my $a; |
459 | s/^[\n\s]*//g; | 778 | s/^[\n\s]*//g; |
@@ -462,26 +781,32 @@ sub do_defs | |||
462 | next if(/typedef\W/); | 781 | next if(/typedef\W/); |
463 | next if(/\#define/); | 782 | next if(/\#define/); |
464 | 783 | ||
784 | print STDERR "DEBUG: \$_ = \"$_\"\n" if $debug; | ||
465 | if (/^\#INFO:([^:]*):(.*)$/) { | 785 | if (/^\#INFO:([^:]*):(.*)$/) { |
466 | $plats = $1; | 786 | $plats = $1; |
467 | $algs = $2; | 787 | $algs = $2; |
788 | print STDERR "DEBUG: found info on platforms ($plats) and algorithms ($algs)\n" if $debug; | ||
468 | next; | 789 | next; |
469 | } elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+)(\[[0-9]*\])*\s*$/) { | 790 | } elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+(\{[0-9]+\})?)(\[[0-9]*\])*\s*$/) { |
470 | $s = $1; | 791 | $s = $1; |
471 | $k = "VARIABLE"; | 792 | $k = "VARIABLE"; |
472 | } elsif (/\(\*(\w*)\([^\)]+/) { | 793 | print STDERR "DEBUG: found external variable $s\n" if $debug; |
794 | } elsif (/\(\*(\w*(\{[0-9]+\})?)\([^\)]+/) { | ||
473 | $s = $1; | 795 | $s = $1; |
796 | print STDERR "DEBUG: found ANSI C function $s\n" if $debug; | ||
474 | } elsif (/\w+\W+(\w+)\W*\(\s*\)$/s) { | 797 | } elsif (/\w+\W+(\w+)\W*\(\s*\)$/s) { |
475 | # K&R C | 798 | # K&R C |
799 | print STDERR "DEBUG: found K&R C function $s\n" if $debug; | ||
476 | next; | 800 | next; |
477 | } elsif (/\w+\W+\w+\W*\(.*\)$/s) { | 801 | } elsif (/\w+\W+\w+(\{[0-9]+\})?\W*\(.*\)$/s) { |
478 | while (not /\(\)$/s) { | 802 | while (not /\(\)$/s) { |
479 | s/[^\(\)]*\)$/\)/s; | 803 | s/[^\(\)]*\)$/\)/s; |
480 | s/\([^\(\)]*\)\)$/\)/s; | 804 | s/\([^\(\)]*\)\)$/\)/s; |
481 | } | 805 | } |
482 | s/\(void\)//; | 806 | s/\(void\)//; |
483 | /(\w+)\W*\(\)/s; | 807 | /(\w+(\{[0-9]+\})?)\W*\(\)/s; |
484 | $s = $1; | 808 | $s = $1; |
809 | print STDERR "DEBUG: found function $s\n" if $debug; | ||
485 | } elsif (/\(/ and not (/=/)) { | 810 | } elsif (/\(/ and not (/=/)) { |
486 | print STDERR "File $file: cannot parse: $_;\n"; | 811 | print STDERR "File $file: cannot parse: $_;\n"; |
487 | next; | 812 | next; |
@@ -512,67 +837,61 @@ sub do_defs | |||
512 | $a .= ",RSA" if($s =~ /RSAPrivateKey/); | 837 | $a .= ",RSA" if($s =~ /RSAPrivateKey/); |
513 | $a .= ",RSA" if($s =~ /SSLv23?_((client|server)_)?method/); | 838 | $a .= ",RSA" if($s =~ /SSLv23?_((client|server)_)?method/); |
514 | 839 | ||
515 | $platform{$s} .= ','.$p; | 840 | $platform{$s} = |
841 | &reduce_platforms((defined($platform{$s})?$platform{$s}.',':"").$p); | ||
516 | $algorithm{$s} .= ','.$a; | 842 | $algorithm{$s} .= ','.$a; |
517 | 843 | ||
518 | if (defined($rename{$s})) { | 844 | if (defined($variant{$s})) { |
519 | (my $r, my $p) = split(/:/,$rename{$s}); | 845 | foreach $v (split /;/,$variant{$s}) { |
520 | my @ip = map { /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p; | 846 | (my $r, my $p, my $k) = split(/:/,$v); |
521 | $syms{$r} = 1; | 847 | my $ip = join ',',map({ /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p); |
522 | $kind{$r} = $kind{$s}."(".$s.")"; | 848 | $syms{$r} = 1; |
523 | $algorithm{$r} = $algorithm{$s}; | 849 | if (!defined($k)) { $k = $kind{$s}; } |
524 | $platform{$r} = $platform{$s}.",".$p; | 850 | $kind{$r} = $k."(".$s.")"; |
525 | $platform{$s} .= ','.join(',', @ip).','.join(',', @ip); | 851 | $algorithm{$r} = $algorithm{$s}; |
852 | $platform{$r} = &reduce_platforms($platform{$s}.",".$p.",".$p); | ||
853 | $platform{$s} = &reduce_platforms($platform{$s}.','.$ip.','.$ip); | ||
854 | print STDERR "DEBUG: \$variant{\"$s\"} = ",$v,"; \$r = $r; \$p = ",$platform{$r},"; \$a = ",$algorithm{$r},"; \$kind = ",$kind{$r},"\n" if $debug; | ||
855 | } | ||
526 | } | 856 | } |
857 | print STDERR "DEBUG: \$s = $s; \$p = ",$platform{$s},"; \$a = ",$algorithm{$s},"; \$kind = ",$kind{$s},"\n" if $debug; | ||
527 | } | 858 | } |
528 | } | 859 | } |
529 | 860 | ||
530 | # Prune the returned symbols | 861 | # Prune the returned symbols |
531 | 862 | ||
532 | $platform{"crypt"} .= ",!PERL5,!__FreeBSD__,!NeXT"; | ||
533 | |||
534 | delete $syms{"SSL_add_dir_cert_subjects_to_stack"}; | ||
535 | delete $syms{"bn_dump1"}; | 863 | delete $syms{"bn_dump1"}; |
536 | |||
537 | $platform{"BIO_s_file_internal"} .= ",WIN16"; | ||
538 | $platform{"BIO_new_file_internal"} .= ",WIN16"; | ||
539 | $platform{"BIO_new_fp_internal"} .= ",WIN16"; | ||
540 | |||
541 | $platform{"BIO_s_file"} .= ",!WIN16"; | ||
542 | $platform{"BIO_new_file"} .= ",!WIN16"; | ||
543 | $platform{"BIO_new_fp"} .= ",!WIN16"; | ||
544 | |||
545 | $platform{"BIO_s_log"} .= ",!WIN32,!WIN16,!macintosh"; | 864 | $platform{"BIO_s_log"} .= ",!WIN32,!WIN16,!macintosh"; |
546 | 865 | ||
547 | if(exists $syms{"ERR_load_CRYPTO_strings"}) { | 866 | $platform{"PEM_read_NS_CERT_SEQ"} = "VMS"; |
548 | $platform{"ERR_load_CRYPTO_strings"} .= ",!VMS,!WIN16"; | 867 | $platform{"PEM_write_NS_CERT_SEQ"} = "VMS"; |
549 | $syms{"ERR_load_CRYPTOlib_strings"} = 1; | 868 | $platform{"PEM_read_P8_PRIV_KEY_INFO"} = "VMS"; |
550 | $platform{"ERR_load_CRYPTOlib_strings"} .= ",VMS,WIN16"; | 869 | $platform{"PEM_write_P8_PRIV_KEY_INFO"} = "VMS"; |
551 | } | ||
552 | 870 | ||
553 | # Info we know about | 871 | # Info we know about |
554 | 872 | ||
555 | $platform{"RSA_PKCS1_RSAref"} = "RSAREF"; | ||
556 | $algorithm{"RSA_PKCS1_RSAref"} = "RSA"; | ||
557 | |||
558 | push @ret, map { $_."\\".&info_string($_,"EXIST", | 873 | push @ret, map { $_."\\".&info_string($_,"EXIST", |
559 | $platform{$_}, | 874 | $platform{$_}, |
560 | $kind{$_}, | 875 | $kind{$_}, |
561 | $algorithm{$_}) } keys %syms; | 876 | $algorithm{$_}) } keys %syms; |
562 | 877 | ||
878 | if (keys %unknown_algorithms) { | ||
879 | print STDERR "WARNING: mkdef.pl doesn't know the following algorithms:\n"; | ||
880 | print STDERR "\t",join("\n\t",keys %unknown_algorithms),"\n"; | ||
881 | } | ||
563 | return(@ret); | 882 | return(@ret); |
564 | } | 883 | } |
565 | 884 | ||
566 | sub info_string { | 885 | # Param: string of comma-separated platform-specs. |
567 | (my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_; | 886 | sub reduce_platforms |
568 | 887 | { | |
569 | my %a = defined($algorithms) ? | 888 | my ($platforms) = @_; |
570 | map { $_ => 1 } split /,/, $algorithms : (); | ||
571 | my $pl = defined($platforms) ? $platforms : ""; | 889 | my $pl = defined($platforms) ? $platforms : ""; |
572 | my %p = map { $_ => 0 } split /,/, $pl; | 890 | my %p = map { $_ => 0 } split /,/, $pl; |
573 | my $k = defined($kind) ? $kind : "FUNCTION"; | ||
574 | my $ret; | 891 | my $ret; |
575 | 892 | ||
893 | print STDERR "DEBUG: Entered reduce_platforms with \"$platforms\"\n" | ||
894 | if $debug; | ||
576 | # We do this, because if there's code like the following, it really | 895 | # We do this, because if there's code like the following, it really |
577 | # means the function exists in all cases and should therefore be | 896 | # means the function exists in all cases and should therefore be |
578 | # everywhere. By increasing and decreasing, we may attain 0: | 897 | # everywhere. By increasing and decreasing, we may attain 0: |
@@ -594,12 +913,28 @@ sub info_string { | |||
594 | } | 913 | } |
595 | 914 | ||
596 | delete $p{""}; | 915 | delete $p{""}; |
916 | |||
917 | $ret = join(',',sort(map { $p{$_} < 0 ? "!".$_ : $_ } keys %p)); | ||
918 | print STDERR "DEBUG: Exiting reduce_platforms with \"$ret\"\n" | ||
919 | if $debug; | ||
920 | return $ret; | ||
921 | } | ||
922 | |||
923 | sub info_string { | ||
924 | (my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_; | ||
925 | |||
926 | my %a = defined($algorithms) ? | ||
927 | map { $_ => 1 } split /,/, $algorithms : (); | ||
928 | my $k = defined($kind) ? $kind : "FUNCTION"; | ||
929 | my $ret; | ||
930 | my $p = &reduce_platforms($platforms); | ||
931 | |||
597 | delete $a{""}; | 932 | delete $a{""}; |
598 | 933 | ||
599 | $ret = $exist; | 934 | $ret = $exist; |
600 | $ret .= ":".join(',',map { $p{$_} < 0 ? "!".$_ : $_ } keys %p); | 935 | $ret .= ":".$p; |
601 | $ret .= ":".$k; | 936 | $ret .= ":".$k; |
602 | $ret .= ":".join(',',keys %a); | 937 | $ret .= ":".join(',',sort keys %a); |
603 | return $ret; | 938 | return $ret; |
604 | } | 939 | } |
605 | 940 | ||
@@ -607,19 +942,30 @@ sub maybe_add_info { | |||
607 | (my $name, *nums, my @symbols) = @_; | 942 | (my $name, *nums, my @symbols) = @_; |
608 | my $sym; | 943 | my $sym; |
609 | my $new_info = 0; | 944 | my $new_info = 0; |
945 | my %syms=(); | ||
610 | 946 | ||
611 | print STDERR "Updating $name info\n"; | 947 | print STDERR "Updating $name info\n"; |
612 | foreach $sym (@symbols) { | 948 | foreach $sym (@symbols) { |
613 | (my $s, my $i) = split /\\/, $sym; | 949 | (my $s, my $i) = split /\\/, $sym; |
614 | $i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/; | ||
615 | if (defined($nums{$s})) { | 950 | if (defined($nums{$s})) { |
951 | $i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/; | ||
616 | (my $n, my $dummy) = split /\\/, $nums{$s}; | 952 | (my $n, my $dummy) = split /\\/, $nums{$s}; |
617 | if (!defined($dummy) || $i ne $dummy) { | 953 | if (!defined($dummy) || $i ne $dummy) { |
618 | $nums{$s} = $n."\\".$i; | 954 | $nums{$s} = $n."\\".$i; |
619 | $new_info++; | 955 | $new_info++; |
620 | #print STDERR "DEBUG: maybe_add_info for $s: \"$dummy\" => \"$i\"\n"; | 956 | print STDERR "DEBUG: maybe_add_info for $s: \"$dummy\" => \"$i\"\n" if $debug; |
621 | } | 957 | } |
622 | } | 958 | } |
959 | $syms{$s} = 1; | ||
960 | } | ||
961 | |||
962 | my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums; | ||
963 | foreach $sym (@s) { | ||
964 | (my $n, my $i) = split /\\/, $nums{$sym}; | ||
965 | if (!defined($syms{$sym}) && $i !~ /^NOEXIST:/) { | ||
966 | $new_info++; | ||
967 | print STDERR "DEBUG: maybe_add_info for $sym: -> undefined\n" if $debug; | ||
968 | } | ||
623 | } | 969 | } |
624 | if ($new_info) { | 970 | if ($new_info) { |
625 | print STDERR "$new_info old symbols got an info update\n"; | 971 | print STDERR "$new_info old symbols got an info update\n"; |
@@ -631,35 +977,121 @@ sub maybe_add_info { | |||
631 | } | 977 | } |
632 | } | 978 | } |
633 | 979 | ||
980 | # Param: string of comma-separated keywords, each possibly prefixed with a "!" | ||
981 | sub is_valid | ||
982 | { | ||
983 | my ($keywords_txt,$platforms) = @_; | ||
984 | my (@keywords) = split /,/,$keywords_txt; | ||
985 | my ($falsesum, $truesum) = (0, !grep(/^[^!]/,@keywords)); | ||
986 | |||
987 | # Param: one keyword | ||
988 | sub recognise | ||
989 | { | ||
990 | my ($keyword,$platforms) = @_; | ||
991 | |||
992 | if ($platforms) { | ||
993 | # platforms | ||
994 | if ($keyword eq "VMS" && $VMS) { return 1; } | ||
995 | if ($keyword eq "WIN32" && $W32) { return 1; } | ||
996 | if ($keyword eq "WIN16" && $W16) { return 1; } | ||
997 | if ($keyword eq "WINNT" && $NT) { return 1; } | ||
998 | # Special platforms: | ||
999 | # EXPORT_VAR_AS_FUNCTION means that global variables | ||
1000 | # will be represented as functions. This currently | ||
1001 | # only happens on VMS-VAX. | ||
1002 | if ($keyword eq "EXPORT_VAR_AS_FUNCTION" && ($VMSVAX || $W32 || $W16)) { | ||
1003 | return 1; | ||
1004 | } | ||
1005 | return 0; | ||
1006 | } else { | ||
1007 | # algorithms | ||
1008 | if ($keyword eq "RC2" && $no_rc2) { return 0; } | ||
1009 | if ($keyword eq "RC4" && $no_rc4) { return 0; } | ||
1010 | if ($keyword eq "RC5" && $no_rc5) { return 0; } | ||
1011 | if ($keyword eq "IDEA" && $no_idea) { return 0; } | ||
1012 | if ($keyword eq "DES" && $no_des) { return 0; } | ||
1013 | if ($keyword eq "BF" && $no_bf) { return 0; } | ||
1014 | if ($keyword eq "CAST" && $no_cast) { return 0; } | ||
1015 | if ($keyword eq "MD2" && $no_md2) { return 0; } | ||
1016 | if ($keyword eq "MD4" && $no_md4) { return 0; } | ||
1017 | if ($keyword eq "MD5" && $no_md5) { return 0; } | ||
1018 | if ($keyword eq "SHA" && $no_sha) { return 0; } | ||
1019 | if ($keyword eq "RIPEMD" && $no_ripemd) { return 0; } | ||
1020 | if ($keyword eq "MDC2" && $no_mdc2) { return 0; } | ||
1021 | if ($keyword eq "RSA" && $no_rsa) { return 0; } | ||
1022 | if ($keyword eq "DSA" && $no_dsa) { return 0; } | ||
1023 | if ($keyword eq "DH" && $no_dh) { return 0; } | ||
1024 | if ($keyword eq "EC" && $no_ec) { return 0; } | ||
1025 | if ($keyword eq "HMAC" && $no_hmac) { return 0; } | ||
1026 | if ($keyword eq "AES" && $no_aes) { return 0; } | ||
1027 | if ($keyword eq "EVP" && $no_evp) { return 0; } | ||
1028 | if ($keyword eq "LHASH" && $no_lhash) { return 0; } | ||
1029 | if ($keyword eq "STACK" && $no_stack) { return 0; } | ||
1030 | if ($keyword eq "ERR" && $no_err) { return 0; } | ||
1031 | if ($keyword eq "BUFFER" && $no_buffer) { return 0; } | ||
1032 | if ($keyword eq "BIO" && $no_bio) { return 0; } | ||
1033 | if ($keyword eq "COMP" && $no_comp) { return 0; } | ||
1034 | if ($keyword eq "DSO" && $no_dso) { return 0; } | ||
1035 | if ($keyword eq "KRB5" && $no_krb5) { return 0; } | ||
1036 | if ($keyword eq "FP_API" && $no_fp_api) { return 0; } | ||
1037 | |||
1038 | # Nothing recognise as true | ||
1039 | return 1; | ||
1040 | } | ||
1041 | } | ||
1042 | |||
1043 | foreach $k (@keywords) { | ||
1044 | if ($k =~ /^!(.*)$/) { | ||
1045 | $falsesum += &recognise($1,$platforms); | ||
1046 | } else { | ||
1047 | $truesum += &recognise($k,$platforms); | ||
1048 | } | ||
1049 | } | ||
1050 | print STDERR "DEBUG: [",$#keywords,",",$#keywords < 0,"] is_valid($keywords_txt) => (\!$falsesum) && $truesum = ",(!$falsesum) && $truesum,"\n" if $debug; | ||
1051 | return (!$falsesum) && $truesum; | ||
1052 | } | ||
1053 | |||
634 | sub print_test_file | 1054 | sub print_test_file |
635 | { | 1055 | { |
636 | (*OUT,my $name,*nums,my @symbols)=@_; | 1056 | (*OUT,my $name,*nums,my $testall,my @symbols)=@_; |
637 | my $n = 1; my @e; my @r; | 1057 | my $n = 1; my @e; my @r; |
638 | my $sym; my $prev = ""; my $prefSSLeay; | 1058 | my $sym; my $prev = ""; my $prefSSLeay; |
639 | 1059 | ||
640 | (@e)=grep(/^SSLeay\\.*?:.*?:FUNCTION/,@symbols); | 1060 | (@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols); |
641 | (@r)=grep(/^\w+\\.*?:.*?:FUNCTION/ && !/^SSLeay\\.*?:.*?:FUNCTION/,@symbols); | 1061 | (@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:.*/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols); |
642 | @symbols=((sort @e),(sort @r)); | 1062 | @symbols=((sort @e),(sort @r)); |
643 | 1063 | ||
644 | foreach $sym (@symbols) { | 1064 | foreach $sym (@symbols) { |
645 | (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/; | 1065 | (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/; |
646 | if ($s ne $prev) { | 1066 | my $v = 0; |
647 | if (!defined($nums{$sym})) { | 1067 | $v = 1 if $i=~ /^.*?:.*?:VARIABLE/; |
648 | printf STDERR "Warning: $sym does not have a number assigned\n" | 1068 | my $p = ($i =~ /^[^:]*:([^:]*):/,$1); |
649 | if(!$do_update); | 1069 | my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1); |
1070 | if (!defined($nums{$s})) { | ||
1071 | print STDERR "Warning: $s does not have a number assigned\n" | ||
1072 | if(!$do_update); | ||
1073 | } elsif (is_valid($p,1) && is_valid($a,0)) { | ||
1074 | my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1); | ||
1075 | if ($prev eq $s2) { | ||
1076 | print OUT "\t/* The following has already appeared previously */\n"; | ||
1077 | print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n"; | ||
1078 | } | ||
1079 | $prev = $s2; # To warn about duplicates... | ||
1080 | |||
1081 | ($nn,$ni)=($nums{$s2} =~ /^(.*?)\\(.*)$/); | ||
1082 | if ($v) { | ||
1083 | print OUT "\textern int $s2; /* type unknown */ /* $nn $ni */\n"; | ||
650 | } else { | 1084 | } else { |
651 | $n=$nums{$s}; | 1085 | print OUT "\textern int $s2(); /* type unknown */ /* $nn $ni */\n"; |
652 | print OUT "\t$s();\n"; | ||
653 | } | 1086 | } |
654 | } | 1087 | } |
655 | $prev = $s; # To avoid duplicates... | ||
656 | } | 1088 | } |
657 | } | 1089 | } |
658 | 1090 | ||
659 | sub print_def_file | 1091 | sub print_def_file |
660 | { | 1092 | { |
661 | (*OUT,my $name,*nums,my @symbols)=@_; | 1093 | (*OUT,my $name,*nums,my @symbols)=@_; |
662 | my $n = 1; my @e; my @r; | 1094 | my $n = 1; my @e; my @r; my @v; my $prev=""; |
663 | 1095 | ||
664 | if ($W32) | 1096 | if ($W32) |
665 | { $name.="32"; } | 1097 | { $name.="32"; } |
@@ -692,80 +1124,35 @@ EOF | |||
692 | 1124 | ||
693 | print "EXPORTS\n"; | 1125 | print "EXPORTS\n"; |
694 | 1126 | ||
695 | (@e)=grep(/^SSLeay\\.*?:.*?:FUNCTION/,@symbols); | 1127 | (@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols); |
696 | (@r)=grep(/^\w+\\.*?:.*?:FUNCTION/ && !/^SSLeay\\.*?:.*?:FUNCTION/,@symbols); | 1128 | (@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:FUNCTION/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols); |
697 | @symbols=((sort @e),(sort @r)); | 1129 | (@v)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:VARIABLE/,@symbols); |
1130 | @symbols=((sort @e),(sort @r), (sort @v)); | ||
698 | 1131 | ||
699 | 1132 | ||
700 | foreach $sym (@symbols) { | 1133 | foreach $sym (@symbols) { |
701 | (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/; | 1134 | (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/; |
1135 | my $v = 0; | ||
1136 | $v = 1 if $i =~ /^.*?:.*?:VARIABLE/; | ||
702 | if (!defined($nums{$s})) { | 1137 | if (!defined($nums{$s})) { |
703 | printf STDERR "Warning: $s does not have a number assigned\n" | 1138 | printf STDERR "Warning: $s does not have a number assigned\n" |
704 | if(!$do_update); | 1139 | if(!$do_update); |
705 | } else { | 1140 | } else { |
706 | (my $n, my $i) = split /\\/, $nums{$s}; | 1141 | (my $n, my $dummy) = split /\\/, $nums{$s}; |
707 | my %pf = (); | 1142 | my %pf = (); |
708 | my @p = split(/,/, ($i =~ /^[^:]*:([^:]*):/,$1)); | 1143 | my $p = ($i =~ /^[^:]*:([^:]*):/,$1); |
709 | my @a = split(/,/, ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1)); | 1144 | my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1); |
710 | # @p_purged must contain hardware platforms only | 1145 | if (is_valid($p,1) && is_valid($a,0)) { |
711 | my @p_purged = (); | 1146 | my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1); |
712 | foreach $ptmp (@p) { | 1147 | if ($prev eq $s2) { |
713 | next if $ptmp =~ /^!?RSAREF$/; | 1148 | print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n"; |
714 | push @p_purged, $ptmp; | 1149 | } |
715 | } | 1150 | $prev = $s2; # To warn about duplicates... |
716 | my $negatives = !!grep(/^!/,@p); | 1151 | if($v) { |
717 | # It is very important to check NT before W32 | 1152 | printf OUT " %s%-39s @%-8d DATA\n",($W32)?"":"_",$s2,$n; |
718 | if ((($NT && (!@p_purged | 1153 | } else { |
719 | || (!$negatives && grep(/^WINNT$/,@p)) | 1154 | printf OUT " %s%-39s @%d\n",($W32)?"":"_",$s2,$n; |
720 | || ($negatives && !grep(/^!WINNT$/,@p)))) | 1155 | } |
721 | || ($W32 && (!@p_purged | ||
722 | || (!$negatives && grep(/^WIN32$/,@p)) | ||
723 | || ($negatives && !grep(/^!WIN32$/,@p)))) | ||
724 | || ($W16 && (!@p_purged | ||
725 | || (!$negatives && grep(/^WIN16$/,@p)) | ||
726 | || ($negatives && !grep(/^!WIN16$/,@p))))) | ||
727 | && (!@p | ||
728 | || (!$negatives | ||
729 | && ($rsaref || !grep(/^RSAREF$/,@p))) | ||
730 | || ($negatives | ||
731 | && (!$rsaref || !grep(/^!RSAREF$/,@p)))) | ||
732 | && (!@a || (!$no_rc2 || !grep(/^RC2$/,@a))) | ||
733 | && (!@a || (!$no_rc4 || !grep(/^RC4$/,@a))) | ||
734 | && (!@a || (!$no_rc5 || !grep(/^RC5$/,@a))) | ||
735 | && (!@a || (!$no_idea || !grep(/^IDEA$/,@a))) | ||
736 | && (!@a || (!$no_des || !grep(/^DES$/,@a))) | ||
737 | && (!@a || (!$no_bf || !grep(/^BF$/,@a))) | ||
738 | && (!@a || (!$no_cast || !grep(/^CAST$/,@a))) | ||
739 | && (!@a || (!$no_md2 || !grep(/^MD2$/,@a))) | ||
740 | && (!@a || (!$no_md4 || !grep(/^MD4$/,@a))) | ||
741 | && (!@a || (!$no_md5 || !grep(/^MD5$/,@a))) | ||
742 | && (!@a || (!$no_sha || !grep(/^SHA$/,@a))) | ||
743 | && (!@a || (!$no_ripemd || !grep(/^RIPEMD$/,@a))) | ||
744 | && (!@a || (!$no_mdc2 || !grep(/^MDC2$/,@a))) | ||
745 | && (!@a || (!$no_rsa || !grep(/^RSA$/,@a))) | ||
746 | && (!@a || (!$no_dsa || !grep(/^DSA$/,@a))) | ||
747 | && (!@a || (!$no_dh || !grep(/^DH$/,@a))) | ||
748 | && (!@a || (!$no_hmac || !grep(/^HMAC$/,@a))) | ||
749 | && (!@a || (!$no_fp_api || !grep(/^FP_API$/,@a))) | ||
750 | ) { | ||
751 | printf OUT " %s%-40s@%d\n",($W32)?"":"_",$s,$n; | ||
752 | # } else { | ||
753 | # print STDERR "DEBUG: \"$sym\" (@p):", | ||
754 | # " rsaref:", !!(!@p | ||
755 | # || (!$negatives | ||
756 | # && ($rsaref || !grep(/^RSAREF$/,@p))) | ||
757 | # || ($negatives | ||
758 | # && (!$rsaref || !grep(/^!RSAREF$/,@p))))?1:0, | ||
759 | # " 16:", !!($W16 && (!@p_purged | ||
760 | # || (!$negatives && grep(/^WIN16$/,@p)) | ||
761 | # || ($negatives && !grep(/^!WIN16$/,@p)))), | ||
762 | # " 32:", !!($W32 && (!@p_purged | ||
763 | # || (!$negatives && grep(/^WIN32$/,@p)) | ||
764 | # || ($negatives && !grep(/^!WIN32$/,@p)))), | ||
765 | # " NT:", !!($NT && (!@p_purged | ||
766 | # || (!$negatives && grep(/^WINNT$/,@p)) | ||
767 | # || ($negatives && !grep(/^!WINNT$/,@p)))), | ||
768 | # "\n"; | ||
769 | } | 1156 | } |
770 | } | 1157 | } |
771 | } | 1158 | } |
@@ -780,6 +1167,7 @@ sub load_numbers | |||
780 | $max_num = 0; | 1167 | $max_num = 0; |
781 | $num_noinfo = 0; | 1168 | $num_noinfo = 0; |
782 | $prev = ""; | 1169 | $prev = ""; |
1170 | $prev_cnt = 0; | ||
783 | 1171 | ||
784 | open(IN,"<$name") || die "unable to open $name:$!\n"; | 1172 | open(IN,"<$name") || die "unable to open $name:$!\n"; |
785 | while (<IN>) { | 1173 | while (<IN>) { |
@@ -788,14 +1176,22 @@ sub load_numbers | |||
788 | next if /^\s*$/; | 1176 | next if /^\s*$/; |
789 | @a=split; | 1177 | @a=split; |
790 | if (defined $ret{$a[0]}) { | 1178 | if (defined $ret{$a[0]}) { |
791 | print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n"; | 1179 | # This is actually perfectly OK |
1180 | #print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n"; | ||
792 | } | 1181 | } |
793 | if ($max_num > $a[1]) { | 1182 | if ($max_num > $a[1]) { |
794 | print STDERR "Warning: Number decreased from ",$max_num," to ",$a[1],"\n"; | 1183 | print STDERR "Warning: Number decreased from ",$max_num," to ",$a[1],"\n"; |
795 | } | 1184 | } |
796 | if ($max_num == $a[1]) { | 1185 | elsif ($max_num == $a[1]) { |
797 | # This is actually perfectly OK | 1186 | # This is actually perfectly OK |
798 | #print STDERR "Warning: Symbol ",$a[0]," has same number as previous ",$prev,": ",$a[1],"\n"; | 1187 | #print STDERR "Warning: Symbol ",$a[0]," has same number as previous ",$prev,": ",$a[1],"\n"; |
1188 | if ($a[0] eq $prev) { | ||
1189 | $prev_cnt++; | ||
1190 | $a[0] .= "{$prev_cnt}"; | ||
1191 | } | ||
1192 | } | ||
1193 | else { | ||
1194 | $prev_cnt = 0; | ||
799 | } | 1195 | } |
800 | if ($#a < 2) { | 1196 | if ($#a < 2) { |
801 | # Existence will be proven later, in do_defs | 1197 | # Existence will be proven later, in do_defs |
@@ -837,7 +1233,7 @@ sub rewrite_numbers | |||
837 | 1233 | ||
838 | print STDERR "Rewriting $name\n"; | 1234 | print STDERR "Rewriting $name\n"; |
839 | 1235 | ||
840 | my @r = grep(/^\w+\\.*?:.*?:\w+\(\w+\)/,@symbols); | 1236 | my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols); |
841 | my $r; my %r; my %rsyms; | 1237 | my $r; my %r; my %rsyms; |
842 | foreach $r (@r) { | 1238 | foreach $r (@r) { |
843 | (my $s, my $i) = split /\\/, $r; | 1239 | (my $s, my $i) = split /\\/, $r; |
@@ -847,16 +1243,31 @@ sub rewrite_numbers | |||
847 | $rsyms{$s} = 1; | 1243 | $rsyms{$s} = 1; |
848 | } | 1244 | } |
849 | 1245 | ||
850 | my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums; | 1246 | my %syms = (); |
1247 | foreach $_ (@symbols) { | ||
1248 | (my $n, my $i) = split /\\/; | ||
1249 | $syms{$n} = 1; | ||
1250 | } | ||
1251 | |||
1252 | my @s=sort { | ||
1253 | &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") | ||
1254 | || $a cmp $b | ||
1255 | } keys %nums; | ||
851 | foreach $sym (@s) { | 1256 | foreach $sym (@s) { |
852 | (my $n, my $i) = split /\\/, $nums{$sym}; | 1257 | (my $n, my $i) = split /\\/, $nums{$sym}; |
853 | next if defined($i) && $i =~ /^.*?:.*?:\w+\(\w+\)/; | 1258 | next if defined($i) && $i =~ /^.*?:.*?:\w+\(\w+\)/; |
854 | next if defined($rsyms{$sym}); | 1259 | next if defined($rsyms{$sym}); |
855 | $i="NOEXIST::FUNCTION:" if !defined($i) || $i eq ""; | 1260 | print STDERR "DEBUG: rewrite_numbers for sym = ",$sym,": i = ",$i,", n = ",$n,", rsym{sym} = ",$rsyms{$sym},"syms{sym} = ",$syms{$sym},"\n" if $debug; |
856 | printf OUT "%s%-40s%d\t%s\n","",$sym,$n,$i; | 1261 | $i="NOEXIST::FUNCTION:" |
1262 | if !defined($i) || $i eq "" || !defined($syms{$sym}); | ||
1263 | my $s2 = $sym; | ||
1264 | $s2 =~ s/\{[0-9]+\}$//; | ||
1265 | printf OUT "%s%-39s %d\t%s\n","",$s2,$n,$i; | ||
857 | if (exists $r{$sym}) { | 1266 | if (exists $r{$sym}) { |
858 | (my $s, $i) = split /\\/,$r{$sym}; | 1267 | (my $s, $i) = split /\\/,$r{$sym}; |
859 | printf OUT "%s%-40s%d\t%s\n","",$s,$n,$i; | 1268 | my $s2 = $s; |
1269 | $s2 =~ s/\{[0-9]+\}$//; | ||
1270 | printf OUT "%s%-39s %d\t%s\n","",$s2,$n,$i; | ||
860 | } | 1271 | } |
861 | } | 1272 | } |
862 | } | 1273 | } |
@@ -868,7 +1279,7 @@ sub update_numbers | |||
868 | 1279 | ||
869 | print STDERR "Updating $name numbers\n"; | 1280 | print STDERR "Updating $name numbers\n"; |
870 | 1281 | ||
871 | my @r = grep(/^\w+\\.*?:.*?:\w+\(\w+\)/,@symbols); | 1282 | my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols); |
872 | my $r; my %r; my %rsyms; | 1283 | my $r; my %r; my %rsyms; |
873 | foreach $r (@r) { | 1284 | foreach $r (@r) { |
874 | (my $s, my $i) = split /\\/, $r; | 1285 | (my $s, my $i) = split /\\/, $r; |
@@ -886,10 +1297,13 @@ sub update_numbers | |||
886 | if $i eq ""; | 1297 | if $i eq ""; |
887 | if (!exists $nums{$s}) { | 1298 | if (!exists $nums{$s}) { |
888 | $new_syms++; | 1299 | $new_syms++; |
889 | printf OUT "%s%-40s%d\t%s\n","",$s, ++$start_num,$i; | 1300 | my $s2 = $s; |
1301 | $s2 =~ s/\{[0-9]+\}$//; | ||
1302 | printf OUT "%s%-39s %d\t%s\n","",$s2, ++$start_num,$i; | ||
890 | if (exists $r{$s}) { | 1303 | if (exists $r{$s}) { |
891 | ($s, $i) = split /\\/,$r{$s}; | 1304 | ($s, $i) = split /\\/,$r{$s}; |
892 | printf OUT "%s%-40s%d\t%s\n","",$s, $start_num,$i; | 1305 | $s =~ s/\{[0-9]+\}$//; |
1306 | printf OUT "%s%-39s %d\t%s\n","",$s, $start_num,$i; | ||
893 | } | 1307 | } |
894 | } | 1308 | } |
895 | } | 1309 | } |