]> git.8kb.co.uk Git - dataflex/df32func/blobdiff - src/df32/string.inc
Just pushing the latest copy of my development / staging DataFlex stuff into git...
[dataflex/df32func] / src / df32 / string.inc
index 9607e6382f123e6a0d62c04194a8d5c77728b766..f951c2ed1faed620c9f7743181acffeb97ff9231 100644 (file)
@@ -5,7 +5,7 @@
 //\r
 // This file is to be included in df32func.mk\r
 //\r
-// Copyright (c) 2006-2009, glyn@8kb.co.uk\r
+// Copyright (c) 2006-2015, glyn@8kb.co.uk\r
 // \r
 // df32func/string.inc\r
 //-------------------------------------------------------------------------\r
@@ -87,7 +87,7 @@ end_function
 \r
 // Standard escaping via C standard.\r
 //\r
-// For PostgreSQL when no_backslash_quote is defined single quotes are \r
+// For PostgreSQL when NO_BACKSLASH_QUOTE is defined single quotes are \r
 // escaped per SQL standard by doubling '' rather than \' because in \r
 // some encodings multibyte characters have a last byte numerically \r
 // equivalent to ASCII escaped by backslash "\".\r
@@ -97,7 +97,7 @@ function addslashes global string argv returns string
     local string l_sReturn\r
     \r
     move (replaces("\",argv,"\\")) to l_sReturn\r
-    #IFDEF no_backslash_quote\r
+    #IFDEF NO_BACKSLASH_QUOTE\r
         move (replaces("'",l_sReturn,"''")) to l_sReturn\r
     #ELSE\r
         move (replaces("'",l_sReturn,"\'")) to l_sReturn\r
@@ -249,9 +249,9 @@ function msxsl global string engine string source string stylesheet string param
 \r
             if (outfile = "") begin\r
                 move (file_size_bytes(l_sFile)) to l_iFileSize\r
-                direct_input channel default_file_channel l_sFile\r
-                    read_block channel default_file_channel l_sReturn l_iFileSize\r
-                close_input channel default_file_channel\r
+                direct_input channel DEFAULT_FILE_CHANNEL l_sFile\r
+                    read_block channel DEFAULT_FILE_CHANNEL l_sReturn l_iFileSize\r
+                close_input channel DEFAULT_FILE_CHANNEL\r
                 move (fileopp("delete",l_sFile,"")) to l_iThrow\r
             end\r
             else move outfile to l_sReturn\r
@@ -268,8 +268,11 @@ end_function
 // String tokenizer class\r
 //\r
 // Send message methods:\r
-//    set_string\r
-//\r
+//    set_string <string> <delimiter>  - Send the string to be tokenized and the delimiter to split on\r
+//    set_string_csv <string>              - Send a CSV string to be tokenized. As per general CSV data:\r
+//                                                                                     * Items containting commas to be enclosed in double quotes:  '"'\r
+//                                                                                     * Double quotes in quotes to be escaped with a backslash:    '\'\r
+//                                                                                     \r
 // Set methods:\r
 //    token_value \r
 //\r
@@ -329,6 +332,46 @@ class StringTokenizer is an array
         set c_iTokenOn to 0\r
         set c_iTokens to l_iTokens\r
     end_procedure\r
+    \r
+       procedure set_string_csv string argv    \r
+               local integer l_i l_iQuot l_iTokens\r
+               local string l_sChar l_sLast l_sNext l_sBuf\r
+               \r
+               move -1 to l_iTokens\r
+               move 0 to l_iQuot\r
+               move "" to l_sLast\r
+               \r
+               for l_i from 0 to (length(argv))\r
+                       move (mid(argv,1,l_i)) to l_sChar\r
+                       move (mid(argv,1,l_i+1)) to l_sNext\r
+                       move (mid(argv,1,l_i-1)) to l_sLast             \r
+                       \r
+                       if ((l_iQuot) and (l_sChar = '\') and (l_sNext = '"')) break begin\r
+                       \r
+                       if ((l_sChar = '"') and (l_sLast <> '\')) begin\r
+                               if (l_iQuot) move 0 to l_iQuot\r
+                               else move 1 to l_iQuot\r
+                       end\r
+                       if ((l_sChar = '"') and (l_sLast <> '\')) break begin           \r
+                       \r
+                       if ((l_sChar = ',') and not (l_iQuot)) begin\r
+                               //fwd to Array\r
+                               increment l_iTokens\r
+                               forward set array_value item l_iTokens to l_sBuf\r
+                               move "" to l_sBuf\r
+                       end\r
+                       if ((l_sChar = ',') and not (l_iQuot)) break begin\r
+                       \r
+                       append l_sBuf l_sChar\r
+               loop\r
+               \r
+               //fwd to Array\r
+               increment l_iTokens             \r
+               forward set array_value item l_iTokens to l_sBuf\r
+\r
+               set c_iTokenOn to 0             \r
+        set c_iTokens to l_iTokens\r
+       end_procedure    \r
 \r
     procedure set token_value integer itemx string val\r
         forward set array_value item itemx to val\r