mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-06-08 19:31:14 -03:00
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:
34
input.c
34
input.c
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
2
input.h
2
input.h
@@ -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
3
main.c
@@ -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();
|
||||||
|
|||||||
2
reader.c
2
reader.c
@@ -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;
|
||||||
|
|||||||
2
reader.h
2
reader.h
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user