diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2012-12-19 15:36:57 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2012-12-19 15:36:57 +0200 |
commit | 894413cf12f347facef4de3626573644d067c3bb (patch) | |
tree | 27fde9b2b956a34a23c24e416cc5ef22de6183cd | |
parent | e468705fb6c7f2b2384c20f320e617cdbd55238c (diff) | |
download | egawk-894413cf12f347facef4de3626573644d067c3bb.tar.gz egawk-894413cf12f347facef4de3626573644d067c3bb.tar.bz2 egawk-894413cf12f347facef4de3626573644d067c3bb.zip |
Make indirectly updated vars accessable to SYMTAB, API.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | extension/ChangeLog | 4 | ||||
-rw-r--r-- | extension/testext.c | 47 | ||||
-rw-r--r-- | gawkapi.c | 4 | ||||
-rw-r--r-- | interpret.h | 5 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | test/ChangeLog | 7 | ||||
-rw-r--r-- | test/Makefile.am | 5 | ||||
-rw-r--r-- | test/Makefile.in | 10 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/symtab1.ok | 2 | ||||
-rw-r--r-- | test/symtab9.awk | 15 | ||||
-rw-r--r-- | test/symtab9.ok | 1 | ||||
-rw-r--r-- | test/testext.ok | 3 |
14 files changed, 115 insertions, 3 deletions
@@ -8,6 +8,14 @@ * gawkapi.h (awk_input_buf_t): Move it to here. * io.c (iop_alloc, get_a_record, get_read_timeout): Adjust code. + Unrelated: Make sure that variables like NF, NR, FNR are + accessable correctly both through SYMTAB and through API. + + * gawkapi.c (api_sym_lookup): Call update_global_values(). + (api_sym_lookup_scalar): Ditto. + * interpret.h (Op_subscript, Op_subscript_lhs): Ditto. + * main.c (update_global_values): Adjust comment. + 2012-12-18 Andrew J. Schorr <aschorr@telemetry-investments.com> * gawkapi.c (sym_update_real): If setting a scalar variable that exists diff --git a/extension/ChangeLog b/extension/ChangeLog index 3e46d637..da24b788 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,7 @@ +2012-12-19 Arnold D. Robbins <arnold@skeeve.com> + + * testext.c (test_indirect_vars): New test and awk code. + 2012-12-02 Arnold D. Robbins <arnold@skeeve.com> * Makefile.am (EXTRA_DIST): Add README.fts. diff --git a/extension/testext.c b/extension/testext.c index 9367da77..8f6735c1 100644 --- a/extension/testext.c +++ b/extension/testext.c @@ -686,6 +686,52 @@ out: return result; } +/* +BEGIN { + print "line 1" > "testexttmp.txt" + print "line 2" > "testexttmp.txt" + print "line 3" > "testexttmp.txt" + close("testexttmp.txt") + ARGV[1] = "testexttmp.txt" + ARGC = 2 + getline + getline + getline # now NR should be 3 +# system("rm testexttmp.txt") + ret = test_indirect_vars() # should get correct value of NR + printf("test_indirect_var() return %d\n", ret) + delete ARGV[1] +} +*/ + +/* test_indirect_vars --- test that access to NR, NF, get correct vales */ + +static awk_value_t * +test_indirect_vars(int nargs, awk_value_t *result) +{ + awk_value_t value; + char *name = "NR"; + + assert(result != NULL); + make_number(0.0, result); + + /* system("rm testexttmp.txt") */ + (void) unlink("testexttmp.txt"); + + if (sym_lookup(name, AWK_NUMBER, & value)) + printf("test_indirect_var: sym_lookup of %s passed\n", name); + else { + printf("test_indirect_var: sym_lookup of %s failed\n", name); + goto out; + } + + printf("test_indirect_var: value of NR is %g\n", value.num_value); + + make_number(1.0, result); +out: + return result; +} + /* fill_in_array --- fill in a new array */ static void @@ -780,6 +826,7 @@ static awk_ext_func_t func_table[] = { { "print_do_lint", print_do_lint, 0 }, { "test_scalar", test_scalar, 1 }, { "test_scalar_reserved", test_scalar_reserved, 0 }, + { "test_indirect_vars", test_indirect_vars, 0 }, }; /* init_testext --- additional initialization function */ @@ -505,6 +505,8 @@ api_sym_lookup(awk_ext_id_t id, { NODE *node; + update_global_values(); /* make sure stuff like NF, NR, are up to date */ + if ( name == NULL || *name == '\0' || result == NULL @@ -532,6 +534,8 @@ api_sym_lookup_scalar(awk_ext_id_t id, || node->type != Node_var) return false; + update_global_values(); /* make sure stuff like NF, NR, are up to date */ + return node_to_awk_value(node, result, wanted); } diff --git a/interpret.h b/interpret.h index 228a3f3e..c652624a 100644 --- a/interpret.h +++ b/interpret.h @@ -225,6 +225,10 @@ top: } r = t2; } else { + /* make sure stuff like NF, NR, are up to date */ + if (t1 == symbol_table) + update_global_values(); + r = *assoc_lookup(t1, t2); } DEREF(t2); @@ -308,6 +312,7 @@ top: else if ( t1 == symbol_table && ( (*lhs)->type == Node_var || (*lhs)->type == Node_var_new)) { + update_global_values(); /* make sure stuff like NF, NR, are up to date */ (*lhs)->type = Node_var; /* in case was Node_var_new */ lhs = & ((*lhs)->var_value); /* extra level of indirection */ } @@ -1561,6 +1561,8 @@ save_argv(int argc, char **argv) /* * update_global_values --- make sure the symbol table has correct values. * Called from the grammar before dumping values. + * + * Also called when accessing through SYMTAB, and from api_sym_lookup(). */ void diff --git a/test/ChangeLog b/test/ChangeLog index af93a7e8..1897aed0 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,10 @@ +2012-12-19 Arnold D. Robbins <arnold@skeeve.com> + + * symtab9.awk, symtab9.ok: New files. + * Makefile.am (EXTRA_DIST): Add new files. + (symtab9): New test. + * symtab1.ok, testext.ok: Updated. + 2012-12-16 Arnold D. Robbins <arnold@skeeve.com> * symtab7.awk, symtab7.in, symtab7.ok, symtab8.awk, symtab8.in, diff --git a/test/Makefile.am b/test/Makefile.am index 793df595..2bf7eba2 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -813,6 +813,8 @@ EXTRA_DIST = \ symtab8.awk \ symtab8.in \ symtab8.ok \ + symtab9.awk \ + symtab9.ok \ synerr1.awk \ synerr1.ok \ synerr2.awk \ @@ -935,7 +937,8 @@ GAWK_EXT_TESTS = \ rebuf regx8bit reint reint2 rsstart1 \ rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \ strtonum switch2 \ - symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 symtab8 + symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ + symtab8 symtab9 EXTRA_TESTS = inftest regtest diff --git a/test/Makefile.in b/test/Makefile.in index b97d4380..6cdff55f 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -1025,6 +1025,8 @@ EXTRA_DIST = \ symtab8.awk \ symtab8.in \ symtab8.ok \ + symtab9.awk \ + symtab9.ok \ synerr1.awk \ synerr1.ok \ synerr2.awk \ @@ -1146,7 +1148,8 @@ GAWK_EXT_TESTS = \ rebuf regx8bit reint reint2 rsstart1 \ rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \ strtonum switch2 \ - symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 symtab8 + symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ + symtab8 symtab9 EXTRA_TESTS = inftest regtest INET_TESTS = inetdayu inetdayt inetechu inetecht @@ -3308,6 +3311,11 @@ symtab7: @AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ +symtab9: + @echo $@ + @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + double1: @echo $@ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/Maketests b/test/Maketests index e7ab3c77..457363e4 100644 --- a/test/Maketests +++ b/test/Maketests @@ -1210,6 +1210,11 @@ symtab7: @AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ +symtab9: + @echo $@ + @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + double1: @echo $@ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/symtab1.ok b/test/symtab1.ok index 3e435dd2..04709e09 100644 --- a/test/symtab1.ok +++ b/test/symtab1.ok @@ -10,7 +10,7 @@ SYMTAB["ERRNO"] = "" SYMTAB["NR"] = "0" SYMTAB["IGNORECASE"] = "0" SYMTAB["TEXTDOMAIN"] = "messages" -SYMTAB["NF"] = "-1" +SYMTAB["NF"] = "0" SYMTAB["ARGIND"] = "0" a[1] = 1 a[2][1] = 21 diff --git a/test/symtab9.awk b/test/symtab9.awk new file mode 100644 index 00000000..fd8f14d9 --- /dev/null +++ b/test/symtab9.awk @@ -0,0 +1,15 @@ +BEGIN { + file = "testit.txt" + for (i = 1; i <= 3; i++) + print("line", i) > file + close(file) + + ARGV[1] = file + ARGC = 2 + + for (i = 1; i <= 3; i++) + getline + + printf "NR should be 3, is %d\n", SYMTAB["NR"] + system("rm testit.txt") +} diff --git a/test/symtab9.ok b/test/symtab9.ok new file mode 100644 index 00000000..759a427d --- /dev/null +++ b/test/symtab9.ok @@ -0,0 +1 @@ +NR should be 3, is 3 diff --git a/test/testext.ok b/test/testext.ok index f6066352..5612e92c 100644 --- a/test/testext.ok +++ b/test/testext.ok @@ -65,6 +65,9 @@ test_scalar(lazy) returned 1, the_scalar is lazy test_scalar(dog) returned 1, the_scalar is dog test_scalar_reserved: sym_lookup of ARGC passed - got a value! test_scalar_reserved: could not update new_value2 for ARGC - pass +test_indirect_var: sym_lookup of NR passed +test_indirect_var: value of NR is 3 +test_indirect_var() return 1 answer_num = 42 message_string = hello, world new_array["hello"] = "world" |