]> git.ipfire.org Git - thirdparty/openssl.git/blame - util/mkdef.pl
Fix verify algorithm.
[thirdparty/openssl.git] / util / mkdef.pl
CommitLineData
ce9449cf 1#!/usr/local/bin/perl -w
d02b48c6
RE
2#
3# generate a .def file
4#
5# It does this by parsing the header files and looking for the
47339f61 6# prototyped functions: it then prunes the output.
d02b48c6 7#
1a53f1d6
RS
8# Intermediary files are created, call libeay.num and ssleay.num,
9# The format of these files is:
948d0125
RL
10#
11# routine-name nnnn info
12#
13# and the "info" part is actually a colon-separated string of fields with
14# the following meaning:
15#
16# existence:platform:kind:algorithms
17#
18# - "existence" can be "EXIST" or "NOEXIST" depending on if the symbol is
19# found somewhere in the source,
20# - "platforms" is empty if it exists on all platforms, otherwise it contains
21# comma-separated list of the platform, just as they are if the symbol exists
22# for those platforms, or prepended with a "!" if not. This helps resolve
62dc5aad 23# symbol name variants for platforms where the names are too long for the
948d0125 24# compiler or linker, or if the systems is case insensitive and there is a
62dc5aad
RL
25# clash, or the symbol is implemented differently (see
26# EXPORT_VAR_AS_FUNCTION). This script assumes renaming of symbols is found
27# in the file crypto/symhacks.h.
28# The semantics for the platforms is that every item is checked against the
5012158a
LJ
29# environment. For the negative items ("!FOO"), if any of them is false
30# (i.e. "FOO" is true) in the environment, the corresponding symbol can't be
62dc5aad
RL
31# used. For the positive itms, if all of them are false in the environment,
32# the corresponding symbol can't be used. Any combination of positive and
33# negative items are possible, and of course leave room for some redundancy.
948d0125
RL
34# - "kind" is "FUNCTION" or "VARIABLE". The meaning of that is obvious.
35# - "algorithms" is a comma-separated list of algorithm names. This helps
36# exclude symbols that are part of an algorithm that some user wants to
37# exclude.
38#
d02b48c6 39
d399fdf8
RL
40my $debug=0;
41
948d0125
RL
42my $crypto_num= "util/libeay.num";
43my $ssl_num= "util/ssleay.num";
cd4c36ad 44my $libname;
d02b48c6 45
47339f61 46my $do_update = 0;
1449bda0 47my $do_rewrite = 1;
47339f61
DSH
48my $do_crypto = 0;
49my $do_ssl = 0;
0f583f69 50my $do_ctest = 0;
967f4ca8 51my $do_ctestall = 0;
c47c6196 52my $do_checkexist = 0;
47339f61 53
62dc5aad 54my $VMSVAX=0;
af55c09d 55my $VMSNonVAX=0;
948d0125
RL
56my $VMS=0;
57my $W32=0;
0f583f69 58my $NT=0;
cd4c36ad 59my $OS2=0;
28a98809 60# Set this to make typesafe STACK definitions appear in DEF
e41c8d6a 61my $safe_stack_def = 0;
31ff97b2 62
e03b2987 63my @known_platforms = ( "__FreeBSD__", "PERL5",
19cd2049
DSH
64 "EXPORT_VAR_AS_FUNCTION", "ZLIB",
65 "OPENSSL_FIPS", "OPENSSL_FIPSCAPABLE" );
6d23cf97 66my @known_ossl_platforms = ( "VMS", "WIN32", "WINNT", "OS2" );
948d0125 67my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF",
3f07fe09 68 "CAST", "MD2", "MD4", "MD5", "SHA", "SHA0", "SHA1",
1f7103b6 69 "SHA256", "SHA512", "RMD160",
36246be9 70 "MDC2", "WHIRLPOOL", "RSA", "DSA", "DH", "EC", "ECDH", "ECDSA", "EC2M",
96afc1cf 71 "HMAC", "AES", "CAMELLIA", "SEED", "GOST",
e0d6132b
BM
72 # EC_NISTP_64_GCC_128
73 "EC_NISTP_64_GCC_128",
3f07fe09
RL
74 # Envelope "algorithms"
75 "EVP", "X509", "ASN1_TYPEDEFS",
76 # Helper "algorithms"
77 "BIO", "COMP", "BUFFER", "LHASH", "STACK", "ERR",
78 "LOCKING",
79 # External "algorithms"
64387788 80 "FP_API", "STDIO", "SOCK", "KRB5", "DGRAM",
6cb68620 81 # Engines
987bebaf 82 "STATIC_ENGINE", "ENGINE", "HW", "GMP",
c20276e4 83 # TLS
918fc30f 84 "TLSEXT", "PSK", "SRP", "HEARTBEATS",
8931b30d
DSH
85 # CMS
86 "CMS",
d8bd55a3
DSH
87 # CryptoAPI Engine
88 "CAPIENG",
3881d810
DSH
89 # SSL v3 method
90 "SSL3_METHOD",
79bd20fd
DSH
91 # JPAKE
92 "JPAKE",
36246be9
DSH
93 # NEXTPROTONEG
94 "NEXTPROTONEG",
4ccfe5f4 95 # Deprecated functions
b1d00b96 96 "DEPRECATED",
9ef562bc 97 # SCTP
3dd814ac
MC
98 "SCTP",
99 # SRTP
100 "SRTP",
8fdb4f1a 101 # SSL TRACE
e0fc7961
DSH
102 "SSL_TRACE",
103 # Unit testing
dc0e9a35
MC
104 "UNIT_TEST",
105 # OCB mode
1a53f1d6
RS
106 "OCB",
107 # APPLINK (win build feature?)
108 "APPLINK"
109 );
948d0125 110
0f583f69 111my $options="";
52272327 112open(IN,"<Makefile") || die "unable to open Makefile!\n";
31ff97b2
UM
113while(<IN>) {
114 $options=$1 if (/^OPTIONS=(.*)$/);
115}
ce457a54 116close(IN);
31ff97b2 117
0f583f69
UM
118# The following ciphers may be excluded (by Configure). This means functions
119# defined with ifndef(NO_XXX) are not included in the .def file, and everything
120# in directory xxx is ignored.
121my $no_rc2; my $no_rc4; my $no_rc5; my $no_idea; my $no_des; my $no_bf;
96afc1cf 122my $no_cast; my $no_whirlpool; my $no_camellia; my $no_seed;
3009458e 123my $no_md2; my $no_md4; my $no_md5; my $no_sha; my $no_ripemd; my $no_mdc2;
a283d2a8 124my $no_rsa; my $no_dsa; my $no_dh; my $no_aes; my $no_krb5;
5cd48abf 125my $no_ec; my $no_ecdsa; my $no_ecdh; my $no_engine; my $no_hw;
f858d222 126my $no_fp_api; my $no_static_engine=1; my $no_gmp; my $no_deprecated;
7317192c 127my $no_psk; my $no_tlsext; my $no_cms; my $no_capieng;
45f55f6a 128my $no_jpake; my $no_srp; my $no_ec2m; my $no_nistp_gcc;
3dd814ac 129my $no_nextprotoneg; my $no_sctp; my $no_srtp; my $no_ssl_trace;
dc0e9a35 130my $no_unit_test; my $no_ssl3_method; my $no_ocb;
8931b30d 131
53f76337
DSH
132my $fips;
133
8931b30d 134my $zlib;
987bebaf 135
0f583f69 136
31ff97b2 137foreach (@ARGV, split(/ /, $options))
d02b48c6 138 {
62dc5aad 139 $debug=1 if $_ eq "debug";
06c68491 140 $W32=1 if $_ eq "32";
6d23cf97 141 die "win16 not supported" if $_ eq "16";
06c68491
DSH
142 if($_ eq "NT") {
143 $W32 = 1;
144 $NT = 1;
145 }
62dc5aad
RL
146 if ($_ eq "VMS-VAX") {
147 $VMS=1;
148 $VMSVAX=1;
149 }
af55c09d 150 if ($_ eq "VMS-NonVAX") {
62dc5aad 151 $VMS=1;
af55c09d 152 $VMSNonVAX=1;
62dc5aad 153 }
948d0125 154 $VMS=1 if $_ eq "VMS";
cd4c36ad 155 $OS2=1 if $_ eq "OS2";
53f76337 156 $fips=1 if /^fips/;
b2cf7c64 157 if ($_ eq "zlib" || $_ eq "enable-zlib" || $_ eq "zlib-dynamic"
8931b30d
DSH
158 || $_ eq "enable-zlib-dynamic") {
159 $zlib = 1;
160 }
161
d02b48c6 162 $do_ssl=1 if $_ eq "ssleay";
cd4c36ad
RL
163 if ($_ eq "ssl") {
164 $do_ssl=1;
165 $libname=$_
166 }
d02b48c6 167 $do_crypto=1 if $_ eq "libeay";
cd4c36ad
RL
168 if ($_ eq "crypto") {
169 $do_crypto=1;
170 $libname=$_;
171 }
fbf002bb
DSH
172 $no_static_engine=1 if $_ eq "no-static-engine";
173 $no_static_engine=0 if $_ eq "enable-static-engine";
55a9cc6e 174 $do_update=1 if $_ eq "update";
948d0125 175 $do_rewrite=1 if $_ eq "rewrite";
12aefe78 176 $do_ctest=1 if $_ eq "ctest";
967f4ca8 177 $do_ctestall=1 if $_ eq "ctestall";
c47c6196 178 $do_checkexist=1 if $_ eq "exist";
a8b07aa4 179 #$safe_stack_def=1 if $_ eq "-DDEBUG_SAFESTACK";
8cf65228
UM
180
181 if (/^no-rc2$/) { $no_rc2=1; }
182 elsif (/^no-rc4$/) { $no_rc4=1; }
183 elsif (/^no-rc5$/) { $no_rc5=1; }
184 elsif (/^no-idea$/) { $no_idea=1; }
be054868 185 elsif (/^no-des$/) { $no_des=1; $no_mdc2=1; }
8cf65228
UM
186 elsif (/^no-bf$/) { $no_bf=1; }
187 elsif (/^no-cast$/) { $no_cast=1; }
ec645d90 188 elsif (/^no-whirlpool$/) { $no_whirlpool=1; }
8cf65228 189 elsif (/^no-md2$/) { $no_md2=1; }
3009458e 190 elsif (/^no-md4$/) { $no_md4=1; }
8cf65228
UM
191 elsif (/^no-md5$/) { $no_md5=1; }
192 elsif (/^no-sha$/) { $no_sha=1; }
193 elsif (/^no-ripemd$/) { $no_ripemd=1; }
194 elsif (/^no-mdc2$/) { $no_mdc2=1; }
195 elsif (/^no-rsa$/) { $no_rsa=1; }
196 elsif (/^no-dsa$/) { $no_dsa=1; }
197 elsif (/^no-dh$/) { $no_dh=1; }
b4f682d3 198 elsif (/^no-ec$/) { $no_ec=1; }
4d94ae00 199 elsif (/^no-ecdsa$/) { $no_ecdsa=1; }
e172d60d 200 elsif (/^no-ecdh$/) { $no_ecdh=1; }
c47c6196 201 elsif (/^no-aes$/) { $no_aes=1; }
f3dea9a5 202 elsif (/^no-camellia$/) { $no_camellia=1; }
96afc1cf 203 elsif (/^no-seed$/) { $no_seed=1; }
3f07fe09
RL
204 elsif (/^no-evp$/) { $no_evp=1; }
205 elsif (/^no-lhash$/) { $no_lhash=1; }
206 elsif (/^no-stack$/) { $no_stack=1; }
207 elsif (/^no-err$/) { $no_err=1; }
208 elsif (/^no-buffer$/) { $no_buffer=1; }
209 elsif (/^no-bio$/) { $no_bio=1; }
210 #elsif (/^no-locking$/) { $no_locking=1; }
211 elsif (/^no-comp$/) { $no_comp=1; }
212 elsif (/^no-dso$/) { $no_dso=1; }
c063f2c5 213 elsif (/^no-krb5$/) { $no_krb5=1; }
0b13e9f0 214 elsif (/^no-engine$/) { $no_engine=1; }
5cd48abf 215 elsif (/^no-hw$/) { $no_hw=1; }
987bebaf 216 elsif (/^no-gmp$/) { $no_gmp=1; }
525de5d3 217 elsif (/^no-tlsext$/) { $no_tlsext=1; }
8931b30d 218 elsif (/^no-cms$/) { $no_cms=1; }
36246be9 219 elsif (/^no-ec2m$/) { $no_ec2m=1; }
ff636340 220 elsif (/^no-ec-nistp224-64-gcc-128$/) { $no_nistp_gcc=1; }
36246be9 221 elsif (/^no-nextprotoneg$/) { $no_nextprotoneg=1; }
3881d810 222 elsif (/^no-ssl3-method$/) { $no_ssl3_method=1; }
8fdb4f1a 223 elsif (/^no-ssl-trace$/) { $no_ssl_trace=1; }
d8bd55a3 224 elsif (/^no-capieng$/) { $no_capieng=1; }
79bd20fd 225 elsif (/^no-jpake$/) { $no_jpake=1; }
edc032b5 226 elsif (/^no-srp$/) { $no_srp=1; }
9ef562bc 227 elsif (/^no-sctp$/) { $no_sctp=1; }
3dd814ac 228 elsif (/^no-srtp$/) { $no_srtp=1; }
e0fc7961 229 elsif (/^no-unit-test$/){ $no_unit_test=1; }
732192a0 230 elsif (/^no-deprecated$/) { $no_deprecated=1; }
dc0e9a35 231 elsif (/^no-ocb/){ $no_ocb=1; }
d02b48c6
RE
232 }
233
12aefe78 234
cd4c36ad
RL
235if (!$libname) {
236 if ($do_ssl) {
237 $libname="SSLEAY";
238 }
239 if ($do_crypto) {
240 $libname="LIBEAY";
241 }
242}
243
948d0125 244# If no platform is given, assume WIN32
6d23cf97 245if ($W32 + $VMS + $OS2 == 0) {
948d0125
RL
246 $W32 = 1;
247}
248
d02b48c6
RE
249if (!$do_ssl && !$do_crypto)
250 {
cd4c36ad 251 print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | NT | OS2 ]\n";
d02b48c6
RE
252 exit(1);
253 }
254
255%ssl_list=&load_numbers($ssl_num);
55a9cc6e 256$max_ssl = $max_num;
d02b48c6 257%crypto_list=&load_numbers($crypto_num);
55a9cc6e 258$max_crypto = $max_num;
d02b48c6 259
0f583f69 260my $ssl="ssl/ssl.h";
3f07fe09 261$ssl.=" ssl/kssl.h";
c20276e4 262$ssl.=" ssl/tls1.h";
2c3ee8ad 263$ssl.=" ssl/srtp.h";
d02b48c6 264
0f583f69 265my $crypto ="crypto/crypto.h";
5b6aaac9 266$crypto.=" crypto/cryptlib.h";
6ac15712 267$crypto.=" crypto/o_dir.h";
486ec555 268$crypto.=" crypto/o_str.h";
c303d4d8 269$crypto.=" crypto/des/des.h" ; # unless $no_des;
0d96bf89
RL
270$crypto.=" crypto/idea/idea.h" ; # unless $no_idea;
271$crypto.=" crypto/rc4/rc4.h" ; # unless $no_rc4;
272$crypto.=" crypto/rc5/rc5.h" ; # unless $no_rc5;
273$crypto.=" crypto/rc2/rc2.h" ; # unless $no_rc2;
274$crypto.=" crypto/bf/blowfish.h" ; # unless $no_bf;
275$crypto.=" crypto/cast/cast.h" ; # unless $no_cast;
ec645d90 276$crypto.=" crypto/whrlpool/whrlpool.h" ;
0d96bf89
RL
277$crypto.=" crypto/md2/md2.h" ; # unless $no_md2;
278$crypto.=" crypto/md4/md4.h" ; # unless $no_md4;
279$crypto.=" crypto/md5/md5.h" ; # unless $no_md5;
280$crypto.=" crypto/mdc2/mdc2.h" ; # unless $no_mdc2;
281$crypto.=" crypto/sha/sha.h" ; # unless $no_sha;
282$crypto.=" crypto/ripemd/ripemd.h" ; # unless $no_ripemd;
6f9079fd 283$crypto.=" crypto/aes/aes.h" ; # unless $no_aes;
f3dea9a5 284$crypto.=" crypto/camellia/camellia.h" ; # unless $no_camellia;
96afc1cf 285$crypto.=" crypto/seed/seed.h"; # unless $no_seed;
d02b48c6
RE
286
287$crypto.=" crypto/bn/bn.h";
0d96bf89
RL
288$crypto.=" crypto/rsa/rsa.h" ; # unless $no_rsa;
289$crypto.=" crypto/dsa/dsa.h" ; # unless $no_dsa;
290$crypto.=" crypto/dh/dh.h" ; # unless $no_dh;
291$crypto.=" crypto/ec/ec.h" ; # unless $no_ec;
4d94ae00 292$crypto.=" crypto/ecdsa/ecdsa.h" ; # unless $no_ecdsa;
e172d60d 293$crypto.=" crypto/ecdh/ecdh.h" ; # unless $no_ecdh;
0d96bf89 294$crypto.=" crypto/hmac/hmac.h" ; # unless $no_hmac;
03c075e5 295$crypto.=" crypto/cmac/cmac.h" ;
d02b48c6 296
0b13e9f0 297$crypto.=" crypto/engine/engine.h"; # unless $no_engine;
0d96bf89
RL
298$crypto.=" crypto/stack/stack.h" ; # unless $no_stack;
299$crypto.=" crypto/buffer/buffer.h" ; # unless $no_buffer;
300$crypto.=" crypto/bio/bio.h" ; # unless $no_bio;
301$crypto.=" crypto/dso/dso.h" ; # unless $no_dso;
302$crypto.=" crypto/lhash/lhash.h" ; # unless $no_lhash;
d02b48c6
RE
303$crypto.=" crypto/conf/conf.h";
304$crypto.=" crypto/txt_db/txt_db.h";
305
0d96bf89 306$crypto.=" crypto/evp/evp.h" ; # unless $no_evp;
d02b48c6
RE
307$crypto.=" crypto/objects/objects.h";
308$crypto.=" crypto/pem/pem.h";
309#$crypto.=" crypto/meth/meth.h";
310$crypto.=" crypto/asn1/asn1.h";
9c67ab2f 311$crypto.=" crypto/asn1/asn1t.h";
d02b48c6 312$crypto.=" crypto/asn1/asn1_mac.h";
0d96bf89 313$crypto.=" crypto/err/err.h" ; # unless $no_err;
d02b48c6 314$crypto.=" crypto/pkcs7/pkcs7.h";
ee0508d4 315$crypto.=" crypto/pkcs12/pkcs12.h";
d02b48c6
RE
316$crypto.=" crypto/x509/x509.h";
317$crypto.=" crypto/x509/x509_vfy.h";
679ab7c3 318$crypto.=" crypto/x509v3/x509v3.h";
c7235be6 319$crypto.=" crypto/ts/ts.h";
d02b48c6 320$crypto.=" crypto/rand/rand.h";
0d96bf89 321$crypto.=" crypto/comp/comp.h" ; # unless $no_comp;
eb64730b 322$crypto.=" crypto/ocsp/ocsp.h";
7cd6069c 323$crypto.=" crypto/ui/ui.h";
c62da732 324$crypto.=" crypto/krb5/krb5_asn.h";
863d447e 325#$crypto.=" crypto/store/store.h";
6c61726b 326$crypto.=" crypto/pqueue/pqueue.h";
8931b30d 327$crypto.=" crypto/cms/cms.h";
ab7e09f5 328$crypto.=" crypto/jpake/jpake.h";
edc032b5 329$crypto.=" crypto/srp/srp.h";
18f3385d 330$crypto.=" crypto/modes/modes.h";
d02b48c6 331
948d0125 332my $symhacks="crypto/symhacks.h";
55a9cc6e 333
948d0125
RL
334my @ssl_symbols = &do_defs("SSLEAY", $ssl, $symhacks);
335my @crypto_symbols = &do_defs("LIBEAY", $crypto, $symhacks);
47339f61 336
55a9cc6e
DSH
337if ($do_update) {
338
339if ($do_ssl == 1) {
948d0125
RL
340
341 &maybe_add_info("SSLEAY",*ssl_list,@ssl_symbols);
342 if ($do_rewrite == 1) {
343 open(OUT, ">$ssl_num");
344 &rewrite_numbers(*OUT,"SSLEAY",*ssl_list,@ssl_symbols);
948d0125
RL
345 } else {
346 open(OUT, ">>$ssl_num");
347 }
348 &update_numbers(*OUT,"SSLEAY",*ssl_list,$max_ssl,@ssl_symbols);
55a9cc6e
DSH
349 close OUT;
350}
351
352if($do_crypto == 1) {
948d0125
RL
353
354 &maybe_add_info("LIBEAY",*crypto_list,@crypto_symbols);
355 if ($do_rewrite == 1) {
356 open(OUT, ">$crypto_num");
357 &rewrite_numbers(*OUT,"LIBEAY",*crypto_list,@crypto_symbols);
358 } else {
359 open(OUT, ">>$crypto_num");
360 }
361 &update_numbers(*OUT,"LIBEAY",*crypto_list,$max_crypto,@crypto_symbols);
55a9cc6e 362 close OUT;
12aefe78
DSH
363}
364
c47c6196
DSH
365} elsif ($do_checkexist) {
366 &check_existing(*ssl_list, @ssl_symbols)
367 if $do_ssl == 1;
368 &check_existing(*crypto_list, @crypto_symbols)
369 if $do_crypto == 1;
967f4ca8 370} elsif ($do_ctest || $do_ctestall) {
12aefe78
DSH
371
372 print <<"EOF";
373
374/* Test file to check all DEF file symbols are present by trying
375 * to link to all of them. This is *not* intended to be run!
376 */
377
378int main()
379{
380EOF
948d0125 381 &print_test_file(*STDOUT,"SSLEAY",*ssl_list,$do_ctestall,@ssl_symbols)
12aefe78
DSH
382 if $do_ssl == 1;
383
948d0125 384 &print_test_file(*STDOUT,"LIBEAY",*crypto_list,$do_ctestall,@crypto_symbols)
12aefe78
DSH
385 if $do_crypto == 1;
386
387 print "}\n";
55a9cc6e
DSH
388
389} else {
8cf65228 390
cd4c36ad 391 &print_def_file(*STDOUT,$libname,*ssl_list,@ssl_symbols)
55a9cc6e
DSH
392 if $do_ssl == 1;
393
cd4c36ad 394 &print_def_file(*STDOUT,$libname,*crypto_list,@crypto_symbols)
55a9cc6e 395 if $do_crypto == 1;
8cf65228 396
55a9cc6e 397}
d02b48c6 398
d02b48c6
RE
399
400sub do_defs
47339f61 401{
948d0125 402 my($name,$files,$symhacksfile)=@_;
0f583f69 403 my $file;
47339f61 404 my @ret;
948d0125
RL
405 my %syms;
406 my %platform; # For anything undefined, we assume ""
407 my %kind; # For anything undefined, we assume "FUNCTION"
408 my %algorithm; # For anything undefined, we assume ""
62dc5aad
RL
409 my %variant;
410 my %variant_cnt; # To be able to allocate "name{n}" if "name"
411 # is the same name as the original.
0f583f69 412 my $cpp;
3f07fe09 413 my %unknown_algorithms = ();
07c4c14c 414 my $parens = 0;
d02b48c6 415
948d0125 416 foreach $file (split(/\s+/,$symhacksfile." ".$files))
d02b48c6 417 {
89eeccac 418 print STDERR "DEBUG: starting on $file:\n" if $debug;
d02b48c6 419 open(IN,"<$file") || die "unable to open $file:$!\n";
0f583f69 420 my $line = "", my $def= "";
47339f61 421 my %tag = (
d399fdf8
RL
422 (map { $_ => 0 } @known_platforms),
423 (map { "OPENSSL_SYS_".$_ => 0 } @known_ossl_platforms),
cf1b7d96 424 (map { "OPENSSL_NO_".$_ => 0 } @known_algorithms),
07c4c14c 425 (map { "OPENSSL_USE_".$_ => 0 } @known_algorithms),
47339f61 426 NOPROTO => 0,
47339f61
DSH
427 PERL5 => 0,
428 _WINDLL => 0,
47339f61
DSH
429 CONST_STRICT => 0,
430 TRUE => 1,
431 );
948d0125 432 my $symhacking = $file eq $symhacksfile;
267a1927
RL
433 my @current_platforms = ();
434 my @current_algorithms = ();
435
62dc5aad
RL
436 # params: symbol, alias, platforms, kind
437 # The reason to put this subroutine in a variable is that
438 # it will otherwise create it's own, unshared, version of
439 # %tag and %variant...
440 my $make_variant = sub
441 {
442 my ($s, $a, $p, $k) = @_;
443 my ($a1, $a2);
444
445 print STDERR "DEBUG: make_variant: Entered with ",$s,", ",$a,", ",(defined($p)?$p:""),", ",(defined($k)?$k:""),"\n" if $debug;
446 if (defined($p))
447 {
448 $a1 = join(",",$p,
449 grep(!/^$/,
450 map { $tag{$_} == 1 ? $_ : "" }
451 @known_platforms));
452 }
453 else
454 {
455 $a1 = join(",",
456 grep(!/^$/,
457 map { $tag{$_} == 1 ? $_ : "" }
458 @known_platforms));
459 }
460 $a2 = join(",",
461 grep(!/^$/,
462 map { $tag{"OPENSSL_SYS_".$_} == 1 ? $_ : "" }
463 @known_ossl_platforms));
464 print STDERR "DEBUG: make_variant: a1 = $a1; a2 = $a2\n" if $debug;
465 if ($a1 eq "") { $a1 = $a2; }
466 elsif ($a1 ne "" && $a2 ne "") { $a1 .= ",".$a2; }
467 if ($a eq $s)
468 {
469 if (!defined($variant_cnt{$s}))
470 {
471 $variant_cnt{$s} = 0;
472 }
473 $variant_cnt{$s}++;
474 $a .= "{$variant_cnt{$s}}";
475 }
c454dbcd
RL
476 my $toadd = $a.":".$a1.(defined($k)?":".$k:"");
477 my $togrep = $s.'(\{[0-9]+\})?:'.$a1.(defined($k)?":".$k:"");
478 if (!grep(/^$togrep$/,
479 split(/;/, defined($variant{$s})?$variant{$s}:""))) {
480 if (defined($variant{$s})) { $variant{$s} .= ";"; }
481 $variant{$s} .= $toadd;
482 }
62dc5aad
RL
483 print STDERR "DEBUG: make_variant: Exit with variant of ",$s," = ",$variant{$s},"\n" if $debug;
484 };
485
486 print STDERR "DEBUG: parsing ----------\n" if $debug;
47339f61 487 while(<IN>) {
07c4c14c
MC
488 if($parens > 0) {
489 #Inside a DECLARE_DEPRECATED
490 $parens += count_parens($_);
491 next;
492 }
40e950ae
DSH
493 if (/\/\* Error codes for the \w+ functions\. \*\//)
494 {
495 undef @tag;
496 last;
497 }
47339f61
DSH
498 if ($line ne '') {
499 $_ = $line . $_;
500 $line = '';
d02b48c6 501 }
47339f61
DSH
502
503 if (/\\$/) {
d399fdf8
RL
504 chomp; # remove eol
505 chop; # remove ending backslash
47339f61
DSH
506 $line = $_;
507 next;
508 }
509
68e57536
AP
510 if(/\/\*/) {
511 if (not /\*\//) { # multiline comment...
512 $line = $_; # ... just accumulate
513 next;
514 } else {
515 s/\/\*.*?\*\///gs;# wipe it
516 }
517 }
518
47339f61 519 if ($cpp) {
68e57536
AP
520 $cpp++ if /^#\s*if/;
521 $cpp-- if /^#\s*endif/;
47339f61
DSH
522 next;
523 }
68e57536 524 $cpp = 1 if /^#.*ifdef.*cplusplus/;
47339f61 525
47339f61 526 s/{[^{}]*}//gs; # ignore {} blocks
6cb68620 527 print STDERR "DEBUG: \$def=\"$def\"\n" if $debug && $def ne "";
d399fdf8 528 print STDERR "DEBUG: \$_=\"$_\"\n" if $debug;
3f07fe09 529 if (/^\#\s*ifndef\s+(.*)/) {
d399fdf8 530 push(@tag,"-");
d02b48c6
RE
531 push(@tag,$1);
532 $tag{$1}=-1;
d399fdf8 533 print STDERR "DEBUG: $file: found tag $1 = -1\n" if $debug;
3f07fe09 534 } elsif (/^\#\s*if\s+!defined\(([^\)]+)\)/) {
d399fdf8
RL
535 push(@tag,"-");
536 if (/^\#\s*if\s+(!defined\(([^\)]+)\)(\s+\&\&\s+!defined\(([^\)]+)\))*)$/) {
537 my $tmp_1 = $1;
538 my $tmp_;
539 foreach $tmp_ (split '\&\&',$tmp_1) {
540 $tmp_ =~ /!defined\(([^\)]+)\)/;
541 print STDERR "DEBUG: $file: found tag $1 = -1\n" if $debug;
542 push(@tag,$1);
543 $tag{$1}=-1;
544 }
545 } else {
546 print STDERR "Warning: $file: complicated expression: $_" if $debug; # because it is O...
547 print STDERR "DEBUG: $file: found tag $1 = -1\n" if $debug;
548 push(@tag,$1);
549 $tag{$1}=-1;
550 }
8aa36bca 551 } elsif (/^\#\s*ifdef\s+(\S*)/) {
d399fdf8 552 push(@tag,"-");
d02b48c6
RE
553 push(@tag,$1);
554 $tag{$1}=1;
d399fdf8 555 print STDERR "DEBUG: $file: found tag $1 = 1\n" if $debug;
3f07fe09 556 } elsif (/^\#\s*if\s+defined\(([^\)]+)\)/) {
d399fdf8
RL
557 push(@tag,"-");
558 if (/^\#\s*if\s+(defined\(([^\)]+)\)(\s+\|\|\s+defined\(([^\)]+)\))*)$/) {
559 my $tmp_1 = $1;
560 my $tmp_;
561 foreach $tmp_ (split '\|\|',$tmp_1) {
562 $tmp_ =~ /defined\(([^\)]+)\)/;
563 print STDERR "DEBUG: $file: found tag $1 = 1\n" if $debug;
564 push(@tag,$1);
565 $tag{$1}=1;
566 }
567 } else {
568 print STDERR "Warning: $file: complicated expression: $_\n" if $debug; # because it is O...
569 print STDERR "DEBUG: $file: found tag $1 = 1\n" if $debug;
570 push(@tag,$1);
571 $tag{$1}=1;
572 }
948d0125 573 } elsif (/^\#\s*error\s+(\w+) is disabled\./) {
d399fdf8
RL
574 my $tag_i = $#tag;
575 while($tag[$tag_i] ne "-") {
576 if ($tag[$tag_i] eq "OPENSSL_NO_".$1) {
577 $tag{$tag[$tag_i]}=2;
578 print STDERR "DEBUG: $file: chaged tag $1 = 2\n" if $debug;
579 }
580 $tag_i--;
948d0125 581 }
47339f61 582 } elsif (/^\#\s*endif/) {
d399fdf8 583 my $tag_i = $#tag;
665560e9 584 while($tag_i > 0 && $tag[$tag_i] ne "-") {
d399fdf8
RL
585 my $t=$tag[$tag_i];
586 print STDERR "DEBUG: \$t=\"$t\"\n" if $debug;
587 if ($tag{$t}==2) {
588 $tag{$t}=-1;
589 } else {
590 $tag{$t}=0;
591 }
592 print STDERR "DEBUG: $file: changed tag ",$t," = ",$tag{$t},"\n" if $debug;
593 pop(@tag);
594 if ($t =~ /^OPENSSL_NO_([A-Z0-9_]+)$/) {
595 $t=$1;
07c4c14c
MC
596 } elsif($t =~ /^OPENSSL_USE_([A-Z0-9_]+)$/) {
597 $t=$1;
d399fdf8
RL
598 } else {
599 $t="";
600 }
601 if ($t ne ""
602 && !grep(/^$t$/, @known_algorithms)) {
603 $unknown_algorithms{$t} = 1;
604 #print STDERR "DEBUG: Added as unknown algorithm: $t\n" if $debug;
605 }
606 $tag_i--;
948d0125 607 }
d02b48c6 608 pop(@tag);
47339f61 609 } elsif (/^\#\s*else/) {
d399fdf8
RL
610 my $tag_i = $#tag;
611 while($tag[$tag_i] ne "-") {
612 my $t=$tag[$tag_i];
613 $tag{$t}= -$tag{$t};
614 print STDERR "DEBUG: $file: changed tag ",$t," = ",$tag{$t},"\n" if $debug;
615 $tag_i--;
616 }
47339f61 617 } elsif (/^\#\s*if\s+1/) {
d399fdf8 618 push(@tag,"-");
47339f61
DSH
619 # Dummy tag
620 push(@tag,"TRUE");
621 $tag{"TRUE"}=1;
d399fdf8 622 print STDERR "DEBUG: $file: found 1\n" if $debug;
1e414935 623 } elsif (/^\#\s*if\s+0/) {
d399fdf8 624 push(@tag,"-");
1e414935
BM
625 # Dummy tag
626 push(@tag,"TRUE");
627 $tag{"TRUE"}=-1;
d399fdf8 628 print STDERR "DEBUG: $file: found 0\n" if $debug;
948d0125 629 } elsif (/^\#\s*define\s+(\w+)\s+(\w+)/
2ae87d46 630 && $symhacking && $tag{'TRUE'} != -1) {
62dc5aad
RL
631 # This is for aliasing. When we find an alias,
632 # we have to invert
633 &$make_variant($1,$2);
634 print STDERR "DEBUG: $file: defined $1 = $2\n" if $debug;
948d0125
RL
635 }
636 if (/^\#/) {
267a1927
RL
637 @current_platforms =
638 grep(!/^$/,
d399fdf8
RL
639 map { $tag{$_} == 1 ? $_ :
640 $tag{$_} == -1 ? "!".$_ : "" }
267a1927 641 @known_platforms);
d399fdf8
RL
642 push @current_platforms
643 , grep(!/^$/,
644 map { $tag{"OPENSSL_SYS_".$_} == 1 ? $_ :
645 $tag{"OPENSSL_SYS_".$_} == -1 ? "!".$_ : "" }
646 @known_ossl_platforms);
07c4c14c 647 @current_algorithms = ();
267a1927
RL
648 @current_algorithms =
649 grep(!/^$/,
cf1b7d96 650 map { $tag{"OPENSSL_NO_".$_} == -1 ? $_ : "" }
267a1927 651 @known_algorithms);
07c4c14c
MC
652 push @current_algorithms
653 , grep(!/^$/,
654 map { $tag{"OPENSSL_USE_".$_} == 1 ? $_ : "" }
655 @known_algorithms);
267a1927
RL
656 $def .=
657 "#INFO:"
658 .join(',',@current_platforms).":"
659 .join(',',@current_algorithms).";";
47339f61
DSH
660 next;
661 }
2ae87d46
RL
662 if ($tag{'TRUE'} != -1) {
663 if (/^\s*DECLARE_STACK_OF\s*\(\s*(\w*)\s*\)/) {
664 next;
665 } elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) {
666 $def .= "int d2i_$3(void);";
667 $def .= "int i2d_$3(void);";
62dc5aad
RL
668 # Variant for platforms that do not
669 # have to access globale variables
670 # in shared libraries through functions
671 $def .=
672 "#INFO:"
673 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
674 .join(',',@current_algorithms).";";
2ae87d46 675 $def .= "OPENSSL_EXTERN int $2_it;";
62dc5aad
RL
676 $def .=
677 "#INFO:"
678 .join(',',@current_platforms).":"
679 .join(',',@current_algorithms).";";
680 # Variant for platforms that have to
681 # access globale variables in shared
682 # libraries through functions
683 &$make_variant("$2_it","$2_it",
684 "EXPORT_VAR_AS_FUNCTION",
685 "FUNCTION");
2ae87d46
RL
686 next;
687 } elsif (/^\s*DECLARE_ASN1_FUNCTIONS_fname\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) {
688 $def .= "int d2i_$3(void);";
689 $def .= "int i2d_$3(void);";
690 $def .= "int $3_free(void);";
691 $def .= "int $3_new(void);";
62dc5aad
RL
692 # Variant for platforms that do not
693 # have to access globale variables
694 # in shared libraries through functions
695 $def .=
696 "#INFO:"
697 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
698 .join(',',@current_algorithms).";";
2ae87d46 699 $def .= "OPENSSL_EXTERN int $2_it;";
62dc5aad
RL
700 $def .=
701 "#INFO:"
702 .join(',',@current_platforms).":"
703 .join(',',@current_algorithms).";";
704 # Variant for platforms that have to
705 # access globale variables in shared
706 # libraries through functions
707 &$make_variant("$2_it","$2_it",
708 "EXPORT_VAR_AS_FUNCTION",
709 "FUNCTION");
710 next;
2ae87d46
RL
711 } elsif (/^\s*DECLARE_ASN1_FUNCTIONS\s*\(\s*(\w*)\s*\)/ ||
712 /^\s*DECLARE_ASN1_FUNCTIONS_const\s*\(\s*(\w*)\s*\)/) {
713 $def .= "int d2i_$1(void);";
714 $def .= "int i2d_$1(void);";
715 $def .= "int $1_free(void);";
716 $def .= "int $1_new(void);";
62dc5aad
RL
717 # Variant for platforms that do not
718 # have to access globale variables
719 # in shared libraries through functions
720 $def .=
721 "#INFO:"
722 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
723 .join(',',@current_algorithms).";";
2ae87d46 724 $def .= "OPENSSL_EXTERN int $1_it;";
62dc5aad
RL
725 $def .=
726 "#INFO:"
727 .join(',',@current_platforms).":"
728 .join(',',@current_algorithms).";";
729 # Variant for platforms that have to
730 # access globale variables in shared
731 # libraries through functions
732 &$make_variant("$1_it","$1_it",
733 "EXPORT_VAR_AS_FUNCTION",
734 "FUNCTION");
2ae87d46
RL
735 next;
736 } elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS_const\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
737 $def .= "int d2i_$2(void);";
738 $def .= "int i2d_$2(void);";
62dc5aad
RL
739 # Variant for platforms that do not
740 # have to access globale variables
741 # in shared libraries through functions
742 $def .=
743 "#INFO:"
744 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
745 .join(',',@current_algorithms).";";
2ae87d46 746 $def .= "OPENSSL_EXTERN int $2_it;";
62dc5aad
RL
747 $def .=
748 "#INFO:"
749 .join(',',@current_platforms).":"
750 .join(',',@current_algorithms).";";
751 # Variant for platforms that have to
752 # access globale variables in shared
753 # libraries through functions
754 &$make_variant("$2_it","$2_it",
755 "EXPORT_VAR_AS_FUNCTION",
756 "FUNCTION");
2ae87d46 757 next;
ea3675b5
DSH
758 } elsif (/^\s*DECLARE_ASN1_ALLOC_FUNCTIONS\s*\(\s*(\w*)\s*\)/) {
759 $def .= "int $1_free(void);";
760 $def .= "int $1_new(void);";
761 next;
2ae87d46
RL
762 } elsif (/^\s*DECLARE_ASN1_FUNCTIONS_name\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
763 $def .= "int d2i_$2(void);";
764 $def .= "int i2d_$2(void);";
765 $def .= "int $2_free(void);";
766 $def .= "int $2_new(void);";
62dc5aad
RL
767 # Variant for platforms that do not
768 # have to access globale variables
769 # in shared libraries through functions
770 $def .=
771 "#INFO:"
772 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
773 .join(',',@current_algorithms).";";
2ae87d46 774 $def .= "OPENSSL_EXTERN int $2_it;";
62dc5aad
RL
775 $def .=
776 "#INFO:"
777 .join(',',@current_platforms).":"
778 .join(',',@current_algorithms).";";
779 # Variant for platforms that have to
780 # access globale variables in shared
781 # libraries through functions
782 &$make_variant("$2_it","$2_it",
783 "EXPORT_VAR_AS_FUNCTION",
784 "FUNCTION");
2ae87d46 785 next;
62dc5aad
RL
786 } elsif (/^\s*DECLARE_ASN1_ITEM\s*\(\s*(\w*)\s*\)/) {
787 # Variant for platforms that do not
788 # have to access globale variables
789 # in shared libraries through functions
790 $def .=
791 "#INFO:"
792 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
793 .join(',',@current_algorithms).";";
2ae87d46 794 $def .= "OPENSSL_EXTERN int $1_it;";
62dc5aad
RL
795 $def .=
796 "#INFO:"
797 .join(',',@current_platforms).":"
798 .join(',',@current_algorithms).";";
799 # Variant for platforms that have to
800 # access globale variables in shared
801 # libraries through functions
802 &$make_variant("$1_it","$1_it",
803 "EXPORT_VAR_AS_FUNCTION",
804 "FUNCTION");
2ae87d46 805 next;
f86abc2e 806 } elsif (/^\s*DECLARE_ASN1_NDEF_FUNCTION\s*\(\s*(\w*)\s*\)/) {
97ebe047 807 $def .= "int i2d_$1_NDEF(void);";
2ae87d46
RL
808 } elsif (/^\s*DECLARE_ASN1_SET_OF\s*\(\s*(\w*)\s*\)/) {
809 next;
16094305
DSH
810 } elsif (/^\s*DECLARE_ASN1_PRINT_FUNCTION\s*\(\s*(\w*)\s*\)/) {
811 $def .= "int $1_print_ctx(void);";
812 next;
813 } elsif (/^\s*DECLARE_ASN1_PRINT_FUNCTION_name\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
814 $def .= "int $2_print_ctx(void);";
815 next;
62dc5aad
RL
816 } elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) {
817 next;
2ae87d46 818 } elsif (/^DECLARE_PEM_rw\s*\(\s*(\w*)\s*,/ ||
47738cba
AP
819 /^DECLARE_PEM_rw_cb\s*\(\s*(\w*)\s*,/ ||
820 /^DECLARE_PEM_rw_const\s*\(\s*(\w*)\s*,/ ) {
2ae87d46
RL
821 $def .=
822 "#INFO:"
6d23cf97 823 .join(',',@current_platforms).":"
2ae87d46
RL
824 .join(',',@current_algorithms).";";
825 $def .= "int PEM_read_$1(void);";
826 $def .= "int PEM_write_$1(void);";
827 $def .=
828 "#INFO:"
829 .join(',',@current_platforms).":"
830 .join(',',@current_algorithms).";";
831 # Things that are everywhere
832 $def .= "int PEM_read_bio_$1(void);";
833 $def .= "int PEM_write_bio_$1(void);";
834 next;
835 } elsif (/^DECLARE_PEM_write\s*\(\s*(\w*)\s*,/ ||
e43bfb29 836 /^DECLARE_PEM_write_const\s*\(\s*(\w*)\s*,/ ||
2ae87d46 837 /^DECLARE_PEM_write_cb\s*\(\s*(\w*)\s*,/ ) {
2ae87d46
RL
838 $def .=
839 "#INFO:"
6d23cf97 840 .join(',',@current_platforms).":"
2ae87d46
RL
841 .join(',',@current_algorithms).";";
842 $def .= "int PEM_write_$1(void);";
843 $def .=
844 "#INFO:"
845 .join(',',@current_platforms).":"
846 .join(',',@current_algorithms).";";
847 # Things that are everywhere
848 $def .= "int PEM_write_bio_$1(void);";
849 next;
850 } elsif (/^DECLARE_PEM_read\s*\(\s*(\w*)\s*,/ ||
851 /^DECLARE_PEM_read_cb\s*\(\s*(\w*)\s*,/ ) {
2ae87d46
RL
852 $def .=
853 "#INFO:"
6d23cf97 854 .join(',',@current_platforms).":"
2ae87d46
RL
855 .join(',',@current_algorithms).";";
856 $def .= "int PEM_read_$1(void);";
857 $def .=
858 "#INFO:"
859 .join(',',@current_platforms).":"
860 .join(',',@current_algorithms).";";
861 # Things that are everywhere
862 $def .= "int PEM_read_bio_$1(void);";
863 next;
62dc5aad
RL
864 } elsif (/^OPENSSL_DECLARE_GLOBAL\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
865 # Variant for platforms that do not
866 # have to access globale variables
867 # in shared libraries through functions
868 $def .=
869 "#INFO:"
870 .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
871 .join(',',@current_algorithms).";";
872 $def .= "OPENSSL_EXTERN int _shadow_$2;";
873 $def .=
874 "#INFO:"
875 .join(',',@current_platforms).":"
876 .join(',',@current_algorithms).";";
877 # Variant for platforms that have to
878 # access globale variables in shared
879 # libraries through functions
880 &$make_variant("_shadow_$2","_shadow_$2",
881 "EXPORT_VAR_AS_FUNCTION",
882 "FUNCTION");
07c4c14c
MC
883 } elsif (/^\s*DECLARE_DEPRECATED\s*\(\s*(\w*(\s|\*|\w)*)/) {
884 $def .= "$1(void);";
885 $parens = count_parens($_);
886 next;
2ae87d46 887 } elsif ($tag{'CONST_STRICT'} != 1) {
948d0125 888 if (/\{|\/\*|\([^\)]*$/) {
47339f61
DSH
889 $line = $_;
890 } else {
891 $def .= $_;
892 }
d02b48c6
RE
893 }
894 }
2ae87d46 895 }
d02b48c6 896 close(IN);
47339f61 897
948d0125
RL
898 my $algs;
899 my $plays;
900
62dc5aad 901 print STDERR "DEBUG: postprocessing ----------\n" if $debug;
47339f61 902 foreach (split /;/, $def) {
948d0125 903 my $s; my $k = "FUNCTION"; my $p; my $a;
47339f61
DSH
904 s/^[\n\s]*//g;
905 s/[\n\s]*$//g;
948d0125 906 next if(/\#undef/);
47339f61 907 next if(/typedef\W/);
948d0125
RL
908 next if(/\#define/);
909
68e57536
AP
910 # Reduce argument lists to empty ()
911 # fold round brackets recursively: (t(*v)(t),t) -> (t{}{},t) -> {}
912 while(/\(.*\)/s) {
913 s/\([^\(\)]+\)/\{\}/gs;
914 s/\(\s*\*\s*(\w+)\s*\{\}\s*\)/$1/gs; #(*f{}) -> f
915 }
916 # pretend as we didn't use curly braces: {} -> ()
917 s/\{\}/\(\)/gs;
918
919 s/STACK_OF\(\)/void/gs;
174c86a2 920 s/LHASH_OF\(\)/void/gs;
68e57536 921
62dc5aad 922 print STDERR "DEBUG: \$_ = \"$_\"\n" if $debug;
948d0125
RL
923 if (/^\#INFO:([^:]*):(.*)$/) {
924 $plats = $1;
925 $algs = $2;
89eeccac 926 print STDERR "DEBUG: found info on platforms ($plats) and algorithms ($algs)\n" if $debug;
948d0125 927 next;
62dc5aad 928 } elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+(\{[0-9]+\})?)(\[[0-9]*\])*\s*$/) {
948d0125
RL
929 $s = $1;
930 $k = "VARIABLE";
89eeccac 931 print STDERR "DEBUG: found external variable $s\n" if $debug;
68e57536 932 } elsif (/TYPEDEF_\w+_OF/s) {
47339f61 933 next;
68e57536
AP
934 } elsif (/(\w+)\s*\(\).*/s) { # first token prior [first] () is
935 $s = $1; # a function name!
89eeccac 936 print STDERR "DEBUG: found function $s\n" if $debug;
47339f61
DSH
937 } elsif (/\(/ and not (/=/)) {
938 print STDERR "File $file: cannot parse: $_;\n";
948d0125
RL
939 next;
940 } else {
941 next;
942 }
943
944 $syms{$s} = 1;
945 $kind{$s} = $k;
946
947 $p = $plats;
948 $a = $algs;
949 $a .= ",BF" if($s =~ /EVP_bf/);
950 $a .= ",CAST" if($s =~ /EVP_cast/);
951 $a .= ",DES" if($s =~ /EVP_des/);
952 $a .= ",DSA" if($s =~ /EVP_dss/);
953 $a .= ",IDEA" if($s =~ /EVP_idea/);
954 $a .= ",MD2" if($s =~ /EVP_md2/);
955 $a .= ",MD4" if($s =~ /EVP_md4/);
956 $a .= ",MD5" if($s =~ /EVP_md5/);
957 $a .= ",RC2" if($s =~ /EVP_rc2/);
958 $a .= ",RC4" if($s =~ /EVP_rc4/);
959 $a .= ",RC5" if($s =~ /EVP_rc5/);
1f7103b6 960 $a .= ",RMD160" if($s =~ /EVP_ripemd/);
948d0125
RL
961 $a .= ",RSA" if($s =~ /EVP_(Open|Seal)(Final|Init)/);
962 $a .= ",RSA" if($s =~ /PEM_Seal(Final|Init|Update)/);
963 $a .= ",RSA" if($s =~ /RSAPrivateKey/);
964 $a .= ",RSA" if($s =~ /SSLv23?_((client|server)_)?method/);
965
62dc5aad
RL
966 $platform{$s} =
967 &reduce_platforms((defined($platform{$s})?$platform{$s}.',':"").$p);
948d0125
RL
968 $algorithm{$s} .= ','.$a;
969
62dc5aad 970 if (defined($variant{$s})) {
c454dbcd
RL
971 foreach $v (split /;/,$variant{$s}) {
972 (my $r, my $p, my $k) = split(/:/,$v);
973 my $ip = join ',',map({ /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p);
974 $syms{$r} = 1;
975 if (!defined($k)) { $k = $kind{$s}; }
976 $kind{$r} = $k."(".$s.")";
977 $algorithm{$r} = $algorithm{$s};
978 $platform{$r} = &reduce_platforms($platform{$s}.",".$p.",".$p);
979 $platform{$s} = &reduce_platforms($platform{$s}.','.$ip.','.$ip);
980 print STDERR "DEBUG: \$variant{\"$s\"} = ",$v,"; \$r = $r; \$p = ",$platform{$r},"; \$a = ",$algorithm{$r},"; \$kind = ",$kind{$r},"\n" if $debug;
981 }
47339f61 982 }
62dc5aad 983 print STDERR "DEBUG: \$s = $s; \$p = ",$platform{$s},"; \$a = ",$algorithm{$s},"; \$kind = ",$kind{$s},"\n" if $debug;
d02b48c6 984 }
d02b48c6
RE
985 }
986
948d0125 987 # Prune the returned symbols
47339f61 988
948d0125 989 delete $syms{"bn_dump1"};
6d23cf97 990 $platform{"BIO_s_log"} .= ",!WIN32,!macintosh";
948d0125 991
2ae87d46
RL
992 $platform{"PEM_read_NS_CERT_SEQ"} = "VMS";
993 $platform{"PEM_write_NS_CERT_SEQ"} = "VMS";
994 $platform{"PEM_read_P8_PRIV_KEY_INFO"} = "VMS";
995 $platform{"PEM_write_P8_PRIV_KEY_INFO"} = "VMS";
af55c09d
RL
996 $platform{"EVP_sha384"} = "!VMSVAX";
997 $platform{"EVP_sha512"} = "!VMSVAX";
998 $platform{"SHA384_Init"} = "!VMSVAX";
999 $platform{"SHA384_Transform"} = "!VMSVAX";
1000 $platform{"SHA384_Update"} = "!VMSVAX";
1001 $platform{"SHA384_Final"} = "!VMSVAX";
1002 $platform{"SHA384"} = "!VMSVAX";
1003 $platform{"SHA512_Init"} = "!VMSVAX";
1004 $platform{"SHA512_Transform"} = "!VMSVAX";
1005 $platform{"SHA512_Update"} = "!VMSVAX";
1006 $platform{"SHA512_Final"} = "!VMSVAX";
1007 $platform{"SHA512"} = "!VMSVAX";
1008
2ae87d46 1009
948d0125
RL
1010 # Info we know about
1011
948d0125
RL
1012 push @ret, map { $_."\\".&info_string($_,"EXIST",
1013 $platform{$_},
1014 $kind{$_},
1015 $algorithm{$_}) } keys %syms;
1016
3f07fe09
RL
1017 if (keys %unknown_algorithms) {
1018 print STDERR "WARNING: mkdef.pl doesn't know the following algorithms:\n";
1019 print STDERR "\t",join("\n\t",keys %unknown_algorithms),"\n";
1020 }
948d0125
RL
1021 return(@ret);
1022}
1023
62dc5aad
RL
1024# Param: string of comma-separated platform-specs.
1025sub reduce_platforms
1026{
1027 my ($platforms) = @_;
948d0125
RL
1028 my $pl = defined($platforms) ? $platforms : "";
1029 my %p = map { $_ => 0 } split /,/, $pl;
948d0125
RL
1030 my $ret;
1031
62dc5aad
RL
1032 print STDERR "DEBUG: Entered reduce_platforms with \"$platforms\"\n"
1033 if $debug;
948d0125
RL
1034 # We do this, because if there's code like the following, it really
1035 # means the function exists in all cases and should therefore be
1036 # everywhere. By increasing and decreasing, we may attain 0:
1037 #
1038 # ifndef WIN16
1039 # int foo();
1040 # else
1041 # int _fat foo();
1042 # endif
1043 foreach $platform (split /,/, $pl) {
1044 if ($platform =~ /^!(.*)$/) {
1045 $p{$1}--;
1046 } else {
1047 $p{$platform}++;
d02b48c6 1048 }
47339f61 1049 }
948d0125
RL
1050 foreach $platform (keys %p) {
1051 if ($p{$platform} == 0) { delete $p{$platform}; }
d02b48c6
RE
1052 }
1053
948d0125 1054 delete $p{""};
62dc5aad 1055
c454dbcd 1056 $ret = join(',',sort(map { $p{$_} < 0 ? "!".$_ : $_ } keys %p));
62dc5aad
RL
1057 print STDERR "DEBUG: Exiting reduce_platforms with \"$ret\"\n"
1058 if $debug;
1059 return $ret;
1060}
1061
1062sub info_string {
1063 (my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_;
1064
1065 my %a = defined($algorithms) ?
1066 map { $_ => 1 } split /,/, $algorithms : ();
1067 my $k = defined($kind) ? $kind : "FUNCTION";
1068 my $ret;
1069 my $p = &reduce_platforms($platforms);
1070
948d0125 1071 delete $a{""};
d02b48c6 1072
948d0125 1073 $ret = $exist;
62dc5aad 1074 $ret .= ":".$p;
948d0125 1075 $ret .= ":".$k;
62dc5aad 1076 $ret .= ":".join(',',sort keys %a);
948d0125
RL
1077 return $ret;
1078}
1079
1080sub maybe_add_info {
1081 (my $name, *nums, my @symbols) = @_;
1082 my $sym;
1083 my $new_info = 0;
451e60e9 1084 my %syms=();
948d0125
RL
1085
1086 print STDERR "Updating $name info\n";
1087 foreach $sym (@symbols) {
1088 (my $s, my $i) = split /\\/, $sym;
948d0125 1089 if (defined($nums{$s})) {
62dc5aad 1090 $i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/;
948d0125
RL
1091 (my $n, my $dummy) = split /\\/, $nums{$s};
1092 if (!defined($dummy) || $i ne $dummy) {
1093 $nums{$s} = $n."\\".$i;
1094 $new_info++;
d399fdf8 1095 print STDERR "DEBUG: maybe_add_info for $s: \"$dummy\" => \"$i\"\n" if $debug;
948d0125
RL
1096 }
1097 }
62dc5aad 1098 $syms{$s} = 1;
451e60e9
RL
1099 }
1100
1101 my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums;
1102 foreach $sym (@s) {
1103 (my $n, my $i) = split /\\/, $nums{$sym};
62dc5aad 1104 if (!defined($syms{$sym}) && $i !~ /^NOEXIST:/) {
451e60e9 1105 $new_info++;
62dc5aad 1106 print STDERR "DEBUG: maybe_add_info for $sym: -> undefined\n" if $debug;
451e60e9 1107 }
948d0125
RL
1108 }
1109 if ($new_info) {
1110 print STDERR "$new_info old symbols got an info update\n";
6d50071e
RL
1111 if (!$do_rewrite) {
1112 print STDERR "You should do a rewrite to fix this.\n";
1113 }
948d0125
RL
1114 } else {
1115 print STDERR "No old symbols needed info update\n";
1116 }
47339f61 1117}
d02b48c6 1118
62dc5aad
RL
1119# Param: string of comma-separated keywords, each possibly prefixed with a "!"
1120sub is_valid
1121{
1122 my ($keywords_txt,$platforms) = @_;
1123 my (@keywords) = split /,/,$keywords_txt;
d3fdc27a 1124 my ($falsesum, $truesum) = (0, 1);
62dc5aad
RL
1125
1126 # Param: one keyword
1127 sub recognise
1128 {
1129 my ($keyword,$platforms) = @_;
1130
1131 if ($platforms) {
1132 # platforms
af55c09d
RL
1133 if ($keyword eq "VMSVAX" && $VMSVAX) { return 1; }
1134 if ($keyword eq "VMSNonVAX" && $VMSNonVAX) { return 1; }
62dc5aad
RL
1135 if ($keyword eq "VMS" && $VMS) { return 1; }
1136 if ($keyword eq "WIN32" && $W32) { return 1; }
62dc5aad 1137 if ($keyword eq "WINNT" && $NT) { return 1; }
cd4c36ad 1138 if ($keyword eq "OS2" && $OS2) { return 1; }
62dc5aad
RL
1139 # Special platforms:
1140 # EXPORT_VAR_AS_FUNCTION means that global variables
1141 # will be represented as functions. This currently
1142 # only happens on VMS-VAX.
6d23cf97 1143 if ($keyword eq "EXPORT_VAR_AS_FUNCTION" && ($VMSVAX || $W32)) {
62dc5aad
RL
1144 return 1;
1145 }
19cd2049
DSH
1146 if ($keyword eq "OPENSSL_FIPSCAPABLE") {
1147 return 0;
1148 }
53f76337
DSH
1149 if ($keyword eq "OPENSSL_FIPS" && $fips) {
1150 return 1;
1151 }
8931b30d 1152 if ($keyword eq "ZLIB" && $zlib) { return 1; }
62dc5aad
RL
1153 return 0;
1154 } else {
1155 # algorithms
1156 if ($keyword eq "RC2" && $no_rc2) { return 0; }
1157 if ($keyword eq "RC4" && $no_rc4) { return 0; }
1158 if ($keyword eq "RC5" && $no_rc5) { return 0; }
1159 if ($keyword eq "IDEA" && $no_idea) { return 0; }
1160 if ($keyword eq "DES" && $no_des) { return 0; }
1161 if ($keyword eq "BF" && $no_bf) { return 0; }
1162 if ($keyword eq "CAST" && $no_cast) { return 0; }
1163 if ($keyword eq "MD2" && $no_md2) { return 0; }
1164 if ($keyword eq "MD4" && $no_md4) { return 0; }
1165 if ($keyword eq "MD5" && $no_md5) { return 0; }
1166 if ($keyword eq "SHA" && $no_sha) { return 0; }
1f7103b6 1167 if ($keyword eq "RMD160" && $no_ripemd) { return 0; }
62dc5aad 1168 if ($keyword eq "MDC2" && $no_mdc2) { return 0; }
ec645d90 1169 if ($keyword eq "WHIRLPOOL" && $no_whirlpool) { return 0; }
62dc5aad
RL
1170 if ($keyword eq "RSA" && $no_rsa) { return 0; }
1171 if ($keyword eq "DSA" && $no_dsa) { return 0; }
1172 if ($keyword eq "DH" && $no_dh) { return 0; }
26a81abf 1173 if ($keyword eq "EC" && $no_ec) { return 0; }
4d94ae00 1174 if ($keyword eq "ECDSA" && $no_ecdsa) { return 0; }
e172d60d 1175 if ($keyword eq "ECDH" && $no_ecdh) { return 0; }
62dc5aad 1176 if ($keyword eq "AES" && $no_aes) { return 0; }
f3dea9a5 1177 if ($keyword eq "CAMELLIA" && $no_camellia) { return 0; }
96afc1cf 1178 if ($keyword eq "SEED" && $no_seed) { return 0; }
26a81abf
RL
1179 if ($keyword eq "EVP" && $no_evp) { return 0; }
1180 if ($keyword eq "LHASH" && $no_lhash) { return 0; }
1181 if ($keyword eq "STACK" && $no_stack) { return 0; }
1182 if ($keyword eq "ERR" && $no_err) { return 0; }
1183 if ($keyword eq "BUFFER" && $no_buffer) { return 0; }
1184 if ($keyword eq "BIO" && $no_bio) { return 0; }
1185 if ($keyword eq "COMP" && $no_comp) { return 0; }
1186 if ($keyword eq "DSO" && $no_dso) { return 0; }
62dc5aad 1187 if ($keyword eq "KRB5" && $no_krb5) { return 0; }
0b13e9f0 1188 if ($keyword eq "ENGINE" && $no_engine) { return 0; }
5cd48abf 1189 if ($keyword eq "HW" && $no_hw) { return 0; }
62dc5aad 1190 if ($keyword eq "FP_API" && $no_fp_api) { return 0; }
6cb68620 1191 if ($keyword eq "STATIC_ENGINE" && $no_static_engine) { return 0; }
987bebaf 1192 if ($keyword eq "GMP" && $no_gmp) { return 0; }
c20276e4
DSH
1193 if ($keyword eq "TLSEXT" && $no_tlsext) { return 0; }
1194 if ($keyword eq "PSK" && $no_psk) { return 0; }
8931b30d 1195 if ($keyword eq "CMS" && $no_cms) { return 0; }
e0d6132b 1196 if ($keyword eq "EC_NISTP_64_GCC_128" && $no_nistp_gcc)
a75829de 1197 { return 0; }
36246be9
DSH
1198 if ($keyword eq "EC2M" && $no_ec2m) { return 0; }
1199 if ($keyword eq "NEXTPROTONEG" && $no_nextprotoneg) { return 0; }
3881d810 1200 if ($keyword eq "SSL3_METHOD" && $no_ssl3_method) { return 0; }
8fdb4f1a 1201 if ($keyword eq "SSL_TRACE" && $no_ssl_trace) { return 0; }
d8bd55a3 1202 if ($keyword eq "CAPIENG" && $no_capieng) { return 0; }
79bd20fd 1203 if ($keyword eq "JPAKE" && $no_jpake) { return 0; }
edc032b5 1204 if ($keyword eq "SRP" && $no_srp) { return 0; }
9ef562bc 1205 if ($keyword eq "SCTP" && $no_sctp) { return 0; }
3dd814ac 1206 if ($keyword eq "SRTP" && $no_srtp) { return 0; }
e0fc7961 1207 if ($keyword eq "UNIT_TEST" && $no_unit_test) { return 0; }
4ccfe5f4 1208 if ($keyword eq "DEPRECATED" && $no_deprecated) { return 0; }
dc0e9a35 1209 if ($keyword eq "OCB" && $no_ocb) { return 0; }
62dc5aad
RL
1210
1211 # Nothing recognise as true
1212 return 1;
1213 }
1214 }
1215
1216 foreach $k (@keywords) {
1217 if ($k =~ /^!(.*)$/) {
1218 $falsesum += &recognise($1,$platforms);
1219 } else {
d3fdc27a 1220 $truesum *= &recognise($k,$platforms);
62dc5aad
RL
1221 }
1222 }
1223 print STDERR "DEBUG: [",$#keywords,",",$#keywords < 0,"] is_valid($keywords_txt) => (\!$falsesum) && $truesum = ",(!$falsesum) && $truesum,"\n" if $debug;
1224 return (!$falsesum) && $truesum;
1225}
1226
12aefe78
DSH
1227sub print_test_file
1228{
62dc5aad 1229 (*OUT,my $name,*nums,my $testall,my @symbols)=@_;
0f583f69 1230 my $n = 1; my @e; my @r;
948d0125
RL
1231 my $sym; my $prev = ""; my $prefSSLeay;
1232
62dc5aad
RL
1233 (@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols);
1234 (@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:.*/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols);
948d0125
RL
1235 @symbols=((sort @e),(sort @r));
1236
1237 foreach $sym (@symbols) {
1238 (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
62dc5aad
RL
1239 my $v = 0;
1240 $v = 1 if $i=~ /^.*?:.*?:VARIABLE/;
1241 my $p = ($i =~ /^[^:]*:([^:]*):/,$1);
1242 my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1);
1243 if (!defined($nums{$s})) {
1244 print STDERR "Warning: $s does not have a number assigned\n"
1245 if(!$do_update);
1246 } elsif (is_valid($p,1) && is_valid($a,0)) {
1247 my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1);
1248 if ($prev eq $s2) {
1249 print OUT "\t/* The following has already appeared previously */\n";
1250 print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n";
1251 }
1252 $prev = $s2; # To warn about duplicates...
1253
1254 ($nn,$ni)=($nums{$s2} =~ /^(.*?)\\(.*)$/);
1255 if ($v) {
1256 print OUT "\textern int $s2; /* type unknown */ /* $nn $ni */\n";
967f4ca8 1257 } else {
62dc5aad 1258 print OUT "\textern int $s2(); /* type unknown */ /* $nn $ni */\n";
967f4ca8 1259 }
12aefe78
DSH
1260 }
1261 }
1262}
1263
0b352c58
RL
1264sub get_version {
1265 local *MF;
1266 my $v = '?';
52272327 1267 open MF, 'Makefile' or return $v;
0b352c58
RL
1268 while (<MF>) {
1269 $v = $1, last if /^VERSION=(.*?)\s*$/;
1270 }
1271 close MF;
1272 return $v;
1273}
1274
d02b48c6 1275sub print_def_file
47339f61 1276{
948d0125 1277 (*OUT,my $name,*nums,my @symbols)=@_;
62dc5aad 1278 my $n = 1; my @e; my @r; my @v; my $prev="";
cd4c36ad 1279 my $liboptions="";
0b352c58
RL
1280 my $libname = $name;
1281 my $http_vendor = 'www.openssl.org/';
1282 my $version = get_version();
1283 my $what = "OpenSSL: implementation of Secure Socket Layer";
1284 my $description = "$what $version, $name - http://$http_vendor";
d02b48c6 1285
06c68491 1286 if ($W32)
0b352c58 1287 { $libname.="32"; }
cd4c36ad 1288 elsif ($OS2)
0b352c58
RL
1289 { # DLL names should not clash on the whole system.
1290 # However, they should not have any particular relationship
1291 # to the name of the static library. Chose descriptive names
1292 # (must be at most 8 chars).
1293 my %translate = (ssl => 'open_ssl', crypto => 'cryptssl');
1294 $libname = $translate{$name} || $name;
1295 $liboptions = <<EOO;
1296INITINSTANCE
1297DATA MULTIPLE NONSHARED
1298EOO
1299 # Vendor field can't contain colon, drat; so we omit http://
1300 $description = "\@#$http_vendor:$version#\@$what; DLL for library $name. Build for EMX -Zmtd";
1301 }
d02b48c6
RE
1302
1303 print OUT <<"EOF";
1304;
9b3086fe 1305; Definition file for the DLL version of the $name library from OpenSSL
d02b48c6
RE
1306;
1307
0b352c58 1308LIBRARY $libname $liboptions
d02b48c6 1309
d02b48c6
RE
1310EOF
1311
d02b48c6
RE
1312 print "EXPORTS\n";
1313
62dc5aad
RL
1314 (@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols);
1315 (@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:FUNCTION/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols);
1316 (@v)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:VARIABLE/,@symbols);
9c67ab2f 1317 @symbols=((sort @e),(sort @r), (sort @v));
d02b48c6 1318
d02b48c6 1319
948d0125
RL
1320 foreach $sym (@symbols) {
1321 (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
9c67ab2f 1322 my $v = 0;
62dc5aad 1323 $v = 1 if $i =~ /^.*?:.*?:VARIABLE/;
948d0125
RL
1324 if (!defined($nums{$s})) {
1325 printf STDERR "Warning: $s does not have a number assigned\n"
62dc5aad 1326 if(!$do_update);
47339f61 1327 } else {
62dc5aad 1328 (my $n, my $dummy) = split /\\/, $nums{$s};
d63b8db8 1329 my %pf = ();
62dc5aad
RL
1330 my $p = ($i =~ /^[^:]*:([^:]*):/,$1);
1331 my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1);
1332 if (is_valid($p,1) && is_valid($a,0)) {
1333 my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1);
1334 if ($prev eq $s2) {
1335 print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n";
1336 }
1337 $prev = $s2; # To warn about duplicates...
cd4c36ad 1338 if($v && !$OS2) {
b4f682d3 1339 printf OUT " %s%-39s @%-8d DATA\n",($W32)?"":"_",$s2,$n;
9c67ab2f 1340 } else {
cd4c36ad 1341 printf OUT " %s%-39s @%d\n",($W32||$OS2)?"":"_",$s2,$n;
9c67ab2f 1342 }
965c1775 1343 }
d02b48c6 1344 }
d02b48c6 1345 }
47339f61
DSH
1346 printf OUT "\n";
1347}
d02b48c6
RE
1348
1349sub load_numbers
47339f61
DSH
1350{
1351 my($name)=@_;
1352 my(@a,%ret);
d02b48c6 1353
55a9cc6e 1354 $max_num = 0;
948d0125
RL
1355 $num_noinfo = 0;
1356 $prev = "";
62dc5aad 1357 $prev_cnt = 0;
55a9cc6e 1358
d02b48c6 1359 open(IN,"<$name") || die "unable to open $name:$!\n";
47339f61 1360 while (<IN>) {
d02b48c6
RE
1361 chop;
1362 s/#.*$//;
1363 next if /^\s*$/;
1364 @a=split;
948d0125 1365 if (defined $ret{$a[0]}) {
62dc5aad
RL
1366 # This is actually perfectly OK
1367 #print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n";
948d0125
RL
1368 }
1369 if ($max_num > $a[1]) {
1370 print STDERR "Warning: Number decreased from ",$max_num," to ",$a[1],"\n";
1371 }
62dc5aad 1372 elsif ($max_num == $a[1]) {
948d0125
RL
1373 # This is actually perfectly OK
1374 #print STDERR "Warning: Symbol ",$a[0]," has same number as previous ",$prev,": ",$a[1],"\n";
62dc5aad
RL
1375 if ($a[0] eq $prev) {
1376 $prev_cnt++;
1377 $a[0] .= "{$prev_cnt}";
1378 }
1379 }
1380 else {
1381 $prev_cnt = 0;
948d0125
RL
1382 }
1383 if ($#a < 2) {
1384 # Existence will be proven later, in do_defs
1385 $ret{$a[0]}=$a[1];
1386 $num_noinfo++;
1387 } else {
1388 $ret{$a[0]}=$a[1]."\\".$a[2]; # \\ is a special marker
1389 }
55a9cc6e 1390 $max_num = $a[1] if $a[1] > $max_num;
948d0125
RL
1391 $prev=$a[0];
1392 }
1393 if ($num_noinfo) {
1394 print STDERR "Warning: $num_noinfo symbols were without info.";
1395 if ($do_rewrite) {
1396 printf STDERR " The rewrite will fix this.\n";
1397 } else {
1398 printf STDERR " You should do a rewrite to fix this.\n";
1399 }
47339f61 1400 }
d02b48c6
RE
1401 close(IN);
1402 return(%ret);
47339f61 1403}
55a9cc6e 1404
948d0125
RL
1405sub parse_number
1406{
1407 (my $str, my $what) = @_;
1408 (my $n, my $i) = split(/\\/,$str);
1409 if ($what eq "n") {
1410 return $n;
1411 } else {
1412 return $i;
1413 }
1414}
1415
1416sub rewrite_numbers
1417{
1418 (*OUT,$name,*nums,@symbols)=@_;
1419 my $thing;
1420
1421 print STDERR "Rewriting $name\n";
1422
62dc5aad 1423 my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols);
948d0125
RL
1424 my $r; my %r; my %rsyms;
1425 foreach $r (@r) {
1426 (my $s, my $i) = split /\\/, $r;
1427 my $a = $1 if $i =~ /^.*?:.*?:\w+\((\w+)\)/;
1428 $i =~ s/^(.*?:.*?:\w+)\(\w+\)/$1/;
1429 $r{$a} = $s."\\".$i;
1430 $rsyms{$s} = 1;
1431 }
1432
451e60e9
RL
1433 my %syms = ();
1434 foreach $_ (@symbols) {
1435 (my $n, my $i) = split /\\/;
1436 $syms{$n} = 1;
1437 }
1438
89eeccac
RL
1439 my @s=sort {
1440 &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n")
1441 || $a cmp $b
1442 } keys %nums;
948d0125
RL
1443 foreach $sym (@s) {
1444 (my $n, my $i) = split /\\/, $nums{$sym};
1445 next if defined($i) && $i =~ /^.*?:.*?:\w+\(\w+\)/;
1446 next if defined($rsyms{$sym});
62dc5aad 1447 print STDERR "DEBUG: rewrite_numbers for sym = ",$sym,": i = ",$i,", n = ",$n,", rsym{sym} = ",$rsyms{$sym},"syms{sym} = ",$syms{$sym},"\n" if $debug;
451e60e9
RL
1448 $i="NOEXIST::FUNCTION:"
1449 if !defined($i) || $i eq "" || !defined($syms{$sym});
62dc5aad
RL
1450 my $s2 = $sym;
1451 $s2 =~ s/\{[0-9]+\}$//;
b4f682d3 1452 printf OUT "%s%-39s %d\t%s\n","",$s2,$n,$i;
948d0125
RL
1453 if (exists $r{$sym}) {
1454 (my $s, $i) = split /\\/,$r{$sym};
62dc5aad
RL
1455 my $s2 = $s;
1456 $s2 =~ s/\{[0-9]+\}$//;
b4f682d3 1457 printf OUT "%s%-39s %d\t%s\n","",$s2,$n,$i;
948d0125
RL
1458 }
1459 }
1460}
1461
55a9cc6e 1462sub update_numbers
47339f61 1463{
948d0125
RL
1464 (*OUT,$name,*nums,my $start_num, my @symbols)=@_;
1465 my $new_syms = 0;
1466
1467 print STDERR "Updating $name numbers\n";
1468
62dc5aad 1469 my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols);
948d0125
RL
1470 my $r; my %r; my %rsyms;
1471 foreach $r (@r) {
1472 (my $s, my $i) = split /\\/, $r;
1473 my $a = $1 if $i =~ /^.*?:.*?:\w+\((\w+)\)/;
1474 $i =~ s/^(.*?:.*?:\w+)\(\w+\)/$1/;
1475 $r{$a} = $s."\\".$i;
1476 $rsyms{$s} = 1;
1477 }
1478
1479 foreach $sym (@symbols) {
1480 (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
1481 next if $i =~ /^.*?:.*?:\w+\(\w+\)/;
1482 next if defined($rsyms{$sym});
1483 die "ERROR: Symbol $sym had no info attached to it."
1484 if $i eq "";
19cd2049 1485 next if $i =~ /OPENSSL_FIPSCAPABLE/;
948d0125
RL
1486 if (!exists $nums{$s}) {
1487 $new_syms++;
62dc5aad
RL
1488 my $s2 = $s;
1489 $s2 =~ s/\{[0-9]+\}$//;
b4f682d3 1490 printf OUT "%s%-39s %d\t%s\n","",$s2, ++$start_num,$i;
948d0125 1491 if (exists $r{$s}) {
33b1a4c2 1492 ($s, $i) = split /\\/,$r{$s};
62dc5aad 1493 $s =~ s/\{[0-9]+\}$//;
b4f682d3 1494 printf OUT "%s%-39s %d\t%s\n","",$s, $start_num,$i;
948d0125 1495 }
55a9cc6e 1496 }
47339f61 1497 }
948d0125
RL
1498 if($new_syms) {
1499 print STDERR "$new_syms New symbols added\n";
55a9cc6e 1500 } else {
948d0125
RL
1501 print STDERR "No New symbols Added\n";
1502 }
1503}
1504
1505sub check_existing
1506{
1507 (*nums, my @symbols)=@_;
1508 my %existing; my @remaining;
1509 @remaining=();
1510 foreach $sym (@symbols) {
1511 (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
1512 $existing{$s}=1;
1513 }
1514 foreach $sym (keys %nums) {
1515 if (!exists $existing{$sym}) {
1516 push @remaining, $sym;
1517 }
1518 }
1519 if(@remaining) {
1520 print STDERR "The following symbols do not seem to exist:\n";
1521 foreach $sym (@remaining) {
1522 print STDERR "\t",$sym,"\n";
1523 }
55a9cc6e 1524 }
47339f61 1525}
948d0125 1526
07c4c14c
MC
1527sub count_parens
1528{
1529 my $line = shift(@_);
1530
1531 my $open = $line =~ tr/\(//;
1532 my $close = $line =~ tr/\)//;
1533
1534 return $open - $close;
1535}
1536