--- modules/csv/csv.tcl.orig	2012-10-09 12:02:21.000000000 +0200
+++ modules/csv/csv.tcl	2012-10-09 12:25:08.000000000 +0200
@@ -11,7 +11,7 @@
 # RCS: @(#) $Id: csv.tcl,v 1.28 2011/11/23 02:22:10 andreas_kupries Exp $
 
 package require Tcl 8.3
-package provide csv 0.7.3
+package provide csv 0.7.4
 
 namespace eval ::csv {
     namespace export join joinlist read2matrix read2queue report 
@@ -25,15 +25,17 @@
 # Arguments:
 #	values		A list of the values to join
 #	sepChar		The separator character, defaults to comma
+#	delChar		The delimiter character, defaults to quote
+#	forceDel	If set, values are always surrounded by delChar
 #
 # Results:
 #	A string containing the values in CSV format.
 
-proc ::csv::join {values {sepChar ,} {delChar \"}} {
+proc ::csv::join {values {sepChar ,} {delChar \"} {forceDel {}}} {
     set out ""
     set sep {}
     foreach val $values {
-	if {[string match "*\[${delChar}$sepChar\r\n\]*" $val]} {
+	if {$forceDel ne {} || [string match "*\[${delChar}$sepChar\r\n\]*" $val]} {
 	    append out $sep${delChar}[string map [list $delChar ${delChar}${delChar}] $val]${delChar}
 	} else {
 	    append out $sep${val}
@@ -53,16 +55,18 @@
 # Arguments:
 #	values		A list of the lists of the values to join
 #	sepChar		The separator character, defaults to comma
+#	delChar		The delimiter character, defaults to quote
+#	forceDel	If set, values are always surrounded by delChar
 #
 # Results:
 #	A string containing the values in CSV format, the records
 #	separated by newlines.
 
-proc ::csv::joinlist {values {sepChar ,} {delChar \"}} {
+proc ::csv::joinlist {values {sepChar ,} {delChar \"} {forceDel {}}} {
     set out ""
     foreach record $values {
 	# note that this is ::csv::join
-	append out "[join $record $sepChar $delChar]\n"
+	append out "[join $record $sepChar $delChar $forceDel]\n"
     }
     return $out
 }
@@ -77,13 +81,15 @@
 # Arguments:
 #	matrix		Matrix object command.
 #	sepChar		The separator character, defaults to comma
+#	delChar		The delimiter character, defaults to quote
+#	forceDel	If set, values are always surrounded by delChar
 #
 # Results:
 #	A string containing the values in CSV format, the records
 #	separated by newlines.
 
-proc ::csv::joinmatrix {matrix {sepChar ,} {delChar \"}} {
-    return [joinlist [$matrix get rect 0 0 end end] $sepChar $delChar]
+proc ::csv::joinmatrix {matrix {sepChar ,} {delChar \"} {forceDel {}}} {
+    return [joinlist [$matrix get rect 0 0 end end] $sepChar $delChar $forceDel]
 }
 
 # ::csv::iscomplete --
--- modules/csv/csv.man.orig	2012-10-09 12:19:59.000000000 +0200
+++ modules/csv/csv.man	2012-10-09 12:24:52.000000000 +0200
@@ -1,11 +1,11 @@
 [comment {-*- tcl -*-}]
-[manpage_begin csv n 0.7.3]
+[manpage_begin csv n 0.7.4]
 [copyright {2002-2011 Andreas Kupries <andreas_kupries@users.sourceforge.net>}]
 [moddesc   {CSV processing}]
 [titledesc {Procedures to handle CSV data.}]
 [category  {Text processing}]
 [require Tcl 8.3]
-[require csv [opt 0.7.3]]
+[require csv [opt 0.7.4]]
 [description]
 
 [para]
@@ -26,33 +26,37 @@
 record. The result is a boolean flag indicating the completeness of
 the data. The result is true if the data is complete.
 
-[call [cmd ::csv::join] [arg values] "{[arg sepChar] ,}" "{[arg delChar] \"}"]
+[call [cmd ::csv::join] [arg values] "{[arg sepChar] ,}" "{[arg delChar] \"}" "{[arg forceDel] {}}"]
 
 Takes a list of values and returns a string in CSV format containing
 these values. The separator character can be defined by the caller,
 but this is optional. The default is ",". The quoting character can
 be defined by the caller, but this is optional. The default is '"'.
+If forceDel is non-empty, values are always surrounded by delChar.
 
-[call [cmd ::csv::joinlist] [arg values] "{[arg sepChar] ,}" "{[arg delChar] \"}"]
+[call [cmd ::csv::joinlist] [arg values] "{[arg sepChar] ,}" "{[arg delChar] \"}" "{[arg forceDel] {}}"]
 
 Takes a list of lists of values and returns a string in CSV format
 containing these values. The separator character can be defined by the
 caller, but this is optional. The default is ",". The quoting character
 can be defined by the caller, but this is optional. The default is '"'.
+If forceDel is non-empty, values are always surrounded by delChar.
 Each element of the outer list is considered a record, these are
 separated by newlines in the result. The elements of each record are
 formatted as usual (via [cmd ::csv::join]).
 
-[call [cmd ::csv::joinmatrix] [arg matrix] "{[arg sepChar] ,}" "{[arg delChar] \"}"]
+
+[call [cmd ::csv::joinmatrix] [arg matrix] "{[arg sepChar] ,}" "{[arg delChar] \"}" "{[arg forceDel] {}}]
 
 Takes a [arg matrix] object following the API specified for the
 struct::matrix package and returns a string in CSV format containing
 these values. The separator character can be defined by the caller,
 but this is optional. The default is ",". The quoting character
 can be defined by the caller, but this is optional. The default is
-'"'. Each row of the matrix is considered a record, these are
-separated by newlines in the result. The elements of each record are
-formatted as usual (via [cmd ::csv::join]).
+'"'. If forceDel is non-empty, values are always surrounded by delChar.
+Each row of the matrix is considered a record, these are separated by
+newlines in the result. The elements of each record are formatted as
+usual (via [cmd ::csv::join]).
 
 [call [cmd ::csv::read2matrix] [opt [option -alternate]] [arg "chan m"] "{[arg sepChar] ,} {[arg expand] none}"]
 
--- modules/csv/csv.pcx.orig	2012-10-09 12:23:47.000000000 +0200
+++ modules/csv/csv.pcx	2012-10-09 12:23:26.000000000 +0200
@@ -21,19 +21,22 @@
 	checkWord
     }}
 pcx::check 0.7 std ::csv::join \
-    {checkSimpleArgs 1 3 {
+    {checkSimpleArgs 1 4 {
 	checkList
 	checkWord
+	checkWord
     checkWord
     }}
 pcx::check 0.7 std ::csv::joinlist \
-    {checkSimpleArgs 1 3 {
+    {checkSimpleArgs 1 4 {
 	checkList
 	checkWord
+	checkWord
     checkWord
     }}
 pcx::check 0.7 std ::csv::joinmatrix \
-    {checkSimpleArgs 1 3 {
+    {checkSimpleArgs 1 4 {
+	checkWord
 	checkWord
 	checkWord
     checkWord
