Introduce the possibility to access global variables through
authorRichard Levitte <levitte@openssl.org>
Fri, 2 Mar 2001 10:38:19 +0000 (10:38 +0000)
committerRichard Levitte <levitte@openssl.org>
Fri, 2 Mar 2001 10:38:19 +0000 (10:38 +0000)
functions on platform were that's the best way to handle exporting
global variables in shared libraries.  To enable this functionality,
one must configure with "EXPORT_VAR_AS_FN" or defined the C macro
"OPENSSL_EXPORT_VAR_AS_FUNCTION" in crypto/opensslconf.h (the latter
is normally done by Configure or something similar).

To implement a global variable, use the macro OPENSSL_IMPLEMENT_GLOBAL
in the source file (foo.c) like this:

OPENSSL_IMPLEMENT_GLOBAL(int,foo)=1;
OPENSSL_IMPLEMENT_GLOBAL(double,bar);

To declare a global variable, use the macros OPENSSL_DECLARE_GLOBAL
and OPENSSL_GLOBAL_REF in the header file (foo.h) like this:

OPENSSL_DECLARE_GLOBAL(int,foo);
#define foo OPENSSL_GLOBAL_REF(foo)
OPENSSL_DECLARE_GLOBAL(double,bar);
#define bar OPENSSL_GLOBAL_REF(bar)

The #defines are very important, and therefore so is including the
header file everywere where the defined globals are used.

The macro OPENSSL_EXPORT_VAR_AS_FUNCTION also affects the definition
of ASN.1 items, but that structure is a bt different.

The largest change is in util/mkdef.pl which has been enhanced with
better and easier to understand logic to choose which symbols should
go into the Windows .def files as well as a number of fixes and code
cleanup (among others, algorithm keywords are now sorted
lexicographically to avoid constant rewrites).

13 files changed:
CHANGES
Configure
crypto/asn1/asn1.h
crypto/asn1/asn1t.h
crypto/des/des.h
crypto/des/enc_read.c
crypto/des/set_key.c
crypto/opensslconf.h.in
e_os2.h
makevms.com
util/libeay.num
util/mkdef.pl
util/ssleay.num

diff --git a/CHANGES b/CHANGES
index 3c45bc7..18c984c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,40 @@
 
  Changes between 0.9.6 and 0.9.7  [xx XXX 2000]
 
+  *) Introduce the possibility to access global variables through
+     functions on platform were that's the best way to handle exporting
+     global variables in shared libraries.  To enable this functionality,
+     one must configure with "EXPORT_VAR_AS_FN" or defined the C macro
+     "OPENSSL_EXPORT_VAR_AS_FUNCTION" in crypto/opensslconf.h (the latter
+     is normally done by Configure or something similar).
+
+     To implement a global variable, use the macro OPENSSL_IMPLEMENT_GLOBAL
+     in the source file (foo.c) like this:
+
+       OPENSSL_IMPLEMENT_GLOBAL(int,foo)=1;
+       OPENSSL_IMPLEMENT_GLOBAL(double,bar);
+
+     To declare a global variable, use the macros OPENSSL_DECLARE_GLOBAL
+     and OPENSSL_GLOBAL_REF in the header file (foo.h) like this:
+
+       OPENSSL_DECLARE_GLOBAL(int,foo);
+       #define foo OPENSSL_GLOBAL_REF(foo)
+       OPENSSL_DECLARE_GLOBAL(double,bar);
+       #define bar OPENSSL_GLOBAL_REF(bar)
+
+     The #defines are very important, and therefore so is including the
+     header file everywere where the defined globals are used.
+
+     The macro OPENSSL_EXPORT_VAR_AS_FUNCTION also affects the definition
+     of ASN.1 items, but that structure is a bt different.
+
+     The largest change is in util/mkdef.pl which has been enhanced with
+     better and easier to understand logic to choose which symbols should
+     go into the Windows .def files as well as a number of fixes and code
+     cleanup (among others, algorithm keywords are now sorted
+     lexicographically to avoid constant rewrites).
+     [Richard Levitte]
+
   *) In copy_email() check for >= 0 as a return value for
      X509_NAME_get_index_by_NID() since 0 is a valid index.
      [Steve Henson reported by Massimiliano Pala <madwolf@opensca.org>]
index 5c69e89..cd6afd8 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -968,6 +968,7 @@ my $rc4_chunk=0;
 my $bf_ptr=0;
 my @type=("char","short","int","long");
 my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
+my $export_var_as_fn=0;
 
 my $des_int;
 
@@ -997,6 +998,7 @@ foreach (sort split(/\s+/,$bn_ops))
        ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
        ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
        ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
+       $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
        }
 
 open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
