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