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