aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2012-12-19 15:36:57 +0200
committerArnold D. Robbins <arnold@skeeve.com>2012-12-19 15:36:57 +0200
commit894413cf12f347facef4de3626573644d067c3bb (patch)
tree27fde9b2b956a34a23c24e416cc5ef22de6183cd
parente468705fb6c7f2b2384c20f320e617cdbd55238c (diff)
downloadegawk-894413cf12f347facef4de3626573644d067c3bb.tar.gz
egawk-894413cf12f347facef4de3626573644d067c3bb.tar.bz2
egawk-894413cf12f347facef4de3626573644d067c3bb.zip
Make indirectly updated vars accessable to SYMTAB, API.
-rw-r--r--ChangeLog8
-rw-r--r--extension/ChangeLog4
-rw-r--r--extension/testext.c47
-rw-r--r--gawkapi.c4
-rw-r--r--interpret.h5
-rw-r--r--main.c2
-rw-r--r--test/ChangeLog7
-rw-r--r--test/Makefile.am5
-rw-r--r--test/Makefile.in10
-rw-r--r--test/Maketests5
-rw-r--r--test/symtab1.ok2
-rw-r--r--test/symtab9.awk15
-rw-r--r--test/symtab9.ok1
-rw-r--r--test/testext.ok3
14 files changed, 115 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 0914e2da..54bc9086 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 */
diff --git a/gawkapi.c b/gawkapi.c
index cd09cddc..b89bdbc3 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -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 */
}
diff --git a/main.c b/main.c
index d054ec1a..88fe3bd8 100644
--- a/main.c
+++ b/main.c
@@ -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"