diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2011-10-02 20:21:29 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2011-10-02 20:21:29 +0200 |
commit | 953f97ddd184f3dfb1ce16ee2965012965b17fac (patch) | |
tree | 96c79805953c5e58856a323f0d5426caf9e16510 | |
parent | 8dbfb49319c538b0682d4dbcc977ba5b811b86b0 (diff) | |
download | egawk-953f97ddd184f3dfb1ce16ee2965012965b17fac.tar.gz egawk-953f97ddd184f3dfb1ce16ee2965012965b17fac.tar.bz2 egawk-953f97ddd184f3dfb1ce16ee2965012965b17fac.zip |
Fix RT handling if partial terminators.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | io.c | 11 | ||||
-rw-r--r-- | test/ChangeLog | 7 | ||||
-rw-r--r-- | test/Makefile.am | 25 | ||||
-rw-r--r-- | test/Makefile.in | 25 | ||||
-rw-r--r-- | test/rtlen.ok | 3 | ||||
-rwxr-xr-x | test/rtlen.sh | 5 | ||||
-rw-r--r-- | test/rtlen01.ok | 3 | ||||
-rwxr-xr-x | test/rtlen01.sh | 8 |
9 files changed, 88 insertions, 7 deletions
@@ -1,3 +1,11 @@ +2011-10-02 Arnold D. Robbins <arnold@skeeve.com> + + * io.c (rsnullscan, get_a_record): Fix the cases where terminators + are incomplete when RS == "". Also fix the case where the new value + is shorter than the old one. Based on patch from Rogier + <rogier777@gmail.com> as submitted by Jeroen Schot + <schot@A-Eskwadraat.nl>. + 2011-09-24 Arnold D. Robbins <arnold@skeeve.com> * eval.c, io.c, re.c: Fix some spelling errors. Thanks to @@ -2870,8 +2870,12 @@ scan_data: while (*bp++ != '\n') continue; - if (bp >= iop->dataend) { /* no terminator */ + if (bp >= iop->dataend) { /* no full terminator */ iop->scanoff = recm->len = bp - iop->off - 1; + if (bp == iop->dataend) { /* half a terminator */ + recm->rt_start = bp - 1; + recm->rt_len = 1; + } *state = INDATA; return NOTERM; } @@ -3042,9 +3046,10 @@ get_a_record(char **out, /* pointer to pointer to data */ /* else leave it alone */ } else if (matchrec == rsnullscan) { - if (rtval->stlen <= recm.rt_len) + if (rtval->stlen >= recm.rt_len) { rtval->stlen = recm.rt_len; - else + free_wstr(rtval); + } else set_RT(recm.rt_start, recm.rt_len); } else set_RT(recm.rt_start, recm.rt_len); diff --git a/test/ChangeLog b/test/ChangeLog index 8c165b04..21224fd7 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,10 @@ +2011-10-02 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (rtlen, rtlen01, rtlenmb): New tests. + * rtlen.ok, rtlen.sh, rtlen01.ok, rtlen01.sh: New files. + Thanks to Rogier <rogier777@gmail.com> as forwarded by + Jeroen Schot <schot@A-Eskwadraat.nl>. + 2011-08-10 Arnold D. Robbins <arnold@skeeve.com> * Makefile.am (beginfile2, fpat3, fwtest3): New tests. diff --git a/test/Makefile.am b/test/Makefile.am index 3d259afe..57d4d464 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -655,6 +655,10 @@ EXTRA_DIST = \ rswhite.awk \ rswhite.in \ rswhite.ok \ + rtlen.ok \ + rtlen.sh \ + rtlen01.ok \ + rtlen01.sh \ scalar.awk \ scalar.ok \ sclforin.awk \ @@ -808,7 +812,8 @@ BASIC_TESTS = \ wjposer1 zero2 zeroe0 zeroflag UNIX_TESTS = \ - fflush getlnhd localenl pid pipeio1 pipeio2 poundbang space strftlng + fflush getlnhd localenl pid pipeio1 pipeio2 poundbang rtlen rtlen01 \ + space strftlng GAWK_EXT_TESTS = \ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \ @@ -834,7 +839,7 @@ MACHINE_TESTS = double1 double2 fmtspcl intformat LOCALE_CHARSET_TESTS = \ asort asorti fmttest fnarydel fnparydl lc_num1 mbfw1 \ - mbprintf1 mbprintf2 mbprintf3 rebt8b2 sort1 sprintfc + mbprintf1 mbprintf2 mbprintf3 rebt8b2 rtlenmb sort1 sprintfc # List of the tests which should be run with --lint option: NEED_LINT = \ @@ -1264,6 +1269,22 @@ rsstart3:: @head $(srcdir)/rsstart1.in | $(AWK) -f $(srcdir)/rsstart2.awk >_$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ +rtlen:: + @echo $@ + @$(srcdir)/$@.sh >_$@ || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + +rtlen01:: + @echo $@ + @$(srcdir)/$@.sh >_$@ || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + +rtlenmb:: + @echo $@ + @GAWKLOCALE=en_US.UTF-8 ; export GAWKLOCALE ; \ + $(srcdir)/rtlen.sh >_$@ || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/rtlen.ok _$@ && rm -f _$@ + nondec2:: @echo $@ @$(AWK) --non-decimal-data -v a=0x1 -f $(srcdir)/$@.awk >_$@ diff --git a/test/Makefile.in b/test/Makefile.in index 3dd318f9..e5ff2005 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -840,6 +840,10 @@ EXTRA_DIST = \ rswhite.awk \ rswhite.in \ rswhite.ok \ + rtlen.ok \ + rtlen.sh \ + rtlen01.ok \ + rtlen01.sh \ scalar.awk \ scalar.ok \ sclforin.awk \ @@ -993,7 +997,8 @@ BASIC_TESTS = \ wjposer1 zero2 zeroe0 zeroflag UNIX_TESTS = \ - fflush getlnhd localenl pid pipeio1 pipeio2 poundbang space strftlng + fflush getlnhd localenl pid pipeio1 pipeio2 poundbang rtlen rtlen01 \ + space strftlng GAWK_EXT_TESTS = \ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \ @@ -1016,7 +1021,7 @@ INET_TESTS = inetdayu inetdayt inetechu inetecht MACHINE_TESTS = double1 double2 fmtspcl intformat LOCALE_CHARSET_TESTS = \ asort asorti fmttest fnarydel fnparydl lc_num1 mbfw1 \ - mbprintf1 mbprintf2 mbprintf3 rebt8b2 sort1 sprintfc + mbprintf1 mbprintf2 mbprintf3 rebt8b2 rtlenmb sort1 sprintfc # List of the tests which should be run with --lint option: @@ -1615,6 +1620,22 @@ rsstart3:: @head $(srcdir)/rsstart1.in | $(AWK) -f $(srcdir)/rsstart2.awk >_$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ +rtlen:: + @echo $@ + @$(srcdir)/$@.sh >_$@ || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + +rtlen01:: + @echo $@ + @$(srcdir)/$@.sh >_$@ || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + +rtlenmb:: + @echo $@ + @GAWKLOCALE=en_US.UTF-8 ; export GAWKLOCALE ; \ + $(srcdir)/rtlen.sh >_$@ || echo EXIT CODE: $$? >>_$@ + @-$(CMP) $(srcdir)/rtlen.ok _$@ && rm -f _$@ + nondec2:: @echo $@ @$(AWK) --non-decimal-data -v a=0x1 -f $(srcdir)/$@.awk >_$@ diff --git a/test/rtlen.ok b/test/rtlen.ok new file mode 100644 index 00000000..b8a484df --- /dev/null +++ b/test/rtlen.ok @@ -0,0 +1,3 @@ +3 +5 +2 diff --git a/test/rtlen.sh b/test/rtlen.sh new file mode 100755 index 00000000..4a740451 --- /dev/null +++ b/test/rtlen.sh @@ -0,0 +1,5 @@ +#! /bin/sh + +AWK=${AWK:-../gawk} + +$AWK 'BEGIN {printf "0\n\n\n1\n\n\n\n\n2\n\n"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}' diff --git a/test/rtlen01.ok b/test/rtlen01.ok new file mode 100644 index 00000000..4539bbf2 --- /dev/null +++ b/test/rtlen01.ok @@ -0,0 +1,3 @@ +0 +1 +2 diff --git a/test/rtlen01.sh b/test/rtlen01.sh new file mode 100755 index 00000000..72156d9b --- /dev/null +++ b/test/rtlen01.sh @@ -0,0 +1,8 @@ +#! /bin/sh + +AWK=${AWK:-../gawk} + +$AWK 'BEGIN {printf "0"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}' +$AWK 'BEGIN {printf "0\n"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}' +$AWK 'BEGIN {printf "0\n\n"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}' + |