mkstack.pl revision 142425
155714Skris#!/usr/local/bin/perl -w 255714Skris 355714Skris# This is a utility that searches out "DECLARE_STACK_OF()" 455714Skris# declarations in .h and .c files, and updates/creates/replaces 555714Skris# the corresponding macro declarations in crypto/stack/safestack.h. 655714Skris# As it's not generally possible to have macros that generate macros, 755714Skris# we need to control this from the "outside", here in this script. 855714Skris# 955714Skris# Geoff Thorpe, June, 2000 (with massive Perl-hacking 10238405Sjkim# help from Steve Robb) 11238405Sjkim 12238405Sjkimmy $safestack = "crypto/stack/safestack"; 1355714Skris 1455714Skrismy $do_write; 15238405Sjkimwhile (@ARGV) { 16238405Sjkim my $arg = $ARGV[0]; 17238405Sjkim if($arg eq "-write") { 18238405Sjkim $do_write = 1; 19238405Sjkim } 2055714Skris shift @ARGV; 2155714Skris} 2255714Skris 2355714Skris 24160814Ssimon@source = (<crypto/*.[ch]>, <crypto/*/*.[ch]>, <ssl/*.[ch]>); 2555714Skrisforeach $file (@source) { 26160814Ssimon next if -l $file; 27160814Ssimon 28160814Ssimon # Open the .c/.h file for reading 2955714Skris open(IN, "< $file") || die "Can't open $file for reading: $!"; 3055714Skris 31238405Sjkim while(<IN>) { 3255714Skris if (/^DECLARE_STACK_OF\(([^)]+)\)/) { 3355714Skris push @stacklst, $1; 3455714Skris } if (/^DECLARE_ASN1_SET_OF\(([^)]+)\)/) { 35160814Ssimon push @asn1setlst, $1; 36160814Ssimon } if (/^DECLARE_PKCS12_STACK_OF\(([^)]+)\)/) { 37238405Sjkim push @p12stklst, $1; 38160814Ssimon } 3955714Skris } 4055714Skris close(IN); 4155714Skris} 4255714Skris 4355714Skris 4455714Skris 4555714Skrismy $old_stackfile = ""; 4655714Skrismy $new_stackfile = ""; 4755714Skrismy $inside_block = 0; 48238405Sjkimmy $type_thing; 4955714Skris 5055714Skrisopen(IN, "< $safestack.h") || die "Can't open input file: $!"; 5155714Skriswhile(<IN>) { 52238405Sjkim $old_stackfile .= $_; 5355714Skris 5455714Skris if (m|^/\* This block of defines is updated by util/mkstack.pl, please do not touch! \*/|) { 5555714Skris $inside_block = 1; 5655714Skris } 5755714Skris if (m|^/\* End of util/mkstack.pl block, you may now edit :-\) \*/|) { 5855714Skris $inside_block = 0; 59238405Sjkim } elsif ($inside_block == 0) { 60238405Sjkim $new_stackfile .= $_; 61238405Sjkim } 62238405Sjkim next if($inside_block != 1); 63238405Sjkim $new_stackfile .= "/* This block of defines is updated by util/mkstack.pl, please do not touch! */"; 64238405Sjkim 65 foreach $type_thing (sort @stacklst) { 66 $new_stackfile .= <<EOF; 67 68#define sk_${type_thing}_new(st) SKM_sk_new($type_thing, (st)) 69#define sk_${type_thing}_new_null() SKM_sk_new_null($type_thing) 70#define sk_${type_thing}_free(st) SKM_sk_free($type_thing, (st)) 71#define sk_${type_thing}_num(st) SKM_sk_num($type_thing, (st)) 72#define sk_${type_thing}_value(st, i) SKM_sk_value($type_thing, (st), (i)) 73#define sk_${type_thing}_set(st, i, val) SKM_sk_set($type_thing, (st), (i), (val)) 74#define sk_${type_thing}_zero(st) SKM_sk_zero($type_thing, (st)) 75#define sk_${type_thing}_push(st, val) SKM_sk_push($type_thing, (st), (val)) 76#define sk_${type_thing}_unshift(st, val) SKM_sk_unshift($type_thing, (st), (val)) 77#define sk_${type_thing}_find(st, val) SKM_sk_find($type_thing, (st), (val)) 78#define sk_${type_thing}_delete(st, i) SKM_sk_delete($type_thing, (st), (i)) 79#define sk_${type_thing}_delete_ptr(st, ptr) SKM_sk_delete_ptr($type_thing, (st), (ptr)) 80#define sk_${type_thing}_insert(st, val, i) SKM_sk_insert($type_thing, (st), (val), (i)) 81#define sk_${type_thing}_set_cmp_func(st, cmp) SKM_sk_set_cmp_func($type_thing, (st), (cmp)) 82#define sk_${type_thing}_dup(st) SKM_sk_dup($type_thing, st) 83#define sk_${type_thing}_pop_free(st, free_func) SKM_sk_pop_free($type_thing, (st), (free_func)) 84#define sk_${type_thing}_shift(st) SKM_sk_shift($type_thing, (st)) 85#define sk_${type_thing}_pop(st) SKM_sk_pop($type_thing, (st)) 86#define sk_${type_thing}_sort(st) SKM_sk_sort($type_thing, (st)) 87#define sk_${type_thing}_is_sorted(st) SKM_sk_is_sorted($type_thing, (st)) 88EOF 89 } 90 foreach $type_thing (sort @asn1setlst) { 91 $new_stackfile .= <<EOF; 92 93#define d2i_ASN1_SET_OF_${type_thing}(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \\ 94 SKM_ASN1_SET_OF_d2i($type_thing, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 95#define i2d_ASN1_SET_OF_${type_thing}(st, pp, i2d_func, ex_tag, ex_class, is_set) \\ 96 SKM_ASN1_SET_OF_i2d($type_thing, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) 97#define ASN1_seq_pack_${type_thing}(st, i2d_func, buf, len) \\ 98 SKM_ASN1_seq_pack($type_thing, (st), (i2d_func), (buf), (len)) 99#define ASN1_seq_unpack_${type_thing}(buf, len, d2i_func, free_func) \\ 100 SKM_ASN1_seq_unpack($type_thing, (buf), (len), (d2i_func), (free_func)) 101EOF 102 } 103 foreach $type_thing (sort @p12stklst) { 104 $new_stackfile .= <<EOF; 105 106#define PKCS12_decrypt_d2i_${type_thing}(algor, d2i_func, free_func, pass, passlen, oct, seq) \\ 107 SKM_PKCS12_decrypt_d2i($type_thing, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) 108EOF 109 } 110 $new_stackfile .= "/* End of util/mkstack.pl block, you may now edit :-) */\n"; 111 $inside_block = 2; 112} 113 114 115if ($new_stackfile eq $old_stackfile) { 116 print "No changes to $safestack.h.\n"; 117 exit 0; # avoid unnecessary rebuild 118} 119 120if ($do_write) { 121 print "Writing new $safestack.h.\n"; 122 open OUT, ">$safestack.h" || die "Can't open output file"; 123 print OUT $new_stackfile; 124 close OUT; 125} 126