diff options
-rw-r--r-- | awk.h | 2 | ||||
-rw-r--r-- | interpret.h | 68 | ||||
-rw-r--r-- | main.c | 5 | ||||
-rw-r--r-- | test/ChangeLog | 5 | ||||
-rw-r--r-- | test/Makefile.am | 5 | ||||
-rw-r--r-- | test/Makefile.in | 10 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rwxr-xr-x | test/sortglos.awk | 51 | ||||
-rwxr-xr-x | test/sortglos.in | 22 | ||||
-rw-r--r-- | test/sortglos.ok | 15 |
10 files changed, 175 insertions, 13 deletions
@@ -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; @@ -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 |