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