develooper Front page | perl.perl5.porters | Postings from January 2004

[perl #25151] [PATCH] Text::Balanced extract_multiple, neg. substr length

From:
David Manura
Date:
January 19, 2004 20:45
Subject:
[perl #25151] [PATCH] Text::Balanced extract_multiple, neg. substr length
Message ID:
rt-3.0.8-25151-71443.1.15579086172282@perl.org
# New Ticket Created by  David Manura 
# Please include the string:  [perl #25151]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=25151 >


This is a bug report for perl from davidm.perl@math2.org,
generated with the help of perlbug 1.34 running under perl v5.8.3.


-----------------------------------------------------------------
[Please enter your report here]

Here's a patch for the extract_multiple function in Text::Balanced 1.95.
The patch includes a new test case that fails in the original code.

The problem was that in certain cases, $unkpos, which is the start index of the
currently being processed unrecognized chunk of text, was not set correctly,
thereby causing the third substr parameter on the below line to be negative,
which in turn yeilds very unexpected results.

   push @fields, substr($$textref, $unkpos,
                                $lastpos-$unkpos).$pref;



===============
--- perl-5.8.3/lib/Text/Balanced/t/extmul.t	2001-11-19 22:59:36.000000000 -0500
+++ perl-5.8.3-patched/lib/Text/Balanced/t/extmul.t	2004-01-19 22:36:36.000000000 -0500
@@ -13,7 +13,7 @@
  # Change 1..1 below to 1..last_test_to_print .
  # (It may become useful if the test is moved to ./t subdirectory.)

-BEGIN { $| = 1; print "1..85\n"; }
+BEGIN { $| = 1; print "1..86\n"; }
  END {print "not ok 1\n" unless $loaded;}
  use Text::Balanced qw ( :ALL );
  $loaded = 1;
@@ -316,3 +316,10 @@

  expect [ pos ], [ 0 ];
  expect [ $_ ], [ substr($stdtext3,2) ];
+
+# TEST 86
+
+# Fails in Text-Balanced-1.95 with result ['1 ', '""', '1234']
+$_ = q{ ""1234};
+expect	[ extract_multiple(undef, [\&extract_quotelike]) ],
+	[ ' ', '""', '1234' ];
Only in perl-5.8.3-patched/lib/Text/Balanced/t: extmul.t~
diff -r -u perl-5.8.3/lib/Text/Balanced.pm perl-5.8.3-patched/lib/Text/Balanced.pm
--- perl-5.8.3/lib/Text/Balanced.pm	2003-07-04 10:33:00.000000000 -0400
+++ perl-5.8.3-patched/lib/Text/Balanced.pm	2004-01-19 22:35:42.000000000 -0500
@@ -930,7 +930,7 @@
  				if (defined($field) && length($field))
  				{
  					if (!$igunk) {
-						$unkpos = pos $$textref
+						$unkpos = $lastpos
  							if length($pref) && !defined($unkpos);
  						if (defined $unkpos)
  						{
===============

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
     category=library
     severity=medium
---
Site configuration information for perl v5.8.3:

Configured by dmanura at Mon Jan 19 21:39:59 2004.

Summary of my perl5 (revision 5 version 8 subversion 3) configuration:
   Platform:
     osname=MSWin32, osvers=4.0, archname=MSWin32-x86-multi-thread
     uname=''
     config_args='undef'
     hint=recommended, useposix=true, d_sigaction=undef
     usethreads=undef use5005threads=undef useithreads=define usemultiplicity=define
     useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
     use64bitint=undef use64bitall=undef uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='cl', ccflags ='-nologo -Gf -W3 -MD -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT  -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX',
     optimize='-MD -DNDEBUG -O1',
     cppflags='-DWIN32'
     ccversion='', gccversion='', gccosandvers=''
     intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
     d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=10
     ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', lseeksize=8
     alignbytes=8, prototype=define
   Linker and Libraries:
     ld='link', ldflags ='-nologo -nodefaultlib -release  -libpath:"c:\perl\lib\CORE"  -machine:x86'
     libpth=D:\lib\mvs-6.0\VC98\lib
     libs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
     perllibs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
     libc=msvcrt.lib, so=dll, useshrplib=yes, libperl=perl58.lib
     gnulibc_version='undef'
   Dynamic Linking:
     dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
     cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -release  -libpath:"c:\perl\lib\CORE"  -machine:x86'

Locally applied patches:


---
@INC for perl v5.8.3:
     d:/testing/perl-5.8.3/lib
     .

---
Environment for perl v5.8.3:
     HOME=
     LANG (unset)
     LANGUAGE (unset)
     LD_LIBRARY_PATH (unset)
     LOGDIR (unset)
     PATH=
     PERLDB_OPTS=RemotePort=127.0.0.1:2000
     PERL_BADLANG (unset)
     SHELL (unset)




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About