Index: ChangeLog
===================================================================
RCS file: /cvsroot/tcllib/tcllib/ChangeLog,v
retrieving revision 1.76
diff -u -r1.76 ChangeLog
--- ChangeLog	2001/11/12 17:23:18	1.76
+++ ChangeLog	2001/11/12 22:20:03
@@ -1,7 +1,10 @@
-2001-11-11  Andreas Kupries  <andreas_kupries@users.sourceforge.net>
+2001-11-12  Andreas Kupries  <andreas_kupries@users.sourceforge.net>
 
+	* csv: Implemented FR #481023.
+
 	* textutil: Added 'expander' code by William H. Duquette
-	  <will@wjduquette.com>.
+	  <will@wjduquette.com>. Added option -strictlength to
+	  adjust. Code by Dan Kuchler <dan@kuchler.net>.
 
 2001-11-09  Joe English  <jenglish@users.sourceforge.net>
 
Index: modules/csv/ChangeLog
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/csv/ChangeLog,v
retrieving revision 1.7
diff -u -r1.7 ChangeLog
--- modules/csv/ChangeLog	2001/10/14 20:16:50	1.7
+++ modules/csv/ChangeLog	2001/11/12 22:20:03
@@ -1,3 +1,11 @@
+2001-11-12  Andreas Kupries  <andreas_kupries@users.sourceforge.net>
+
+	* csv.test:
+	* cvs.n:
+	* csv.tcl (split2matrix, read2matrix): Implemented FR
+	  #481023. Added additional expansion behaviours, controlled via
+	  an optional argument.
+
 2001-10-14  Jeff Hobbs  <jeffh@ActiveState.com>
 
 	* csv.test (csv-1.7): 
Index: modules/csv/csv.n
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/csv/csv.n,v
retrieving revision 1.5
diff -u -r1.5 csv.n
--- modules/csv/csv.n	2001/08/02 16:38:06	1.5
+++ modules/csv/csv.n	2001/11/12 22:20:03
@@ -19,7 +19,7 @@
 .sp
 \fB::csv::joinlist\fR \fIvalues {sepChar ,}\fR
 .sp
-\fB::csv::read2matrix\fR \fIchan m {sepChar ,}\fR
+\fB::csv::read2matrix\fR \fIchan m {sepChar ,} {expand none}\fR
 .sp
 \fB::csv::read2queue\fR \fIchan q {sepChar ,}\fR
 .sp
@@ -27,6 +27,8 @@
 .sp
 \fB::csv::split\fR \fIline {sepChar ,}\fR
 .sp
+\fB::csv::split2matrix\fR \fIq line {sepChar ,} {expand none}\fR
+.sp
 \fB::csv::split2queue\fR \fIq line {sepChar ,}\fR
 .sp
 \fB::csv::writematrix\fR \fIm chan {sepChar ,}\fR
@@ -55,10 +57,11 @@
 the result. The elements of each record are formatted as usual (via
 \fB::csv::join\fR).
 .TP
-\fB::csv::read2matrix\fR \fIchan m {sepChar ,}\fR
+\fB::csv::read2matrix\fR \fIchan m {sepChar ,} {expand none}\fR
 A wrapper around \fB::csv::split2matrix\fR (see below) reading from
 CSV-formatted lines from the specified channel (until EOF) and adding
-it to the given matrix.
+it to the given matrix. For an explanation of the \fIexpand\fR
+argument see \fB::csv::split2matrix\fR.
 .TP
 \fB::csv::read2queue\fR \fIchan q {sepChar ,}\fR
 A wrapper around \fB::csv::split2queue\fR (see below) reading from
@@ -79,12 +82,33 @@
 each other can be defined by the caller, via \fIsepChar\fR, but this
 is optional. The default is ",".
 .TP
-\fB::csv::split2matrix\fR \fIm line {sepChar ,}\fR
+\fB::csv::split2matrix\fR \fIm line {sepChar ,} {expand none}\fR
 The same as \fB::csv::split\fR, but appends the resulting list as a
-new row to the matrix \fIm\fR, using the method \fBadd row\fR. It is the
-responsibility of the caller to ensure that the matrix has enough
-columns to contain the full line. If there are not enough columns the
-list of values is silently truncated at the end to fit.
+new row to the matrix \fIm\fR, using the method \fBadd row\fR. The
+expansion mode specified via \fIexpand\fR determines how the command
+handles a matrix with less columns than contained in \fIline\fR. The
+allowed modes are:
+.RS
+.TP
+\fBnone\fR
+This is the \fBdefault mode\fR. In this mode it is the responsibility
+of the caller to ensure that the matrix has enough columns to contain
+the full line. If there are not enough columns the list of values is
+silently truncated at the end to fit.
+.TP
+\fBempty\fR
+In this mode the command expands an empty matrix to hold all columns
+of the specified line, but goes no further. The overall effect is that
+the first of a series of lines determines the number of columns in the
+matrix and all following lines are truncated to that size, as if mode
+\fBnone\fR was set.
+.TP
+\fBauto\fR
+In this mode the command expands the matrix as needed to hold all
+columns contained in \Iline\fR. The overall effect is that after
+adding a series of lines the matrix will have enough columns to hold
+all columns of the longest line encoutered so far.
+.RE
 .TP
 \fB::csv::split2queue\fR \fIq line {sepChar ,}\fR
 The same as \fB::csv::split\fR, but appending the resulting list as a
