aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--awk.h2
-rw-r--r--interpret.h68
-rw-r--r--main.c5
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am5
-rw-r--r--test/Makefile.in10
-rw-r--r--test/Maketests5
-rwxr-xr-xtest/sortglos.awk51
-rwxr-xr-xtest/sortglos.in22
-rw-r--r--test/sortglos.ok15
10 files changed, 175 insertions, 13 deletions
diff --git a/awk.h b/awk.h
index 9b72a53c..e788a5a8 100644
--- a/awk.h
+++ b/awk.h
@@ -1056,6 +1056,8 @@ extern bool field0_valid;
extern int do_flags;
+extern bool do_old_mem; /* XXX temporary */
+
extern SRCFILE *srcfiles; /* source files */
enum do_flag_values {
diff --git a/interpret.h b/interpret.h
index 74f56c73..2901f60e 100644
--- a/interpret.h
+++ b/interpret.h
@@ -23,7 +23,19 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-
+#define UNFIELD(l, r) \
+{ \
+ /* if was a field, turn it into a var */ \
+ if ((r->flags & FIELD) == 0) { \
+ l = r; \
+ } else if (r->valref == 1) { \
+ r->flags &= ~FIELD; \
+ l = r; \
+ } else { \
+ l = dupnode(r); \
+ DEREF(r); \
+ } \
+}
int
r_interpret(INSTRUCTION *code)
{
@@ -340,7 +352,16 @@ uninitialized_scalar:
lhs = r_get_field(t1, (Func_ptr *) 0, true);
decr_sp();
DEREF(t1);
- r = dupnode(*lhs); /* can't use UPREF here */
+ if (do_old_mem) {
+ r = dupnode(*lhs);
+ } else {
+ /* only for $0, up ref count */
+ if (*lhs == fields_arr[0]) {
+ r = *lhs;
+ UPREF(r);
+ } else
+ r = dupnode(*lhs);
+ }
PUSH(r);
break;
@@ -631,7 +652,12 @@ mod:
}
unref(*lhs);
- *lhs = POP_SCALAR();
+ if (do_old_mem) {
+ *lhs = POP_SCALAR();
+ } else {
+ r = POP_SCALAR();
+ UNFIELD(*lhs, r);
+ }
/* execute post-assignment routine if any */
if (t1->astore != NULL)
@@ -649,11 +675,21 @@ mod:
lhs = get_lhs(pc->memory, false);
unref(*lhs);
r = pc->initval; /* constant initializer */
- if (r == NULL)
- *lhs = POP_SCALAR();
- else {
- UPREF(r);
- *lhs = r;
+ if (do_old_mem) {
+ if (r == NULL)
+ *lhs = POP_SCALAR();
+ else {
+ UPREF(r);
+ *lhs = r;
+ }
+ } else {
+ if (r != NULL) {
+ UPREF(r);
+ *lhs = r;
+ } else {
+ r = POP_SCALAR();
+ UNFIELD(*lhs, r);
+ }
}
break;
@@ -669,7 +705,12 @@ mod:
decr_sp();
DEREF(t1);
unref(*lhs);
- *lhs = POP_SCALAR();
+ if (do_old_mem) {
+ *lhs = POP_SCALAR();
+ } else {
+ r = POP_SCALAR();
+ UNFIELD(*lhs, r);
+ }
assert(assign != NULL);
assign();
}
@@ -723,8 +764,13 @@ mod:
lhs = POP_ADDRESS();
r = TOP_SCALAR();
unref(*lhs);
- *lhs = r;
- UPREF(r);
+ if (do_old_mem) {
+ *lhs = r;
+ UPREF(r);
+ } else {
+ UPREF(r);
+ UNFIELD(*lhs, r);
+ }
REPLACE(r);
break;
diff --git a/main.c b/main.c
index 1323330c..69e536f6 100644
--- a/main.c
+++ b/main.c
@@ -170,6 +170,8 @@ GETGROUPS_T *groupset; /* current group set */
int ngroups; /* size of said set */
#endif
+bool do_old_mem = false; /* XXX temporary */
+
void (*lintfunc)(const char *mesg, ...) = r_warning;
/* Sorted by long option name! */
@@ -231,6 +233,9 @@ main(int argc, char **argv)
#endif /* HAVE_MTRACE */
#endif /* HAVE_MCHECK_H */
+ if (getenv("OLDMEM") != NULL)
+ do_old_mem = true; /* XXX temporary */
+
myname = gawk_name(argv[0]);
os_arg_fixup(&argc, &argv); /* emulate redirection, expand wildcards */
diff --git a/test/ChangeLog b/test/ChangeLog
index e28ac2bb..633fef51 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-16 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (sortglos): New test.
+ * sortglos.awk, sortglos.in, sortglos.ok: New files.
+
2014-11-09 Arnold D. Robbins <arnold@skeeve.com>
* mbprintf4.awk: Add record and line number for debugging.
diff --git a/test/Makefile.am b/test/Makefile.am
index f8db2833..3c850125 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -831,6 +831,9 @@ EXTRA_DIST = \
sortfor.awk \
sortfor.in \
sortfor.ok \
+ sortglos.awk \
+ sortglos.in \
+ sortglos.ok \
sortu.awk \
sortu.ok \
space.ok \
@@ -996,7 +999,7 @@ BASIC_TESTS = \
rand range1 rebt8b1 redfilnm regeq regexprange regrange reindops \
reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \
rstest3 rstest4 rstest5 rswhite \
- scalar sclforin sclifin sortempty splitargv splitarr splitdef \
+ scalar sclforin sclifin sortempty sortglos splitargv splitarr splitdef \
splitvar splitwht strcat1 strnum1 strtod subamp subi18n \
subsepnm subslash substr swaplns synerr1 synerr2 tradanch tweakfld \
uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs \
diff --git a/test/Makefile.in b/test/Makefile.in
index 62dd0666..5a7610ee 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1078,6 +1078,9 @@ EXTRA_DIST = \
sortfor.awk \
sortfor.in \
sortfor.ok \
+ sortglos.awk \
+ sortglos.in \
+ sortglos.ok \
sortu.awk \
sortu.ok \
space.ok \
@@ -1242,7 +1245,7 @@ BASIC_TESTS = \
rand range1 rebt8b1 redfilnm regeq regexprange regrange reindops \
reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \
rstest3 rstest4 rstest5 rswhite \
- scalar sclforin sclifin sortempty splitargv splitarr splitdef \
+ scalar sclforin sclifin sortempty sortglos splitargv splitarr splitdef \
splitvar splitwht strcat1 strnum1 strtod subamp subi18n \
subsepnm subslash substr swaplns synerr1 synerr2 tradanch tweakfld \
uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs \
@@ -3196,6 +3199,11 @@ sortempty:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+sortglos:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
splitargv:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index f8d5e8a9..85c13d5d 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -777,6 +777,11 @@ sortempty:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+sortglos:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
splitargv:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/sortglos.awk b/test/sortglos.awk
new file mode 100755
index 00000000..e4f910d7
--- /dev/null
+++ b/test/sortglos.awk
@@ -0,0 +1,51 @@
+BEGIN {
+ pr="y";
+ npre=0;
+ po="n";
+ npos=0;
+ }
+
+pr=="y" { npre++; pre[npre]=$0; }
+$1=="@table" && $2=="@asis" { pr="n";nite++; next; }
+
+po=="y" { npos++; pos[npos]=$0; }
+$1=="@end" && $2=="table" {
+ po="y";
+ npos++;
+ pos[npos]=$0;
+ # last item...
+ vec[nite]=nlin;
+}
+
+ { nite++; }
+
+END {
+ for ( i=1; i<=npre; i++ ) { print pre[i]; }
+ if ( srt=="y" ) {
+ n=asorti(entr,ital);
+ ##print "n=",n;
+ for ( i=1; i<=n; i++ ) {
+ #printf("=========> %3.3d %s\n",i,ital[i]);
+ # ital[i] is the sorted key;
+ j=entr[ital[i]];
+ # j is the original item number
+ for ( k=1; k<=vec[j]; k++ ) {
+ print dat[j,k];
+ }
+ }
+ }
+ if ( srt=="n" ) {
+ for ( i=1; i<=nite; i++ ) {
+ printf("=========> %3.3d %2.2d %s\n",i,vec[i],titl[i]);
+ for ( j=1; j<=vec[i]; j++ ) {
+ print dat[i,j];
+ }
+ }
+ print "========================= END";
+ }
+ for ( i=1; i<=npos; i++ ) { print pos[i]; }
+ print "@c npre=" npre;
+ print "@c nite=" nite;
+ print "@c npos=" npos;
+}
+
diff --git a/test/sortglos.in b/test/sortglos.in
new file mode 100755
index 00000000..b24373de
--- /dev/null
+++ b/test/sortglos.in
@@ -0,0 +1,22 @@
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@item Azione
+Una serie di istruzioni @command{awk} associate a una regola. Se
+l'espressione di ricerca della regola individua un record in input,
+@command{awk} esegue su quel record l'azione relativa. Le azioni sono
+sempre racchiuse fra parentesi graffe.
+(@xref{Panoramica sulle azioni}).
+
+@item Spazio bianco
+Una sequenza di spazi, TAB, o caratteri di "a capo" presenti in un record in
+input o in una stringa.
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@c aggiornato alla versione: settembre 2014
+@c ultimo aggiornamento: 14 novembre 2014
diff --git a/test/sortglos.ok b/test/sortglos.ok
new file mode 100644
index 00000000..69ddbe67
--- /dev/null
+++ b/test/sortglos.ok
@@ -0,0 +1,15 @@
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@c aggiornato alla versione: settembre 2014
+@c ultimo aggiornamento: 14 novembre 2014
+@c npre=4
+@c nite=22
+@c npos=8