@@ -1029,6 +1031,11 @@ while (<IN>)
        {
        if      (/^#define\s+OPENSSLDIR/)
                { print OUT "#define OPENSSLDIR \"$openssldir\"\n"; }
+       elsif   (/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
+               { printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
+                       if $export_var_as_fn;
+                 printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
+                       ($export_var_as_fn)?"define":"undef"; }
        elsif   (/^#define\s+OPENSSL_UNISTD/)
                {
                $unistd = "<unistd.h>" if $unistd eq "";
index a3b992f..ae92ad9 100644 (file)
@@ -357,7 +357,7 @@ typedef struct ASN1_VALUE_st ASN1_VALUE;
  *
  */
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 /* ASN1_ITEM pointer exported type */
 typedef const ASN1_ITEM ASN1_ITEM_EXP;
index 7d01df0..6e1bf87 100644 (file)
@@ -74,7 +74,7 @@ extern "C" {
 #endif
 
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
 #define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))
@@ -287,7 +287,7 @@ extern "C" {
 
 /* Any defined by macros: the field used is in the table itself */
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
 #define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
 #else
@@ -358,7 +358,7 @@ extern "C" {
 #define ASN1_ADB(name) \
        const static ASN1_ADB_TABLE name##_adbtbl[] 
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 #define ASN1_ADB_END(name, flags, field, app_table, def, none) \
        ;\
index 5fa6aef..dc62718 100644 (file)
@@ -116,8 +116,10 @@ typedef struct des_ks_struct
 #define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
        des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
 
-OPENSSL_EXTERN int des_check_key;      /* defaults to false */
-OPENSSL_EXTERN int des_rw_mode;                /* defaults to DES_PCBC_MODE */
+OPENSSL_DECLARE_GLOBAL(int,des_check_key);     /* defaults to false */
+#define des_check_key OPENSSL_GLOBAL_REF(des_check_key)
+OPENSSL_DECLARE_GLOBAL(int,des_rw_mode);       /* defaults to DES_PCBC_MODE */
+#define des_rw_mode OPENSSL_GLOBAL_REF(des_rw_mode)
 
 const char *des_options(void);
 void des_ecb3_encrypt(const_des_cblock *input, des_cblock *output,
index af2d917..e8a5763 100644 (file)
@@ -63,7 +63,7 @@
 
 /* This has some uglies in it but it works - even over sockets. */
 /*extern int errno;*/
-OPENSSL_GLOBAL int des_rw_mode=DES_PCBC_MODE;
+OPENSSL_IMPLEMENT_GLOBAL(int,des_rw_mode)=DES_PCBC_MODE;
 
 
 /*
index 6df3ba9..0dc79c9 100644 (file)
@@ -65,7 +65,7 @@
  */
 #include "des_locl.h"
 
-OPENSSL_GLOBAL int des_check_key=0;
+OPENSSL_IMPLEMENT_GLOBAL(int,des_check_key);   /* defaults to false */
 
 static const unsigned char odd_parity[256]={
   1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
index 5da5911..a06861b 100644 (file)
@@ -12,6 +12,8 @@
 #undef OPENSSL_UNISTD
 #define OPENSSL_UNISTD <unistd.h>
 
+#undef OPENSSL_EXPORT_VAR_AS_FUNCTIONS
+
 #if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
 #define IDEA_INT unsigned int
 #endif
diff --git a/e_os2.h b/e_os2.h
index be20eac..f279fa1 100644 (file)
--- a/e_os2.h
+++ b/e_os2.h
@@ -200,6 +200,28 @@ extern "C" {
 #endif
 #define OPENSSL_EXTERN OPENSSL_IMPORT
 
+/* Macros to allow global variables to be reached through function calls when
+   required (if a shared library version requvres it, for example.
+   The way it's done allows definitions like this:
+
+       // in foobar.c
+       OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0;
+       // in foobar.h
+       OPENSSL_DECLARE_GLOBAL(int,foobar);
+       #define foobar OPENSSL_GLOBAL_REF(foobar)
+*/
+#ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION
+# define OPENSSL_IMPLEMENT_GLOBAL(type,name) extern static type _hide_##name; \
+        type *_shadow_##name(void) { static type local_var; return &local_var; } \
+        static type _hide_##name
+# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void)
+# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name()))
+#else
+# define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name
+# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name
+# define OPENSSL_GLOBAL_REF(name) _shadow_##name
+#endif
+
 #ifdef  __cplusplus
 }
 #endif
index 194e485..579fcae 100755 (executable)
@@ -285,6 +285,8 @@ $   WRITE H_FILE "#undef THIRTY_TWO_BIT"
 $   WRITE H_FILE "#undef SIXTEEN_BIT"
 $   WRITE H_FILE "#undef EIGHT_BIT"
 $   WRITE H_FILE "#endif"
+$
+$   WRITE H_FILE "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION"
 $!
 $!  Else...
 $!
@@ -317,6 +319,9 @@ $   WRITE H_FILE "#define THIRTY_TWO_BIT"
 $   WRITE H_FILE "#undef SIXTEEN_BIT"
 $   WRITE H_FILE "#undef EIGHT_BIT"
 $   WRITE H_FILE "#endif"
+$
+$   WRITE H_FILE "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION"
+$   WRITE H_FILE "#define OPENSSL_EXPORT_VAR_AS_FUNCTION"
 $!
 $!  End
 $!
index 6c76287..92de2a8 100755 (executable)
@@ -203,13 +203,13 @@ DSA_generate_key                        210       EXIST::FUNCTION:DSA
 DSA_generate_parameters                 211    EXIST::FUNCTION:DSA
 DSA_is_prime                            212    NOEXIST::FUNCTION:
 DSA_new                                 213    EXIST::FUNCTION:DSA
-DSA_print                               214    EXIST::FUNCTION:DSA,BIO
+DSA_print                               214    EXIST::FUNCTION:BIO,DSA
 DSA_print_fp                            215    EXIST::FUNCTION:DSA,FP_API
 DSA_sign                                216    EXIST::FUNCTION:DSA
 DSA_sign_setup                          217    EXIST::FUNCTION:DSA
 DSA_size                                218    EXIST::FUNCTION:DSA
 DSA_verify                              219    EXIST::FUNCTION:DSA
-DSAparams_print                         220    EXIST::FUNCTION:DSA,BIO
+DSAparams_print                         220    EXIST::FUNCTION:BIO,DSA
 DSAparams_print_fp                      221    EXIST::FUNCTION:DSA,FP_API
 ERR_clear_error                         222    EXIST::FUNCTION:
 ERR_error_string                        223    EXIST::FUNCTION:
@@ -478,7 +478,7 @@ RSA_generate_key                        485 EXIST::FUNCTION:RSA
 RSA_new                                 486    EXIST::FUNCTION:RSA
 RSA_new_method                          487    EXIST::FUNCTION:RSA
 RSA_print                               488    EXIST::FUNCTION:BIO,RSA
-RSA_print_fp                            489    EXIST::FUNCTION:RSA,FP_API
+RSA_print_fp                            489    EXIST::FUNCTION:FP_API,RSA
 RSA_private_decrypt                     490    EXIST::FUNCTION:RSA
 RSA_private_encrypt                     491    EXIST::FUNCTION:RSA
 RSA_public_decrypt                      492    EXIST::FUNCTION:RSA
@@ -489,14 +489,14 @@ RSA_sign_ASN1_OCTET_STRING              496       EXIST::FUNCTION:RSA
 RSA_size                                497    EXIST::FUNCTION:RSA
 RSA_verify                              498    EXIST::FUNCTION:RSA
 RSA_verify_ASN1_OCTET_STRING            499    EXIST::FUNCTION:RSA
-SHA                                     500    EXIST::FUNCTION:SHA0,SHA
+SHA                                     500    EXIST::FUNCTION:SHA,SHA0
 SHA1                                    501    EXIST::FUNCTION:SHA,SHA1
 SHA1_Final                              502    EXIST::FUNCTION:SHA,SHA1
 SHA1_Init                               503    EXIST::FUNCTION:SHA,SHA1
 SHA1_Update                             504    EXIST::FUNCTION:SHA,SHA1
-SHA_Final                               505    EXIST::FUNCTION:SHA0,SHA
-SHA_Init                                506    EXIST::FUNCTION:SHA0,SHA
-SHA_Update                              507    EXIST::FUNCTION:SHA0,SHA
+SHA_Final                               505    EXIST::FUNCTION:SHA,SHA0
+SHA_Init                                506    EXIST::FUNCTION:SHA,SHA0
+SHA_Update                              507    EXIST::FUNCTION:SHA,SHA0
 OpenSSL_add_all_algorithms              508    EXIST::FUNCTION:
 OpenSSL_add_all_ciphers                 509    EXIST::FUNCTION:
 OpenSSL_add_all_digests                 510    EXIST::FUNCTION:
@@ -719,7 +719,7 @@ d2i_ASN1_bytes                          725 EXIST::FUNCTION:
 d2i_ASN1_type_bytes                     726    EXIST::FUNCTION:
 d2i_DHparams                            727    EXIST::FUNCTION:DH
 d2i_DSAPrivateKey                       728    EXIST::FUNCTION:DSA
-d2i_DSAPrivateKey_bio                   729    EXIST::FUNCTION:DSA,BIO
+d2i_DSAPrivateKey_bio                   729    EXIST::FUNCTION:BIO,DSA
 d2i_DSAPrivateKey_fp                    730    EXIST::FUNCTION:DSA,FP_API
 d2i_DSAPublicKey                        731    EXIST::FUNCTION:DSA
 d2i_DSAparams                           732    EXIST::FUNCTION:DSA
@@ -742,7 +742,7 @@ d2i_PrivateKey                          748 EXIST::FUNCTION:
 d2i_PublicKey                           749    EXIST::FUNCTION:
 d2i_RSAPrivateKey                       750    EXIST::FUNCTION:RSA
 d2i_RSAPrivateKey_bio                   751    EXIST::FUNCTION:BIO,RSA
-d2i_RSAPrivateKey_fp                    752    EXIST::FUNCTION:RSA,FP_API
+d2i_RSAPrivateKey_fp                    752    EXIST::FUNCTION:FP_API,RSA
 d2i_RSAPublicKey                        753    EXIST::FUNCTION:RSA
 d2i_X509                                754    EXIST::FUNCTION:
 d2i_X509_ALGOR                          755    EXIST::FUNCTION:
@@ -821,7 +821,7 @@ i2d_ASN1_UTCTIME                        828 EXIST::FUNCTION:
 i2d_ASN1_bytes                          829    EXIST::FUNCTION:
 i2d_DHparams                            830    EXIST::FUNCTION:DH
 i2d_DSAPrivateKey                       831    EXIST::FUNCTION:DSA
-i2d_DSAPrivateKey_bio                   832    EXIST::FUNCTION:DSA,BIO
+i2d_DSAPrivateKey_bio                   832    EXIST::FUNCTION:BIO,DSA
 i2d_DSAPrivateKey_fp                    833    EXIST::FUNCTION:DSA,FP_API
 i2d_DSAPublicKey                        834    EXIST::FUNCTION:DSA
 i2d_DSAparams                           835    EXIST::FUNCTION:DSA
@@ -844,7 +844,7 @@ i2d_PrivateKey                          851 EXIST::FUNCTION:
 i2d_PublicKey                           852    EXIST::FUNCTION:
 i2d_RSAPrivateKey                       853    EXIST::FUNCTION:RSA
 i2d_RSAPrivateKey_bio                   854    EXIST::FUNCTION:BIO,RSA
-i2d_RSAPrivateKey_fp                    855    EXIST::FUNCTION:RSA,FP_API
+i2d_RSAPrivateKey_fp                    855    EXIST::FUNCTION:FP_API,RSA
 i2d_RSAPublicKey                        856    EXIST::FUNCTION:RSA
 i2d_X509                                857    EXIST::FUNCTION:
 i2d_X509_ALGOR                          858    EXIST::FUNCTION:
@@ -933,8 +933,8 @@ d2i_RSAPublicKey_bio                    945 EXIST::FUNCTION:BIO,RSA
 i2d_RSAPublicKey_bio                    946    EXIST::FUNCTION:BIO,RSA
 PEM_read_RSAPublicKey                   947    EXIST:!WIN16:FUNCTION:RSA
 PEM_write_RSAPublicKey                  949    EXIST:!WIN16:FUNCTION:RSA
-d2i_RSAPublicKey_fp                     952    EXIST::FUNCTION:RSA,FP_API
-i2d_RSAPublicKey_fp                     954    EXIST::FUNCTION:RSA,FP_API
+d2i_RSAPublicKey_fp                     952    EXIST::FUNCTION:FP_API,RSA
+i2d_RSAPublicKey_fp                     954    EXIST::FUNCTION:FP_API,RSA
 BIO_copy_next_retry                     955    EXIST::FUNCTION:
 RSA_flags                               956    EXIST::FUNCTION:RSA
 X509_STORE_add_crl                      957    EXIST::FUNCTION:
@@ -989,7 +989,7 @@ ERR_load_CRYPTOlib_strings              1009        EXIST:WIN16,VMS:FUNCTION:
 EVP_PKEY_bits                           1010   EXIST::FUNCTION:
 MD5_Transform                           1011   EXIST::FUNCTION:MD5
 SHA1_Transform                          1012   EXIST::FUNCTION:SHA,SHA1
-SHA_Transform                           1013   EXIST::FUNCTION:SHA0,SHA
+SHA_Transform                           1013   EXIST::FUNCTION:SHA,SHA0
 X509_STORE_CTX_get_chain                1014   EXIST::FUNCTION:
 X509_STORE_CTX_get_current_cert         1015   EXIST::FUNCTION:
 X509_STORE_CTX_get_error                1016   EXIST::FUNCTION:
@@ -1216,7 +1216,7 @@ name_cmp                                1239      EXIST::FUNCTION:
 str_dup                                 1240   NOEXIST::FUNCTION:
 i2s_ASN1_ENUMERATED                     1241   EXIST::FUNCTION:
 i2s_ASN1_ENUMERATED_TABLE               1242   EXIST::FUNCTION:
-BIO_s_log                               1243   EXIST:!WIN32,!WIN16,!macintosh:FUNCTION:
+BIO_s_log                               1243   EXIST:!WIN16,!WIN32,!macintosh:FUNCTION:
 BIO_f_reliable                          1244   EXIST::FUNCTION:BIO
 PKCS7_dataFinal                         1245   EXIST::FUNCTION:
 PKCS7_dataDecode                        1246   EXIST::FUNCTION:
@@ -1468,7 +1468,7 @@ RSA_get_method                          1847      EXIST::FUNCTION:RSA
 RSA_get_default_method                  1848   NOEXIST::FUNCTION:
 RSA_check_key                           1869   EXIST::FUNCTION:RSA
 OBJ_obj2txt                             1870   EXIST::FUNCTION:
-DSA_dup_DH                              1871   EXIST::FUNCTION:DSA,DH
+DSA_dup_DH                              1871   EXIST::FUNCTION:DH,DSA
 X509_REQ_get_extensions                 1872   EXIST::FUNCTION:
 X509_REQ_set_extension_nids             1873   EXIST::FUNCTION:
 BIO_nwrite                              1874   EXIST::FUNCTION:
@@ -1543,7 +1543,7 @@ ASN1_STRING_set_default_mask_asc        1960      EXIST:!VMS:FUNCTION:
 ASN1_STRING_set_def_mask_asc            1960   EXIST:VMS:FUNCTION:
 PEM_write_bio_RSA_PUBKEY                1961   EXIST::FUNCTION:RSA
 ASN1_INTEGER_cmp                        1963   EXIST::FUNCTION:
-d2i_RSA_PUBKEY_fp                       1964   EXIST::FUNCTION:RSA,FP_API
+d2i_RSA_PUBKEY_fp                       1964   EXIST::FUNCTION:FP_API,RSA
 X509_trust_set_bit_asc                  1967   NOEXIST::FUNCTION:
 PEM_write_bio_DSA_PUBKEY                1968   EXIST::FUNCTION:DSA
 X509_STORE_CTX_free                     1969   EXIST::FUNCTION:
@@ -1576,7 +1576,7 @@ X509_NAME_add_entry_by_OBJ              2008      EXIST::FUNCTION:
 X509_CRL_get_ext_d2i                    2009   EXIST::FUNCTION:
 X509_PURPOSE_get0_name                  2011   EXIST::FUNCTION:
 PEM_read_PUBKEY                         2012   EXIST:!WIN16:FUNCTION:
-i2d_DSA_PUBKEY_bio                      2014   EXIST::FUNCTION:DSA,BIO
+i2d_DSA_PUBKEY_bio                      2014   EXIST::FUNCTION:BIO,DSA
 i2d_OTHERNAME                           2015   EXIST::FUNCTION:
 ASN1_OCTET_STRING_free                  2016   EXIST::FUNCTION:
 ASN1_BIT_STRING_set_asc                 2017   EXIST::FUNCTION:
@@ -1634,7 +1634,7 @@ PEM_read_bio_DSA_PUBKEY                 2088      EXIST::FUNCTION:DSA
 X509_PURPOSE_add                        2090   EXIST::FUNCTION:
 ASN1_STRING_TABLE_get                   2091   EXIST::FUNCTION:
 ASN1_UTF8STRING_free                    2092   EXIST::FUNCTION:
-d2i_DSA_PUBKEY_bio                      2093   EXIST::FUNCTION:DSA,BIO
+d2i_DSA_PUBKEY_bio                      2093   EXIST::FUNCTION:BIO,DSA
 PEM_write_RSA_PUBKEY                    2095   EXIST:!WIN16:FUNCTION:RSA
 d2i_OTHERNAME                           2096   EXIST::FUNCTION:
 X509_reject_set_bit                     2098   NOEXIST::FUNCTION:
@@ -1646,7 +1646,7 @@ ASN1_BIT_STRING_set                     2109      EXIST::FUNCTION:
 X509_TRUST_get_count                    2110   EXIST::FUNCTION:
 ASN1_INTEGER_free                       2111   EXIST::FUNCTION:
 OTHERNAME_free                          2112   EXIST::FUNCTION:
-i2d_RSA_PUBKEY_fp                       2113   EXIST::FUNCTION:RSA,FP_API
+i2d_RSA_PUBKEY_fp                       2113   EXIST::FUNCTION:FP_API,RSA
 ASN1_INTEGER_dup                        2114   EXIST::FUNCTION:
 d2i_X509_CERT_AUX                       2115   EXIST::FUNCTION:
 PEM_write_bio_PUBKEY                    2117   EXIST::FUNCTION:
@@ -1871,8 +1871,10 @@ X509_time_adj                           2453     EXIST::FUNCTION:
 X509_check_issued                       2454   EXIST::FUNCTION:
 ASN1_UTCTIME_cmp_time_t                 2455   EXIST::FUNCTION:
 des_set_weak_key_flag                   2456   NOEXIST::FUNCTION:
-des_check_key                           2457   EXIST::VARIABLE:DES
-des_rw_mode                             2458   EXIST::VARIABLE:DES
+_shadow_des_check_key                   2457   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:DES
+_shadow_des_check_key                   2457   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:DES
+_shadow_des_rw_mode                     2458   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:DES
+_shadow_des_rw_mode                     2458   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:DES
 RSA_PKCS1_RSAref                        2459   NOEXIST::FUNCTION:
 X509_keyid_set1                         2460   EXIST::FUNCTION:
 BIO_next                                2461   EXIST::FUNCTION:
@@ -2077,95 +2079,141 @@ BN_mod_lshift1_quick                    2656   EXIST::FUNCTION:
 BN_mod_lshift_quick                     2657   EXIST::FUNCTION:
 BN_mod_add_quick                        2658   EXIST::FUNCTION:
 BN_mod_sub                              2659   EXIST::FUNCTION:
-ASN1_UTF8STRING_it                      2660   EXIST::VARIABLE:
+ASN1_UTF8STRING_it                      2660   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_UTF8STRING_it                      2660   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_ex_i2d                        2661   EXIST::FUNCTION:
 X509V3_add1_i2d                         2662   EXIST::FUNCTION:
-PKCS7_ENVELOPE_it                       2663   EXIST::VARIABLE:
+PKCS7_ENVELOPE_it                       2663   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ENVELOPE_it                       2663   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get1_ext_d2i                2664   EXIST::FUNCTION:
-PBKDF2PARAM_it                          2665   EXIST::VARIABLE:
+PBKDF2PARAM_it                          2665   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PBKDF2PARAM_it                          2665   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EXTENDED_KEY_USAGE_new                  2666   EXIST::FUNCTION:
 OCSP_BASICRESP_delete_ext               2667   EXIST::FUNCTION:
-X509_CRL_it                             2668   EXIST::VARIABLE:
+X509_CRL_it                             2668   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CRL_it                             2668   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_add_ext                  2669   EXIST::FUNCTION:
 OCSP_REQUEST_get_ext_by_OBJ             2670   EXIST::FUNCTION:
-ASN1_T61STRING_it                       2671   EXIST::VARIABLE:
+ASN1_T61STRING_it                       2671   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_T61STRING_it                       2671   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext_by_OBJ           2672   EXIST::FUNCTION:
 OCSP_SINGLERESP_get_ext_count           2673   EXIST::FUNCTION:
 asn1_do_adb                             2674   EXIST::FUNCTION:
 ASN1_template_i2d                       2675   EXIST::FUNCTION:
-GENERAL_NAME_it                         2676   EXIST::VARIABLE:
-ASN1_GENERALIZEDTIME_it                 2677   EXIST::VARIABLE:
-SXNET_it                                2678   EXIST::VARIABLE:
-POLICYQUALINFO_it                       2679   EXIST::VARIABLE:
+GENERAL_NAME_it                         2676   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+GENERAL_NAME_it                         2676   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_GENERALIZEDTIME_it                 2677   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_GENERALIZEDTIME_it                 2677   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+SXNET_it                                2678   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+SXNET_it                                2678   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+POLICYQUALINFO_it                       2679   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+POLICYQUALINFO_it                       2679   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_free                          2680   EXIST::FUNCTION:
-AUTHORITY_KEYID_it                      2681   EXIST::VARIABLE:
+AUTHORITY_KEYID_it                      2681   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+AUTHORITY_KEYID_it                      2681   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EXTENDED_KEY_USAGE_free                 2682   EXIST::FUNCTION:
 OCSP_REQUEST_get_ext                    2683   EXIST::FUNCTION:
 ENGINE_load_ubsec                       2684   EXIST::FUNCTION:
-PKEY_USAGE_PERIOD_it                    2685   EXIST::VARIABLE:
-NETSCAPE_SPKAC_it                       2686   EXIST::VARIABLE:
-X509_REVOKED_it                         2687   EXIST::VARIABLE:
+PKEY_USAGE_PERIOD_it                    2685   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKEY_USAGE_PERIOD_it                    2685   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+NETSCAPE_SPKAC_it                       2686   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NETSCAPE_SPKAC_it                       2686   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_REVOKED_it                         2687   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_REVOKED_it                         2687   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext_by_critical      2688   EXIST:!VMS:FUNCTION:
 OCSP_BASICRESP_get_ext_by_crit          2688   EXIST:VMS:FUNCTION:
-PKCS12_it                               2689   EXIST::VARIABLE:
+PKCS12_it                               2689   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_it                               2689   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_get_ext_by_critical     2690   EXIST:!VMS:FUNCTION:
 OCSP_SINGLERESP_get_ext_by_crit         2690   EXIST:VMS:FUNCTION:
 ASN1_item_i2d                           2691   EXIST::FUNCTION:
 asn1_ex_i2c                             2692   EXIST::FUNCTION:
-X509_EXTENSION_it                       2693   EXIST::VARIABLE:
-SXNETID_it                              2694   EXIST::VARIABLE:
+X509_EXTENSION_it                       2693   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_EXTENSION_it                       2693   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+SXNETID_it                              2694   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+SXNETID_it                              2694   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EDIPARTYNAME_new                        2695   EXIST::FUNCTION:
 d2i_EXTENDED_KEY_USAGE                  2696   EXIST::FUNCTION:
-X509_PUBKEY_it                          2697   EXIST::VARIABLE:
-PKCS7_ENCRYPT_it                        2698   EXIST::VARIABLE:
+X509_PUBKEY_it                          2697   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_PUBKEY_it                          2697   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ENCRYPT_it                        2698   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ENCRYPT_it                        2698   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_add1_ext_i2d                       2699   EXIST::FUNCTION:
-PKCS7_SIGNER_INFO_it                    2700   EXIST::VARIABLE:
-PKCS12_SAFEBAG_it                       2701   EXIST::VARIABLE:
+PKCS7_SIGNER_INFO_it                    2700   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_SIGNER_INFO_it                    2700   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS12_SAFEBAG_it                       2701   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_SAFEBAG_it                       2701   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_signature_print                    2702   EXIST::FUNCTION:EVP
 OCSP_REQUEST_add_ext                    2703   EXIST::FUNCTION:
-X509_ALGOR_it                           2704   EXIST::VARIABLE:
-ASN1_TIME_it                            2705   EXIST::VARIABLE:
+X509_ALGOR_it                           2704   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_ALGOR_it                           2704   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_TIME_it                            2705   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_TIME_it                            2705   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext_count               2706   EXIST::FUNCTION:
-ASN1_IA5STRING_it                       2707   EXIST::VARIABLE:
-X509_CERT_AUX_it                        2708   EXIST::VARIABLE:
-CERTIFICATEPOLICIES_it                  2709   EXIST::VARIABLE:
+ASN1_IA5STRING_it                       2707   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_IA5STRING_it                       2707   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_CERT_AUX_it                        2708   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CERT_AUX_it                        2708   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+CERTIFICATEPOLICIES_it                  2709   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+CERTIFICATEPOLICIES_it                  2709   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 BN_bntest_rand                          2710   EXIST::FUNCTION:
-X509_ATTRIBUTE_it                       2711   EXIST::VARIABLE:
+X509_ATTRIBUTE_it                       2711   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_ATTRIBUTE_it                       2711   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext_by_NID              2712   EXIST::FUNCTION:
-OCSP_SERVICELOC_it                      2713   EXIST::VARIABLE:
-ACCESS_DESCRIPTION_it                   2714   EXIST::VARIABLE:
-PKCS7_ISSUER_AND_SERIAL_it              2715   EXIST::VARIABLE:
-PBE2PARAM_it                            2716   EXIST::VARIABLE:
-PKCS7_SIGNED_it                         2717   EXIST::VARIABLE:
-X509_it                                 2718   EXIST::VARIABLE:
-ASN1_BMPSTRING_it                       2719   EXIST::VARIABLE:
+OCSP_SERVICELOC_it                      2713   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_SERVICELOC_it                      2713   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ACCESS_DESCRIPTION_it                   2714   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ACCESS_DESCRIPTION_it                   2714   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ISSUER_AND_SERIAL_it              2715   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ISSUER_AND_SERIAL_it              2715   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PBE2PARAM_it                            2716   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PBE2PARAM_it                            2716   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_SIGNED_it                         2717   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_SIGNED_it                         2717   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_it                                 2718   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_it                                 2718   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_BMPSTRING_it                       2719   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_BMPSTRING_it                       2719   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_tag2bit                            2720   EXIST::FUNCTION:
 OCSP_REQUEST_delete_ext                 2721   EXIST::FUNCTION:
-ASN1_PRINTABLESTRING_it                 2722   EXIST::VARIABLE:
+ASN1_PRINTABLESTRING_it                 2722   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_PRINTABLESTRING_it                 2722   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 BN_mod_sqr                              2723   EXIST::FUNCTION:
-NETSCAPE_CERT_SEQUENCE_it               2724   EXIST::VARIABLE:
-GENERAL_NAMES_it                        2725   EXIST::VARIABLE:
-AUTHORITY_INFO_ACCESS_it                2726   EXIST::VARIABLE:
-X509_CINF_it                            2727   EXIST::VARIABLE:
+NETSCAPE_CERT_SEQUENCE_it               2724   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NETSCAPE_CERT_SEQUENCE_it               2724   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+GENERAL_NAMES_it                        2725   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+GENERAL_NAMES_it                        2725   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+AUTHORITY_INFO_ACCESS_it                2726   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+AUTHORITY_INFO_ACCESS_it                2726   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_CINF_it                            2727   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CINF_it                            2727   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 d2i_EDIPARTYNAME                        2728   EXIST::FUNCTION:
-OTHERNAME_it                            2729   EXIST::VARIABLE:
+OTHERNAME_it                            2729   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OTHERNAME_it                            2729   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_get_ext_by_NID          2730   EXIST::FUNCTION:
 OCSP_REQUEST_add1_ext_i2d               2731   EXIST::FUNCTION:
-X509_VAL_it                             2732   EXIST::VARIABLE:
+X509_VAL_it                             2732   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_VAL_it                             2732   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_CRL_add1_ext_i2d                   2733   EXIST::FUNCTION:
 OCSP_BASICRESP_add1_ext_i2d             2734   EXIST::FUNCTION:
-X509_SIG_it                             2735   EXIST::VARIABLE:
+X509_SIG_it                             2735   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_SIG_it                             2735   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext                     2736   EXIST::FUNCTION:
 OCSP_ONEREQ_get_ext_by_OBJ              2737   EXIST::FUNCTION:
 ASN1_primitive_new                      2738   EXIST::FUNCTION:
-ASN1_VISIBLESTRING_it                   2739   EXIST::VARIABLE:
+ASN1_VISIBLESTRING_it                   2739   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_VISIBLESTRING_it                   2739   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_add1_ext_i2d            2740   EXIST::FUNCTION:
-CRL_DIST_POINTS_it                      2741   EXIST::VARIABLE:
+CRL_DIST_POINTS_it                      2741   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+CRL_DIST_POINTS_it                      2741   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 GENERAL_NAME_print                      2742   EXIST::FUNCTION:
 OCSP_SINGLERESP_delete_ext              2743   EXIST::FUNCTION:
-ASN1_BIT_STRING_it                      2744   EXIST::VARIABLE:
-X509_REQ_it                             2745   EXIST::VARIABLE:
-PKCS7_SIGN_ENVELOPE_it                  2746   EXIST::VARIABLE:
+ASN1_BIT_STRING_it                      2744   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_BIT_STRING_it                      2744   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_REQ_it                             2745   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_REQ_it                             2745   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_SIGN_ENVELOPE_it                  2746   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_SIGN_ENVELOPE_it                  2746   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EDIPARTYNAME_free                       2747   EXIST::FUNCTION:
 OCSP_REQUEST_get1_ext_d2i               2748   EXIST::FUNCTION:
 asn1_ex_c2i                             2749   EXIST::FUNCTION:
@@ -2173,68 +2221,98 @@ asn1_enc_restore                        2750    EXIST::FUNCTION:
 OCSP_SINGLERESP_get_ext                 2751   EXIST::FUNCTION:
 OCSP_BASICRESP_get1_ext_d2i             2752   EXIST::FUNCTION:
 i2d_EDIPARTYNAME                        2753   EXIST::FUNCTION:
-ASN1_INTEGER_it                         2754   EXIST::VARIABLE:
+ASN1_INTEGER_it                         2754   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_INTEGER_it                         2754   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext_by_critical         2755   EXIST::FUNCTION:
-BASIC_CONSTRAINTS_it                    2756   EXIST::VARIABLE:
+BASIC_CONSTRAINTS_it                    2756   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+BASIC_CONSTRAINTS_it                    2756   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_get1_ext_d2i            2757   EXIST::FUNCTION:
-X509_NAME_ENTRY_it                      2758   EXIST::VARIABLE:
+X509_NAME_ENTRY_it                      2758   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_NAME_ENTRY_it                      2758   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_add_ext                     2759   EXIST::FUNCTION:
-DIST_POINT_it                           2760   EXIST::VARIABLE:
-OCSP_SINGLERESP_it                      2761   EXIST::VARIABLE:
+DIST_POINT_it                           2760   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DIST_POINT_it                           2760   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_SINGLERESP_it                      2761   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_SINGLERESP_it                      2761   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_ex_d2i                        2762   EXIST::FUNCTION:
 BN_mod_sqrt                             2763   EXIST::FUNCTION:
 OCSP_SINGLERESP_get_ext_by_OBJ          2764   EXIST::FUNCTION:
-PKCS12_BAGS_it                          2765   EXIST::VARIABLE:
+PKCS12_BAGS_it                          2765   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_BAGS_it                          2765   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_template_free                      2766   EXIST::FUNCTION:
 OCSP_SINGLERESP_add_ext                 2767   EXIST::FUNCTION:
 ASN1_template_d2i                       2768   EXIST::FUNCTION:
-POLICYINFO_it                           2769   EXIST::VARIABLE:
+POLICYINFO_it                           2769   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+POLICYINFO_it                           2769   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_enc_free                           2770   EXIST::FUNCTION:
-PKCS8_PRIV_KEY_INFO_it                  2771   EXIST::VARIABLE:
-OCSP_REQINFO_it                         2772   EXIST::VARIABLE:
-PBEPARAM_it                             2773   EXIST::VARIABLE:
+PKCS8_PRIV_KEY_INFO_it                  2771   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS8_PRIV_KEY_INFO_it                  2771   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_REQINFO_it                         2772   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_REQINFO_it                         2772   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PBEPARAM_it                             2773   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PBEPARAM_it                             2773   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_CRL_add0_revoked                   2774   EXIST::FUNCTION:
-EDIPARTYNAME_it                         2775   EXIST::VARIABLE:
-NETSCAPE_SPKI_it                        2776   EXIST::VARIABLE:
+EDIPARTYNAME_it                         2775   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+EDIPARTYNAME_it                         2775   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+NETSCAPE_SPKI_it                        2776   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NETSCAPE_SPKI_it                        2776   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 BN_kronecker                            2777   EXIST::FUNCTION:
-ASN1_ENUMERATED_it                      2778   EXIST::VARIABLE:
+ASN1_ENUMERATED_it                      2778   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_ENUMERATED_it                      2778   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext_count            2779   EXIST::FUNCTION:
-ASN1_UTCTIME_it                         2780   EXIST::VARIABLE:
-NOTICEREF_it                            2781   EXIST::VARIABLE:
-ASN1_ANY_it                             2782   EXIST::VARIABLE:
+ASN1_UTCTIME_it                         2780   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_UTCTIME_it                         2780   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+NOTICEREF_it                            2781   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NOTICEREF_it                            2781   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_ANY_it                             2782   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_ANY_it                             2782   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_enc_init                           2783   EXIST::FUNCTION:
 ASN1_item_d2i                           2784   EXIST::FUNCTION:
 ASN1_primitive_free                     2785   EXIST::FUNCTION:
 i2d_EXTENDED_KEY_USAGE                  2786   EXIST::FUNCTION:
 asn1_enc_save                           2787   EXIST::FUNCTION:
-PKCS12_MAC_DATA_it                      2788   EXIST::VARIABLE:
+PKCS12_MAC_DATA_it                      2788   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_MAC_DATA_it                      2788   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_do_lock                            2789   EXIST::FUNCTION:
 ASN1_item_ex_new                        2790   EXIST::FUNCTION:
 asn1_get_choice_selector                2791   EXIST::FUNCTION:
 OCSP_REQUEST_get_ext_by_NID             2792   EXIST::FUNCTION:
 OCSP_BASICRESP_get_ext_by_NID           2793   EXIST::FUNCTION:
-DIST_POINT_NAME_it                      2794   EXIST::VARIABLE:
+DIST_POINT_NAME_it                      2794   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DIST_POINT_NAME_it                      2794   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509V3_extensions_print                 2795   EXIST::FUNCTION:
 X509_REVOKED_add1_ext_i2d               2796   EXIST::FUNCTION:
-ASN1_OCTET_STRING_it                    2797   EXIST::VARIABLE:
+ASN1_OCTET_STRING_it                    2797   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_OCTET_STRING_it                    2797   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_template_new                       2798   EXIST::FUNCTION:
-PKCS7_RECIP_INFO_it                     2799   EXIST::VARIABLE:
-EXTENDED_KEY_USAGE_it                   2800   EXIST::VARIABLE:
-X509_CRL_INFO_it                        2801   EXIST::VARIABLE:
-PKCS7_DIGEST_it                         2802   EXIST::VARIABLE:
-PKCS7_ENC_CONTENT_it                    2803   EXIST::VARIABLE:
+PKCS7_RECIP_INFO_it                     2799   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_RECIP_INFO_it                     2799   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+EXTENDED_KEY_USAGE_it                   2800   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+EXTENDED_KEY_USAGE_it                   2800   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_CRL_INFO_it                        2801   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CRL_INFO_it                        2801   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_DIGEST_it                         2802   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_DIGEST_it                         2802   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ENC_CONTENT_it                    2803   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ENC_CONTENT_it                    2803   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_set_choice_selector                2804   EXIST::FUNCTION:
 asn1_get_field_ptr                      2805   EXIST::FUNCTION:
-OCSP_CRLID_it                           2806   EXIST::VARIABLE:
+OCSP_CRLID_it                           2806   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_CRLID_it                           2806   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_REQUEST_get_ext_count              2807   EXIST::FUNCTION:
-X509_NAME_it                            2808   EXIST::VARIABLE:
-USERNOTICE_it                           2809   EXIST::VARIABLE:
+X509_NAME_it                            2808   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_NAME_it                            2808   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+USERNOTICE_it                           2809   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+USERNOTICE_it                           2809   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext                  2810   EXIST::FUNCTION:
-X509_REQ_INFO_it                        2811   EXIST::VARIABLE:
+X509_REQ_INFO_it                        2811   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_REQ_INFO_it                        2811   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_ex_free                       2812   EXIST::FUNCTION:
 OCSP_ONEREQ_add1_ext_i2d                2813   EXIST::FUNCTION:
-ASN1_NULL_it                            2814   EXIST::VARIABLE:
-PKCS7_it                                2815   EXIST::VARIABLE:
+ASN1_NULL_it                            2814   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_NULL_it                            2814   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_it                                2815   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_it                                2815   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_REQUEST_get_ext_by_critical        2816   EXIST:!VMS:FUNCTION:
 OCSP_REQUEST_get_ext_by_crit            2816   EXIST:VMS:FUNCTION:
 OCSP_ONEREQ_delete_ext                  2817   EXIST::FUNCTION:
@@ -2245,26 +2323,39 @@ ASN1_item_sign                          2821    EXIST::FUNCTION:EVP
 ASN1_unpack_item                        2822   NOEXIST::FUNCTION:
 ASN1_item_verify                        2823   EXIST::FUNCTION:EVP
 ASN1_pack_item                          2824   NOEXIST::FUNCTION:
-OCSP_CERTID_it                          2825   EXIST::VARIABLE:
-OCSP_SIGNATURE_it                       2826   EXIST::VARIABLE:
+OCSP_CERTID_it                          2825   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_CERTID_it                          2825   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_SIGNATURE_it                       2826   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_SIGNATURE_it                       2826   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_dup                           2827   EXIST::FUNCTION:
-OCSP_REQUEST_it                         2828   EXIST::VARIABLE:
-OCSP_BASICRESP_it                       2829   EXIST::VARIABLE:
-OCSP_RESPBYTES_it                       2830   EXIST::VARIABLE:
-OCSP_ONEREQ_it                          2831   EXIST::VARIABLE:
-OCSP_RESPDATA_it                        2832   EXIST::VARIABLE:
-OCSP_RESPID_it                          2833   EXIST::VARIABLE:
-OCSP_REVOKEDINFO_it                     2834   EXIST::VARIABLE:
-OCSP_RESPONSE_it                        2835   EXIST::VARIABLE:
-OCSP_CERTSTATUS_it                      2836   EXIST::VARIABLE:
+OCSP_REQUEST_it                         2828   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_REQUEST_it                         2828   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_BASICRESP_it                       2829   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_BASICRESP_it                       2829   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPBYTES_it                       2830   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPBYTES_it                       2830   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_ONEREQ_it                          2831   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_ONEREQ_it                          2831   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPDATA_it                        2832   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPDATA_it                        2832   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPID_it                          2833   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPID_it                          2833   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_REVOKEDINFO_it                     2834   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_REVOKEDINFO_it                     2834   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPONSE_it                        2835   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPONSE_it                        2835   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_CERTSTATUS_it                      2836   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_CERTSTATUS_it                      2836   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_basic_sign                         2837   EXIST::FUNCTION:
 OCSP_request_onereq_get0                2838   EXIST::FUNCTION:
-ASN1_SEQUENCE_it                        2839   NOEXIST::FUNCTION:
+ASN1_SEQUENCE_it                        2839   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_SEQUENCE_it                        2839   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_crl_reason_str                     2840   EXIST::FUNCTION:
 OCSP_request_set1_name                  2841   EXIST::FUNCTION:
 OCSP_cert_to_id                         2842   EXIST::FUNCTION:
 OCSP_request_add0_id                    2843   EXIST::FUNCTION:
-RSAPrivateKey_it                        2844   EXIST::VARIABLE:RSA
+RSAPrivateKey_it                        2844   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:RSA
+RSAPrivateKey_it                        2844   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:RSA
 PKCS12_unpack_p7data                    2845   EXIST::FUNCTION:
 PKCS12_item_decrypt_d2i                 2846   EXIST::FUNCTION:
 OCSP_resp_count                         2847   EXIST::FUNCTION:
@@ -2273,16 +2364,19 @@ CRYPTO_get_mem_ex_functions             2849    EXIST::FUNCTION:
 OPENSSL_issetugid                       2850   EXIST::FUNCTION:
 PKCS12_item_i2d_encrypt                 2851   EXIST::FUNCTION:
 OCSP_basic_verify                       2852   EXIST::FUNCTION:
-ZLONG_it                                2853   NOEXIST::FUNCTION:
+ZLONG_it                                2853   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ZLONG_it                                2853   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EVP_aes_128_ecb                         2854   EXIST::FUNCTION:AES
 CRYPTO_set_locked_mem_ex_functions      2855   EXIST:!VMS:FUNCTION:
 CRYPTO_set_locked_mem_ex_funcs          2855   EXIST:VMS:FUNCTION:
 PKCS12_certbag2x509crl                  2856   EXIST::FUNCTION:
-DIRECTORYSTRING_it                      2857   EXIST::VARIABLE:
+DIRECTORYSTRING_it                      2857   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DIRECTORYSTRING_it                      2857   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS12_decrypt_skey                     2858   EXIST::FUNCTION:
 EVP_aes_192_cbc                         2859   EXIST::FUNCTION:AES
 OCSP_id_get0_info                       2860   EXIST::FUNCTION:
-ASN1_FBOOLEAN_it                        2861   NOEXIST::FUNCTION:
+ASN1_FBOOLEAN_it                        2861   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_FBOOLEAN_it                        2861   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_id_issuer_cmp                      2862   EXIST::FUNCTION:
 RAND_query_egd_bytes                    2863   EXIST::FUNCTION:
 ASN1_TIME_check                         2864   EXIST::FUNCTION:
@@ -2296,7 +2390,8 @@ EVP_Digest                              2871      EXIST::FUNCTION:
 OCSP_response_status                    2872   EXIST::FUNCTION:
 OCSP_request_add1_nonce                 2873   EXIST::FUNCTION:
 EVP_CIPHER_CTX_set_padding              2874   EXIST::FUNCTION:
-ASN1_PRINTABLE_it                       2875   EXIST::VARIABLE:
+ASN1_PRINTABLE_it                       2875   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_PRINTABLE_it                       2875   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS12_pack_authsafes                   2876   EXIST::FUNCTION:
 PKCS12_unpack_p7encdata                 2877   EXIST::FUNCTION:
 X509_pubkey_digest                      2878   EXIST::FUNCTION:EVP
@@ -2311,18 +2406,21 @@ ASN1_PRINTABLE_new                      2886    EXIST::FUNCTION:
 ASN1_item_unpack                        2887   EXIST::FUNCTION:
 ASN1_item_d2i_fp                        2888   EXIST::FUNCTION:FP_API
 OCSP_basic_add1_status                  2889   EXIST::FUNCTION:
-DISPLAYTEXT_it                          2890   EXIST::VARIABLE:
+DISPLAYTEXT_it                          2890   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DISPLAYTEXT_it                          2890   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_response_status_str                2891   EXIST::FUNCTION:
 EVP_aes_128_cbc                         2892   EXIST::FUNCTION:AES
 X509_get0_pubkey_bitstr                 2893   EXIST::FUNCTION:
 OCSP_cert_status_str                    2894   EXIST::FUNCTION:
 OCSP_sendreq_bio                        2895   EXIST::FUNCTION:
 ASN1_item_i2d_bio                       2896   EXIST::FUNCTION:BIO
-CBIGNUM_it                              2897   NOEXIST::FUNCTION:
+CBIGNUM_it                              2897   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+CBIGNUM_it                              2897   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS8_decrypt                           2898   EXIST::FUNCTION:
 rijndaelKeySetupEnc                     2899   EXIST::FUNCTION:
 OCSP_basic_add1_cert                    2900   EXIST::FUNCTION:
-LONG_it                                 2901   NOEXIST::FUNCTION:
+LONG_it                                 2901   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+LONG_it                                 2901   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS12_certbag2x509                     2902   EXIST::FUNCTION:
 OCSP_response_create                    2903   EXIST::FUNCTION:
 OCSP_resp_get0                          2904   EXIST::FUNCTION:
@@ -2332,17 +2430,32 @@ EVP_aes_192_ecb                         2906    EXIST::FUNCTION:AES
 OCSP_response_get1_basic                2907   EXIST::FUNCTION:
 PKCS12_item_pack_safebag                2908   EXIST::FUNCTION:
 OCSP_copy_nonce                         2909   EXIST::FUNCTION:
-ASN1_TBOOLEAN_it                        2910   NOEXIST::FUNCTION:
+ASN1_TBOOLEAN_it                        2910   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_TBOOLEAN_it                        2910   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_single_get0_status                 2911   EXIST::FUNCTION:
 OCSP_check_nonce                        2912   EXIST::FUNCTION:
-ASN1_BOOLEAN_it                         2913   NOEXIST::FUNCTION:
-RSAPublicKey_it                         2914   EXIST::VARIABLE:RSA
+ASN1_BOOLEAN_it                         2913   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_BOOLEAN_it                         2913   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+RSAPublicKey_it                         2914   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:RSA
+RSAPublicKey_it                         2914   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:RSA
 ASN1_PRINTABLE_free                     2915   EXIST::FUNCTION:
 CRYPTO_set_mem_ex_functions             2916   EXIST::FUNCTION:
 ASN1_TIME_to_generalizedtime            2917   EXIST::FUNCTION:
-BIGNUM_it                               2918   NOEXIST::FUNCTION:
+BIGNUM_it                               2918   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+BIGNUM_it                               2918   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_onereq_get0_id                     2919   EXIST::FUNCTION:
 EVP_aes_256_cbc                         2920   EXIST::FUNCTION:AES
 OCSP_resp_find                          2921   EXIST::FUNCTION:
 BN_rand_range                           2922   EXIST::FUNCTION:
 OCSP_check_validity                     2923   EXIST::FUNCTION:
+OCSP_request_is_signed                  2924   EXIST::FUNCTION:
+PKCS7_ATTR_SIGN_it                      2925   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ATTR_SIGN_it                      2925   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS12_AUTHSAFES_it                     2926   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_AUTHSAFES_it                     2926   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS12_SAFEBAGS_it                      2927   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_SAFEBAGS_it                      2927   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ATTR_VERIFY_it                    2928   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ATTR_VERIFY_it                    2928   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_OBJECT_it                          2929   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_OBJECT_it                          2929   EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
index 17ac517..b611749 100755 (executable)
 # - "platforms" is empty if it exists on all platforms, otherwise it contains
 #   comma-separated list of the platform, just as they are if the symbol exists
 #   for those platforms, or prepended with a "!" if not.  This helps resolve
-#   symbol name replacements for platforms where the names are too long for the
+#   symbol name variants for platforms where the names are too long for the
 #   compiler or linker, or if the systems is case insensitive and there is a
-#   clash.  This script assumes those redefinitions are place in the file
-#   crypto/symhacks.h.
-#   The semantics for the platforms list is a bit complicated.  The rule of
-#   thumb is that the list is exclusive, but it seems to mean different things.
-#   So, if the list is all negatives (like "!VMS,!WIN16"), the symbol exists
-#   on all platforms except those listed.  If the list is all positives (like
-#   "VMS,WIN16"), the symbol exists only on those platforms and nowhere else.
-#   The combination of positives and negatives will act as if the positives
-#   weren't there.
+#   clash, or the symbol is implemented differently (see
+#   EXPORT_VAR_AS_FUNCTION).  This script assumes renaming of symbols is found
+#   in the file crypto/symhacks.h.
+#   The semantics for the platforms is that every item is checked against the
+#   enviroment.  For the negative items ("!FOO"), if any of them is false
+#   (i.e. "FOO" is true) in the enviroment, the corresponding symbol can't be
+#   used.  For the positive itms, if all of them are false in the environment,
+#   the corresponding symbol can't be used.  Any combination of positive and
+#   negative items are possible, and of course leave room for some redundancy.
 # - "kind" is "FUNCTION" or "VARIABLE".  The meaning of that is obvious.
 # - "algorithms" is a comma-separated list of algorithm names.  This helps
 #   exclude symbols that are part of an algorithm that some user wants to
@@ -67,6 +67,8 @@ my $do_ctest = 0;
 my $do_ctestall = 0;
 my $do_checkexist = 0;
 
+my $VMSVAX=0;
+my $VMSAlpha=0;
 my $VMS=0;
 my $W32=0;
 my $W16=0;
@@ -74,7 +76,8 @@ my $NT=0;
 # Set this to make typesafe STACK definitions appear in DEF
 my $safe_stack_def = 0;
 
-my @known_platforms = ( "__FreeBSD__", "PERL5", "NeXT" );
+my @known_platforms = ( "__FreeBSD__", "PERL5", "NeXT",
+                       "EXPORT_VAR_AS_FUNCTION" );
 my @known_ossl_platforms = ( "VMS", "WIN16", "WIN32", "WINNT" );
 my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF",
                         "CAST", "MD2", "MD4", "MD5", "SHA", "SHA0", "SHA1",
@@ -106,12 +109,21 @@ my $no_fp_api;
 
 foreach (@ARGV, split(/ /, $options))
        {
+       $debug=1 if $_ eq "debug";
        $W32=1 if $_ eq "32";
        $W16=1 if $_ eq "16";
        if($_ eq "NT") {
                $W32 = 1;
                $NT = 1;
        }
+       if ($_ eq "VMS-VAX") {
+               $VMS=1;
+               $VMSVAX=1;
+       }
+       if ($_ eq "VMS-Alpha") {
+               $VMS=1;
+               $VMSAlpha=1;
+       }
        $VMS=1 if $_ eq "VMS";
 
        $do_ssl=1 if $_ eq "ssleay";
@@ -308,7 +320,9 @@ sub do_defs
        my %platform;           # For anything undefined, we assume ""
        my %kind;               # For anything undefined, we assume "FUNCTION"
        my %algorithm;          # For anything undefined, we assume ""
-       my %rename;
+       my %variant;
+       my %variant_cnt;        # To be able to allocate "name{n}" if "name"
+                               # is the same name as the original.
        my $cpp;
        my %unknown_algorithms = ();
 
@@ -330,6 +344,53 @@ sub do_defs
                my @current_platforms = ();
                my @current_algorithms = ();
 
+               # params: symbol, alias, platforms, kind
+               # The reason to put this subroutine in a variable is that
+               # it will otherwise create it's own, unshared, version of
+               # %tag and %variant...
+               my $make_variant = sub
+               {
+                       my ($s, $a, $p, $k) = @_;
+                       my ($a1, $a2);
+
+                       print STDERR "DEBUG: make_variant: Entered with ",$s,", ",$a,", ",(defined($p)?$p:""),", ",(defined($k)?$k:""),"\n" if $debug;
+                       if (defined($p))
+                       {
+                               $a1 = join(",",$p,
+                                          grep(!/^$/,
+                                               map { $tag{$_} == 1 ? $_ : "" }
+                                               @known_platforms));
+                       }
+                       else
+                       {
+                               $a1 = join(",",
+                                          grep(!/^$/,
+                                               map { $tag{$_} == 1 ? $_ : "" }
+                                               @known_platforms));
+                       }
+                       $a2 = join(",",
+                                  grep(!/^$/,
+                                       map { $tag{"OPENSSL_SYS_".$_} == 1 ? $_ : "" }
+                                       @known_ossl_platforms));
+                       print STDERR "DEBUG: make_variant: a1 = $a1; a2 = $a2\n" if $debug;
+                       if ($a1 eq "") { $a1 = $a2; }
+                       elsif ($a1 ne "" && $a2 ne "") { $a1 .= ",".$a2; }
+                       if ($a eq $s)
+                       {
+                               if (!defined($variant_cnt{$s}))
+                               {
+                                       $variant_cnt{$s} = 0;
+                               }
+                               $variant_cnt{$s}++;
+                               $a .= "{$variant_cnt{$s}}";
+                       }
+                       if (defined($variant{$s})) { $variant{$s} .= ";"; }
+                       $variant{$s} = $a.":".$a1;
+                       if (defined($k)) { $variant{$s} .= ":$k"; }
+                       print STDERR "DEBUG: make_variant: Exit with variant of ",$s," = ",$variant{$s},"\n" if $debug;
+               };
+
+               print STDERR "DEBUG: parsing ----------\n" if $debug;
                while(<IN>) {
                        last if (/BEGIN ERROR CODES/);
                        if ($line ne '') {
@@ -453,22 +514,10 @@ sub do_defs
                                print STDERR "DEBUG: $file: found 0\n" if $debug;
                        } elsif (/^\#\s*define\s+(\w+)\s+(\w+)/
                                 && $symhacking && $tag{'TRUE'} != -1) {
-                               my $s = $1;
-                               my $a = $2;
-                               my $a1 = join(",",
-                                             grep(!/^$/,
-                                                  map { $tag{$_} == 1 ?
-                                                            $_ : "" }
-                                                  @known_platforms));
-                               my $a2 = join(",",
-                                             grep(!/^$/,
-                                                  map { $tag{"OPENSSL_SYS_".$_} == 1 ?
-                                                            $_ : "" }
-                                                  @known_ossl_platforms));
-                               if ($a1 eq "") { $a1 = $a2; }
-                               elsif ($a1 ne "" && $a2 ne "") { $a1 .= ",".$a2; }
-                               $rename{$s} = $a.":".$a1;
-                               print STDERR "DEBUG: $file: defined $s = $a\n" if $debug;
+                               # This is for aliasing.  When we find an alias,
+                               # we have to invert
+                               &$make_variant($1,$2);
+                               print STDERR "DEBUG: $file: defined $1 = $2\n" if $debug;
                        }
                        if (/^\#/) {
                                @current_platforms =
@@ -497,41 +546,145 @@ sub do_defs
                                } elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) {
                                        $def .= "int d2i_$3(void);";
                                        $def .= "int i2d_$3(void);";
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
                                        $def .= "OPENSSL_EXTERN int $2_it;";
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("$2_it","$2_it",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
                                        next;
                                } elsif (/^\s*DECLARE_ASN1_FUNCTIONS_fname\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) {
                                        $def .= "int d2i_$3(void);";
                                        $def .= "int i2d_$3(void);";
                                        $def .= "int $3_free(void);";
                                        $def .= "int $3_new(void);";
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
                                        $def .= "OPENSSL_EXTERN int $2_it;";
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("$2_it","$2_it",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
+                                       next;
                                } elsif (/^\s*DECLARE_ASN1_FUNCTIONS\s*\(\s*(\w*)\s*\)/ ||
                                         /^\s*DECLARE_ASN1_FUNCTIONS_const\s*\(\s*(\w*)\s*\)/) {
                                        $def .= "int d2i_$1(void);";
                                        $def .= "int i2d_$1(void);";
                                        $def .= "int $1_free(void);";
                                        $def .= "int $1_new(void);";
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
                                        $def .= "OPENSSL_EXTERN int $1_it;";
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("$1_it","$1_it",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
                                        next;
                                } elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS_const\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
                                        $def .= "int d2i_$2(void);";
                                        $def .= "int i2d_$2(void);";
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
                                        $def .= "OPENSSL_EXTERN int $2_it;";
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("$2_it","$2_it",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
                                        next;
                                } elsif (/^\s*DECLARE_ASN1_FUNCTIONS_name\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
                                        $def .= "int d2i_$2(void);";
                                        $def .= "int i2d_$2(void);";
                                        $def .= "int $2_free(void);";
                                        $def .= "int $2_new(void);";
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
                                        $def .= "OPENSSL_EXTERN int $2_it;";
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("$2_it","$2_it",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
                                        next;
-                               } elsif (/^\s*DECLARE_ASN1_ITEM\s*\(\s*(\w*)\s*,(\w*)\s*\)/) {
+                               } elsif (/^\s*DECLARE_ASN1_ITEM\s*\(\s*(\w*)\s*\)/) {
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
                                        $def .= "OPENSSL_EXTERN int $1_it;";
-                                       next;
-                               } elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) {
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("$1_it","$1_it",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
+                                       print STDERR "DEBUG: after make_variant: variant of $1_it = ",$variant{"$1_it"},"\n" if $debug;
                                        next;
                                } elsif (/^\s*DECLARE_ASN1_SET_OF\s*\(\s*(\w*)\s*\)/) {
                                        next;
+                               } elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) {
+                                       next;
                                } elsif (/^DECLARE_PEM_rw\s*\(\s*(\w*)\s*,/ ||
                                         /^DECLARE_PEM_rw_cb\s*\(\s*(\w*)\s*,/ ) {
                                        # Things not in Win16
@@ -579,6 +732,26 @@ sub do_defs
                                        # Things that are everywhere
                                        $def .= "int PEM_read_bio_$1(void);";
                                        next;
+                               } elsif (/^OPENSSL_DECLARE_GLOBAL\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
+                                       # Variant for platforms that do not
+                                       # have to access globale variables
+                                       # in shared libraries through functions
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       $def .= "OPENSSL_EXTERN int _shadow_$2;";
+                                       $def .=
+                                           "#INFO:"
+                                               .join(',',@current_platforms).":"
+                                                   .join(',',@current_algorithms).";";
+                                       # Variant for platforms that have to
+                                       # access globale variables in shared
+                                       # libraries through functions
+                                       &$make_variant("_shadow_$2","_shadow_$2",
+                                                     "EXPORT_VAR_AS_FUNCTION",
+                                                     "FUNCTION");
+                                       print STDERR "DEBUG: after make_variant: variant of $1_it = ",$variant{"$1_it"},"\n" if $debug;
                                } elsif ($tag{'CONST_STRICT'} != 1) {
                                        if (/\{|\/\*|\([^\)]*$/) {
                                                $line = $_;
@@ -593,6 +766,7 @@ sub do_defs
                my $algs;
                my $plays;
 
+               print STDERR "DEBUG: postprocessing ----------\n" if $debug;
                foreach (split /;/, $def) {
                        my $s; my $k = "FUNCTION"; my $p; my $a;
                        s/^[\n\s]*//g;
@@ -601,25 +775,26 @@ sub do_defs
                        next if(/typedef\W/);
                        next if(/\#define/);
 
+                       print STDERR "DEBUG: \$_ = \"$_\"\n" if $debug;
                        if (/^\#INFO:([^:]*):(.*)$/) {
                                $plats = $1;
                                $algs = $2;
                                next;
-                       } elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+)(\[[0-9]*\])*\s*$/) {
+                       } elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+(\{[0-9]+\})?)(\[[0-9]*\])*\s*$/) {
                                $s = $1;
                                $k = "VARIABLE";
-                       } elsif (/\(\*(\w*)\([^\)]+/) {
+                       } elsif (/\(\*(\w*(\{[0-9]+\})?)\([^\)]+/) {
                                $s = $1;
                        } elsif (/\w+\W+(\w+)\W*\(\s*\)$/s) {
                                # K&R C
                                next;
-                       } elsif (/\w+\W+\w+\W*\(.*\)$/s) {
+                       } elsif (/\w+\W+\w+(\{[0-9]+\})?\W*\(.*\)$/s) {
                                while (not /\(\)$/s) {
                                        s/[^\(\)]*\)$/\)/s;
                                        s/\([^\(\)]*\)\)$/\)/s;
                                }
                                s/\(void\)//;
-                               /(\w+)\W*\(\)/s;
+                               /(\w+(\{[0-9]+\})?)\W*\(\)/s;
                                $s = $1;
                        } elsif (/\(/ and not (/=/)) {
                                print STDERR "File $file: cannot parse: $_;\n";
@@ -651,18 +826,22 @@ sub do_defs
                        $a .= ",RSA" if($s =~ /RSAPrivateKey/);
                        $a .= ",RSA" if($s =~ /SSLv23?_((client|server)_)?method/);
 
-                       $platform{$s} .= ','.$p;
+                       $platform{$s} =
+                           &reduce_platforms((defined($platform{$s})?$platform{$s}.',':"").$p);
                        $algorithm{$s} .= ','.$a;
 
-                       if (defined($rename{$s})) {
-                               (my $r, my $p) = split(/:/,$rename{$s});
-                               my @ip = map { /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p;
+                       if (defined($variant{$s})) {
+                               (my $r, my $p, my $k) = split(/:/,$variant{$s});
+                               my $ip = join ',',map({ /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p);
                                $syms{$r} = 1;
-                               $kind{$r} = $kind{$s}."(".$s.")";
+                               if (!defined($k)) { $k = $kind{$s}; }
+                               $kind{$r} = $k."(".$s.")";
                                $algorithm{$r} = $algorithm{$s};
-                               $platform{$r} = $platform{$s}.",".$p;
-                               $platform{$s} .= ','.join(',', @ip).','.join(',', @ip);
+                               $platform{$r} = &reduce_platforms($platform{$s}.",".$p.",".$p);
+                               $platform{$s} = &reduce_platforms($platform{$s}.','.$ip.','.$ip);
+                               print STDERR "DEBUG: \$variant{\"$s\"} = ",$variant{$s},"; \$r = $r; \$p = ",$platform{$r},"; \$a = ",$algorithm{$r},"; \$kind = ",$kind{$r},"\n" if $debug;
                        }
+                       print STDERR "DEBUG: \$s = $s; \$p = ",$platform{$s},"; \$a = ",$algorithm{$s},"; \$kind = ",$kind{$s},"\n" if $debug;
                }
        }
 
@@ -690,16 +869,16 @@ sub do_defs
        return(@ret);
 }
 
-sub info_string {
-       (my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_;
-
-       my %a = defined($algorithms) ?
-           map { $_ => 1 } split /,/, $algorithms : ();
+# Param: string of comma-separated platform-specs.
+sub reduce_platforms
+{
+       my ($platforms) = @_;
        my $pl = defined($platforms) ? $platforms : "";
        my %p = map { $_ => 0 } split /,/, $pl;
-       my $k = defined($kind) ? $kind : "FUNCTION";
        my $ret;
 
+       print STDERR "DEBUG: Entered reduce_platforms with \"$platforms\"\n"
+           if $debug;
        # We do this, because if there's code like the following, it really
        # means the function exists in all cases and should therefore be
        # everywhere.  By increasing and decreasing, we may attain 0:
@@ -721,12 +900,28 @@ sub info_string {
        }
 
        delete $p{""};
+
+       $ret = join(',',map { $p{$_} < 0 ? "!".$_ : $_ } keys %p);
+       print STDERR "DEBUG: Exiting reduce_platforms with \"$ret\"\n"
+           if $debug;
+       return $ret;
+}
+
+sub info_string {
+       (my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_;
+
+       my %a = defined($algorithms) ?
+           map { $_ => 1 } split /,/, $algorithms : ();
+       my $k = defined($kind) ? $kind : "FUNCTION";
+       my $ret;
+       my $p = &reduce_platforms($platforms);
+
        delete $a{""};
 
        $ret = $exist;
-       $ret .= ":".join(',',map { $p{$_} < 0 ? "!".$_ : $_ } keys %p);
+       $ret .= ":".$p;
        $ret .= ":".$k;
-       $ret .= ":".join(',',keys %a);
+       $ret .= ":".join(',',sort keys %a);
        return $ret;
 }
 
@@ -739,8 +934,8 @@ sub maybe_add_info {
        print STDERR "Updating $name info\n";
        foreach $sym (@symbols) {
                (my $s, my $i) = split /\\/, $sym;
-               $i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/;
                if (defined($nums{$s})) {
+                       $i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/;
                        (my $n, my $dummy) = split /\\/, $nums{$s};
                        if (!defined($dummy) || $i ne $dummy) {
                                $nums{$s} = $n."\\".$i;
@@ -748,15 +943,15 @@ sub maybe_add_info {
                                print STDERR "DEBUG: maybe_add_info for $s: \"$dummy\" => \"$i\"\n" if $debug;
                        }
                }
-               $syms{sym} = 1;
+               $syms{$s} = 1;
        }
 
        my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums;
        foreach $sym (@s) {
                (my $n, my $i) = split /\\/, $nums{$sym};
-               if (!defined($syms{sym})) {
+               if (!defined($syms{$sym}) && $i !~ /^NOEXIST:/) {
                        $new_info++;
-                       print STDERR "DEBUG: maybe_add_info for $sym: -> undefined\n if $debug";
+                       print STDERR "DEBUG: maybe_add_info for $sym: -> undefined\n" if $debug;
                }
        }
        if ($new_info) {
@@ -769,35 +964,112 @@ sub maybe_add_info {
        }
 }
 
+# Param: string of comma-separated keywords, each possibly prefixed with a "!"
+sub is_valid
+{
+       my ($keywords_txt,$platforms) = @_;
+       my (@keywords) = split /,/,$keywords_txt;
+       my ($falsesum, $truesum) = (0, !grep(/^[^!]/,@keywords));
+
+       # Param: one keyword
+       sub recognise
+       {
+               my ($keyword,$platforms) = @_;
+
+               if ($platforms) {
+                       # platforms
+                       if ($keyword eq "VMS" && $VMS) { return 1; }
+                       if ($keyword eq "WIN32" && $W32) { return 1; }
+                       if ($keyword eq "WIN16" && $W16) { return 1; }
+                       if ($keyword eq "WINNT" && $NT) { return 1; }
+                       # Special platforms:
+                       # EXPORT_VAR_AS_FUNCTION means that global variables
+                       # will be represented as functions.  This currently
+                       # only happens on VMS-VAX.
+                       if ($keyword eq "EXPORT_VAR_AS_FUNCTION" && $VMSVAX) {
+                               return 1;
+                       }
+                       return 0;
+               } else {
+                       # algorithms
+                       if ($keyword eq "RC2" && $no_rc2) { return 0; }
+                       if ($keyword eq "RC4" && $no_rc4) { return 0; }
+                       if ($keyword eq "RC5" && $no_rc5) { return 0; }
+                       if ($keyword eq "IDEA" && $no_idea) { return 0; }
+                       if ($keyword eq "DES" && $no_des) { return 0; }
+                       if ($keyword eq "BF" && $no_bf) { return 0; }
+                       if ($keyword eq "CAST" && $no_cast) { return 0; }
+                       if ($keyword eq "MD2" && $no_md2) { return 0; }
+                       if ($keyword eq "MD4" && $no_md4) { return 0; }
+                       if ($keyword eq "MD5" && $no_md5) { return 0; }
+                       if ($keyword eq "SHA" && $no_sha) { return 0; }
+                       if ($keyword eq "RIPEMD" && $no_ripemd) { return 0; }
+                       if ($keyword eq "MDC2" && $no_mdc2) { return 0; }
+                       if ($keyword eq "RSA" && $no_rsa) { return 0; }
+                       if ($keyword eq "DSA" && $no_dsa) { return 0; }
+                       if ($keyword eq "DH" && $no_dh) { return 0; }
+                       if ($keyword eq "HMAC" && $no_hmac) { return 0; }
+                       if ($keyword eq "AES" && $no_aes) { return 0; }
+                       if ($keyword eq "KRB5" && $no_krb5) { return 0; }
+                       if ($keyword eq "FP_API" && $no_fp_api) { return 0; }
+
+                       # Nothing recognise as true
+                       return 1;
+               }
+       }
+
+       foreach $k (@keywords) {
+               if ($k =~ /^!(.*)$/) {
+                       $falsesum += &recognise($1,$platforms);
+               } else {
+                       $truesum += &recognise($k,$platforms);
+               }
+       }
+       print STDERR "DEBUG: [",$#keywords,",",$#keywords < 0,"] is_valid($keywords_txt) => (\!$falsesum) && $truesum = ",(!$falsesum) && $truesum,"\n" if $debug;
+       return (!$falsesum) && $truesum;
+}
+
 sub print_test_file
 {
-       (*OUT,my $name,*nums,my @symbols)=@_;
+       (*OUT,my $name,*nums,my $testall,my @symbols)=@_;
        my $n = 1; my @e; my @r;
        my $sym; my $prev = ""; my $prefSSLeay;
 
-       (@e)=grep(/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
-       (@r)=grep(/^\w+\\.*?:.*?:FUNCTION/ && !/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
+       (@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols);
+       (@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:.*/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols);
        @symbols=((sort @e),(sort @r));
 
        foreach $sym (@symbols) {
                (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
-               if ($s ne $prev) {
-                       if (!defined($nums{$s})) {
-                               print STDERR "Warning: $s does not have a number assigned\n"
-                                               if(!$do_update);
+               my $v = 0;
+               $v = 1 if $i=~ /^.*?:.*?:VARIABLE/;
+               my $p = ($i =~ /^[^:]*:([^:]*):/,$1);
+               my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1);
+               if (!defined($nums{$s})) {
+                       print STDERR "Warning: $s does not have a number assigned\n"
+                           if(!$do_update);
+               } elsif (is_valid($p,1) && is_valid($a,0)) {
+                       my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1);
+                       if ($prev eq $s2) {
+                               print OUT "\t/* The following has already appeared previously */\n";
+                               print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n";
+                       }
+                       $prev = $s2;    # To warn about duplicates...
+
+                       ($nn,$ni)=($nums{$s2} =~ /^(.*?)\\(.*)$/);
+                       if ($v) {
+                               print OUT "\textern int $s2; /* type unknown */ /* $nn $ni */\n";
                        } else {
-                               $n=$nums{$s};
-                               print OUT "\t$s();\n";
+                               print OUT "\textern int $s2(); /* type unknown */ /* $nn $ni */\n";
                        }
                }
-               $prev = $s;     # To avoid duplicates...
        }
 }
 
 sub print_def_file
 {
        (*OUT,my $name,*nums,my @symbols)=@_;
-       my $n = 1; my @e; my @r; my @v;
+       my $n = 1; my @e; my @r; my @v; my $prev="";
 
        if ($W32)
                { $name.="32"; }
@@ -830,79 +1102,36 @@ EOF
 
        print "EXPORTS\n";
 
-       (@e)=grep(/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
-       (@r)=grep(/^\w+\\.*?:.*?:FUNCTION/ && !/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
-       (@v)=grep(/^\w+\\.*?:.*?:VARIABLE/,@symbols);
+       (@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols);
+       (@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:FUNCTION/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols);
+       (@v)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:VARIABLE/,@symbols);
        @symbols=((sort @e),(sort @r), (sort @v));
 
 
        foreach $sym (@symbols) {
                (my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
                my $v = 0;
-               $v = 1 if $sym=~ /^\w+\\.*?:.*?:VARIABLE/;
+               $v = 1 if $i =~ /^.*?:.*?:VARIABLE/;
                if (!defined($nums{$s})) {
                        printf STDERR "Warning: $s does not have a number assigned\n"
-                                       if(!$do_update);
+                           if(!$do_update);
                } else {
-                       (my $n, my $i) = split /\\/, $nums{$s};
+                       (my $n, my $dummy) = split /\\/, $nums{$s};
                        my %pf = ();
-                       my @p = split(/,/, ($i =~ /^[^:]*:([^:]*):/,$1));
-                       my @a = split(/,/, ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1));
-                       # @p_purged must contain hardware platforms only
-                       my @p_purged = ();
-                       foreach $ptmp (@p) {
-                               push @p_purged, $ptmp;
-                       }
-                       my $negatives = !!grep(/^!/,@p);
-                       # It is very important to check NT before W32
-                       if ((($NT && (!@p_purged
-                                     || (!$negatives && grep(/^WINNT$/,@p))
-                                     || ($negatives && !grep(/^!WINNT$/,@p))))
-                            || ($W32 && (!@p_purged
-                                         || (!$negatives && grep(/^WIN32$/,@p))
-                                         || ($negatives && !grep(/^!WIN32$/,@p))))
-                            || ($W16 && (!@p_purged
-                                         || (!$negatives && grep(/^WIN16$/,@p))
-                                         || ($negatives && !grep(/^!WIN16$/,@p)))))
-                           && (!@a || (!$no_rc2 || !grep(/^RC2$/,@a)))
-                           && (!@a || (!$no_rc4 || !grep(/^RC4$/,@a)))
-                           && (!@a || (!$no_rc5 || !grep(/^RC5$/,@a)))
-                           && (!@a || (!$no_idea || !grep(/^IDEA$/,@a)))
-                           && (!@a || (!$no_des || !grep(/^DES$/,@a)))
-                           && (!@a || (!$no_bf || !grep(/^BF$/,@a)))
-                           && (!@a || (!$no_cast || !grep(/^CAST$/,@a)))
-                           && (!@a || (!$no_md2 || !grep(/^MD2$/,@a)))
-                           && (!@a || (!$no_md4 || !grep(/^MD4$/,@a)))
-                           && (!@a || (!$no_md5 || !grep(/^MD5$/,@a)))
-                           && (!@a || (!$no_sha || !grep(/^SHA$/,@a)))
-                           && (!@a || (!$no_ripemd || !grep(/^RIPEMD$/,@a)))
-                           && (!@a || (!$no_mdc2 || !grep(/^MDC2$/,@a)))
-                           && (!@a || (!$no_rsa || !grep(/^RSA$/,@a)))
-                           && (!@a || (!$no_dsa || !grep(/^DSA$/,@a)))
-                           && (!@a || (!$no_dh || !grep(/^DH$/,@a)))
-                           && (!@a || (!$no_hmac || !grep(/^HMAC$/,@a)))
-                           && (!@a || (!$no_aes || !grep(/^AES$/,@a)))
-                           && (!@a || (!$no_krb5 || !grep(/^KRB5$/,@a)))
-                           && (!@a || (!$no_fp_api || !grep(/^FP_API$/,@a)))
-                           ) {
+                       my $p = ($i =~ /^[^:]*:([^:]*):/,$1);
+                       my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1);
+                       if (is_valid($p,1) && is_valid($a,0)) {
+                               my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1);
+                               if ($prev eq $s2) {
+                                       print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n";
+                               }
+                               $prev = $s2;    # To warn about duplicates...
                                if($v) {
-                                       printf OUT "    %s%-40s@%-8d DATA\n",($W32)?"":"_",$s,$n;
+                                       printf OUT "    %s%-40s@%-8d DATA\n",($W32)?"":"_",$s2,$n;
                                } else {
-                                       printf OUT "    %s%-40s@%d\n",($W32)?"":"_",$s,$n;
+                                       printf OUT "    %s%-40s@%d\n",($W32)?"":"_",$s2,$n;
                                }
                        }
-#                      print STDERR "DEBUG: \"$sym\" (@p):",
-#                      " negatives:", $negatives,
-#                      " 16:", !!($W16 && (!@p_purged
-#                                          || (!$negatives && grep(/^WIN16$/,@p))
-#                                          || ($negatives && !grep(/^!WIN16$/,@p)))),
-#                      " 32:", !!($W32 && (!@p_purged
-#                                          || (!$negatives && grep(/^WIN32$/,@p))
-#                                          || ($negatives && !grep(/^!WIN32$/,@p)))),
-#                      " NT:", !!($NT && (!@p_purged
-#                                         || (!$negatives && grep(/^WINNT$/,@p))
-#                                         || ($negatives && !grep(/^!WINNT$/,@p)))),
-#                      "\n";
                }
        }
        printf OUT "\n";
@@ -916,6 +1145,7 @@ sub load_numbers
        $max_num = 0;
        $num_noinfo = 0;
        $prev = "";
+       $prev_cnt = 0;
 
        open(IN,"<$name") || die "unable to open $name:$!\n";
        while (<IN>) {
@@ -924,14 +1154,22 @@ sub load_numbers
                next if /^\s*$/;
                @a=split;
                if (defined $ret{$a[0]}) {
-                       print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n";
+                       # This is actually perfectly OK
+                       #print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n";
                }
                if ($max_num > $a[1]) {
                        print STDERR "Warning: Number decreased from ",$max_num," to ",$a[1],"\n";
                }
-               if ($max_num == $a[1]) {
+               elsif ($max_num == $a[1]) {
                        # This is actually perfectly OK
                        #print STDERR "Warning: Symbol ",$a[0]," has same number as previous ",$prev,": ",$a[1],"\n";
+                       if ($a[0] eq $prev) {
+                               $prev_cnt++;
+                               $a[0] .= "{$prev_cnt}";
+                       }
+               }
+               else {
+                       $prev_cnt = 0;
                }
                if ($#a < 2) {
                        # Existence will be proven later, in do_defs
@@ -973,7 +1211,7 @@ sub rewrite_numbers
 
        print STDERR "Rewriting $name\n";
 
-       my @r = grep(/^\w+\\.*?:.*?:\w+\(\w+\)/,@symbols);
+       my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols);
        my $r; my %r; my %rsyms;
        foreach $r (@r) {
                (my $s, my $i) = split /\\/, $r;
@@ -992,15 +1230,19 @@ sub rewrite_numbers
        my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums;
        foreach $sym (@s) {
                (my $n, my $i) = split /\\/, $nums{$sym};
-               print STDERR "DEBUG: rewrite_numbers for sym = ",$sym,": i = ",$i,", n = ",$n,", rsym{sym} = ",$rsyms{$sym},"syms{sym} = ",$syms{$sym},"\n" if $debug;
                next if defined($i) && $i =~ /^.*?:.*?:\w+\(\w+\)/;
                next if defined($rsyms{$sym});
+               print STDERR "DEBUG: rewrite_numbers for sym = ",$sym,": i = ",$i,", n = ",$n,", rsym{sym} = ",$rsyms{$sym},"syms{sym} = ",$syms{$sym},"\n" if $debug;
                $i="NOEXIST::FUNCTION:"
                        if !defined($i) || $i eq "" || !defined($syms{$sym});
-               printf OUT "%s%-40s%d\t%s\n","",$sym,$n,$i;
+               my $s2 = $sym;
+               $s2 =~ s/\{[0-9]+\}$//;
+               printf OUT "%s%-40s%d\t%s\n","",$s2,$n,$i;
                if (exists $r{$sym}) {
                        (my $s, $i) = split /\\/,$r{$sym};
-                       printf OUT "%s%-40s%d\t%s\n","",$s,$n,$i;
+                       my $s2 = $s;
+                       $s2 =~ s/\{[0-9]+\}$//;
+                       printf OUT "%s%-40s%d\t%s\n","",$s2,$n,$i;
                }
        }
 }
@@ -1012,7 +1254,7 @@ sub update_numbers
 
        print STDERR "Updating $name numbers\n";
 
-       my @r = grep(/^\w+\\.*?:.*?:\w+\(\w+\)/,@symbols);
+       my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols);
        my $r; my %r; my %rsyms;
        foreach $r (@r) {
                (my $s, my $i) = split /\\/, $r;
@@ -1030,9 +1272,12 @@ sub update_numbers
                    if $i eq "";
                if (!exists $nums{$s}) {
                        $new_syms++;
-                       printf OUT "%s%-40s%d\t%s\n","",$s, ++$start_num,$i;
+                       my $s2 = $s;
+                       $s2 =~ s/\{[0-9]+\}$//;
+                       printf OUT "%s%-40s%d\t%s\n","",$s2, ++$start_num,$i;
                        if (exists $r{$s}) {
                                ($s, $i) = split /\\/,$r{$s};
+                               $s =~ s/\{[0-9]+\}$//;
                                printf OUT "%s%-40s%d\t%s\n","",$s, $start_num,$i;
                        }
                }
index c335f90..bc2c1fc 100755 (executable)
@@ -21,7 +21,7 @@ SSL_CTX_use_PrivateKey_ASN1             23    EXIST::FUNCTION:
 SSL_CTX_use_PrivateKey_file             24     EXIST::FUNCTION:STDIO
 SSL_CTX_use_RSAPrivateKey               25     EXIST::FUNCTION:RSA
 SSL_CTX_use_RSAPrivateKey_ASN1          26     EXIST::FUNCTION:RSA
-SSL_CTX_use_RSAPrivateKey_file          27     EXIST::FUNCTION:STDIO,RSA
+SSL_CTX_use_RSAPrivateKey_file          27     EXIST::FUNCTION:RSA,STDIO
 SSL_CTX_use_certificate                 28     EXIST::FUNCTION:
 SSL_CTX_use_certificate_ASN1            29     EXIST::FUNCTION:
 SSL_CTX_use_certificate_file            30     EXIST::FUNCTION:STDIO
@@ -89,7 +89,7 @@ SSL_use_PrivateKey_ASN1                 100   EXIST::FUNCTION:
 SSL_use_PrivateKey_file                 101    EXIST::FUNCTION:STDIO
 SSL_use_RSAPrivateKey                   102    EXIST::FUNCTION:RSA
 SSL_use_RSAPrivateKey_ASN1              103    EXIST::FUNCTION:RSA
-SSL_use_RSAPrivateKey_file              104    EXIST::FUNCTION:STDIO,RSA
+SSL_use_RSAPrivateKey_file              104    EXIST::FUNCTION:RSA,STDIO
 SSL_use_certificate                     105    EXIST::FUNCTION:
 SSL_use_certificate_ASN1                106    EXIST::FUNCTION:
 SSL_use_certificate_file                107    EXIST::FUNCTION:STDIO
@@ -208,7 +208,7 @@ kssl_ctx_free                           257 EXIST::FUNCTION:KRB5
 kssl_krb5_free_data_contents            258    EXIST::FUNCTION:KRB5
 print_krb5_data                         259    EXIST::FUNCTION:KRB5
 kssl_ctx_setstring                      260    EXIST::FUNCTION:KRB5
-SSL_CTX_has_matching_session_id         261    EXIST::FUNCTION:
+SSL_CTX_has_matching_session_id         261    NOEXIST::FUNCTION:
 SSL_set_generate_session_id             262    EXIST::FUNCTION:
 SSL_CTX_set_generate_session_id         263    EXIST::FUNCTION:
 SSL_has_matching_session_id             264    EXIST::FUNCTION: