diff options
author | john haque <j.eh@mchsi.com> | 2012-05-03 16:36:25 -0500 |
---|---|---|
committer | john haque <j.eh@mchsi.com> | 2012-05-03 16:36:25 -0500 |
commit | dbabe5a569ad82a9faeb2f121e387ec6399f9dcb (patch) | |
tree | a868d671a650aabc34d5b6802c4514649dbe13a4 /extension/spec_array.c | |
parent | 3a8c139d1a28651bf222b05cb0895bf5066bb9f9 (diff) | |
download | egawk-dbabe5a569ad82a9faeb2f121e387ec6399f9dcb.tar.gz egawk-dbabe5a569ad82a9faeb2f121e387ec6399f9dcb.tar.bz2 egawk-dbabe5a569ad82a9faeb2f121e387ec6399f9dcb.zip |
Add extension example to read/write files with fixed-length records.
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[] */ |