diff options
Diffstat (limited to 'extension/spec_array.c')
-rw-r--r-- | extension/spec_array.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/extension/spec_array.c b/extension/spec_array.c index b2713002..78b24018 100644 --- a/extension/spec_array.c +++ b/extension/spec_array.c @@ -130,13 +130,43 @@ deferred_array_##F(NODE *symbol, NODE *subs) \ DEF_ARR(exists) DEF_ARR(lookup) -DEF_ARR(clear) -DEF_ARR(remove) DEF_ARR(list) DEF_ARR(copy) #undef DEF_ARR +/* deferred_array_remove --- remove the index from the array */ + +static NODE ** +deferred_array_remove(NODE *symbol, NODE *subs) +{ + array_t *av = (array_t *) symbol->xarray; + + (void) SUPER(aremove)(symbol, subs); + if (av) { + symbol->xarray = NULL; + (*av->load_func)(symbol, av->data); + symbol->xarray = (NODE *) av; + } + return NULL; +} + +/* deferred_array_clear --- flush all the values in symbol[] */ + +static NODE ** +deferred_array_clear(NODE *symbol, NODE *subs) +{ + array_t *av = (array_t *) symbol->xarray; + + (void) SUPER(aclear)(symbol, subs); + if (av) { + symbol->xarray = NULL; + (*av->load_func)(symbol, av->data); + symbol->xarray = (NODE *) av; + } + return NULL; +} + /* * dyn_array --- array with triggers for reading and writing @@ -272,12 +302,13 @@ dyn_array_remove(NODE *symbol, NODE *subs) { array_t *av = (array_t *) symbol->xarray; + (void) SUPER(aremove)(symbol, subs); if (av && av->store_func) { symbol->xarray = NULL; (*av->store_func)(symbol, subs, NULL, av->data); symbol->xarray = (NODE *) av; } - return SUPER(aremove)(symbol, subs); + return NULL; } /* dyn_array_clear --- flush all the values in symbol[] */ @@ -287,12 +318,13 @@ dyn_array_clear(NODE *symbol, NODE *subs) { array_t *av = (array_t *) symbol->xarray; + (void) SUPER(aclear)(symbol, subs); if (av && av->store_func) { symbol->xarray = NULL; (*av->store_func)(symbol, NULL, NULL, av->data); symbol->xarray = (NODE *) av; } - return SUPER(aclear)(symbol, subs); + return NULL; } /* dyn_array_list --- return a list of items in symbol[] */ |