aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--interpret.h28
-rw-r--r--test/ChangeLog9
-rw-r--r--test/Makefile.am91
-rw-r--r--test/Makefile.in132
-rw-r--r--test/Maketests40
-rw-r--r--test/functab1.awk3
-rw-r--r--test/functab1.ok2
-rw-r--r--test/functab2.awk8
-rw-r--r--test/functab2.ok2
-rw-r--r--test/functab3.awk10
-rw-r--r--test/functab3.ok2
-rw-r--r--test/functab4.awk14
-rw-r--r--test/functab4.ok3
-rw-r--r--test/id.awk11
-rw-r--r--test/id.ok32
-rw-r--r--test/symtab1.awk18
-rw-r--r--test/symtab1.ok31
-rw-r--r--test/symtab2.awk6
-rw-r--r--test/symtab2.ok2
-rw-r--r--test/symtab3.awk1
-rw-r--r--test/symtab3.ok2
22 files changed, 374 insertions, 78 deletions
diff --git a/ChangeLog b/ChangeLog
index ec40159c..31869feb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-10-04 Arnold D. Robbins <arnold@skeeve.com>
+
+ * interpret.h (Op_Subscript): Added lint warnings for FUNCTAB
+ and SYMTAB.
+
2012-10-02 Arnold D. Robbins <arnold@skeeve.com>
* awk.h (func_table): Declare.
diff --git a/interpret.h b/interpret.h
index 5bd3e3a6..ab6c9b33 100644
--- a/interpret.h
+++ b/interpret.h
@@ -212,6 +212,12 @@ top:
/* for FUNCTAB, get the name as the element value */
if (t1 == func_table) {
+ static bool warned = false;
+
+ if (do_lint && ! warned) {
+ warned = true;
+ lintwarn(_("FUNCTAB is a gawk extension"));
+ }
r = t2;
} else {
r = *assoc_lookup(t1, t2);
@@ -219,8 +225,16 @@ top:
DEREF(t2);
/* for SYMTAB, step through to the actual variable */
- if (t1 == symbol_table && r->type == Node_var)
- r = r->var_value;
+ if (t1 == symbol_table) {
+ static bool warned = false;
+
+ if (do_lint && ! warned) {
+ warned = true;
+ lintwarn(_("SYMTAB is a gawk extension"));
+ }
+ if (r->type == Node_var)
+ r = r->var_value;
+ }
if (r->type == Node_val)
UPREF(r);
@@ -909,9 +923,13 @@ match_re:
f = lookup(t1->stptr);
}
- if (f == NULL || f->type != Node_func)
- fatal(_("function called indirectly through `%s' does not exist"),
- pc->func_name);
+ if (f == NULL || f->type != Node_func) {
+ if (f->type == Node_ext_func)
+ fatal(_("cannot (yet) call extension functions indirectly"));
+ else
+ fatal(_("function called indirectly through `%s' does not exist"),
+ pc->func_name);
+ }
pc->func_body = f; /* save for next call */
ni = setup_frame(pc);
diff --git a/test/ChangeLog b/test/ChangeLog
index b8e55945..ff38cdcd 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,12 @@
+2012-10-04 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (functab1, functab2, functab3, functab4, id, symtab1,
+ symtab2, symtab3): New tests.
+ * functab1.awk, functab1.ok, functab2.awk, functab2.ok, functab3.awk,
+ functab3.ok, functab4.awk, functab4.ok, id.awk, id.ok, symtab1.awk,
+ symtab1.ok, symtab2.awk, symtab2.ok, symtab3.awk, symtab3.ok:
+ New files.
+
2012-09-23 Arnold D. Robbins <arnold@skeeve.com>
* lintwarn.ok: Updated.
diff --git a/test/Makefile.am b/test/Makefile.am
index 962ab6b2..1f20b923 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -47,8 +47,6 @@ EXTRA_DIST = \
anchgsub.awk \
anchgsub.in \
anchgsub.ok \
- arraysort.awk \
- arraysort.ok \
argarray.awk \
argarray.in \
argarray.ok \
@@ -62,6 +60,8 @@ EXTRA_DIST = \
arrayprm3.ok \
arrayref.awk \
arrayref.ok \
+ arraysort.awk \
+ arraysort.ok \
arrymem1.awk \
arrymem1.ok \
arryref2.awk \
@@ -160,10 +160,10 @@ EXTRA_DIST = \
defref.ok \
delargv.awk \
delargv.ok \
- delarprm.awk \
- delarprm.ok \
delarpm2.awk \
delarpm2.ok \
+ delarprm.awk \
+ delarprm.ok \
delfunc.awk \
delfunc.ok \
delsub.awk \
@@ -199,8 +199,8 @@ EXTRA_DIST = \
fcall_exit.awk \
fcall_exit.ok \
fcall_exit2.awk \
- fcall_exit2.ok \
fcall_exit2.in \
+ fcall_exit2.ok \
fflush.ok \
fflush.sh \
fieldwdth.awk \
@@ -214,9 +214,9 @@ EXTRA_DIST = \
fldchgnf.awk \
fldchgnf.in \
fldchgnf.ok \
+ fmtspcl-mpfr.ok \
fmtspcl.awk \
fmtspcl.tok \
- fmtspcl-mpfr.ok \
fmttest.awk \
fmttest.ok \
fnamedat.awk \
@@ -227,9 +227,9 @@ EXTRA_DIST = \
fnarray2.awk \
fnarray2.in \
fnarray2.ok \
+ fnarydel-mpfr.ok \
fnarydel.awk \
fnarydel.ok \
- fnarydel-mpfr.ok \
fnaryscl.awk \
fnaryscl.ok \
fnasgnm.awk \
@@ -239,13 +239,19 @@ EXTRA_DIST = \
fnmatch.ok \
fnmisc.awk \
fnmisc.ok \
+ fnparydl-mpfr.ok \
fnparydl.awk \
fnparydl.ok \
- fnparydl-mpfr.ok \
+ fordel.awk \
+ fordel.ok \
fork.awk \
fork.ok \
fork2.awk \
fork2.ok \
+ forref.awk \
+ forref.ok \
+ forsimp.awk \
+ forsimp.ok \
fpat1.awk \
fpat1.in \
fpat1.ok \
@@ -257,12 +263,6 @@ EXTRA_DIST = \
fpatnull.awk \
fpatnull.in \
fpatnull.ok \
- fordel.awk \
- fordel.ok \
- forref.awk \
- forref.ok \
- forsimp.awk \
- forsimp.ok \
fsbs.awk \
fsbs.in \
fsbs.ok \
@@ -279,6 +279,14 @@ EXTRA_DIST = \
fstabplus.in \
fstabplus.ok \
fts.awk \
+ functab1.awk \
+ functab1.ok \
+ functab2.awk \
+ functab2.ok \
+ functab3.awk \
+ functab3.ok \
+ functab4.awk \
+ functab4.ok \
funlen.awk \
funlen.in \
funlen.ok \
@@ -367,29 +375,31 @@ EXTRA_DIST = \
icasers.awk \
icasers.in \
icasers.ok \
+ id.awk \
+ id.ok \
igncdym.awk \
igncdym.in \
igncdym.ok \
igncfs.awk \
igncfs.in \
igncfs.ok \
+ ignrcas2.awk \
+ ignrcas2.ok \
ignrcase.awk \
ignrcase.in \
ignrcase.ok \
- ignrcas2.awk \
- ignrcas2.ok \
- inclib.awk \
- include.awk \
- include.ok \
- include2.ok \
incdupe.ok \
incdupe2.ok \
incdupe3.ok \
- inchello.awk \
incdupe4.ok \
incdupe5.ok \
incdupe6.ok \
incdupe7.ok \
+ inchello.awk \
+ inclib.awk \
+ include.awk \
+ include.ok \
+ include2.ok \
indirectcall.awk \
indirectcall.in \
indirectcall.ok \
@@ -434,8 +444,8 @@ EXTRA_DIST = \
longsub.in \
longsub.ok \
longwrds.awk \
- longwrds.ok \
longwrds.in \
+ longwrds.ok \
manglprm.awk \
manglprm.in \
manglprm.ok \
@@ -602,9 +612,6 @@ EXTRA_DIST = \
prdupval.awk \
prdupval.in \
prdupval.ok \
- profile2.ok \
- profile3.awk \
- profile3.ok \
prec.awk \
prec.ok \
printf0.awk \
@@ -626,24 +633,30 @@ EXTRA_DIST = \
prmreuse.ok \
procinfs.awk \
procinfs.ok \
+ profile2.ok \
+ profile3.awk \
+ profile3.ok \
prt1eval.awk \
prt1eval.ok \
prtoeval.awk \
prtoeval.ok \
pty1.awk \
pty1.ok \
+ rand-mpfr.ok \
rand.awk \
rand.ok \
- rand-mpfr.ok \
range1.awk \
range1.in \
range1.ok \
- readdir0.awk \
readdir.awk \
+ readdir0.awk \
rebt8b1.awk \
rebt8b1.ok \
rebt8b2.awk \
rebt8b2.ok \
+ rebuf.awk \
+ rebuf.in \
+ rebuf.ok \
redfilnm.awk \
redfilnm.in \
redfilnm.ok \
@@ -657,9 +670,6 @@ EXTRA_DIST = \
regtest.sh \
regx8bit.awk \
regx8bit.ok \
- rebuf.awk \
- rebuf.in \
- rebuf.ok \
reindops.awk \
reindops.in \
reindops.ok \
@@ -757,16 +767,16 @@ EXTRA_DIST = \
sprintfc.ok \
strcat1.awk \
strcat1.ok \
+ strftime.awk \
+ strftlng.awk \
+ strftlng.ok \
+ strnum1.awk \
+ strnum1.ok \
strtod.awk \
strtod.in \
strtod.ok \
- strnum1.awk \
- strnum1.ok \
strtonum.awk \
strtonum.ok \
- strftime.awk \
- strftlng.awk \
- strftlng.ok \
subamp.awk \
subamp.in \
subamp.ok \
@@ -783,6 +793,12 @@ EXTRA_DIST = \
swaplns.ok \
switch2.awk \
switch2.ok \
+ symtab1.awk \
+ symtab1.ok \
+ symtab2.awk \
+ symtab2.ok \
+ symtab3.awk \
+ symtab3.ok \
synerr1.awk \
synerr1.ok \
synerr2.awk \
@@ -837,6 +853,7 @@ EXTRA_DIST = \
zeroflag.awk \
zeroflag.ok
+
TESTS_WE_ARE_NOT_DOING_YET_FIXME_ONE_DAY = longdbl
# Get rid of core files when cleaning and generated .ok file
@@ -890,9 +907,10 @@ GAWK_EXT_TESTS = \
backw badargs beginfile1 beginfile2 binmode1 charasbytes \
clos1way delsub devfd devfd1 devfd2 dumpvars exit \
fieldwdth fpat1 fpat2 fpat3 fpatnull fsfwfs funlen \
+ functab1 functab2 functab3 functab4 \
fwtest fwtest2 fwtest3 \
gensub gensub2 getlndir gnuops2 gnuops3 gnureops \
- icasefs icasers igncdym igncfs ignrcas2 ignrcase indirectcall \
+ icasefs icasers id igncdym igncfs ignrcas2 ignrcase indirectcall \
lint lintold lintwarn \
manyfiles match1 match2 match3 mbstr1 \
nastyparm next nondec nondec2 \
@@ -901,6 +919,7 @@ GAWK_EXT_TESTS = \
rebuf regx8bit reint reint2 rsstart1 \
rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \
strtonum switch2 \
+ symtab1 symtab2 symtab3 \
include include2 incdupe incdupe2 incdupe3 \
incdupe4 incdupe5 incdupe6 incdupe7
diff --git a/test/Makefile.in b/test/Makefile.in
index cc8091a0..5bb75637 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.12.3 from Makefile.am.
+# Makefile.in generated by automake 1.12.4 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2012 Free Software Foundation, Inc.
@@ -259,8 +259,6 @@ EXTRA_DIST = \
anchgsub.awk \
anchgsub.in \
anchgsub.ok \
- arraysort.awk \
- arraysort.ok \
argarray.awk \
argarray.in \
argarray.ok \
@@ -274,6 +272,8 @@ EXTRA_DIST = \
arrayprm3.ok \
arrayref.awk \
arrayref.ok \
+ arraysort.awk \
+ arraysort.ok \
arrymem1.awk \
arrymem1.ok \
arryref2.awk \
@@ -372,10 +372,10 @@ EXTRA_DIST = \
defref.ok \
delargv.awk \
delargv.ok \
- delarprm.awk \
- delarprm.ok \
delarpm2.awk \
delarpm2.ok \
+ delarprm.awk \
+ delarprm.ok \
delfunc.awk \
delfunc.ok \
delsub.awk \
@@ -411,8 +411,8 @@ EXTRA_DIST = \
fcall_exit.awk \
fcall_exit.ok \
fcall_exit2.awk \
- fcall_exit2.ok \
fcall_exit2.in \
+ fcall_exit2.ok \
fflush.ok \
fflush.sh \
fieldwdth.awk \
@@ -426,9 +426,9 @@ EXTRA_DIST = \
fldchgnf.awk \
fldchgnf.in \
fldchgnf.ok \
+ fmtspcl-mpfr.ok \
fmtspcl.awk \
fmtspcl.tok \
- fmtspcl-mpfr.ok \
fmttest.awk \
fmttest.ok \
fnamedat.awk \
@@ -439,9 +439,9 @@ EXTRA_DIST = \
fnarray2.awk \
fnarray2.in \
fnarray2.ok \
+ fnarydel-mpfr.ok \
fnarydel.awk \
fnarydel.ok \
- fnarydel-mpfr.ok \
fnaryscl.awk \
fnaryscl.ok \
fnasgnm.awk \
@@ -451,13 +451,19 @@ EXTRA_DIST = \
fnmatch.ok \
fnmisc.awk \
fnmisc.ok \
+ fnparydl-mpfr.ok \
fnparydl.awk \
fnparydl.ok \
- fnparydl-mpfr.ok \
+ fordel.awk \
+ fordel.ok \
fork.awk \
fork.ok \
fork2.awk \
fork2.ok \
+ forref.awk \
+ forref.ok \
+ forsimp.awk \
+ forsimp.ok \
fpat1.awk \
fpat1.in \
fpat1.ok \
@@ -469,12 +475,6 @@ EXTRA_DIST = \
fpatnull.awk \
fpatnull.in \
fpatnull.ok \
- fordel.awk \
- fordel.ok \
- forref.awk \
- forref.ok \
- forsimp.awk \
- forsimp.ok \
fsbs.awk \
fsbs.in \
fsbs.ok \
@@ -491,6 +491,14 @@ EXTRA_DIST = \
fstabplus.in \
fstabplus.ok \
fts.awk \
+ functab1.awk \
+ functab1.ok \
+ functab2.awk \
+ functab2.ok \
+ functab3.awk \
+ functab3.ok \
+ functab4.awk \
+ functab4.ok \
funlen.awk \
funlen.in \
funlen.ok \
@@ -579,29 +587,31 @@ EXTRA_DIST = \
icasers.awk \
icasers.in \
icasers.ok \
+ id.awk \
+ id.ok \
igncdym.awk \
igncdym.in \
igncdym.ok \
igncfs.awk \
igncfs.in \
igncfs.ok \
+ ignrcas2.awk \
+ ignrcas2.ok \
ignrcase.awk \
ignrcase.in \
ignrcase.ok \
- ignrcas2.awk \
- ignrcas2.ok \
- inclib.awk \
- include.awk \
- include.ok \
- include2.ok \
incdupe.ok \
incdupe2.ok \
incdupe3.ok \
- inchello.awk \
incdupe4.ok \
incdupe5.ok \
incdupe6.ok \
incdupe7.ok \
+ inchello.awk \
+ inclib.awk \
+ include.awk \
+ include.ok \
+ include2.ok \
indirectcall.awk \
indirectcall.in \
indirectcall.ok \
@@ -646,8 +656,8 @@ EXTRA_DIST = \
longsub.in \
longsub.ok \
longwrds.awk \
- longwrds.ok \
longwrds.in \
+ longwrds.ok \
manglprm.awk \
manglprm.in \
manglprm.ok \
@@ -814,9 +824,6 @@ EXTRA_DIST = \
prdupval.awk \
prdupval.in \
prdupval.ok \
- profile2.ok \
- profile3.awk \
- profile3.ok \
prec.awk \
prec.ok \
printf0.awk \
@@ -838,24 +845,30 @@ EXTRA_DIST = \
prmreuse.ok \
procinfs.awk \
procinfs.ok \
+ profile2.ok \
+ profile3.awk \
+ profile3.ok \
prt1eval.awk \
prt1eval.ok \
prtoeval.awk \
prtoeval.ok \
pty1.awk \
pty1.ok \
+ rand-mpfr.ok \
rand.awk \
rand.ok \
- rand-mpfr.ok \
range1.awk \
range1.in \
range1.ok \
- readdir0.awk \
readdir.awk \
+ readdir0.awk \
rebt8b1.awk \
rebt8b1.ok \
rebt8b2.awk \
rebt8b2.ok \
+ rebuf.awk \
+ rebuf.in \
+ rebuf.ok \
redfilnm.awk \
redfilnm.in \
redfilnm.ok \
@@ -869,9 +882,6 @@ EXTRA_DIST = \
regtest.sh \
regx8bit.awk \
regx8bit.ok \
- rebuf.awk \
- rebuf.in \
- rebuf.ok \
reindops.awk \
reindops.in \
reindops.ok \
@@ -969,16 +979,16 @@ EXTRA_DIST = \
sprintfc.ok \
strcat1.awk \
strcat1.ok \
+ strftime.awk \
+ strftlng.awk \
+ strftlng.ok \
+ strnum1.awk \
+ strnum1.ok \
strtod.awk \
strtod.in \
strtod.ok \
- strnum1.awk \
- strnum1.ok \
strtonum.awk \
strtonum.ok \
- strftime.awk \
- strftlng.awk \
- strftlng.ok \
subamp.awk \
subamp.in \
subamp.ok \
@@ -995,6 +1005,12 @@ EXTRA_DIST = \
swaplns.ok \
switch2.awk \
switch2.ok \
+ symtab1.awk \
+ symtab1.ok \
+ symtab2.awk \
+ symtab2.ok \
+ symtab3.awk \
+ symtab3.ok \
synerr1.awk \
synerr1.ok \
synerr2.awk \
@@ -1102,9 +1118,10 @@ GAWK_EXT_TESTS = \
backw badargs beginfile1 beginfile2 binmode1 charasbytes \
clos1way delsub devfd devfd1 devfd2 dumpvars exit \
fieldwdth fpat1 fpat2 fpat3 fpatnull fsfwfs funlen \
+ functab1 functab2 functab3 functab4 \
fwtest fwtest2 fwtest3 \
gensub gensub2 getlndir gnuops2 gnuops3 gnureops \
- icasefs icasers igncdym igncfs ignrcas2 ignrcase indirectcall \
+ icasefs icasers id igncdym igncfs ignrcas2 ignrcase indirectcall \
lint lintold lintwarn \
manyfiles match1 match2 match3 mbstr1 \
nastyparm next nondec nondec2 \
@@ -1113,6 +1130,7 @@ GAWK_EXT_TESTS = \
rebuf regx8bit reint reint2 rsstart1 \
rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \
strtonum switch2 \
+ symtab1 symtab2 symtab3 \
include include2 incdupe incdupe2 incdupe3 \
incdupe4 incdupe5 incdupe6 incdupe7
@@ -3014,6 +3032,26 @@ funlen:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+functab1:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+functab2:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+functab3:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+functab4:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
fwtest:
@echo $@
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@@ -3069,6 +3107,11 @@ icasers:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+id:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
igncdym:
@echo $@
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@@ -3204,6 +3247,21 @@ switch2:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+symtab1:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+symtab2:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+symtab3:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
include:
@echo $@
@AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 3951c3ff..6490410c 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -960,6 +960,26 @@ funlen:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+functab1:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+functab2:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+functab3:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+functab4:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
fwtest:
@echo $@
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@@ -1015,6 +1035,11 @@ icasers:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+id:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
igncdym:
@echo $@
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@@ -1150,6 +1175,21 @@ switch2:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+symtab1:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+symtab2:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
+symtab3:
+ @echo $@
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
include:
@echo $@
@AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/functab1.awk b/test/functab1.awk
new file mode 100644
index 00000000..05692684
--- /dev/null
+++ b/test/functab1.awk
@@ -0,0 +1,3 @@
+BEGIN {
+ delete FUNCTAB
+}
diff --git a/test/functab1.ok b/test/functab1.ok
new file mode 100644
index 00000000..2a60a4cb
--- /dev/null
+++ b/test/functab1.ok
@@ -0,0 +1,2 @@
+gawk: functab1.awk:3: fatal: `delete' is not allowed with FUNCTAB
+EXIT CODE: 2
diff --git a/test/functab2.awk b/test/functab2.awk
new file mode 100644
index 00000000..9a07dfc3
--- /dev/null
+++ b/test/functab2.awk
@@ -0,0 +1,8 @@
+function foo()
+{
+ print "foo!"
+}
+
+BEGIN {
+ FUNCTAB["a"] = "something"
+}
diff --git a/test/functab2.ok b/test/functab2.ok
new file mode 100644
index 00000000..32b07ad3
--- /dev/null
+++ b/test/functab2.ok
@@ -0,0 +1,2 @@
+gawk: functab2.awk:7: fatal: cannot assign to elements of FUNCTAB
+EXIT CODE: 2
diff --git a/test/functab3.awk b/test/functab3.awk
new file mode 100644
index 00000000..98fa49b1
--- /dev/null
+++ b/test/functab3.awk
@@ -0,0 +1,10 @@
+function foo()
+{
+ print "foo!"
+}
+
+BEGIN {
+ x = FUNCTAB["foo"]
+ print "x =", x
+ @x()
+}
diff --git a/test/functab3.ok b/test/functab3.ok
new file mode 100644
index 00000000..66f53d72
--- /dev/null
+++ b/test/functab3.ok
@@ -0,0 +1,2 @@
+x = foo
+foo!
diff --git a/test/functab4.awk b/test/functab4.awk
new file mode 100644
index 00000000..0d9d4267
--- /dev/null
+++ b/test/functab4.awk
@@ -0,0 +1,14 @@
+@load "filefuncs"
+
+function foo()
+{
+ print "foo!"
+}
+
+BEGIN {
+ x = FUNCTAB["chdir"]
+ print "x =", x
+ @x("/tmp")
+ printf "we are now in --> "
+ system("/bin/pwd || /usr/bin/pwd")
+}
diff --git a/test/functab4.ok b/test/functab4.ok
new file mode 100644
index 00000000..70a520b7
--- /dev/null
+++ b/test/functab4.ok
@@ -0,0 +1,3 @@
+x = chdir
+gawk: functab4.awk:11: fatal: cannot (yet) call extension functions indirectly
+EXIT CODE: 2
diff --git a/test/id.awk b/test/id.awk
new file mode 100644
index 00000000..2a35e42c
--- /dev/null
+++ b/test/id.awk
@@ -0,0 +1,11 @@
+function function1()
+{
+ print "function1"
+}
+
+BEGIN {
+ an_array[1] = 1
+
+ for (i in PROCINFO["identifiers"])
+ printf("%s -> %s\n", i, PROCINFO["identifiers"][i])
+}
diff --git a/test/id.ok b/test/id.ok
new file mode 100644
index 00000000..d31573de
--- /dev/null
+++ b/test/id.ok
@@ -0,0 +1,32 @@
+FUNCTAB -> array
+ARGV -> array
+SYMTAB -> array
+ORS -> scalar
+ROUNDMODE -> scalar
+i -> untyped
+OFS -> scalar
+ERRNO -> scalar
+FNR -> scalar
+LINT -> scalar
+IGNORECASE -> scalar
+NR -> scalar
+function1 -> user
+ARGIND -> scalar
+NF -> scalar
+TEXTDOMAIN -> scalar
+CONVFMT -> scalar
+FIELDWIDTHS -> scalar
+ARGC -> scalar
+an_array -> untyped
+PROCINFO -> array
+PREC -> scalar
+SUBSEP -> scalar
+FPAT -> scalar
+RS -> scalar
+FS -> scalar
+OFMT -> scalar
+RLENGTH -> scalar
+RT -> scalar
+BINMODE -> scalar
+FILENAME -> scalar
+RSTART -> scalar
diff --git a/test/symtab1.awk b/test/symtab1.awk
new file mode 100644
index 00000000..6ca7d632
--- /dev/null
+++ b/test/symtab1.awk
@@ -0,0 +1,18 @@
+function dumparray(name, array, i)
+{
+ for (i in array)
+ if (isarray(array[i]))
+ dumparray(name "[" i "]", array[i])
+ else
+ printf("%s[%s] = %s\n", name, i, array[i])
+}
+
+BEGIN {
+ a[1] = 1
+ a[2][1] = 21
+ for (i in SYMTAB)
+ if (isarray(SYMTAB[i]))
+ dumparray(i, SYMTAB[i])
+ else
+ printf("SYMTAB[\"%s\"] = \"%s\"\n", i, SYMTAB[i])
+}
diff --git a/test/symtab1.ok b/test/symtab1.ok
new file mode 100644
index 00000000..3e435dd2
--- /dev/null
+++ b/test/symtab1.ok
@@ -0,0 +1,31 @@
+ARGV[0] = gawk
+SYMTAB["i"] = "i"
+SYMTAB["ROUNDMODE"] = "N"
+SYMTAB["ORS"] = "
+"
+SYMTAB["OFS"] = " "
+SYMTAB["LINT"] = "0"
+SYMTAB["FNR"] = "0"
+SYMTAB["ERRNO"] = ""
+SYMTAB["NR"] = "0"
+SYMTAB["IGNORECASE"] = "0"
+SYMTAB["TEXTDOMAIN"] = "messages"
+SYMTAB["NF"] = "-1"
+SYMTAB["ARGIND"] = "0"
+a[1] = 1
+a[2][1] = 21
+SYMTAB["ARGC"] = "1"
+SYMTAB["FIELDWIDTHS"] = ""
+SYMTAB["CONVFMT"] = "%.6g"
+SYMTAB["SUBSEP"] = ""
+SYMTAB["PREC"] = "53"
+SYMTAB["RS"] = "
+"
+SYMTAB["FPAT"] = "[^[:space:]]+"
+SYMTAB["RT"] = ""
+SYMTAB["RLENGTH"] = "0"
+SYMTAB["OFMT"] = "%.6g"
+SYMTAB["FS"] = " "
+SYMTAB["RSTART"] = "0"
+SYMTAB["FILENAME"] = ""
+SYMTAB["BINMODE"] = "0"
diff --git a/test/symtab2.awk b/test/symtab2.awk
new file mode 100644
index 00000000..bb26f75d
--- /dev/null
+++ b/test/symtab2.awk
@@ -0,0 +1,6 @@
+BEGIN {
+ a = 5
+ printf "a = %d, SYMTAB[\"a\"] = %d\n", a, SYMTAB["a"]
+ SYMTAB["a"] = 4
+ printf "a = %d, SYMTAB[\"a\"] = %d\n", a, SYMTAB["a"]
+}
diff --git a/test/symtab2.ok b/test/symtab2.ok
new file mode 100644
index 00000000..23d2bf69
--- /dev/null
+++ b/test/symtab2.ok
@@ -0,0 +1,2 @@
+a = 5, SYMTAB["a"] = 5
+a = 4, SYMTAB["a"] = 4
diff --git a/test/symtab3.awk b/test/symtab3.awk
new file mode 100644
index 00000000..4c2026dc
--- /dev/null
+++ b/test/symtab3.awk
@@ -0,0 +1 @@
+BEGIN { a = 5 ; delete SYMTAB["a"] }
diff --git a/test/symtab3.ok b/test/symtab3.ok
new file mode 100644
index 00000000..5b283583
--- /dev/null
+++ b/test/symtab3.ok
@@ -0,0 +1,2 @@
+gawk: symtab3.awk:1: fatal: `delete' is not allowed with SYMTAB
+EXIT CODE: 2