aboutsummaryrefslogtreecommitdiffhomepage
path: root/function.c
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2007-04-23 08:10:33 +1000
committerGravatar axel <axel@liljencrantz.se>2007-04-23 08:10:33 +1000
commitee94424b0f4753b9d9a0b075c36d5b65cadafbb4 (patch)
treeac51edb6de64732c2a7a1fe199712498f05aeda2 /function.c
parent2b7535bb518c909e2a6ce1352df93c5c6bbc084b (diff)
Add the possibility for functions which do not shadow the arguments of the calling function
darcs-hash:20070422221033-ac50b-d9544c87d0ddab10f7f503b5a1707292f266efe4.gz
Diffstat (limited to 'function.c')
-rw-r--r--function.c84
1 files changed, 48 insertions, 36 deletions
diff --git a/function.c b/function.c
index 361edd85..0c9c855b 100644
--- a/function.c
+++ b/function.c
@@ -60,8 +60,10 @@ typedef struct
Flag for specifying that this function was automatically loaded
*/
int is_autoload;
+
+ int shadows;
}
- function_data_t;
+ function_internal_data_t;
/**
Table containing all functions
@@ -83,8 +85,8 @@ static int load( const wchar_t *name )
{
int was_autoload = is_autoload;
int res;
- function_data_t *data;
- data = (function_data_t *)hash_get( &function, name );
+ function_internal_data_t *data;
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data && !data->is_autoload )
return 0;
@@ -165,46 +167,43 @@ void function_destroy()
}
-void function_add( const wchar_t *name,
- const wchar_t *val,
- const wchar_t *desc,
- array_list_t *events,
- array_list_t *named_arguments )
+void function_add( function_data_t *data )
{
int i;
wchar_t *cmd_end;
- function_data_t *d;
+ function_internal_data_t *d;
- CHECK( name, );
- CHECK( val, );
+ CHECK( data->name, );
+ CHECK( data->definition, );
- function_remove( name );
+ function_remove( data->name );
- d = halloc( 0, sizeof( function_data_t ) );
+ d = halloc( 0, sizeof( function_internal_data_t ) );
d->definition_offset = parse_util_lineno( parser_get_buffer(), current_block->tok_pos )-1;
- d->cmd = halloc_wcsdup( d, val );
+ d->cmd = halloc_wcsdup( d, data->definition );
- if( named_arguments )
+ if( data->named_arguments )
{
d->named_arguments = al_halloc( d );
- for( i=0; i<al_get_count( named_arguments ); i++ )
+ for( i=0; i<al_get_count( data->named_arguments ); i++ )
{
- al_push( d->named_arguments, halloc_wcsdup( d, (wchar_t *)al_get( named_arguments, i ) ) );
+ al_push( d->named_arguments, halloc_wcsdup( d, (wchar_t *)al_get( data->named_arguments, i ) ) );
}
}
cmd_end = d->cmd + wcslen(d->cmd)-1;
- d->desc = desc?halloc_wcsdup( d, desc ):0;
+ d->desc = data->description?halloc_wcsdup( d, data->description ):0;
d->definition_file = intern(reader_current_filename());
d->is_autoload = is_autoload;
-
- hash_put( &function, intern(name), d );
+ d->shadows = data->shadows;
+
+ hash_put( &function, intern(data->name), d );
- for( i=0; i<al_get_count( events ); i++ )
+ for( i=0; i<al_get_count( data->events ); i++ )
{
- event_add_handler( (event_t *)al_get( events, i ) );
+ event_add_handler( (event_t *)al_get( data->events, i ) );
}
}
@@ -225,7 +224,7 @@ void function_remove( const wchar_t *name )
{
void *key;
void *dv;
- function_data_t *d;
+ function_internal_data_t *d;
event_t ev;
CHECK( name, );
@@ -235,7 +234,7 @@ void function_remove( const wchar_t *name )
&key,
&dv );
- d=(function_data_t *)dv;
+ d=(function_internal_data_t *)dv;
if( !key )
return;
@@ -259,12 +258,12 @@ void function_remove( const wchar_t *name )
const wchar_t *function_get_definition( const wchar_t *name )
{
- function_data_t *data;
+ function_internal_data_t *data;
CHECK( name, 0 );
load( name );
- data = (function_data_t *)hash_get( &function, name );
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data == 0 )
return 0;
return data->cmd;
@@ -272,26 +271,39 @@ const wchar_t *function_get_definition( const wchar_t *name )
array_list_t *function_get_named_arguments( const wchar_t *name )
{
- function_data_t *data;
+ function_internal_data_t *data;
CHECK( name, 0 );
load( name );
- data = (function_data_t *)hash_get( &function, name );
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data == 0 )
return 0;
return data->named_arguments;
}
+int function_get_shadows( const wchar_t *name )
+{
+ function_internal_data_t *data;
+
+ CHECK( name, 0 );
+
+ load( name );
+ data = (function_internal_data_t *)hash_get( &function, name );
+ if( data == 0 )
+ return 0;
+ return data->shadows;
+}
+
const wchar_t *function_get_desc( const wchar_t *name )
{
- function_data_t *data;
+ function_internal_data_t *data;
CHECK( name, 0 );
load( name );
- data = (function_data_t *)hash_get( &function, name );
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data == 0 )
return 0;
@@ -300,13 +312,13 @@ const wchar_t *function_get_desc( const wchar_t *name )
void function_set_desc( const wchar_t *name, const wchar_t *desc )
{
- function_data_t *data;
+ function_internal_data_t *data;
CHECK( name, );
CHECK( desc, );
load( name );
- data = (function_data_t *)hash_get( &function, name );
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data == 0 )
return;
@@ -377,11 +389,11 @@ void function_get_names( array_list_t *list, int get_hidden )
const wchar_t *function_get_definition_file( const wchar_t *name )
{
- function_data_t *data;
+ function_internal_data_t *data;
CHECK( name, 0 );
- data = (function_data_t *)hash_get( &function, name );
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data == 0 )
return 0;
@@ -391,11 +403,11 @@ const wchar_t *function_get_definition_file( const wchar_t *name )
int function_get_definition_offset( const wchar_t *name )
{
- function_data_t *data;
+ function_internal_data_t *data;
CHECK( name, -1 );
- data = (function_data_t *)hash_get( &function, name );
+ data = (function_internal_data_t *)hash_get( &function, name );
if( data == 0 )
return -1;