aboutsummaryrefslogtreecommitdiffstats
path: root/extension/spec_array.c
diff options
context:
space:
mode:
authorjohn haque <j.eh@mchsi.com>2012-05-03 16:36:25 -0500
committerjohn haque <j.eh@mchsi.com>2012-05-03 16:36:25 -0500
commitdbabe5a569ad82a9faeb2f121e387ec6399f9dcb (patch)
treea868d671a650aabc34d5b6802c4514649dbe13a4 /extension/spec_array.c
parent3a8c139d1a28651bf222b05cb0895bf5066bb9f9 (diff)
downloadegawk-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.c40
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[] */