mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-27 20:25:12 +00:00
More cleanup of static string buffers in favor of wcstring
This commit is contained in:
parent
562ba1291e
commit
eef1e3e77e
4 changed files with 36 additions and 76 deletions
67
builtin.cpp
67
builtin.cpp
|
@ -100,13 +100,13 @@ struct builtin_data_t
|
||||||
*/
|
*/
|
||||||
const wchar_t *desc;
|
const wchar_t *desc;
|
||||||
|
|
||||||
bool operator<(const wchar_t *) const;
|
bool operator<(const wcstring &) const;
|
||||||
bool operator<(const builtin_data_t *) const;
|
bool operator<(const builtin_data_t *) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool builtin_data_t::operator<(const wchar_t *other) const
|
bool builtin_data_t::operator<(const wcstring &other) const
|
||||||
{
|
{
|
||||||
return wcscmp(this->name, other) < 0;
|
return wcscmp(this->name, other.c_str()) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool builtin_data_t::operator<(const builtin_data_t *other) const
|
bool builtin_data_t::operator<(const builtin_data_t *other) const
|
||||||
|
@ -187,49 +187,21 @@ static int count_char( const wchar_t *str, wchar_t c )
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t *builtin_help_get( parser_t &parser, const wchar_t *name )
|
wcstring builtin_help_get( parser_t &parser, const wchar_t *name )
|
||||||
{
|
{
|
||||||
wcstring_list_t lst;
|
wcstring_list_t lst;
|
||||||
string_buffer_t cmd;
|
wcstring out;
|
||||||
wchar_t *name_esc;
|
const wcstring name_esc = escape_string(name, 1);
|
||||||
|
const wcstring cmd = format_string(L"__fish_print_help %ls", name_esc.c_str());
|
||||||
/*
|
if( exec_subshell2( cmd, lst ) >= 0 )
|
||||||
Because the contents of this buffer is returned by this
|
|
||||||
function, it must not be free'd on exit, so we allocate it
|
|
||||||
using halloc.
|
|
||||||
*/
|
|
||||||
static string_buffer_t *out = 0;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
sb_init( &cmd );
|
|
||||||
|
|
||||||
if( !out )
|
|
||||||
{
|
|
||||||
out = sb_halloc( global_context );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sb_clear( out );
|
|
||||||
}
|
|
||||||
|
|
||||||
name_esc = escape( name, 1 );
|
|
||||||
sb_printf( &cmd, L"__fish_print_help %ls", name_esc );
|
|
||||||
|
|
||||||
|
|
||||||
if( exec_subshell2( (wchar_t *)cmd.buff, lst ) >= 0 )
|
|
||||||
{
|
{
|
||||||
for( i=0; i<lst.size(); i++ )
|
for( size_t i=0; i<lst.size(); i++ )
|
||||||
{
|
{
|
||||||
sb_append( out, lst.at(i).c_str() );
|
out.append(lst.at(i));
|
||||||
sb_append( out, L"\n" );
|
out.push_back(L'\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return out;
|
||||||
sb_destroy( &cmd );
|
|
||||||
free( name_esc );
|
|
||||||
|
|
||||||
return (wchar_t *)out->buff;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -246,7 +218,6 @@ wchar_t *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, string_buffer_t *b )
|
||||||
{
|
{
|
||||||
|
|
||||||
const wchar_t *h;
|
|
||||||
int is_short = 0;
|
int is_short = 0;
|
||||||
|
|
||||||
if( b == sb_err )
|
if( b == sb_err )
|
||||||
|
@ -255,12 +226,12 @@ static void builtin_print_help( parser_t &parser, const wchar_t *cmd, string_buf
|
||||||
parser.current_line() );
|
parser.current_line() );
|
||||||
}
|
}
|
||||||
|
|
||||||
h = builtin_help_get( parser, cmd );
|
const wcstring h = builtin_help_get( parser, cmd );
|
||||||
|
|
||||||
if( !h )
|
if( !h.size())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wchar_t *str = wcsdup( h );
|
wchar_t *str = wcsdup( h.c_str() );
|
||||||
if( str )
|
if( str )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -3654,10 +3625,10 @@ static const builtin_data_t builtin_datas[]=
|
||||||
|
|
||||||
#define BUILTIN_COUNT (sizeof builtin_datas / sizeof *builtin_datas)
|
#define BUILTIN_COUNT (sizeof builtin_datas / sizeof *builtin_datas)
|
||||||
|
|
||||||
static const builtin_data_t *builtin_lookup(const wchar_t *name) {
|
static const builtin_data_t *builtin_lookup(const wcstring &name) {
|
||||||
const builtin_data_t *array_end = builtin_datas + BUILTIN_COUNT;
|
const builtin_data_t *array_end = builtin_datas + BUILTIN_COUNT;
|
||||||
const builtin_data_t *found = std::lower_bound(builtin_datas, array_end, name);
|
const builtin_data_t *found = std::lower_bound(builtin_datas, array_end, name);
|
||||||
if (found != array_end && ! wcscmp(found->name, name)) {
|
if (found != array_end && name == found->name) {
|
||||||
return found;
|
return found;
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3681,10 +3652,8 @@ void builtin_destroy()
|
||||||
al_destroy( &io_stack );
|
al_destroy( &io_stack );
|
||||||
}
|
}
|
||||||
|
|
||||||
int builtin_exists( const wchar_t *cmd )
|
int builtin_exists( const wcstring &cmd )
|
||||||
{
|
{
|
||||||
CHECK( cmd, 0 );
|
|
||||||
|
|
||||||
return !!builtin_lookup(cmd);
|
return !!builtin_lookup(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
builtin.h
11
builtin.h
|
@ -123,7 +123,7 @@ void builtin_destroy();
|
||||||
/**
|
/**
|
||||||
Is there a builtin command with the given name?
|
Is there a builtin command with the given name?
|
||||||
*/
|
*/
|
||||||
int builtin_exists( const wchar_t *cmd );
|
int builtin_exists( const wcstring &cmd );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Execute a builtin command
|
Execute a builtin command
|
||||||
|
@ -142,9 +142,7 @@ int builtin_run( parser_t &parser, const wchar_t * const *argv, io_data_t *io );
|
||||||
/** Returns a list of all builtin names */
|
/** Returns a list of all builtin names */
|
||||||
wcstring_list_t builtin_get_names(void);
|
wcstring_list_t builtin_get_names(void);
|
||||||
|
|
||||||
/**
|
/** Insert all builtin names into list. */
|
||||||
Insert all builtin names into list.
|
|
||||||
*/
|
|
||||||
void builtin_get_names(std::vector<completion_t> &list);
|
void builtin_get_names(std::vector<completion_t> &list);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -174,10 +172,9 @@ const wchar_t *builtin_complete_get_temporary_buffer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Run the __fish_print_help function to obtain the help information
|
Run the __fish_print_help function to obtain the help information
|
||||||
for the specified command. The resulting string will be valid until
|
for the specified command.
|
||||||
the next time this function is called, and must never be free'd manually.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wchar_t *builtin_help_get( parser_t &parser, const wchar_t *cmd );
|
wcstring builtin_help_get( parser_t &parser, const wchar_t *cmd );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -707,7 +707,7 @@ void tokenize( const wchar_t * const buff, int * const color, const int pos, arr
|
||||||
any files for that
|
any files for that
|
||||||
*/
|
*/
|
||||||
if( use_builtin )
|
if( use_builtin )
|
||||||
is_cmd |= builtin_exists( cmd.c_str() );
|
is_cmd |= builtin_exists( cmd );
|
||||||
|
|
||||||
if( use_function )
|
if( use_function )
|
||||||
is_cmd |= function_exists_no_autoload( cmd.c_str(), vars );
|
is_cmd |= function_exists_no_autoload( cmd.c_str(), vars );
|
||||||
|
|
32
parser.cpp
32
parser.cpp
|
@ -1883,7 +1883,7 @@ int parser_t::parse_job( process_t *p,
|
||||||
if( !p->type )
|
if( !p->type )
|
||||||
{
|
{
|
||||||
if( use_builtin &&
|
if( use_builtin &&
|
||||||
builtin_exists(args.at(0).completion.c_str()))
|
builtin_exists(args.at(0).completion))
|
||||||
{
|
{
|
||||||
p->type = INTERNAL_BUILTIN;
|
p->type = INTERNAL_BUILTIN;
|
||||||
is_new_block |= parser_keywords_is_block( args.at( 0 ).completion );
|
is_new_block |= parser_keywords_is_block( args.at( 0 ).completion );
|
||||||
|
@ -2504,7 +2504,6 @@ int parser_t::eval( const wcstring &cmdStr, io_data_t *io, enum block_type_t blo
|
||||||
|
|
||||||
if( (!error_code) && (!exit_status()) && (!proc_get_last_status()) )
|
if( (!error_code) && (!exit_status()) && (!proc_get_last_status()) )
|
||||||
{
|
{
|
||||||
wchar_t *h;
|
|
||||||
|
|
||||||
//debug( 2, L"Status %d\n", proc_get_last_status() );
|
//debug( 2, L"Status %d\n", proc_get_last_status() );
|
||||||
|
|
||||||
|
@ -2514,9 +2513,9 @@ int parser_t::eval( const wcstring &cmdStr, io_data_t *io, enum block_type_t blo
|
||||||
BLOCK_END_ERR_MSG );
|
BLOCK_END_ERR_MSG );
|
||||||
fwprintf( stderr, L"%ls", parser_t::current_line() );
|
fwprintf( stderr, L"%ls", parser_t::current_line() );
|
||||||
|
|
||||||
h = builtin_help_get( *this, L"end" );
|
const wcstring h = builtin_help_get( *this, L"end" );
|
||||||
if( h )
|
if( h.size() )
|
||||||
fwprintf( stderr, L"%ls", h );
|
fwprintf( stderr, L"%ls", h.c_str() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3026,16 +3025,14 @@ int parser_t::test( const wchar_t * buff,
|
||||||
|
|
||||||
if( out )
|
if( out )
|
||||||
{
|
{
|
||||||
wchar_t *h;
|
|
||||||
|
|
||||||
error( SYNTAX_ERROR,
|
error( SYNTAX_ERROR,
|
||||||
tok_get_pos( &tok ),
|
tok_get_pos( &tok ),
|
||||||
INVALID_CASE_ERR_MSG );
|
INVALID_CASE_ERR_MSG );
|
||||||
|
|
||||||
print_errors( out, prefix);
|
print_errors( out, prefix);
|
||||||
h = builtin_help_get( *this, L"case" );
|
const wcstring h = builtin_help_get( *this, L"case" );
|
||||||
if( h )
|
if( h.size() )
|
||||||
sb_printf( out, L"%ls", h );
|
sb_printf( out, L"%ls", h.c_str() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3189,15 +3186,13 @@ int parser_t::test( const wchar_t * buff,
|
||||||
err = 1;
|
err = 1;
|
||||||
if( out )
|
if( out )
|
||||||
{
|
{
|
||||||
wchar_t *h;
|
|
||||||
|
|
||||||
error( SYNTAX_ERROR,
|
error( SYNTAX_ERROR,
|
||||||
tok_get_pos( &tok ),
|
tok_get_pos( &tok ),
|
||||||
INVALID_END_ERR_MSG );
|
INVALID_END_ERR_MSG );
|
||||||
print_errors( out, prefix );
|
print_errors( out, prefix );
|
||||||
h = builtin_help_get( *this, L"end" );
|
const wcstring h = builtin_help_get( *this, L"end" );
|
||||||
if( h )
|
if( h.size() )
|
||||||
sb_printf( out, L"%ls", h );
|
sb_printf( out, L"%ls", h.c_str() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3469,7 +3464,6 @@ int parser_t::test( const wchar_t * buff,
|
||||||
|
|
||||||
if( out && count>0 )
|
if( out && count>0 )
|
||||||
{
|
{
|
||||||
const wchar_t *h;
|
|
||||||
const wchar_t *cmd;
|
const wchar_t *cmd;
|
||||||
|
|
||||||
error( SYNTAX_ERROR,
|
error( SYNTAX_ERROR,
|
||||||
|
@ -3481,10 +3475,10 @@ int parser_t::test( const wchar_t * buff,
|
||||||
cmd = parser_get_block_command( block_type[count -1] );
|
cmd = parser_get_block_command( block_type[count -1] );
|
||||||
if( cmd )
|
if( cmd )
|
||||||
{
|
{
|
||||||
h = builtin_help_get( *this, cmd );
|
const wcstring h = builtin_help_get( *this, cmd );
|
||||||
if( cmd )
|
if( h.size() )
|
||||||
{
|
{
|
||||||
sb_printf( out, L"%ls", h );
|
sb_printf( out, L"%ls", h.c_str() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue