Files
pcas/src/libCom/error/makeStatTbl.pl
2002-07-12 21:35:43 +00:00

128 lines
3.2 KiB
Perl

#!/usr/local/bin/perl
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE Versions 3.13.7
# and higher are distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
#
# makeStatTbl.pl - Create Error Symbol Table
#
# Kay-Uwe Kasemir, 1-31-97,
# based on makeStatTbl shell script.
#
# SYNOPSIS
# perl makeStatTbl.pl hdir [...]
#
# DESCRIPTION
# This tool creates a symbol table (ERRSYMTAB) structure which contains the
# names and values of all the status codes defined in the .h files in the
# specified directory(s). The status codes must be prefixed with "S_"
# in order to be included in this table.
# A "err.h" file must exist in each hdir which defines the module
# numbers, eg. "M_". The table is created on standard output.
#
# This tool's primary use is for creating an error status table used
# by errPrint, and errSymFind.
#
# FILES
# errMdef.h module number file for each h directory
#
# SEE ALSO: errnoLib(1), symLib(1)
#*/
use Cwd;
die "No args (files to parse) given" if ($#ARGV < 0);
# parse all lines of all files given:
while (<>)
{
if (m'^#define[ /t]*S_')
{
chomp;
push @err_sym_line, $_;
}
if (m'^#[ \t]*define[ /t]+M_')
{
chomp;
push @err_facility_line, $_;
}
}
$out_name = "errSymTbl.c";
$dir = cwd();
open OUT, ">$out_name" or die "Cannot open $out_name";
print OUT "/*\n";
print OUT " * status code symbol table\n";
print OUT " *\n";
print OUT " * CREATED BY makeStatTbl.pl\n";
print OUT " * FROM $dir\n";
print OUT " * ON " . localtime() . "\n";
print OUT " */\n";
print OUT "\n";
print OUT "#include \"errMdef.h\"\n";
print OUT "#include \"errSymTbl.h\"\n";
print OUT "\n";
foreach $line ( @err_facility_line )
{
if ($line =~ m'^#[ \t]*define[ \t]+(M_[A-Za-z0-9_]+)[ \t]+(.*)')
{
printf OUT "#ifndef %s\n", $1;
printf OUT "#define %s %s\n", $1, $2;
printf OUT "#endif /* ifdef %s */\n", $1;
}
}
$count = 0;
foreach $line ( @err_sym_line )
{
print OUT "$line\n";
# define S_symbol /* comment */
if ($line =~ m'[ \t#]define[ \t]*(S_[A-Za-z0-9_]+).*\/\*(.+)\*\/')
{
$symbol[$count] = $1;
$comment[$count]= $2;
++$count;
}
else
{
# Some status values for '0' (=OK) have no comment:
unless ($line =~ m'[ \t#]define[ \t]*(S_[A-Za-z0-9_]+)')
{
die "cannot decode this line:\n$line\n";
}
}
}
print OUT "\n";
print OUT "LOCAL ERRSYMBOL symbols[] =\n";
print OUT "{\n";
for ($i=0; $i<$count; ++$i)
{
printf OUT "\t{ \"%s\", (long) %s },\n",
$comment[$i], $symbol[$i];
}
print OUT "};\n";
print OUT "\n";
print OUT "LOCAL ERRSYMTAB symTbl =\n";
print OUT "{\n";
print OUT "\tNELEMENTS(symbols), /* current number of symbols in table */\n";
print OUT "\tsymbols, /* ptr to symbol array */\n";
print OUT "};\n";
print OUT "\n";
print OUT "ERRSYMTAB_ID errSymTbl = &symTbl;\n";
print OUT "\n";
print OUT "/*\tEOF $out_name */\n";