//\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
\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
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
\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
// 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
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