]> git.8kb.co.uk Git - dataflex/df32func/blobdiff - src/df32/string.inc
Amend functionality of antiquated matrix methods and minor changes to matrix parsing...
[dataflex/df32func] / src / df32 / string.inc
index f951c2ed1faed620c9f7743181acffeb97ff9231..e09adf87bce360d56c454f20ab7f00c00c256f85 100644 (file)
@@ -206,7 +206,7 @@ function sanitize_str global string l_sInput string l_sLevel returns string
     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
@@ -261,6 +261,90 @@ function msxsl global string engine string source string stylesheet string param
     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
@@ -268,11 +352,11 @@ end_function
 // String tokenizer class\r
 //\r
 // Send message methods:\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_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
@@ -333,45 +417,46 @@ class StringTokenizer is an array
         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
+    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_iTokenOn to 0     \r
         set c_iTokens to l_iTokens\r
-       end_procedure    \r
+    end_procedure    \r
 \r
     procedure set token_value integer itemx string val\r
         forward set array_value item itemx to val\r