This is msggen.pl in view mode; [Download] [Up]
#! /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 (<DEF>) { 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[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 <<END; // This file was automatically generated from $def_file by $prog. END print <<END if $gen_c; #ifndef ${class}_INCLUDED #define ${class}_INCLUDED 1 #ifdef __GNUG__ #pragma interface #endif END print <<END; #include "Message.h" #ifdef SP_NAMESPACE namespace SP_NAMESPACE { #endif struct $class { END foreach $i (0 .. $#message) { if (defined($message[$i])) { print " // $i\n"; print " static const Message"; if ($type[$i] eq "") { print "Fragment"; } else { print "Type$nargs[$i]$auxloc[$i]"; } print " $tag[$i];\n"; } } print "};\n"; print <<END if $gen_c; #ifdef SP_NAMESPACE } #endif #endif /* not ${class}_INCLUDED */ END if ($gen_c) { close(OUT); # this is needed on Windows NT chmod 0666, "$file_base.cxx"; unlink("$file_base.cxx"); open(OUT, ">$file_base.cxx"); chmod 0444, "$file_base.cxx"; select(OUT); print <<END; // This file was automatically generated from $def_file by $prog. #ifdef __GNUG__ #pragma implementation #endif #include "$config_h" #include "$class.h" #ifdef SP_NAMESPACE namespace SP_NAMESPACE { #endif END } foreach $i (0 .. $#message) { if (defined($message[$i])) { if ($type[$i] eq "") { print "const MessageFragment ${class}::$tag[$i](\n"; } else { print "const MessageType$nargs[$i]$auxloc[$i] ${class}::$tag[$i](\n"; print "MessageType::"; if ($type[$i] eq 'I') { print 'info'; } elsif ($type[$i] eq 'W') { print 'warning'; } elsif ($type[$i] eq 'Q') { print 'quantityError'; } elsif ($type[$i] eq 'X') { print 'idrefError'; } else { print 'error'; } print ",\n"; } print <<END; #ifdef BUILD_LIBSP MessageFragment::libModule, #else MessageFragment::appModule, #endif END print "$i\n"; print "#ifndef SP_NO_MESSAGE_TEXT\n"; $str = $message[$i]; $str =~ s|\\|\\\\|g; $str =~ s|"|\\"|g; printf ",\"%s\"", $str; if ($auxloc[$i]) { $str = $message2[$i + 1]; $str =~ s|\\|\\\\|g; $str =~ s|"|\\"|g; printf "\n,\"%s\"", $str; } print "\n#endif\n"; print ");\n"; } } print <<END; #ifdef SP_NAMESPACE } #endif END close(OUT); # this is needed on Windows NT chmod 0666, "$file_base.rc"; unlink("$file_base.rc"); open(OUT, ">$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"; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.