//\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
function_return l_sReturn \r
end_function\r
\r
-// Return none blank of two strings\r
+// Return one blank of two strings\r
function nbstring global string argv string argv2 returns string\r
if (argv <> "") function_return argv\r
else if (argv2 <> "") function_return argv2\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
function_return l_sReturn\r
end_function\r
\r
+// Check if a string looks like a valid dataflex number\r
+//True\r
+// showln (is_number("99999999999999.99999999")) (is_number("-99999999999999.99999999"))\r
+// showln (is_number("99999999999999.0")) (is_number("0")) (is_number("-0")) (is_number("100"))\r
+//False\r
+// showln (is_number("99999999999999.999999999")) (is_number("-999999999999999.99999999"))\r
+// showln (is_number("999999999999999.99999999")) (is_number("1-0")) (is_number(".0D"))\r
+// showln (is_number("")) (is_number("-")) (is_number("100A")) (is_number("A100"))\r
+function is_number global string argv returns integer\r
+ local integer l_iChar l_iDec l_iNum l_iLen l_i l_iNeg\r
+ \r
+ move 0 to l_iNum \r
+ move 0 to l_iDec\r
+ \r
+ // Is the value negative\r
+ if (ascii(mid(argv,1,1)) = 45);\r
+ move 1 to l_iNeg\r
+ else;\r
+ move 0 to l_iNeg\r
+ \r
+ move (length(argv)) to l_iLen\r
+ \r
+ // Check basic length conforms to number\r
+ if ((l_iLen-L_iNeg = 0) or (l_iLen-l_iNeg > 23)) function_return 0\r
+ \r
+ //Check for non numerics\r
+ for l_i from (1+l_iNeg) to l_iLen\r
+ move (ascii(mid(argv,1,l_i))) to l_iChar\r
+ if ((l_iChar = 46) and ((l_iDec = 1) or (l_i > 15+l_iNeg))) break\r
+ if not ((l_iChar >= 48) and (l_iChar <= 57) or (l_iChar = 46)) break \r
+ if (l_iChar = 46);\r
+ move 1 to l_iDec\r
+ increment l_iNum\r
+ loop\r
+ \r
+ function_return ((l_iNum+l_iNeg) = l_iLen)\r
+end_function\r
+\r
+\r
+// Check if a string looks like a valid dataflex integer\r
+//True\r
+// showln (is_integer("2147483647")) (is_integer("2147483638")) \r
+// showln (is_integer("-2147483647")) (is_integer("-2147483648")) \r
+// showln (is_integer("0")) (is_integer("-0"))\r
+//False\r
+// showln (is_integer("214748364 ")) (is_integer("2147483648")) (is_integer("2947483647"))\r
+// showln (is_integer("-2147483649")) (is_integer("21474836478")) (is_integer("21474836470"))\r
+// showln (is_integer("-21474836470")) (is_integer("214748364A")) (is_integer("-A"))\r
+// showln (is_integer("-214748364A")) (is_integer("-")) (is_integer("-21474B364P"))\r
+function is_integer global string argv returns integer\r
+ local integer l_iChar l_iInt l_iLen l_i l_iNeg \r
+ \r
+ move 0 to l_iInt\r
+ move (length(argv)) to l_iLen\r
+ \r
+ //Is the value negative\r
+ if (ascii(mid(argv,1,1)) = 45);\r
+ move 1 to l_iNeg\r
+ else;\r
+ move 0 to l_iNeg \r
+ \r
+ // Check basic length conforms to integer\r
+ if ((l_iLen-L_iNeg = 0) or (l_iLen-l_iNeg > 10)) function_return 0 \r
+ \r
+ //Check for non numerics\r
+ for l_i from (1+l_iNeg) to l_iLen\r
+ move (ascii(mid(argv,1,l_i))) to l_iChar\r
+ if not ((l_iChar >= 48) and (l_iChar <= 57)) break\r
+ increment l_iInt\r
+ loop\r
+\r
+ //Check for 32 bit signed integer bounds\r
+ if ((l_iLen-l_iNeg = 10) and ((l_iInt+l_iNeg) = l_iLen)) begin \r
+ if (integer(mid(argv,9,1+l_iNeg)) > 214748364);\r
+ function_return 0\r
+ if (integer(mid(argv,9,1+l_iNeg)) = 214748364) begin \r
+ if (integer(mid(argv,1,10+l_iNeg)) > 7+l_iNeg);\r
+ function_return 0\r
+ end\r
+ end\r
+ \r
+ function_return ((l_iInt+l_iNeg) = l_iLen)\r
+end_function\r
+\r
//-------------------------------------------------------------------------\r
// Classes\r
//-------------------------------------------------------------------------\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
+ 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