36
36
37
37
use File::stat ;
38
38
use File::Basename;
39
+ use Data::Dumper;
40
+ # use Tie::IxHash;
39
41
42
+ my $C = " C\t " ;
43
+ my $PERL = " PERL\t " ;
44
+
45
+ my $DEBUG = grep /^--debug$/ , @ARGV ; # print debug info on STDERR
40
46
my $inFileName = shift @ARGV || ' cryptlib.h' ; # default filename is "cryptlib.h"
41
47
my %DEFINED = ( 1, 1, # ifdef 1 is to be included
42
48
" USE_VENDOR_ALGOS" , 0 ); # set to 1 to include #IFDEF USE_VENDOR_ALGOS
56
62
print " Transforming \" $Infile \" into \" $Outfile \"\n " ;
57
63
my $Default = select (OUTFILE);
58
64
65
+ print STDERR qq[
66
+ ${C} #include <stdio.h>
67
+ ${C} #include <stdlib.h>
68
+ ${C} #include "$Infile "
69
+ ${C} int main(void) {
70
+ ] if $DEBUG ;
71
+
72
+ print STDERR qq[
73
+ ${PERL} #!/usr/bin/perl -W
74
+ ${PERL} use strict;
75
+ ${PERL} use warnings;
76
+ ${PERL} require "$Outfile ";
77
+ ] if $DEBUG ;
78
+
79
+
59
80
60
81
# Ignore all input lines before (and including) $Startline
61
82
while (<INFILE>) {
163
184
164
185
# constant definitions
165
186
# s/^\s*#define\s+(\w+)\s+(\w+|[+\-0-9]+|&H[0-9a-fA-F]+)/ Public Const $1 As Long = $2/;
166
- s / ^\s *#define\s +(\w +)\s +(\w +|[+\- 0-9]+|&H[0-9a-fA-F]+)/ \t sub $1 { $2 }/ ;
187
+ # s/^\s*#define\s+(\w+)\s+(\w+|[+\-0-9]+|&H[0-9a-fA-F]+)/\tsub $1 { $2 }/;
188
+ s / ^\s *#define\s +(\w +)\s +\( ?\s *(\w +|[+\- 0-9]+|&H[0-9a-fA-F]+)\s *\) ?\s */ \t sub $1 { $2 }\n / ;
167
189
168
190
# typedef struct
169
191
if (s ! ^(\s *)typedef\s +struct\s *{([^}]*)}\s *(\w +)\s *;! &typelist(split(/;/,$2 ))! e ) {
207
229
}
208
230
print PERLFooter();
209
231
232
+ print STDERR qq[
233
+ ${C} return 0;
234
+ ${C} }
235
+ ] if $DEBUG ;
236
+
237
+ print STDERR qq[
238
+ ${PERL} exit(0);
239
+ ] if $DEBUG ;
240
+
210
241
select ($Default );
211
242
212
- exit ;
243
+ exit 0 ;
213
244
214
245
# subroutine definitions follow:
215
246
@@ -278,10 +309,14 @@ sub enums {
278
309
if (m / (\w +)\s *=\s *(\d +).*$ / ) {
279
310
# new value is being set, $index must be updated
280
311
$_S .= " sub $1 { $2 }\n " ;
312
+ print STDERR qq{ ${C} printf("$1 : \% d\\ n", $1 );\n } if $DEBUG ;
313
+ print STDERR qq{ ${PERL} print "$1 : ", \& $1 (), "\\ n";\n } if $DEBUG ;
281
314
eval ($Index = $2 +1);
282
315
}
283
316
else {
284
317
$_S .= " sub $_ { " .$Index ++." }\n " ;
318
+ print STDERR qq{ ${C} printf("$_ : \% d\\ n", $_ );\n } if $DEBUG ;
319
+ print STDERR qq{ ${PERL} print "$_ : ", \& $_ (), "\\ n";\n } if $DEBUG ;
285
320
}
286
321
}
287
322
return $_S;
@@ -292,34 +327,58 @@ sub enumt {
292
327
my $LINES = " " ;
293
328
my $parval ;
294
329
my $lastValue = 0;
295
- foreach $parval ( @_ ) {
296
- my ( $val , $rem , $name , $value );
297
- $parval =~ s / ^ \s *(.*?) \s *$ / $1 / ;
298
- ( $val , $rem ) = split ( ' # ' , $parval , 2);
299
- $val = ' ' unless $val ;
300
- $val =~ s / ^ \s *(.*?) \s *$ / $1 / ;
330
+ # tie my %values, 'Tie::IxHash', ();
331
+ my %values = ( );
332
+ my @lines = @_ ;
333
+ foreach my $parval1 ( @lines ) {
334
+ # my ( $val, $rem, $name, $value) ;
335
+ my ( $val1 , $rem ) = split ( ' # ' , $parval1 , 2) ;
301
336
$rem = ' ' unless $rem ;
302
337
$rem =~ s / ^\s *(.*?)\s *$/ $1 / ;
303
- if ( $val ne ' ' ) {
304
- ($name , $value ) = split (' =' , $val , 2);
305
- $name = ' ' unless $name ;
306
- $name =~ s / ^\s *(.*?)[\s\, ]*$/ $1 / ;
307
- $value = ' ' unless $value ;
308
- $value =~ s / ^\s *(.*?)[\s\, ]*$/ $1 / ;
309
- if ( $value eq ' ' || $value =~ / ^\d / ) {
310
- $value = $lastValue unless $value ;
338
+ $LINES .= ($rem ? " \t # $rem " : ' ' ) . " \n " ;
339
+ $val1 = ' ' unless $val1 ;
340
+ $val1 =~ s / ^\s *(.*?)\s *$/ $1 / ;
341
+ next unless $val1 ;
342
+ foreach $parval (split (' ,' ,$val1 )) {
343
+ last unless defined ($parval );
344
+ my ($val , $name , $value );
345
+ ($val = $parval ) =~ s / ^\s *(.*?)\s *$/ $1 / ;
346
+ # $val = '' unless $val;
347
+ # $val =~ s/^\s*(.*?)\s*$/$1/;
348
+ if ( $val ne ' ' ) {
349
+ ($name , $value ) = split (' =' , $val , 2);
350
+ $name = ' ' unless $name ;
351
+ $name =~ s / ^\s *(.*?)[\s\, ]*$/ $1 / ;
352
+ $value = ' ' unless $value ;
353
+ $value =~ s / ^\s *(.*?)[\s\, ]*$/ $1 / ;
354
+ if ( $value eq ' ' || $value =~ / ^\d / ) {
355
+ $value = $lastValue unless $value ;
356
+ # $lastValue = $value + 1;
357
+ } else {
358
+ # $rem .= ' ==> ' . $value;
359
+ # $lastValue =
360
+ $value = eval ( join (' ' , map { exists ($values {$_ }) ? $values {$_ } : $_ } split (/ \s +/ ,$value )) );
361
+ }
311
362
$lastValue = $value + 1;
312
363
}
313
- }
314
- if ( $name ) {
315
- foreach my $curname (split (' ,' , $name )) {
316
- $curname =~ s / ^\s *(.*?)\s *$/ $1 / ;
317
- $LINES .= ($curname ? " \t sub $curname { $value }" : ' ' ) . ($rem ? " \t # $rem " : ' ' ) . " \n " ;
364
+ if ( $name ) {
365
+ # $lastValue = $value;
366
+ foreach my $curname (split (' ,' , $name )) {
367
+ $curname =~ s / ^\s *(.*?)\s *$/ $1 / ;
368
+ $values {$curname } = $value ;
369
+ # $LINES .= ($curname ? "\tsub $curname { $value }" : '') . ($rem ? "\t# $rem" : '') . "\n";
370
+ $LINES .= ($curname ? " \t sub $curname { $value }" : ' ' ) . " \n " ;
371
+ # ++$lastValue;
372
+ # print STDERR "$curname = $value\n";
373
+ print STDERR qq{ ${C} printf("$curname : \% d\\ n", $curname );\n } if $DEBUG ;
374
+ print STDERR qq{ ${PERL} print "$curname : ", \& ${curname} (), "\\ n";\n } if $DEBUG ;
375
+ }
376
+ } else {
377
+ # $LINES .= ($rem ? "\t# $rem" : '') . "\n";
318
378
}
319
- } else {
320
- $LINES .= ($rem ? " \t # $rem " : ' ' ) . " \n " ;
321
- }
379
+ }
322
380
}
381
+ # print STDERR Dumper(\%values);
323
382
return $LINES ;
324
383
}
325
384
# handle the lines of a "typedef struct { ... } structname"
0 commit comments