my $recurse = 0;
my $reindex = 0;
my $dowrite = 0;
-
+my $staticloader = "";
while (@ARGV) {
my $arg = $ARGV[0];
} elsif($arg eq "-nostatic") {
$static = 0;
shift @ARGV;
+ } elsif($arg eq "-staticloader") {
+ $staticloader = "static ";
+ shift @ARGV;
} elsif($arg eq "-write") {
$dowrite = 1;
shift @ARGV;
}
if($recurse) {
- @source = (<crypto/*.c>, <crypto/*/*.c>, ,<rsaref/*.c>, <ssl/*.c>);
+ @source = (<crypto/*.c>, <crypto/*/*.c>, <ssl/*.c>);
} else {
@source = @ARGV;
}
{
if(/^L\s+(\S+)\s+(\S+)\s+(\S+)/) {
$hinc{$1} = $2;
+ $libinc{$2} = $1;
$cskip{$3} = $1;
if($3 ne "NONE") {
$csrc{$1} = $3;
# Scan each header file in turn and make a list of error codes
# and function names
-while (($lib, $hdr) = each %hinc)
+while (($hdr, $lib) = each %libinc)
{
next if($hdr eq "NONE");
print STDERR "Scanning header file $hdr\n" if $debug;
open(IN, "<$hdr") || die "Can't open Header file $hdr\n";
- my $line = "", $def= "";
+ my $line = "", $def= "", $linenr = 0;
while(<IN>) {
+ $linenr++;
+ print STDERR "line: $linenr\r" if $debug;
+
last if(/BEGIN\s+ERROR\s+CODES/);
if ($line ne '') {
$_ = $line . $_;
}
}
+ print STDERR " \r" if $debug;
+ $defnr = 0;
foreach (split /;/, $def) {
+ $defnr++;
+ print STDERR "def: $defnr\r" if $debug;
+
s/^[\n\s]*//g;
s/[\n\s]*$//g;
next if(/typedef\W/);
}
}
+ print STDERR " \r" if $debug;
+
next if $reindex;
# Scan function and reason codes and store them: keep a note of the
if(/^#define\s+(\S+)\s+(\S+)/) {
$name = $1;
$code = $2;
+ next if $name =~ /^${lib}err/;
unless($name =~ /^${lib}_([RF])_(\w+)$/) {
print STDERR "Invalid error code $name\n";
next;
# so all those unreferenced can be printed out.
+print STDERR "Files loaded: " if $debug;
foreach $file (@source) {
# Don't parse the error source file.
next if exists $cskip{$file};
+ print STDERR $file if $debug;
open(IN, "<$file") || die "Can't open source file $file\n";
while(<IN>) {
if(/(([A-Z0-9]+)_F_([A-Z0-9_]+))/) {
}
close IN;
}
+print STDERR "\n" if $debug;
# Now process each library in turn.
/* The following lines are auto generated by the script mkerr.pl. Any changes
* made after this point may be overwritten when the script is next run.
*/
-
+EOF
+ if($static) {
+ print OUT <<"EOF";
+${staticloader}void ERR_load_${lib}_strings(void);
+EOF
+ } else {
+ print OUT <<"EOF";
+${staticloader}void ERR_load_${lib}_strings(void);
+${staticloader}void ERR_unload_${lib}_strings(void);
+${staticloader}void ERR_${lib}_error(int function, int reason, char *file, int line);
+#define ${lib}err(f,r) ERR_${lib}_error((f),(r),__FILE__,__LINE__)
+EOF
+ }
+ print OUT <<"EOF";
/* Error codes for the $lib functions. */
/* Function codes. */
}
#endif
#endif
-
EOF
close OUT;
# Rewrite the C source file containing the error details.
+ # First, read any existing reason string definitions:
+ my %err_reason_strings;
+ if (open(IN,"<$cfile")) {
+ while (<IN>) {
+ if (/\b(${lib}_R_\w*)\b.*\"(.*)\"/) {
+ $err_reason_strings{$1} = $2;
+ }
+ }
+ close(IN);
+ }
+
my $hincf;
if($static) {
$hfile =~ /([^\/]+)$/;
*/
/* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
*/
#include <stdio.h>
#include $hincf
/* BEGIN ERROR CODES */
-#ifndef NO_ERR
+#ifndef OPENSSL_NO_ERR
static ERR_STRING_DATA ${lib}_str_functs[]=
{
EOF
foreach $i (@reasons) {
my $rn;
my $nspc = 0;
- $i =~ /^${lib}_R_(\S+)$/;
- $rn = $1;
- $rn =~ tr/_[A-Z]/ [a-z]/;
+ if (exists $err_reason_strings{$i}) {
+ $rn = $err_reason_strings{$i};
+ } else {
+ $i =~ /^${lib}_R_(\S+)$/;
+ $rn = $1;
+ $rn =~ tr/_[A-Z]/ [a-z]/;
+ }
$nspc = 40 - length($i) unless length($i) > 40;
$nspc = " " x $nspc;
print OUT "{${i}${nspc},\"$rn\"},\n";
#endif
-void ERR_load_${lib}_strings(void)
+${staticloader}void ERR_load_${lib}_strings(void)
{
static int init=1;
if (init)
{
init=0;
-#ifndef NO_ERR
+#ifndef OPENSSL_NO_ERR
ERR_load_strings(ERR_LIB_${lib},${lib}_str_functs);
ERR_load_strings(ERR_LIB_${lib},${lib}_str_reasons);
#endif
#endif
-int ${lib}_lib_error_code=0;
+static int ${lib}_lib_error_code=0;
+static int ${lib}_error_init=1;
-void ERR_load_${lib}_strings(void)
+${staticloader}void ERR_load_${lib}_strings(void)
{
- static int init=1;
-
if (${lib}_lib_error_code == 0)
${lib}_lib_error_code=ERR_get_next_error_library();
- if (init)
+ if (${lib}_error_init)
{
- init=0;
-#ifndef NO_ERR
+ ${lib}_error_init=0;
+#ifndef OPENSSL_NO_ERR
ERR_load_strings(${lib}_lib_error_code,${lib}_str_functs);
ERR_load_strings(${lib}_lib_error_code,${lib}_str_reasons);
#endif
#ifdef ${lib}_LIB_NAME
${lib}_lib_name->error = ERR_PACK(${lib}_lib_error_code,0,0);
ERR_load_strings(0,${lib}_lib_name);
-#endif;
+#endif
}
}
-void ERR_${lib}_error(int function, int reason, char *file, int line)
+${staticloader}void ERR_unload_${lib}_strings(void)
+ {
+ if (${lib}_error_init == 0)
+ {
+#ifndef OPENSSL_NO_ERR
+ ERR_unload_strings(${lib}_lib_error_code,${lib}_str_functs);
+ ERR_unload_strings(${lib}_lib_error_code,${lib}_str_reasons);
+#endif
+
+#ifdef ${lib}_LIB_NAME
+ ERR_unload_strings(0,${lib}_lib_name);
+#endif
+ ${lib}_error_init=1;
+ }
+ }
+
+${staticloader}void ERR_${lib}_error(int function, int reason, char *file, int line)
{
if (${lib}_lib_error_code == 0)
${lib}_lib_error_code=ERR_get_next_error_library();
}
close OUT;
-
+ undef %err_reason_strings;
}
if($debug && defined(%notrans)) {