diff --git a/array.c b/array.c index aa52f3a..a47660c 100644 --- a/array.c +++ b/array.c @@ -40,7 +40,6 @@ static NODE **null_dump(NODE *symbol, NODE *subs); static afunc_t null_array_func[] = { (afunc_t) 0, (afunc_t) 0, - null_length, null_lookup, null_afunc, null_afunc, @@ -150,15 +149,6 @@ null_lookup(NODE *symbol, NODE *subs) return symbol->alookup(symbol, subs); } -/* null_length --- default function for array length interface */ - -NODE ** -null_length(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED) -{ - static NODE *tmp; - tmp = symbol; - return & tmp; -} /* null_afunc --- default function for array interface */ @@ -618,6 +608,9 @@ do_delete(NODE *symbol, int nsubs) (void) assoc_remove(symbol, subs); DEREF(subs); + if (assoc_empty(symbol)) + /* last element was removed, so reset array type to null */ + null_array(symbol); #undef free_subs } diff --git a/awk.h b/awk.h index e3f458b..5a8da4e 100644 --- a/awk.h +++ b/awk.h @@ -542,29 +542,27 @@ typedef struct exp_node { #define xarray sub.nodep.rn #define parent_array sub.nodep.x.extra -#define ainit array_funcs[0] #define ainit_ind 0 -#define atypeof array_funcs[1] +#define ainit array_funcs[ainit_ind] #define atypeof_ind 1 -#define alength array_funcs[2] -#define alength_ind 2 -#define alookup array_funcs[3] -#define alookup_ind 3 -#define aexists array_funcs[4] -#define aexists_ind 4 -#define aclear array_funcs[5] -#define aclear_ind 5 -#define aremove array_funcs[6] -#define aremove_ind 6 -#define alist array_funcs[7] -#define alist_ind 7 -#define acopy array_funcs[8] -#define acopy_ind 8 -#define adump array_funcs[9] -#define adump_ind 9 -#define astore array_funcs[10] -#define astore_ind 10 -#define NUM_AFUNCS 11 /* # of entries in array_funcs */ +#define atypeof array_funcs[atypeof_ind] +#define alookup_ind 2 +#define alookup array_funcs[alookup_ind] +#define aexists_ind 3 +#define aexists array_funcs[aexists_ind] +#define aclear_ind 4 +#define aclear array_funcs[aclear_ind] +#define aremove_ind 5 +#define aremove array_funcs[aremove_ind] +#define alist_ind 6 +#define alist array_funcs[alist_ind] +#define acopy_ind 7 +#define acopy array_funcs[acopy_ind] +#define adump_ind 8 +#define adump array_funcs[adump_ind] +#define astore_ind 9 +#define astore array_funcs[astore_ind] +#define NUM_AFUNCS 10 /* # of entries in array_funcs */ /* Node_array_ref: */ #define orig_array lnode @@ -1345,7 +1343,7 @@ DEREF(NODE *r) extern jmp_buf fatal_tag; extern int fatal_tag_valid; -#define assoc_length(a) ((*((a)->alength(a, NULL)))->table_size) +#define assoc_length(a) ((a)->table_size) #define assoc_empty(a) (assoc_length(a) == 0) #define assoc_lookup(a, s) ((a)->alookup(a, s)) @@ -1378,7 +1376,6 @@ extern const char *make_aname(const NODE *symbol); extern const char *array_vname(const NODE *symbol); extern void array_init(void); extern int register_array_func(afunc_t *afunc); -extern NODE **null_length(NODE *symbol, NODE *subs); extern NODE **null_afunc(NODE *symbol, NODE *subs); extern void set_SUBSEP(void); extern NODE *concat_exp(int nargs, bool do_subsep); diff --git a/cint_array.c b/cint_array.c index 05b9440..7db45fd 100644 --- a/cint_array.c +++ b/cint_array.c @@ -62,7 +62,6 @@ static void cint_print(NODE *symbol); afunc_t cint_array_func[] = { cint_array_init, is_uinteger, - null_length, cint_lookup, cint_exists, cint_clear, diff --git a/int_array.c b/int_array.c index 069e027..9f70517 100644 --- a/int_array.c +++ b/int_array.c @@ -49,7 +49,6 @@ static void grow_int_table(NODE *symbol); afunc_t int_array_func[] = { int_array_init, is_integer, - null_length, int_lookup, int_exists, int_clear, diff --git a/str_array.c b/str_array.c index bc6584d..4972a92 100644 --- a/str_array.c +++ b/str_array.c @@ -59,7 +59,6 @@ static NODE **str_dump(NODE *symbol, NODE *ndump); afunc_t str_array_func[] = { str_array_init, (afunc_t) 0, - null_length, str_lookup, str_exists, str_clear, @@ -78,7 +77,6 @@ static NODE **env_clear(NODE *symbol, NODE *subs); afunc_t env_array_func[] = { str_array_init, (afunc_t) 0, - null_length, str_lookup, str_exists, env_clear,