diff options
author | axel <axel@liljencrantz.se> | 2007-04-23 07:19:47 +1000 |
---|---|---|
committer | axel <axel@liljencrantz.se> | 2007-04-23 07:19:47 +1000 |
commit | 2b7535bb518c909e2a6ce1352df93c5c6bbc084b (patch) | |
tree | cfce1fe4a8073a4f855b8f73390d2cda4d8ff740 /builtin.c | |
parent | c5805cfd472dd082a7adc02e02cb87ee5b7d7f81 (diff) |
Make the . (source) builtin able to read commands from stdin
darcs-hash:20070422211947-ac50b-b8d33d81fcef5e0b7e76a8d2a9f0bcbcf3ac67b7.gz
Diffstat (limited to 'builtin.c')
-rw-r--r-- | builtin.c | 94 |
1 files changed, 51 insertions, 43 deletions
@@ -2257,36 +2257,42 @@ static int builtin_source( wchar_t ** argv ) argc = builtin_count_args( argv ); - if( argc < 2 ) - { - sb_printf( sb_err, _( L"%ls: Expected at least one argument, got %d\n" ), argv[0], argc ); - builtin_print_help( argv[0], sb_err ); - return STATUS_BUILTIN_ERROR; - } - - if( wstat(argv[1], &buf) == -1 ) - { - builtin_wperror( L"stat" ); - return STATUS_BUILTIN_ERROR; - } + wchar_t *fn; + const wchar_t *fn_intern; + - if( !S_ISREG(buf.st_mode) ) - { - sb_printf( sb_err, _( L"%ls: '%ls' is not a file\n" ), argv[0], argv[1] ); - builtin_print_help( argv[0], sb_err ); - return STATUS_BUILTIN_ERROR; - } - if( ( fd = wopen( argv[1], O_RDONLY ) ) == -1 ) + if( argc < 2 || (wcscmp( argv[1], L"-" ) == 0) ) { - builtin_wperror( L"open" ); - res = STATUS_BUILTIN_ERROR; + fn = L"-"; + fn_intern = fn; + fd = dup(builtin_stdin); } else { - wchar_t *fn = wrealpath( argv[1], 0 ); - const wchar_t *fn_intern; - + + if( wstat(argv[1], &buf) == -1 ) + { + builtin_wperror( L"stat" ); + return STATUS_BUILTIN_ERROR; + } + + if( !S_ISREG(buf.st_mode) ) + { + sb_printf( sb_err, _( L"%ls: '%ls' is not a file\n" ), argv[0], argv[1] ); + builtin_print_help( argv[0], sb_err ); + + return STATUS_BUILTIN_ERROR; + } + + if( ( fd = wopen( argv[1], O_RDONLY ) ) == -1 ) + { + builtin_wperror( L"open" ); + return STATUS_BUILTIN_ERROR; + } + + fn = wrealpath( argv[1], 0 ); + if( !fn ) { fn_intern = intern( argv[1] ); @@ -2296,33 +2302,35 @@ static int builtin_source( wchar_t ** argv ) fn_intern = intern(fn); free( fn ); } + + } - parser_push_block( SOURCE ); - reader_push_current_filename( fn_intern ); + parser_push_block( SOURCE ); + 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, 0); + parse_util_set_argv( (argc>2)?(argv+2):(argv+1), 0); - res = reader_read( fd ); + res = reader_read( fd ); - parser_pop_block(); - if( res ) - { - sb_printf( sb_err, - _( L"%ls: Error while reading file '%ls'\n" ), - argv[0], - argv[1] ); - } + parser_pop_block(); - /* - Do not close fd after calling reader_read. reader_read - automatically closes it before calling eval. - */ - - reader_pop_current_filename(); + if( res ) + { + sb_printf( sb_err, + _( L"%ls: Error while reading file '%ls'\n" ), + argv[0], + argv[1] ); } + /* + Do not close fd after calling reader_read. reader_read + automatically closes it before calling eval. + */ + + reader_pop_current_filename(); + return res; } |