Index: modules/csv/csv.tcl
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/csv/csv.tcl,v
retrieving revision 1.7
diff -u -r1.7 csv.tcl
--- modules/csv/csv.tcl	2001/10/14 20:16:50	1.7
+++ modules/csv/csv.tcl	2001/11/12 22:20:03
@@ -77,15 +77,19 @@
 #	m		The matrix to add the read data too.
 #	chan		The channel to read from.
 #	sepChar		The separator character, defaults to comma
+#	expand		The expansion mode. The default is none
 #
 # Results:
 #	A list of the values in 'line'.
 
-proc ::csv::read2matrix {chan m {sepChar ,}} {
+proc ::csv::read2matrix {chan m {sepChar ,} {expand none}} {
+    # FR #481023
+    # See 'split2matrix' for the available expansion modes.
+
     while {![eof $chan]} {
 	if {[gets $chan line] < 0} {continue}
 	if {$line == {}} {continue}
-	split2matrix $m $line $sepChar
+	split2matrix $m $line $sepChar $expand
     }
     return
 }
@@ -202,12 +206,43 @@
 #	m		The matrix to write the resulting list to.
 #	line		The string to split
 #	sepChar		The separator character, defaults to comma
+#	expand		The expansion mode. The default is none
 #
 # Results:
 #	A list of the values in 'line', written to 'q'.
+
+proc ::csv::split2matrix {m line {sepChar ,} {expand none}} {
+    # FR #481023
 
-proc ::csv::split2matrix {m line {sepChar ,}} {
-    $m add row [split $line $sepChar]
+    set csv [split $line $sepChar]
+
+    # Expansion modes
+    # - none  : default, behaviour of original implementation.
+    #           no expansion is done, lines are silently truncated
+    #           to the number of columns in the matrix.
+    #
+    # - empty : A matrix without columns is expanded to the number
+    #           of columns in the first line added to it. All
+    #           following lines are handled as if "mode == none"
+    #           was set.
+    #
+    # - auto  : Full auto-mode. The matrix is expanded as needed to
+    #           hold all columns of all lines.
+
+    switch -exact -- $expand {
+	none {}
+	empty {
+	    if {[$m columns] == 0} {
+		$m add columns [llength $csv]
+	    }
+	}
+	auto {
+	    if {[$m columns] < [llength $csv]} {
+		$m add columns [expr {[llength $csv] - [$m columns]}]
+	    }
+	}
+    }
+    $m add row $csv
     return
 }
 
Index: modules/csv/csv.test
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/csv/csv.test,v
retrieving revision 1.3
diff -u -r1.3 csv.test
--- modules/csv/csv.test	2001/10/14 20:16:50	1.3
+++ modules/csv/csv.test	2001/11/12 22:20:03
@@ -162,6 +162,27 @@
 } {1255}
 
 
+test csv-5.5 {reading csv files, empty expansion mode} {
+    set f [open [file join $::tcltest::testsDirectory mem_debug_bench.csv] r]
+    ::struct::matrix m
+    ::csv::read2matrix $f m , empty
+    close $f
+    set result [m get rect 0 227 end 231]
+    m destroy
+    set result
+} {{227 {STR append (1MB + 1MB * 3)} 125505 327765 38.29} {228 {STR append (1MB + 1MB * 5)} 158507 855295 18.53} {229 {STR append (1MB + (1b + 1K + 1b) * 100)} 33101 174031 19.02} {230 {STR info locals match} 946 1521 62.20} {231 {TRACE no trace set} 34 121 28.10}}
+
+test csv-5.6 {reading csv files, auto expansion mode} {
+    set f [open [file join $::tcltest::testsDirectory mem_debug_bench.csv] r]
+    ::struct::matrix m
+    m add columns 1
+    ::csv::read2matrix $f m , auto
+    close $f
+    set result [m get rect 0 227 end 231]
+    m destroy
+    set result
+} {{227 {STR append (1MB + 1MB * 3)} 125505 327765 38.29} {228 {STR append (1MB + 1MB * 5)} 158507 855295 18.53} {229 {STR append (1MB + (1b + 1K + 1b) * 100)} 33101 174031 19.02} {230 {STR info locals match} 946 1521 62.20} {231 {TRACE no trace set} 34 121 28.10}}
+
 tcltest::makeFile {} eval-out1.csv
 tcltest::makeFile {} eval-out2.csv
 tcltest::makeFile {} eval-out3.csv
Index: modules/textutil/ChangeLog
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/textutil/ChangeLog,v
retrieving revision 1.11
diff -u -r1.11 ChangeLog
--- modules/textutil/ChangeLog	2001/11/12 18:33:10	1.11
+++ modules/textutil/ChangeLog	2001/11/12 22:20:03
@@ -1,4 +1,4 @@
-2001-11-08  Andreas Kupries  <andreas_kupries@users.sourceforge.net>
+2001-11-12  Andreas Kupries  <andreas_kupries@users.sourceforge.net>
 
 	* textutil.n:
 	* adjust.tcl:
