Use the intern function to share the strings used to describe various key bindings. This saves both performance, code size and memory use, but there is a pathological case where the user continually changes key bindings, resulting in more allocated memory than needed.

darcs-hash:20060621140344-ac50b-c7eb89a94a96538215f9a6737f8e4bacd6a801fb.gz
This commit is contained in:
axel 2006-06-22 00:03:44 +10:00
parent 407c96e943
commit 2076944268
5 changed files with 17 additions and 26 deletions

34
input.c
View file

@ -61,6 +61,7 @@ implementation in fish is as of yet incomplete.
#include "signal.h" #include "signal.h"
#include "translate.h" #include "translate.h"
#include "output.h" #include "output.h"
#include "intern.h"
static void input_read_inputrc( wchar_t *fn ); static void input_read_inputrc( wchar_t *fn );
@ -71,9 +72,9 @@ static void input_read_inputrc( wchar_t *fn );
typedef struct typedef struct
{ {
wchar_t *seq; /**< Character sequence which generates this event */ const wchar_t *seq; /**< Character sequence which generates this event */
wchar_t *seq_desc; /**< Description of the character sequence suitable for printing on-screen */ const wchar_t *seq_desc; /**< Description of the character sequence suitable for printing on-screen */
wchar_t *command; /**< command that should be evaluated by this mapping */ const wchar_t *command; /**< command that should be evaluated by this mapping */
} }
mapping; mapping;
@ -237,7 +238,7 @@ static int inputrc_error = 0;
*/ */
static int is_init = 0; static int is_init = 0;
wchar_t input_get_code( wchar_t *name ) wchar_t input_get_code( const wchar_t *name )
{ {
int i; int i;
@ -340,18 +341,16 @@ void add_mapping( const wchar_t *mode,
mapping *m = (mapping *)al_get( mappings, i ); mapping *m = (mapping *)al_get( mappings, i );
if( wcscmp( m->seq, s ) == 0 ) if( wcscmp( m->seq, s ) == 0 )
{ {
free( m->command ); m->seq_desc = intern(d);
free( m->seq_desc ); m->command = intern(c);
m->seq_desc = wcsdup(d );
m->command=wcsdup(c);
return; return;
} }
} }
mapping *m = malloc( sizeof( mapping ) ); mapping *m = malloc( sizeof( mapping ) );
m->seq = wcsdup( s ); m->seq = intern( s );
m->seq_desc = wcsdup(d ); m->seq_desc = intern(d );
m->command=wcsdup(c); m->command = intern(c);
al_push( mappings, m ); al_push( mappings, m );
} }
@ -1427,20 +1426,11 @@ int input_init()
*/ */
static void destroy_mapping( void *key, void *val ) static void destroy_mapping( void *key, void *val )
{ {
int i;
array_list_t *mappings = (array_list_t *)val; array_list_t *mappings = (array_list_t *)val;
for( i=0; i<al_get_count( mappings ); i++ ) al_foreach( mappings, &free );
{
mapping *m = (mapping *)al_get( mappings, i );
free( m->seq );
free( m->seq_desc );
free( m->command );
free(m );
}
al_destroy( mappings ); al_destroy( mappings );
free((void *)key); free((void *)key);
free((void *)val); free((void *)val);
} }

View file

@ -111,6 +111,6 @@ void input_parse_inputrc_line( wchar_t *cmd );
/** /**
Returns the function for the given function name. Returns the function for the given function name.
*/ */
wchar_t input_get_code( wchar_t *name ); wchar_t input_get_code( const wchar_t *name );
#endif #endif

3
main.c
View file

@ -117,6 +117,8 @@ int main( int argc, char **argv )
char *cmd=0; char *cmd=0;
halloc_util_init();
wsetlocale( LC_ALL, L"" ); wsetlocale( LC_ALL, L"" );
is_interactive_session=1; is_interactive_session=1;
program_name=L"fish"; program_name=L"fish";
@ -258,7 +260,6 @@ int main( int argc, char **argv )
no_exec = 0; no_exec = 0;
} }
halloc_util_init();
proc_init(); proc_init();
event_init(); event_init();

View file

@ -2080,7 +2080,7 @@ int reader_get_cursor_pos()
} }
void reader_run_command( wchar_t *cmd ) void reader_run_command( const wchar_t *cmd )
{ {
wchar_t *ft; wchar_t *ft;

View file

@ -72,7 +72,7 @@ void repaint();
Run the specified command with the correct terminal modes, and Run the specified command with the correct terminal modes, and
while taking care to perform job notification, set the title, etc. while taking care to perform job notification, set the title, etc.
*/ */
void reader_run_command( wchar_t *buff ); void reader_run_command( const wchar_t *buff );
/** /**
Get the string of character currently entered into the command Get the string of character currently entered into the command