diff options
Diffstat (limited to 'contrib/perl5/regcomp.pl')
-rw-r--r-- | contrib/perl5/regcomp.pl | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/contrib/perl5/regcomp.pl b/contrib/perl5/regcomp.pl new file mode 100644 index 0000000..cfe59ad --- /dev/null +++ b/contrib/perl5/regcomp.pl @@ -0,0 +1,98 @@ +#use Fatal qw(open close rename chmod unlink); +open DESC, 'regcomp.sym'; +$ind = 0; + +while (<DESC>) { + next if /^\s*($|\#)/; + $ind++; + chomp; + ($name[$ind], $desc, $rest[$ind]) = split /\t+/, $_, 3; + ($type[$ind], $code[$ind], $args[$ind], $longj[$ind]) + = split /[,\s]\s*/, $desc, 4; +} +close DESC; +$tot = $ind; + +$tmp_h = 'tmp_reg.h'; + +unlink $tmp_h if -f $tmp_h; + +open OUT, ">$tmp_h"; + +print OUT <<EOP; +/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + This file is built by regcomp.pl from regcomp.sym. + Any changes made here will be lost! +*/ + +EOP + +$ind = 0; +while (++$ind <= $tot) { + $oind = $ind - 1; + $hind = sprintf "%#4x", $oind; + print OUT <<EOP; +#define $name[$ind] $oind /* $hind $rest[$ind] */ +EOP +} + +print OUT <<EOP; + +#ifndef DOINIT +EXTCONST U8 regkind[]; +#else +EXTCONST U8 regkind[] = { +EOP + +$ind = 0; +while (++$ind <= $tot) { + print OUT <<EOP; + $type[$ind], /* $name[$ind] */ +EOP +} + +print OUT <<EOP; +}; +#endif + + +#ifdef REG_COMP_C +const static U8 regarglen[] = { +EOP + +$ind = 0; +while (++$ind <= $tot) { + $size = 0; + $size = "EXTRA_SIZE(struct regnode_$args[$ind])" if $args[$ind]; + + print OUT <<EOP; + $size, /* $name[$ind] */ +EOP +} + +print OUT <<EOP; +}; + +const static char reg_off_by_arg[] = { +EOP + +$ind = 0; +while (++$ind <= $tot) { + $size = $longj[$ind] || 0; + + print OUT <<EOP; + $size, /* $name[$ind] */ +EOP +} + +print OUT <<EOP; +}; +#endif /* REG_COMP_C */ + +EOP + +close OUT; + +chmod 0666, 'regnodes.h'; +unlink 'regnodes.h'; +rename $tmp_h, 'regnodes.h'; |