diff options
author | ridiculousfish <corydoras@ridiculousfish.com> | 2012-02-22 10:51:06 -0800 |
---|---|---|
committer | ridiculousfish <corydoras@ridiculousfish.com> | 2012-02-22 10:51:06 -0800 |
commit | 62bd43f17fa279b67fbd4482580a91fc2db9c899 (patch) | |
tree | 4a060823ccb92ea5e885a4221c85fd10b9bf580d /builtin.cpp | |
parent | 917b4ff8bc542d161006cea8254885a193f5b8c3 (diff) |
Large set of changes to migrate sb_out and sb_err to wcstring
Diffstat (limited to 'builtin.cpp')
-rw-r--r-- | builtin.cpp | 447 |
1 files changed, 216 insertions, 231 deletions
diff --git a/builtin.cpp b/builtin.cpp index 1eaec88e..4af4f208 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -116,18 +116,27 @@ bool builtin_data_t::operator<(const builtin_data_t *other) const int builtin_out_redirect; int builtin_err_redirect; -/* - Buffers for storing the output of builtin functions -*/ -string_buffer_t *sb_out=0, *sb_err=0; +/* Buffers for storing the output of builtin functions */ +wcstring stdout_buffer, stderr_buffer; + +const wcstring &get_stdout_buffer() { + ASSERT_IS_MAIN_THREAD(); + return stdout_buffer; +} + +const wcstring &get_stderr_buffer() { + ASSERT_IS_MAIN_THREAD(); + return stderr_buffer; +} + /** Stack containing builtin I/O for recursive builtin calls. */ struct io_stack_elem_t { int in; - string_buffer_t *out; - string_buffer_t *err; + wcstring out; + wcstring err; }; static std::stack<io_stack_elem_t> io_stack; @@ -167,13 +176,15 @@ static void builtin_wperror( const wchar_t *s) { if( s != 0 ) { - sb_append( sb_err, s, L": ", NULL ); + stderr_buffer.append(s); + stderr_buffer.append(L": "); } char *err = strerror( errno ); wchar_t *werr = str2wcs( err ); if( werr ) { - sb_append( sb_err, werr, L"\n", NULL ); + stderr_buffer.append(werr); + stderr_buffer.push_back(L'\n'); free( werr ); } } @@ -219,15 +230,14 @@ wcstring builtin_help_get( parser_t &parser, const wchar_t *name ) */ -static void builtin_print_help( parser_t &parser, const wchar_t *cmd, string_buffer_t *b ) +static void builtin_print_help( parser_t &parser, const wchar_t *cmd, wcstring &b ) { int is_short = 0; - if( b == sb_err ) + if( &b == &stderr_buffer ) { - sb_append( sb_err, - parser.current_line() ); + stderr_buffer.append(parser.current_line()); } const wcstring h = builtin_help_get( parser, cmd ); @@ -239,7 +249,7 @@ static void builtin_print_help( parser_t &parser, const wchar_t *cmd, string_buf if( str ) { - if( b==sb_err ) + if( &b == &stderr_buffer ) { /* @@ -319,10 +329,10 @@ static void builtin_print_help( parser_t &parser, const wchar_t *cmd, string_buf } } - sb_append( b, str ); + b.append(str); if( is_short ) { - sb_printf( b, _(L"%ls: Type 'help %ls' for related documentation\n\n"), cmd, cmd ); + append_format(b, _(L"%ls: Type 'help %ls' for related documentation\n\n"), cmd, cmd); } free( str ); @@ -334,11 +344,8 @@ static void builtin_print_help( parser_t &parser, const wchar_t *cmd, string_buf */ static void builtin_unknown_option( parser_t &parser, const wchar_t *cmd, const wchar_t *opt ) { - sb_printf( sb_err, - BUILTIN_ERR_UNKNOWN, - cmd, - opt ); - builtin_print_help( parser, cmd, sb_err ); + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, cmd, opt); + builtin_print_help( parser, cmd, stderr_buffer ); } /** @@ -346,11 +353,8 @@ static void builtin_unknown_option( parser_t &parser, const wchar_t *cmd, const */ static void builtin_missing_argument( parser_t &parser, const wchar_t *cmd, const wchar_t *opt ) { - sb_printf( sb_err, - BUILTIN_ERR_MISSING, - cmd, - opt ); - builtin_print_help( parser, cmd, sb_err ); + append_format(stderr_buffer, BUILTIN_ERR_MISSING, cmd, opt); + builtin_print_help( parser, cmd, stderr_buffer ); } /* @@ -400,12 +404,12 @@ static void builtin_bind_list() wcstring tname; if( input_terminfo_get_name(seq, tname) ) { - sb_printf( sb_out, L"bind -k %ls %ls\n", tname.c_str(), ecmd.c_str() ); + append_format(stdout_buffer, L"bind -k %ls %ls\n", tname.c_str(), ecmd.c_str() ); } else { const wcstring eseq = escape_string( seq, 1 ); - sb_printf( sb_out, L"bind %ls %ls\n", eseq.c_str(), ecmd.c_str() ); + append_format(stdout_buffer, L"bind %ls %ls\n", eseq.c_str(), ecmd.c_str() ); } } } @@ -424,7 +428,7 @@ static void builtin_bind_key_names( int all ) { const wcstring &name = names.at(i); - sb_printf( sb_out, L"%ls\n", name.c_str() ); + append_format(stdout_buffer, L"%ls\n", name.c_str() ); } } @@ -439,7 +443,7 @@ static void builtin_bind_function_names() for( size_t i=0; i<names.size(); i++ ) { const wchar_t *seq = names.at(i).c_str(); - sb_printf( sb_out, L"%ls\n", seq ); + append_format(stdout_buffer, L"%ls\n", seq ); } } @@ -463,19 +467,19 @@ static int builtin_bind_add( wchar_t *seq, wchar_t *cmd, int terminfo ) case ENOENT: { - sb_printf( sb_err, _(L"%ls: No key with name '%ls' found\n"), L"bind", seq ); + append_format(stderr_buffer, _(L"%ls: No key with name '%ls' found\n"), L"bind", seq ); break; } case EILSEQ: { - sb_printf( sb_err, _(L"%ls: Key with name '%ls' does not have any mapping\n"), L"bind", seq ); + append_format(stderr_buffer, _(L"%ls: Key with name '%ls' does not have any mapping\n"), L"bind", seq ); break; } default: { - sb_printf( sb_err, _(L"%ls: Unknown error trying to bind to key named '%ls'\n"), L"bind", seq ); + append_format(stderr_buffer, _(L"%ls: Unknown error trying to bind to key named '%ls'\n"), L"bind", seq ); break; } @@ -600,11 +604,11 @@ static int builtin_bind( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; @@ -618,7 +622,7 @@ static int builtin_bind( parser_t &parser, wchar_t **argv ) case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case 'k': @@ -669,7 +673,7 @@ static int builtin_bind( parser_t &parser, wchar_t **argv ) default: { res = STATUS_BUILTIN_ERROR; - sb_printf( sb_err, _(L"%ls: Expected zero or two parameters, got %d"), argv[0], argc-woptind ); + append_format(stderr_buffer, _(L"%ls: Expected zero or two parameters, got %d"), argv[0], argc-woptind ); break; } } @@ -693,7 +697,7 @@ static int builtin_bind( parser_t &parser, wchar_t **argv ) default: { res = STATUS_BUILTIN_ERROR; - sb_printf( sb_err, _(L"%ls: Invalid state\n"), argv[0] ); + append_format(stderr_buffer, _(L"%ls: Invalid state\n"), argv[0] ); break; } } @@ -763,15 +767,15 @@ static int builtin_block( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case 'g': @@ -798,13 +802,13 @@ static int builtin_block( parser_t &parser, wchar_t **argv ) { if( scope != UNSET ) { - sb_printf( sb_err, _( L"%ls: Can not specify scope when removing block\n" ), argv[0] ); + append_format(stderr_buffer, _( L"%ls: Can not specify scope when removing block\n" ), argv[0] ); return STATUS_BUILTIN_ERROR; } if (parser.global_event_blocks.empty()) { - sb_printf( sb_err, _( L"%ls: No blocks defined\n" ), argv[0] ); + append_format(stderr_buffer, _( L"%ls: No blocks defined\n" ), argv[0] ); return STATUS_BUILTIN_ERROR; } parser.global_event_blocks.pop_front(); @@ -897,16 +901,16 @@ static int builtin_builtin( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case 'n': @@ -930,10 +934,8 @@ static int builtin_builtin( parser_t &parser, wchar_t **argv ) { const wchar_t *el = names.at(i).c_str(); - sb_append( sb_out, - el, - L"\n", - NULL ); + stdout_buffer.append(el); + stdout_buffer.append(L"\n"); } } return STATUS_BUILTIN_OK; @@ -978,15 +980,15 @@ static int builtin_emit( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case '?': @@ -1049,15 +1051,15 @@ static int builtin_generic( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case '?': @@ -1074,7 +1076,7 @@ static int builtin_generic( parser_t &parser, wchar_t **argv ) Output a definition of the specified function to the specified stringbuffer. Used by the functions builtin. */ -static void functions_def( const wcstring &name, string_buffer_t *out ) +static void functions_def( const wcstring &name, wcstring &out ) { const wchar_t *desc = function_get_desc( name ); const wchar_t *def = function_get_definition(name); @@ -1086,22 +1088,21 @@ static void functions_def( const wcstring &name, string_buffer_t *out ) std::vector<event_t *> ev; event_get( &search, &ev ); - sb_append( out, - L"function ", - name.c_str(), - NULL); + out.append(L"function "); + out.append(name); if( desc && wcslen(desc) ) { wchar_t *esc_desc = escape( desc, 1 ); - sb_append( out, L" --description ", esc_desc, NULL ); + out.append(L" --description "); + out.append( esc_desc ); free( esc_desc ); } if( !function_get_shadows( name ) ) { - sb_append( out, L" --no-scope-shadowing", NULL ); + out.append(L" --no-scope-shadowing" ); } for( size_t i=0; i<ev.size(); i++ ) @@ -1111,22 +1112,22 @@ static void functions_def( const wcstring &name, string_buffer_t *out ) { case EVENT_SIGNAL: { - sb_printf( out, L" --on-signal %ls", sig2wcs( next->param1.signal ) ); + append_format( out, L" --on-signal %ls", sig2wcs( next->param1.signal ) ); break; } case EVENT_VARIABLE: { - sb_printf( out, L" --on-variable %ls", next->str_param1.c_str() ); + append_format( out, L" --on-variable %ls", next->str_param1.c_str() ); break; } case EVENT_EXIT: { if( next->param1.pid > 0 ) - sb_printf( out, L" --on-process-exit %d", next->param1.pid ); + append_format( out, L" --on-process-exit %d", next->param1.pid ); else - sb_printf( out, L" --on-job-exit %d", -next->param1.pid ); + append_format( out, L" --on-job-exit %d", -next->param1.pid ); break; } @@ -1134,13 +1135,13 @@ static void functions_def( const wcstring &name, string_buffer_t *out ) { job_t *j = job_get( next->param1.job_id ); if( j ) - sb_printf( out, L" --on-job-exit %d", j->pgid ); + append_format( out, L" --on-job-exit %d", j->pgid ); break; } case EVENT_GENERIC: { - sb_printf( out, L" --on-event %ls", next->str_param1.c_str() ); + append_format( out, L" --on-event %ls", next->str_param1.c_str() ); break; } @@ -1152,15 +1153,15 @@ static void functions_def( const wcstring &name, string_buffer_t *out ) wcstring_list_t named = function_get_named_arguments( name ); if( named.size() > 0 ) { - sb_printf( out, L" --argument" ); + append_format( out, L" --argument" ); for( size_t i=0; i < named.size(); i++ ) { - sb_printf( out, L" %ls", named.at(i).c_str() ); + append_format( out, L" %ls", named.at(i).c_str() ); } } - sb_printf( out, L"\n\t%ls\nend\n", def ); + append_format( out, L"\n\t%ls\nend\n", def ); } @@ -1236,11 +1237,11 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; @@ -1262,7 +1263,7 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) break; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case 'q': @@ -1286,11 +1287,11 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) */ if( (erase + (!!desc) + list + query + copy) > 1 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Invalid combination of options\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -1308,22 +1309,22 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) if( argc-woptind != 1 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Expected exactly one function name\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } func = argv[woptind]; if( !function_exists( func ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Function '%ls' does not exist\n" ), argv[0], func ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -1340,28 +1341,22 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) std::sort(names.begin(), names.end()); if( is_screen ) { - string_buffer_t buff; - sb_init( &buff ); + wcstring buff; for( i=0; i<names.size(); i++ ) { - sb_append( &buff, - names.at(i).c_str(), - L", ", - NULL ); + buff.append(names.at(i)); + buff.append(L", "); } - write_screen( (wchar_t *)buff.buff, sb_out ); - sb_destroy( &buff ); + write_screen( buff, stdout_buffer ); } else { for( i=0; i<names.size(); i++ ) { - sb_append( sb_out, - names.at(i).c_str(), - L"\n", - NULL ); + stdout_buffer.append(names.at(i).c_str()); + stdout_buffer.append(L"\n"); } } @@ -1374,10 +1369,10 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) if( argc-woptind != 2 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Expected exactly two names (current function name, and new function name)\n" ), argv[0] ); - builtin_print_help ( parser, argv[0], sb_err ); + builtin_print_help ( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -1386,34 +1381,34 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) if( !function_exists( current_func ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Function '%ls' does not exist\n" ), argv[0], current_func.c_str() ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } if( (wcsfuncname( new_func.c_str() ) != 0) || parser_keywords_is_reserved( new_func ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Illegal function name '%ls'\n"), argv[0], new_func.c_str()); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } // keep things simple: don't allow existing names to be copy targets. if( function_exists( new_func ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Function '%ls' already exists. Cannot create copy '%ls'\n" ), argv[0], new_func.c_str(), current_func.c_str() ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -1432,9 +1427,9 @@ static int builtin_functions( parser_t &parser, wchar_t **argv ) if( !query ) { if( i != woptind) - sb_append( sb_out, L"\n" ); + stdout_buffer.append( L"\n" ); - functions_def( argv[i], sb_out ); + functions_def( argv[i], stdout_buffer ); } } } @@ -1526,7 +1521,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); @@ -1544,7 +1539,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) if( sig < 0 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Unknown signal '%ls'\n" ), argv[0], woptarg ); @@ -1559,7 +1554,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) { if( wcsvarname( woptarg ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Invalid variable name '%ls'\n" ), argv[0], woptarg ); @@ -1609,7 +1604,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) if( job_id == -1 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Cannot find calling job for event handler\n" ), argv[0] ); res=1; @@ -1627,7 +1622,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) pid = wcstol( woptarg, &end, 10 ); if( errno || !end || *end ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Invalid process id %ls\n" ), argv[0], woptarg ); @@ -1660,7 +1655,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) break; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case '?': @@ -1677,14 +1672,14 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) if( argc == woptind ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Expected function name\n" ), argv[0] ); res=1; } else if( wcsfuncname( argv[woptind] ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Illegal function name '%ls'\n" ), argv[0], argv[woptind] ); @@ -1694,7 +1689,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) else if( parser_keywords_is_reserved(argv[woptind] ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: The name '%ls' is reserved,\nand can not be used as a function name\n" ), argv[0], argv[woptind] ); @@ -1712,7 +1707,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) { if( wcsvarname( argv[woptind] ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Invalid variable name '%ls'\n" ), argv[0], argv[woptind] ); @@ -1725,7 +1720,7 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) } else if( woptind != argc ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Expected one argument, got %d\n" ), argv[0], argc ); @@ -1740,9 +1735,9 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) size_t i; int chars=0; - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); const wchar_t *cfa = _( L"Current functions are: " ); - sb_append( sb_err, cfa ); + stderr_buffer.append( cfa ); chars += wcslen( cfa ); wcstring_list_t names = function_get_names(0); @@ -1755,13 +1750,13 @@ static int builtin_function( parser_t &parser, wchar_t **argv ) if( chars+l > common_get_width() ) { chars = 0; - sb_append(sb_err, L"\n" ); + stderr_buffer.push_back(L'\n'); } - sb_append( sb_err, - nxt, L" ", NULL ); + stderr_buffer.append(nxt); + stderr_buffer.append(L" "); } - sb_append( sb_err, L"\n" ); + stderr_buffer.push_back(L'\n'); parser.pop_block(); parser.push_block( FAKE ); @@ -1837,16 +1832,16 @@ static int builtin_random( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); break; case '?': @@ -1871,7 +1866,7 @@ static int builtin_random( parser_t &parser, wchar_t **argv ) } lrand48_r( &seed_buffer, &res ); - sb_printf( sb_out, L"%d\n", abs(res%32767) ); + append_format(stdout_buffer, L"%d\n", abs(res%32767) ); break; } @@ -1884,7 +1879,7 @@ static int builtin_random( parser_t &parser, wchar_t **argv ) foo = wcstol( argv[woptind], &end, 10 ); if( errno || *end ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Seed value '%ls' is not a valid number\n" ), argv[0], argv[woptind] ); @@ -1898,11 +1893,11 @@ static int builtin_random( parser_t &parser, wchar_t **argv ) default: { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Expected zero or one argument, got %d\n" ), argv[0], argc-woptind ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } } @@ -1993,11 +1988,11 @@ static int builtin_read( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; @@ -2038,7 +2033,7 @@ static int builtin_read( parser_t &parser, wchar_t **argv ) break; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case L'?': @@ -2050,21 +2045,21 @@ static int builtin_read( parser_t &parser, wchar_t **argv ) if( ( place & ENV_UNEXPORT ) && ( place & ENV_EXPORT ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_EXPUNEXP, argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } if( (place&ENV_LOCAL?1:0) + (place & ENV_GLOBAL?1:0) + (place & ENV_UNIVERSAL?1:0) > 1) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_GLOCAL, argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -2078,7 +2073,7 @@ static int builtin_read( parser_t &parser, wchar_t **argv ) if( !wcslen( argv[i] ) ) { - sb_printf( sb_err, BUILTIN_ERR_VARNAME_ZERO, argv[0] ); + append_format(stderr_buffer, BUILTIN_ERR_VARNAME_ZERO, argv[0] ); return STATUS_BUILTIN_ERROR; } @@ -2086,8 +2081,8 @@ static int builtin_read( parser_t &parser, wchar_t **argv ) { if( (!iswalnum(*src)) && (*src != L'_' ) ) { - sb_printf( sb_err, BUILTIN_ERR_VARCHAR, argv[0], *src ); - builtin_print_help( parser, argv[0], sb_err ); + append_format(stderr_buffer, BUILTIN_ERR_VARCHAR, argv[0], *src ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } } @@ -2327,11 +2322,11 @@ static int builtin_status( parser_t &parser, wchar_t **argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'c': @@ -2359,7 +2354,7 @@ static int builtin_status( parser_t &parser, wchar_t **argv ) break; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; case 'j': @@ -2371,7 +2366,7 @@ static int builtin_status( parser_t &parser, wchar_t **argv ) job_control_mode = JOB_CONTROL_NONE; else { - sb_printf( sb_err, + append_format(stderr_buffer, L"%ls: Invalid job control mode '%ls'\n", woptarg ); res = 1; @@ -2408,14 +2403,14 @@ static int builtin_status( parser_t &parser, wchar_t **argv ) if( !fn ) fn = _(L"Standard input"); - sb_printf( sb_out, L"%ls\n", fn ); + append_format(stdout_buffer, L"%ls\n", fn ); break; } case CURRENT_LINE_NUMBER: { - sb_printf( sb_out, L"%d\n", parser.get_lineno() ); + append_format(stdout_buffer, L"%d\n", parser.get_lineno() ); break; } @@ -2442,22 +2437,22 @@ static int builtin_status( parser_t &parser, wchar_t **argv ) case STACK_TRACE: { - parser.stack_trace( parser.current_block, sb_out ); + parser.stack_trace( parser.current_block, stdout_buffer ); break; } case NORMAL: { if( is_login ) - sb_printf( sb_out, _( L"This is a login shell\n" ) ); + append_format(stdout_buffer, _( L"This is a login shell\n" ) ); else - sb_printf( sb_out, _( L"This is not a login shell\n" ) ); + append_format(stdout_buffer, _( L"This is not a login shell\n" ) ); - sb_printf( sb_out, _( L"Job control: %ls\n" ), + append_format(stdout_buffer, _( L"Job control: %ls\n" ), job_control_mode==JOB_CONTROL_INTERACTIVE?_( L"Only on interactive jobs" ): (job_control_mode==JOB_CONTROL_NONE ? _( L"Never" ) : _( L"Always" ) ) ); - parser.stack_trace( parser.current_block, sb_out ); + parser.stack_trace( parser.current_block, stdout_buffer ); break; } } @@ -2490,11 +2485,11 @@ static int builtin_exit( parser_t &parser, wchar_t **argv ) ec = wcstol(argv[1],&end,10); if( errno || *end != 0) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Argument '%ls' must be an integer\n" ), argv[0], argv[1] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } break; @@ -2502,11 +2497,11 @@ static int builtin_exit( parser_t &parser, wchar_t **argv ) default: { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_TOO_MANY_ARGUMENTS, argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -2532,7 +2527,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) dir_in = env_get_string( L"HOME" ); if( dir_in.missing_or_empty() ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Could not find home directory\n" ), argv[0] ); } @@ -2546,21 +2541,21 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) { if( errno == ENOTDIR ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: '%ls' is not a directory\n" ), argv[0], dir_in.c_str() ); } else if( errno == ENOENT ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: The directory '%ls' does not exist\n" ), argv[0], dir_in.c_str() ); } else if( errno == EROTTEN ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: '%ls' is a rotten symlink\n" ), argv[0], dir_in.c_str() ); @@ -2568,7 +2563,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) } else { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Unknown error trying to locate directory '%ls'\n" ), argv[0], dir_in.c_str() ); @@ -2578,9 +2573,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) if( !is_interactive ) { - sb_append( sb_err, - parser.current_line(), - NULL ); + stderr_buffer.append(parser.current_line()); } res = 1; @@ -2593,7 +2586,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) status = wstat( dir, &buffer ); if( !status && S_ISDIR(buffer.st_mode)) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Permission denied: '%ls'\n" ), argv[0], dir ); @@ -2602,7 +2595,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) else { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: '%ls' is not a directory\n" ), argv[0], dir ); @@ -2610,9 +2603,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) if( !is_interactive ) { - sb_append( sb_err, - parser.current_line(), - NULL ); + stderr_buffer.append(parser.current_line()); } res = 1; @@ -2620,7 +2611,7 @@ static int builtin_cd( parser_t &parser, wchar_t **argv ) else if( !env_set_pwd() ) { res=1; - sb_printf( sb_err, _( L"%ls: Could not set PWD variable\n" ), argv[0] ); + append_format(stderr_buffer, _( L"%ls: Could not set PWD variable\n" ), argv[0] ); } free(dir); @@ -2636,7 +2627,7 @@ static int builtin_count( parser_t &parser, wchar_t ** argv ) { int argc; argc = builtin_count_args( argv ); - sb_printf( sb_out, L"%d\n", argc-1 ); + append_format(stdout_buffer, L"%d\n", argc-1 ); return !(argc-1); } @@ -2683,16 +2674,16 @@ static int builtin_contains( parser_t &parser, wchar_t ** argv ) case 0: if(long_options[opt_index].flag != 0) break; - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; case 'h': - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; @@ -2713,7 +2704,7 @@ static int builtin_contains( parser_t &parser, wchar_t ** argv ) needle = argv[woptind]; if (!needle) { - sb_printf( sb_err, _( L"%ls: Key not specified\n" ), argv[0] ); + append_format(stderr_buffer, _( L"%ls: Key not specified\n" ), argv[0] ); } @@ -2758,7 +2749,7 @@ static int builtin_source( parser_t &parser, wchar_t ** argv ) if( wstat(argv[1], &buf) == -1 ) { - sb_printf( sb_err, _(L"%ls: Error encountered while sourcing file '%ls':\n"), argv[0], argv[1] ); + append_format(stderr_buffer, _(L"%ls: Error encountered while sourcing file '%ls':\n"), argv[0], argv[1] ); builtin_wperror( L"." ); return STATUS_BUILTIN_ERROR; @@ -2766,13 +2757,13 @@ static int builtin_source( parser_t &parser, wchar_t ** argv ) if( !S_ISREG(buf.st_mode) ) { - sb_printf( sb_err, _( L"%ls: '%ls' is not a file\n" ), argv[0], argv[1] ); + append_format(stderr_buffer, _( L"%ls: '%ls' is not a file\n" ), argv[0], argv[1] ); return STATUS_BUILTIN_ERROR; } if( ( fd = wopen( argv[1], O_RDONLY ) ) == -1 ) { - sb_printf( sb_err, _(L"%ls: Error encountered while sourcing file '%ls':\n"), argv[0], argv[1] ); + append_format(stderr_buffer, _(L"%ls: Error encountered while sourcing file '%ls':\n"), argv[0], argv[1] ); builtin_wperror( L"." ); return STATUS_BUILTIN_ERROR; } @@ -2806,7 +2797,7 @@ static int builtin_source( parser_t &parser, wchar_t ** argv ) if( res ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Error while reading file '%ls'\n" ), argv[0], fn_intern == intern_static(L"-") ? L"<stdin>" : fn_intern ); @@ -2862,10 +2853,10 @@ static int builtin_fg( parser_t &parser, wchar_t **argv ) } if( !j ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: There are no suitable jobs\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); } } else if( argv[2] != 0 ) @@ -2891,19 +2882,19 @@ static int builtin_fg( parser_t &parser, wchar_t **argv ) if( found_job ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Ambiguous job\n" ), argv[0] ); } else { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: '%ls' is not a job\n" ), argv[0], argv[1] ); } - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); j=0; @@ -2917,32 +2908,32 @@ static int builtin_fg( parser_t &parser, wchar_t **argv ) if( *end || errno ) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_NOT_NUMBER, argv[0], argv[1] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); } else { j = job_get_from_pid( pid ); if( !j || !job_get_flag( j, JOB_CONSTRUCTED ) || job_is_completed( j )) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: No suitable job: %d\n" ), argv[0], pid ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); j=0; } else if( !job_get_flag( j, JOB_CONTROL) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Can't put job %d, '%ls' to foreground because it is not under job control\n" ), argv[0], pid, j->command_cstr() ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); j=0; } } @@ -2952,7 +2943,7 @@ static int builtin_fg( parser_t &parser, wchar_t **argv ) { if( builtin_err_redirect ) { - sb_printf( sb_err, + append_format(stderr_buffer, FG_MSG, j->job_id, j->command_cstr() ); @@ -2991,26 +2982,26 @@ static int send_to_bg( parser_t &parser, job_t *j, const wchar_t *name ) { if( j == 0 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Unknown job '%ls'\n" ), L"bg", name ); - builtin_print_help( parser, L"bg", sb_err ); + builtin_print_help( parser, L"bg", stderr_buffer ); return STATUS_BUILTIN_ERROR; } else if( !job_get_flag( j, JOB_CONTROL ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Can't put job %d, '%ls' to background because it is not under job control\n" ), L"bg", j->job_id, j->command_cstr() ); - builtin_print_help( parser, L"bg", sb_err ); + builtin_print_help( parser, L"bg", stderr_buffer ); return STATUS_BUILTIN_ERROR; } else { - sb_printf( sb_err, + append_format(stderr_buffer, _(L"Send job %d '%ls' to background\n"), j->job_id, j->command_cstr() ); @@ -3043,7 +3034,7 @@ static int builtin_bg( parser_t &parser, wchar_t **argv ) if( !j ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: There are no suitable jobs\n" ), argv[0] ); res = 1; @@ -3066,7 +3057,7 @@ static int builtin_bg( parser_t &parser, wchar_t **argv ) pid = (int)wcstol( argv[i], &end, 10 ); if( errno || pid < 0 || *end || !job_get_from_pid( pid ) ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: '%ls' is not a job\n" ), argv[0], argv[i] ); @@ -3100,26 +3091,26 @@ static int builtin_for( parser_t &parser, wchar_t **argv ) if( argc < 3) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_FOR_ERR_COUNT, argv[0] , argc ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); } else if ( wcsvarname(argv[1]) ) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_FOR_ERR_NAME, argv[0], argv[1] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); } else if (wcscmp( argv[2], L"in") != 0 ) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_FOR_ERR_IN, argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); } else { @@ -3176,11 +3167,11 @@ static int builtin_end( parser_t &parser, wchar_t **argv ) { if( !parser.current_block->outer ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Not inside of block\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } else @@ -3300,10 +3291,10 @@ static int builtin_else( parser_t &parser, wchar_t **argv ) parser.current_block->type != IF || parser.current_block->state1<int>() != 1) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Not inside of 'if' block\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } else @@ -3334,12 +3325,12 @@ static int builtin_break_continue( parser_t &parser, wchar_t **argv ) if( argc != 1 ) { - sb_printf( sb_err, + append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[1] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -3353,10 +3344,10 @@ static int builtin_break_continue( parser_t &parser, wchar_t **argv ) if( b == 0 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Not inside of loop\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -3410,20 +3401,20 @@ static int builtin_return( parser_t &parser, wchar_t **argv ) status = wcstol(argv[1],&end,10); if( errno || *end != 0) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Argument '%ls' must be an integer\n" ), argv[0], argv[1] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } break; } default: - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Too many arguments\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -3437,10 +3428,10 @@ static int builtin_return( parser_t &parser, wchar_t **argv ) if( b == 0 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Not inside of function\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -3468,12 +3459,12 @@ static int builtin_switch( parser_t &parser, wchar_t **argv ) if( argc != 2 ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: Expected exactly one argument, got %d\n" ), argv[0], argc-1 ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); res=1; parser.push_block( FAKE ); } @@ -3500,10 +3491,10 @@ static int builtin_case( parser_t &parser, wchar_t **argv ) if( parser.current_block->type != SWITCH ) { - sb_printf( sb_err, + append_format(stderr_buffer, _( L"%ls: 'case' command while not in switch block\n" ), argv[0] ); - builtin_print_help( parser, argv[0], sb_err ); + builtin_print_help( parser, argv[0], stderr_buffer ); return STATUS_BUILTIN_ERROR; } @@ -3645,7 +3636,7 @@ int builtin_run( parser_t &parser, const wchar_t * const *argv, io_data_t *io ) { if( argv[2] == 0 && (parser.is_help( argv[1], 0 ) ) ) { - builtin_print_help( parser, argv[0], sb_out ); + builtin_print_help( parser, argv[0], stdout_buffer ); return STATUS_BUILTIN_OK; } } @@ -3693,36 +3684,30 @@ void builtin_push_io( parser_t &parser, int in ) ASSERT_IS_MAIN_THREAD(); if( builtin_stdin != -1 ) { - struct io_stack_elem_t elem = {builtin_stdin, sb_out, sb_err}; + struct io_stack_elem_t elem = {builtin_stdin, stdout_buffer, stderr_buffer}; io_stack.push(elem); } builtin_stdin = in; - sb_out = (string_buffer_t *)malloc(sizeof(string_buffer_t)); - sb_err = (string_buffer_t *)malloc(sizeof(string_buffer_t)); - sb_init( sb_out ); - sb_init( sb_err ); + stdout_buffer.clear(); + stderr_buffer.clear(); } void builtin_pop_io(parser_t &parser) { ASSERT_IS_MAIN_THREAD(); builtin_stdin = 0; - sb_destroy( sb_out ); - sb_destroy( sb_err ); - free( sb_out); - free(sb_err); - if( ! io_stack.empty() ) { struct io_stack_elem_t &elem = io_stack.top(); - sb_err = elem.err; - sb_out = elem.out; + stderr_buffer = elem.err; + stdout_buffer = elem.out; builtin_stdin = elem.in; io_stack.pop(); } else { - sb_out = sb_err = 0; + stdout_buffer.clear(); + stderr_buffer.clear(); builtin_stdin = 0; } } |