#!/usr/local/bin/perl -w # This is a utility that searches out "DECLARE_STACK_OF()" # declarations in .h and .c files, and updates/creates/replaces # the corresponding macro declarations in crypto/stack/safestack.h. # As it's not generally possible to have macros that generate macros, # we need to control this from the "outside", here in this script. # # Geoff Thorpe, June, 2000 (with massive Perl-hacking # help from Steve Robb) my $safestack = "crypto/stack/safestack"; my $do_write; while (@ARGV) { my $arg = $ARGV[0]; if($arg eq "-write") { $do_write = 1; } shift @ARGV; } @source = (, , , ); foreach $file (@source) { next if -l $file; # Open the .c/.h file for reading open(IN, "< $file") || die "Can't open $file for reading: $!"; while() { if (/^DECLARE_STACK_OF\(([^)]+)\)/) { push @stacklst, $1; } if (/^DECLARE_SPECIAL_STACK_OF\(([^,\s]+)\s*,\s*([^>\s]+)\)/) { push @sstacklst, [$1, $2]; } if (/^DECLARE_ASN1_SET_OF\(([^)]+)\)/) { push @asn1setlst, $1; } if (/^DECLARE_PKCS12_STACK_OF\(([^)]+)\)/) { push @p12stklst, $1; } if (/^DECLARE_LHASH_OF\(([^)]+)\)/) { push @lhashlst, $1; } } close(IN); } my $old_stackfile = ""; my $new_stackfile = ""; my $inside_block = 0; my $type_thing; open(IN, "< $safestack.h") || die "Can't open input file: $!"; while() { $old_stackfile .= $_; if (m|^/\* This block of defines is updated by util/mkstack.pl, please do not touch! \*/|) { $inside_block = 1; } if (m|^/\* End of util/mkstack.pl block, you may now edit :-\) \*/|) { $inside_block = 0; } elsif ($inside_block == 0) { $new_stackfile .= $_; } next if($inside_block != 1); $new_stackfile .= "/* This block of defines is updated by util/mkstack.pl, please do not touch! */"; foreach $type_thing (sort @stacklst) { $new_stackfile .= <[0]; my $t2 = $type_thing->[1]; $new_stackfile .= <$safestack.h" || die "Can't open output file"; print OUT $new_stackfile; close OUT; }