From 76f1fdf92d3e2ceadf162deccd29cd0bc44cbffe Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 22 Apr 2004 20:10:10 +0000 Subject: [PATCH] Tidy up, fixed problem in Bug #76. --- src/libCom/env/bldEnvData.pl | 135 +++++++++++++---------------------- src/libCom/env/envDefs.h | 4 +- 2 files changed, 49 insertions(+), 90 deletions(-) diff --git a/src/libCom/env/bldEnvData.pl b/src/libCom/env/bldEnvData.pl index 2cb5c2745..3de34493b 100644 --- a/src/libCom/env/bldEnvData.pl +++ b/src/libCom/env/bldEnvData.pl @@ -17,26 +17,17 @@ # # tool to build envData.c from envDefs.h and config/CONFIG*ENV -use Cwd; +use Cwd 'abs_path'; # We need exactly one argument: $usage="Usage:\tbldEnvData "; die $usage unless $#ARGV==0; -$start_dir=cwd(); -$config_dir=$ARGV[0]; - -# Don't see a reason for this directory hopping, -# it's copied from the original: -chdir $config_dir or die "cannot change dir to $config_dir"; -$config_dir=cwd(); -chdir $start_dir; - -$SRC = "../env/envDefs.h"; -$env_data = "${config_dir}/CONFIG_ENV"; -$site_data= "${config_dir}/CONFIG_SITE_ENV"; -$out_name = "envData.c"; -$OUT = "> $out_name"; +$config_dir = abs_path($ARGV[0]); +$env_defs = abs_path("../env/envDefs.h"); +$config_env = "${config_dir}/CONFIG_ENV"; +$site_env = "${config_dir}/CONFIG_SITE_ENV"; +$out_name = "envData.c"; # $tool = basename of this script $tool=$0; @@ -46,115 +37,85 @@ $tool=~ s'.*/''; # Start by extracting the ENV_PARAM declarations from $SRC # i.e. gather the names of params we are interested in: # -open SRC or die "Cannot open $SRC"; -while () -{ - if (m'epicsShareExtern[ \t]+READONLY[ \t]+ENV_PARAM[ \t]+([A-Za-z_]+)[ \t;]*') - { +open SRC, "<$env_defs" or die "Cannot open $SRC"; +while () { + if (m/epicsShareExtern\s+READONLY\s+ENV_PARAM\s+([A-Za-z_]+)\s*;/) { $need_var{$1} = 1; } } close SRC; - # Read the default values from the config file into shell variables -sub GetVars -{ +sub GetVars { my ($filename) = @_; - - open IN, $filename or die "Cannot read $filename"; - while () - { - # word space = space rest - if (m'([A-Za-z_]+)[ \t]*=[ \t]*(.*)') - { - $var = $1; - # Check if we need that variable: + open IN, "<$filename" or die "Cannot read $filename"; + while () { + # Discard comments, carriage returns and trailing whitespace + next if m/^ \s* \#/x; + chomp; + if (m/^ \s* ([A-Za-z_] \w*) \s* = \s* (.*) \s* $/x) { + my ($var, $val) = ($1, $2); next unless $need_var{$var}; - - # cosmetics: - # Some vars are given as "", - # so that $value{$var} is empty (=undefined). - # To avoid "no value for .." warning I use %have_value - $have_value{$var} = 1; - $value{$var} = $2; - # remove '"' - if ($value{$var} =~ m'"(.*)"') - { - $value{$var} = $1; - } - # remove trailing whitespace and carriage return - $value{$var} =~ s/\s+$//; + $val =~ s/^"(.*)"$/$1/x; + $value{$var} = $val; } } close IN; } -GetVars ($env_data); -GetVars ($site_data); +GetVars ($config_env); +GetVars ($site_env); # Generate header file # print "Generating $out_name\n"; -open OUT or die "cannot create $out_name"; +open OUT, ">$out_name" or die "cannot create $out_name"; # Write header -print OUT "/*\t$out_name\n"; -print OUT " *\n"; -print OUT " *\tcreated by $tool\n"; -print OUT " *\n"; -print OUT " *\tfrom:\n"; -print OUT " *\t$SRC\n"; -print OUT " *\t$env_data\n"; -print OUT " *\t$site_data\n"; -print OUT " *\n"; -print OUT " *\t" . localtime() . "\n"; -print OUT " *\n"; -print OUT " */\n"; -print OUT "\n"; -print OUT "#define epicsExportSharedSymbols\n"; -print OUT "#include \"envDefs.h\"\n"; -print OUT "\n"; +print OUT "/* $out_name\n", + " *\n", + " * Created " . localtime() . "\n", + " * by $tool from files:\n", + " *\t$env_defs\n", + " *\t$config_env\n", + " *\t$site_env\n", + " */\n", + "\n", + "#define epicsExportSharedSymbols\n", + "#include \"envDefs.h\"\n", + "\n"; # Print variables # -foreach $var ( sort keys %need_var ) -{ - if ($have_value{$var}) - { - $default = $value{$var}; - } - else - { - $default = ""; - print "Cannot find value for $var\n"; - } +@vars = sort keys %need_var; +foreach $var (@vars) { + $default = exists $value{$var} ? $value{$var} : ""; + print "Warning: No default value found for $var\n" + unless exists $value{$var}; - printf OUT "epicsShareDef READONLY ENV_PARAM %s = { \"%s\", \"%s\" };\n", - $var, $var, $default; + print OUT "epicsShareDef READONLY ENV_PARAM $var =\n", + "\t{\"$var\", \"$default\"};\n"; } # Now create an array pointing to all parameters -print OUT "\n"; -print OUT "epicsShareDef READONLY ENV_PARAM* env_param_list[EPICS_ENV_VARIABLE_COUNT+1] =\n"; -print OUT "{\n"; +print OUT "\n", + "epicsShareDef READONLY ENV_PARAM* env_param_list[] = {\n"; # Contents are the addresses of each parameter -foreach $var ( sort keys %need_var ) -{ +foreach $var (@vars) { print OUT "\t&$var,\n"; } # Finally finish list with 0 -print OUT "\t0\n"; -print OUT "};\n"; -print OUT "\n"; -print OUT "/*\tEOF $out_name */\n"; +print OUT "\t0\n", + "};\n", + "\n", + "/*\tEOF $out_name */\n"; close OUT; diff --git a/src/libCom/env/envDefs.h b/src/libCom/env/envDefs.h index e09f24e88..040824f08 100644 --- a/src/libCom/env/envDefs.h +++ b/src/libCom/env/envDefs.h @@ -73,14 +73,12 @@ epicsShareExtern READONLY ENV_PARAM EPICS_IOC_LOG_FILE_NAME; epicsShareExtern READONLY ENV_PARAM EPICS_IOC_LOG_FILE_COMMAND; epicsShareExtern READONLY ENV_PARAM EPICS_CMD_PROTO_PORT; epicsShareExtern READONLY ENV_PARAM EPICS_AR_PORT; -#define EPICS_ENV_VARIABLE_COUNT 23 /* * bldEnvData looks for "epicsShareExtern ENV_PARAM" so * this always needs to be divided into two lines */ -epicsShareExtern READONLY ENV_PARAM - *env_param_list[EPICS_ENV_VARIABLE_COUNT+1]; +epicsShareExtern READONLY ENV_PARAM *env_param_list[]; struct in_addr;