diff options
author | John Malmberg <wb8tyw@qsl.net> | 2014-11-27 21:28:30 -0600 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2015-01-27 21:43:16 -0500 |
commit | e4ac28e83081fa273b19fa778d46c1e3052cb834 (patch) | |
tree | 6fe0cfcee6056f6b84433cf3c1ee07ef66843c55 /variable.c | |
parent | 1fae20a2b7894ab24bb2a17e48178e70c4cf0db9 (diff) | |
download | gunmake-e4ac28e83081fa273b19fa778d46c1e3052cb834.tar.gz |
Fix bs-nl handling, exit and Environment for VMS.
This fix required a complete rewrite of the command parser vmsjobs.c
child_execute_job. The old parser had too many incorrect assumptions
about DCL commands and could not be repaired to extended.
The parser now more closely parses VMS commands and handles quoted
commands and redirection. Command File mode has been improved, but can
not fully support bs-nl syntax.
VMS Unix shell simulation has been improved.
* commands.c: vms_comma_separator is now a run-time setting.
* function.c: vms_comma_separator is now a run-time setting.
* function.c(func_basename_dir) now reports "[]" or "./" based on
VMS crtl runtime setting.
* job.c(start_job_command): VMS Handle empty commands propery.
* main.c: Add VMS environment variables for run-time settings.
* vms_legacy_behavior - Force older behavior.
* vms_comma_separator - Commas or spaces for separators.
* vms_unix_simulation - Enhanced Posix shell simulation features.
* Detect if VMS CRTL is set to report Unix paths instead of VMS.
* ':' and '>' are also MAP_DIRSEP on VMS.
* makeint.h: Add VMS run-time option variables.
* readme.vms: Update to current behavior.
* variable.c(define_variable_in_set): Fix VMS Environment variable
lookup.
* variable.c(define_automatic_variables): Remove some VMS specific
automatic variables and use the Unix ones instead.
* vms_export_symbol.c: Set max symbol size correctly.
* vmsjobs.c: child_execute_job() complete rewrite of VMS comand
parsing.
* vmsjobs.c(build_vms_cmd): VMS commmand building with shell simulation.
Signed-off-by: Paul Smith <psmith@gnu.org>
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 44 |
1 files changed, 32 insertions, 12 deletions
@@ -205,11 +205,39 @@ define_variable_in_set (const char *name, unsigned int length, var_key.name = (char *) name; var_key.length = length; var_slot = (struct variable **) hash_find_slot (&set->table, &var_key); + v = *var_slot; + +#ifdef VMS + /* VMS does not populate envp[] with DCL symbols and logical names which + historically are mapped to environent variables. + If the variable is not yet defined, then we need to check if getenv() + can find it. Do not do this for origin == o_env to avoid infinte + recursion */ + if (HASH_VACANT (v) && (origin != o_env)) + { + struct variable * vms_variable; + char * vname = alloca (length + 1); + char * vvalue; + + strncpy (vname, name, length); + vvalue = getenv(vname); + + /* Values starting with '$' are probably foreign commands. + We want to treat them as Shell aliases and not look them up here */ + if ((vvalue != NULL) && (vvalue[0] != '$')) + { + vms_variable = lookup_variable(name, length); + /* Refresh the slot */ + var_slot = (struct variable **) hash_find_slot (&set->table, + &var_key); + v = *var_slot; + } + } +#endif if (env_overrides && origin == o_env) origin = o_env_override; - v = *var_slot; if (! HASH_VACANT (v)) { if (env_overrides && v->origin == o_env) @@ -450,8 +478,8 @@ lookup_variable (const char *name, unsigned int length) } #ifdef VMS - /* since we don't read envp[] on startup, try to get the - variable via getenv() here. */ + /* VMS does not populate envp[] with DCL symbols and logical names which + historically are mapped to enviroment varables and returned by getenv() */ { char *vname = alloca (length + 1); char *value; @@ -900,15 +928,7 @@ define_automatic_variables (void) /* Define the magic D and F variables in terms of the automatic variables they are variations of. */ -#ifdef VMS - define_variable_cname ("@D", "$(dir $@)", o_automatic, 1); - define_variable_cname ("%D", "$(dir $%)", o_automatic, 1); - define_variable_cname ("*D", "$(dir $*)", o_automatic, 1); - define_variable_cname ("<D", "$(dir $<)", o_automatic, 1); - define_variable_cname ("?D", "$(dir $?)", o_automatic, 1); - define_variable_cname ("^D", "$(dir $^)", o_automatic, 1); - define_variable_cname ("+D", "$(dir $+)", o_automatic, 1); -#elif defined(__MSDOS__) || defined(WINDOWS32) +#if defined(__MSDOS__) || defined(WINDOWS32) /* For consistency, remove the trailing backslash as well as slash. */ define_variable_cname ("@D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $@)))", o_automatic, 1); |