diff --git a/src/engine/builtins.c b/src/engine/builtins.c index 20d413b7c..30aa649ad 100644 --- a/src/engine/builtins.c +++ b/src/engine/builtins.c @@ -937,6 +937,17 @@ static void add_hash_key( void* np, void* result_ ) *result = list_new( *result, copystr( *(char**)np ) ); } +static struct hash *get_running_module_vars() +{ + struct hash *dummy, *vars = NULL; + /* Get the global variables pointer (that of the currently running module) */ + var_hash_swap(&vars); + dummy = vars; + /* Put the global variables pointer in its right place */ + var_hash_swap(&dummy); + return vars; +} + LIST * builtin_varnames( PARSE *parse, @@ -946,8 +957,14 @@ builtin_varnames( LIST *result = L0; module_t* source_module = bindmodule( arg0 ? arg0->string : 0 ); - if ( source_module->variables ) - hashenumerate( source_module->variables, add_hash_key, &result ); + /* The running module _always_ has its 'variables' member set to NULL + * due to the way enter_module and var_hash_swap work */ + struct hash *vars = + source_module == frame->module ? + get_running_module_vars() : source_module->variables; + + if ( vars ) + hashenumerate( vars, add_hash_key, &result ); return result; } diff --git a/src/engine/variable.c b/src/engine/variable.c index 4938fe989..c66ec53bd 100644 --- a/src/engine/variable.c +++ b/src/engine/variable.c @@ -291,8 +291,7 @@ var_string( } /* expand the file value into the file reference */ - if ( !globs.noexec ) - var_string_to_file( split+3, ine-split-4, file_name_s, lol ); + var_string_to_file( split+3, ine-split-4, file_name_s, lol ); /* continue on with the expansion */ out += strlen(out); @@ -352,7 +351,12 @@ void var_string_to_file( const char * in, int insize, const char * out, LOL * lo { const char * ine = in+insize; FILE * out_file = 0; - if ( strcmp( out, "STDOUT" ) == 0 ) + int out_debug = DEBUG_EXEC ? 1 : 0; + if ( globs.noexec ) + { + out_debug = 1; + } + else if ( strcmp( out, "STDOUT" ) == 0 ) { out_file = stdout; } @@ -382,6 +386,8 @@ void var_string_to_file( const char * in, int insize, const char * out, LOL * lo string_free(&out_name); } + if ( out_debug ) printf("\nfile %s\n",out); + while( *in && in < ine ) { int dollar = 0; @@ -396,7 +402,8 @@ void var_string_to_file( const char * in, int insize, const char * out, LOL * lo } if ( output_0 < output_1 ) { - fwrite(output_0,output_1-output_0,1,out_file); + if ( out_file ) fwrite(output_0,output_1-output_0,1,out_file); + if ( out_debug ) fwrite(output_0,output_1-output_0,1,stdout); } output_0 = output_1; @@ -411,7 +418,7 @@ void var_string_to_file( const char * in, int insize, const char * out, LOL * lo ++output_1; } - /* If a variable encountered, expand it and and embed the */ + /* If a variable encountered, expand it and embed the */ /* space-separated members of the list in the output. */ if( dollar ) @@ -422,26 +429,34 @@ void var_string_to_file( const char * in, int insize, const char * out, LOL * lo while ( l ) { - fputs( l->string, out_file ); + if ( out_file ) fputs( l->string, out_file ); + if ( out_debug ) puts( l->string ); l = list_next( l ); - if ( l ) fputc( ' ', out_file ); + if ( l ) + { + if ( out_file ) fputc( ' ', out_file ); + if ( out_debug ) fputc( ' ', stdout ); + } } list_free( l ); } else if ( output_0 < output_1 ) { - fwrite(output_0,output_1-output_0,1,out_file); + if ( out_file ) fwrite(output_0,output_1-output_0,1,out_file); + if ( out_debug ) fwrite(output_0,output_1-output_0,1,stdout); } in = output_1; } - if ( out_file != stdout && out_file != stderr ) + if ( out_file && out_file != stdout && out_file != stderr ) { fflush( out_file ); fclose( out_file ); } + + if ( out_debug ) fputc('\n',stdout); } /*