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