mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Cleanup of wildcard.cpp, removing ad-hoc hash table and halloc
This commit is contained in:
parent
f1b1d1ca75
commit
19cd7a248d
3 changed files with 26 additions and 68 deletions
10
output.cpp
10
output.cpp
|
@ -113,7 +113,7 @@ static int (*out)(char c) = &writeb_internal;
|
||||||
/**
|
/**
|
||||||
Name of terminal
|
Name of terminal
|
||||||
*/
|
*/
|
||||||
static wchar_t *current_term = 0;
|
static wcstring current_term;
|
||||||
|
|
||||||
|
|
||||||
void output_set_writer( int (*writer)(char) )
|
void output_set_writer( int (*writer)(char) )
|
||||||
|
@ -570,12 +570,10 @@ int output_color_code( const wcstring &val, bool is_background ) {
|
||||||
|
|
||||||
void output_set_term( const wchar_t *term )
|
void output_set_term( const wchar_t *term )
|
||||||
{
|
{
|
||||||
current_term = halloc_wcsdup(global_context, term);
|
current_term = term;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t *output_get_term()
|
const wchar_t *output_get_term()
|
||||||
{
|
{
|
||||||
return (wchar_t *)(current_term ? current_term : L"<unknown>");
|
return current_term.empty() ? L"<unknown>" : current_term.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
2
output.h
2
output.h
|
@ -158,6 +158,6 @@ void output_set_term( const wchar_t *term );
|
||||||
/**
|
/**
|
||||||
Return the terminal name
|
Return the terminal name
|
||||||
*/
|
*/
|
||||||
wchar_t *output_get_term();
|
const wchar_t *output_get_term();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
76
wildcard.cpp
76
wildcard.cpp
|
@ -32,7 +32,7 @@ wildcards using **.
|
||||||
#include "expand.h"
|
#include "expand.h"
|
||||||
#include "exec.h"
|
#include "exec.h"
|
||||||
#include "halloc_util.h"
|
#include "halloc_util.h"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This flag is set in the flags parameter of wildcard_expand if the
|
This flag is set in the flags parameter of wildcard_expand if the
|
||||||
|
@ -103,18 +103,9 @@ wildcards using **.
|
||||||
#define COMPLETE_DIRECTORY_DESC _( L"Directory" )
|
#define COMPLETE_DIRECTORY_DESC _( L"Directory" )
|
||||||
|
|
||||||
/** Hashtable containing all descriptions that describe an executable */
|
/** Hashtable containing all descriptions that describe an executable */
|
||||||
static hash_table_t *suffix_hash=0;
|
static std::map<wcstring, wcstring> suffix_map;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Free hash key and hash value
|
|
||||||
*/
|
|
||||||
static void clear_hash_entry( void *key, void *data )
|
|
||||||
{
|
|
||||||
free( (void *)key );
|
|
||||||
free( (void *)data );
|
|
||||||
}
|
|
||||||
|
|
||||||
int wildcard_has( const wchar_t *str, int internal )
|
int wildcard_has( const wchar_t *str, int internal )
|
||||||
{
|
{
|
||||||
wchar_t prev=0;
|
wchar_t prev=0;
|
||||||
|
@ -358,14 +349,11 @@ static wchar_t *make_path( const wchar_t *base_dir, const wchar_t *name )
|
||||||
does not perform any caching, it directly calls the mimedb command
|
does not perform any caching, it directly calls the mimedb command
|
||||||
to do a lookup.
|
to do a lookup.
|
||||||
*/
|
*/
|
||||||
static wchar_t *complete_get_desc_suffix_internal( const wchar_t *suff_orig )
|
static wcstring complete_get_desc_suffix_internal( const wchar_t *suff_orig )
|
||||||
{
|
{
|
||||||
|
|
||||||
wchar_t *suff = wcsdup( suff_orig );
|
wcstring suff = suff_orig;
|
||||||
wchar_t *cmd = wcsdupcat( SUFFIX_CMD_STR, suff );
|
wcstring cmd = wcstring(SUFFIX_CMD_STR) + suff;
|
||||||
|
|
||||||
if( !suff || !cmd )
|
|
||||||
DIE_MEM();
|
|
||||||
|
|
||||||
wcstring_list_t lst;
|
wcstring_list_t lst;
|
||||||
wcstring desc;
|
wcstring desc;
|
||||||
|
@ -388,61 +376,32 @@ static wchar_t *complete_get_desc_suffix_internal( const wchar_t *suff_orig )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(cmd);
|
if( desc.empty() )
|
||||||
|
|
||||||
if( ! desc.size() )
|
|
||||||
{
|
{
|
||||||
desc = COMPLETE_FILE_DESC;
|
desc = COMPLETE_FILE_DESC;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t *tmp = wcsdup(desc.c_str());
|
suffix_map[suff] = desc.c_str();
|
||||||
hash_put( suffix_hash, suff, tmp );
|
return desc;
|
||||||
|
|
||||||
return tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Free the suffix_hash hash table and all memory used by it.
|
|
||||||
*/
|
|
||||||
static void complete_get_desc_destroy_suffix_hash()
|
|
||||||
{
|
|
||||||
if( suffix_hash )
|
|
||||||
{
|
|
||||||
hash_foreach( suffix_hash, &clear_hash_entry );
|
|
||||||
hash_destroy( suffix_hash );
|
|
||||||
free( suffix_hash );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Use the mimedb command to look up a description for a given suffix
|
Use the mimedb command to look up a description for a given suffix
|
||||||
*/
|
*/
|
||||||
static const wchar_t *complete_get_desc_suffix( const wchar_t *suff_orig )
|
static wcstring complete_get_desc_suffix( const wchar_t *suff_orig )
|
||||||
{
|
{
|
||||||
|
|
||||||
int len;
|
int len;
|
||||||
wchar_t *suff;
|
wchar_t *suff;
|
||||||
wchar_t *pos;
|
wchar_t *pos;
|
||||||
wchar_t *tmp;
|
wchar_t *tmp;
|
||||||
wchar_t *desc;
|
|
||||||
|
|
||||||
len = wcslen(suff_orig );
|
len = wcslen(suff_orig );
|
||||||
|
|
||||||
if( len == 0 )
|
if( len == 0 )
|
||||||
return COMPLETE_FILE_DESC;
|
return COMPLETE_FILE_DESC;
|
||||||
|
|
||||||
if( !suffix_hash )
|
|
||||||
{
|
|
||||||
suffix_hash = (hash_table_t *)malloc( sizeof( hash_table_t) );
|
|
||||||
if( !suffix_hash )
|
|
||||||
DIE_MEM();
|
|
||||||
hash_init( suffix_hash, &hash_wcs_func, &hash_wcs_cmp );
|
|
||||||
halloc_register_function_void( global_context, &complete_get_desc_destroy_suffix_hash );
|
|
||||||
}
|
|
||||||
|
|
||||||
suff = wcsdup(suff_orig);
|
suff = wcsdup(suff_orig);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -460,12 +419,14 @@ static const wchar_t *complete_get_desc_suffix( const wchar_t *suff_orig )
|
||||||
tmp = escape( suff, 1 );
|
tmp = escape( suff, 1 );
|
||||||
free(suff);
|
free(suff);
|
||||||
suff = tmp;
|
suff = tmp;
|
||||||
desc = (wchar_t *)hash_get( suffix_hash, suff );
|
|
||||||
|
|
||||||
if( !desc )
|
std::map<wcstring, wcstring>::iterator iter = suffix_map.find(suff);
|
||||||
{
|
wcstring desc;
|
||||||
desc = complete_get_desc_suffix_internal( suff );
|
if (iter != suffix_map.end()) {
|
||||||
}
|
desc = iter->second;
|
||||||
|
} else {
|
||||||
|
desc = complete_get_desc_suffix_internal( suff );
|
||||||
|
}
|
||||||
|
|
||||||
free( suff );
|
free( suff );
|
||||||
|
|
||||||
|
@ -486,7 +447,7 @@ static const wchar_t *complete_get_desc_suffix( const wchar_t *suff_orig )
|
||||||
\param err The errno value after a failed stat call on the file.
|
\param err The errno value after a failed stat call on the file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const wchar_t *file_get_desc( const wchar_t *filename,
|
static wcstring file_get_desc( const wchar_t *filename,
|
||||||
int lstat_res,
|
int lstat_res,
|
||||||
struct stat lbuf,
|
struct stat lbuf,
|
||||||
int stat_res,
|
int stat_res,
|
||||||
|
@ -626,7 +587,6 @@ static void wildcard_completion_allocate( std::vector<completion_t> &list,
|
||||||
const wchar_t *wc,
|
const wchar_t *wc,
|
||||||
int is_cmd )
|
int is_cmd )
|
||||||
{
|
{
|
||||||
const wchar_t *desc;
|
|
||||||
struct stat buf, lbuf;
|
struct stat buf, lbuf;
|
||||||
wcstring sb;
|
wcstring sb;
|
||||||
|
|
||||||
|
@ -679,7 +639,7 @@ static void wildcard_completion_allocate( std::vector<completion_t> &list,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
desc = file_get_desc( fullname, lstat_res, lbuf, stat_res, buf, stat_errno );
|
wcstring desc = file_get_desc( fullname, lstat_res, lbuf, stat_res, buf, stat_errno );
|
||||||
|
|
||||||
if( sz >= 0 && S_ISDIR(buf.st_mode) )
|
if( sz >= 0 && S_ISDIR(buf.st_mode) )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue