Add support for sending arguments whenusing the source builtin

darcs-hash:20060214195636-ac50b-511c211368103df6923d63cef99ce20a88d31be3.gz
This commit is contained in:
axel 2006-02-15 05:56:36 +10:00
parent 7ac922def6
commit 3e165297ce
3 changed files with 38 additions and 27 deletions

View file

@ -61,6 +61,8 @@
#include "translate.h" #include "translate.h"
#include "halloc.h" #include "halloc.h"
#include "halloc_util.h" #include "halloc_util.h"
#include "parse_util.h"
#include "expand.h"
/** /**
The default prompt for the read command The default prompt for the read command
@ -1941,9 +1943,9 @@ static int builtin_source( wchar_t ** argv )
argc = builtin_count_args( argv ); argc = builtin_count_args( argv );
if( argc != 2 ) if( argc < 2 )
{ {
sb_printf( sb_err, _( L"%ls: Expected exactly one argument, got %d\n" ), argv[0], argc ); sb_printf( sb_err, _( L"%ls: Expected at least one argument, got %d\n" ), argv[0], argc );
builtin_print_help( argv[0], sb_err ); builtin_print_help( argv[0], sb_err );
return 1; return 1;
} }
@ -1983,9 +1985,12 @@ static int builtin_source( wchar_t ** argv )
parser_push_block( SOURCE ); parser_push_block( SOURCE );
reader_push_current_filename( fn_intern ); reader_push_current_filename( fn_intern );
current_block->param1.source_dest = fn_intern; current_block->param1.source_dest = fn_intern;
parse_util_set_argv( argv+2);
res = reader_read( fd ); res = reader_read( fd );
parser_pop_block(); parser_pop_block();
if( res ) if( res )
@ -2008,7 +2013,6 @@ static int builtin_source( wchar_t ** argv )
return res; return res;
} }
/** /**
Make the specified job the first job of the job list. Moving jobs Make the specified job the first job of the job list. Moving jobs
around in the list makes the list reflect the order in which the around in the list makes the list reflect the order in which the

27
exec.c
View file

@ -39,6 +39,7 @@
#include "translate.h" #include "translate.h"
#include "halloc.h" #include "halloc.h"
#include "halloc_util.h" #include "halloc_util.h"
#include "parse_util.h"
/** /**
Prototype for the getpgid library function. The prototype for this Prototype for the getpgid library function. The prototype for this
@ -789,9 +790,6 @@ void exec( job_t *j )
{ {
case INTERNAL_FUNCTION: case INTERNAL_FUNCTION:
{ {
wchar_t **arg;
int i;
string_buffer_t sb;
wchar_t * def = halloc_register( j, wcsdup( function_get_definition( p->argv[0] ))); wchar_t * def = halloc_register( j, wcsdup( function_get_definition( p->argv[0] )));
//fwprintf( stderr, L"run function %ls\n", argv[0] ); //fwprintf( stderr, L"run function %ls\n", argv[0] );
@ -805,26 +803,9 @@ void exec( job_t *j )
current_block->param2.function_call_process = p; current_block->param2.function_call_process = p;
current_block->param1.function_name = halloc_register( current_block, wcsdup( p->argv[0] ) ); current_block->param1.function_name = halloc_register( current_block, wcsdup( p->argv[0] ) );
if( builtin_count_args(p->argv)>1 ) parse_util_set_argv( p->argv+1 );
{
sb_init( &sb );
for( i=1, arg=p->argv+1; *arg; i++, arg++ )
{
if( i != 1 )
sb_append( &sb, ARRAY_SEP_STR );
sb_append( &sb, *arg );
}
env_set( L"argv", (wchar_t *)sb.buff, ENV_LOCAL );
sb_destroy( &sb );
}
else
{
env_set( L"argv", 0, ENV_LOCAL );
}
parser_forbid_function( p->argv[0] ); parser_forbid_function( p->argv[0] );
if( p->next ) if( p->next )

View file

@ -24,6 +24,7 @@
#include "expand.h" #include "expand.h"
#include "intern.h" #include "intern.h"
#include "exec.h" #include "exec.h"
#include "env.h"
#include "halloc_util.h" #include "halloc_util.h"
/** /**
@ -599,3 +600,28 @@ int parse_util_load( const wchar_t *cmd,
return reloaded; return reloaded;
} }
void parse_util_set_argv( wchar_t **argv )
{
if( *argv )
{
wchar_t **arg;
string_buffer_t sb;
sb_init( &sb );
for( arg=argv; *arg; arg++ )
{
if( arg != argv )
sb_append( &sb, ARRAY_SEP_STR );
sb_append( &sb, *arg );
}
env_set( L"argv", (wchar_t *)sb.buff, ENV_LOCAL );
sb_destroy( &sb );
}
else
{
env_set( L"argv", 0, ENV_LOCAL );
}
}