#! /usr/bin/perl # Copyright (c) 1994 James Clark # See the file COPYING for copying permission. $prog = $0; $prog =~ s@.*/@@; $gen_c = 0; do 'getopts.pl'; &Getopts('l'); die "Usage: $prog file\n" unless $#ARGV == 0; $def_file = $ARGV[0]; $file_base = $def_file; $file_base =~ s/\.[^.]*$//; $config_h = $opt_l ? "splib.h" : "config.h"; $class = $file_base; $class =~ s|.*[\\/]||; open(DEF, $def_file) || die "can't open \`$def_file': $!\n"; $num = 0; while () { chop; if (/^!cxx$/) { $gen_c = 1; next; } if (/^=/) { $n = substr($_, 1); &error("= directive must increase message num") if ($n < $num); $num = $n; next; } if (/^-/) { # a deleted message $num++; next; } next if /^[ ]*#/; next if /^[ ]*$/; @field = split('\+', $_, 5); &error("too few fields") if $#field < 3; if ($#field == 4 && $field[4] =~ /^%J/) { $field[3] .= '+'; $field[3] .= substr($field[4], 2); $#field = 3; } if ($field[0] eq "") { $type[$num] = ""; $argc = 0; } else { $field[0] =~ /^[IWQXE][0-9]$/ || &error("invalid first field");; $type[$num] = substr($field[0], 0, 1); $argc = int(substr($field[0], 1, 1)); } $nargs[$num] = $argc; $field[1] =~ /^[a-zA-Z_][a-zA-Z0-9_]+$/ || &error("invalid tag"); $tag[$num] = $field[1]; &error("duplicate tag $field[1]") if defined($tag_used{$field[1]}); $tag_used{$field[1]} = 1; $field[2] =~ /^([0-9]+(\.[0-9]+)*(p[0-9]+)?( [0-9]+(\.[0-9]+)*(p[0-9]+)?)*)?$/ || &error("invalid clauses field"); # push @clauses, $field[2]; if ($argc == 0) { if ($field[0] ne "") { $field[3] =~ /^([^%]|%%)*$/ || &error("invalid character after %"); } } else { $field[3] =~ /^([^%]|%[%1-$argc])*$/ || &error("invalid character after %"); } $auxloc[$num] = ($#field == 4 ? "L" : ""); $message[$num] = $field[3]; $num++; if ($#field == 4) { $message2[$num] = $field[4]; $num++; } } close(DEF); # this is needed on Windows NT chmod 0666, "$file_base.h"; unlink("$file_base.h"); open(OUT, ">$file_base.h"); chmod 0444, "$file_base.h"; select(OUT); print <$file_base.cxx"); chmod 0444, "$file_base.cxx"; select(OUT); print <$file_base.rc"); chmod 0444, "$file_base.rc"; select(OUT); print "STRINGTABLE\nBEGIN\n"; foreach $i (0 .. $#message) { if (defined($message[$i])) { $str = $message[$i]; $str =~ s/"/""/g; printf " %d, \"%s\"\n", $i, $str; } elsif (defined($message2[$i])) { $str = $message2[$i]; $str =~ s/"/""/g; printf " %d, \"%s\"\n", $i, $str; } } print "END\n"; close(OUT); sub error { die "$def_file:$.: $_[0]\n"; }