Changeset: bbfede0c3cb4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bbfede0c3cb4
Modified Files:
        clients/Tests/MAL-signatures-hge.test
        clients/Tests/MAL-signatures.test
        monetdb5/modules/atoms/str.c
Branch: txtsim
Log Message:

Improve startsWith, endsWith, contains(search) ~bat versions.


diffs (truncated from 343 to 300 lines):

diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -50431,8 +50431,13 @@ Transform string from UTF8 to ASCII
 str
 endsWith
 command str.endsWith(X_0:str, X_1:str):bit 
-STRSuffix;
-Suffix check.
+STRendsWith;
+Check if string ends with substring.
+str
+endsWith
+pattern str.endsWith(X_0:str, X_1:str, X_2:bit):bit 
+STRendsWith;
+Check if string ends with substring, case insensitive flag.
 str
 epilogue
 command str.epilogue():void 
@@ -50549,6 +50554,11 @@ command str.search(X_0:str, X_1:str):int
 STRstrSearch;
 Search for a substring. Returns@position, -1 if not found.
 str
+search
+command str.search(X_0:str, X_1:str, X_2:bit):int 
+STRstrSearch;
+Search for a substring, case insensitive flag. Returns@position, -1 if not 
found.
+str
 space
 command str.space(X_0:int):str 
 STRspace;
@@ -50561,8 +50571,13 @@ Split string on delimiter. Returns@given
 str
 startsWith
 command str.startsWith(X_0:str, X_1:str):bit 
-STRPrefix;
-Prefix check.
+STRstartsWith;
+Check if string starts with substring.
+str
+startsWith
+command str.startsWith(X_0:str, X_1:str, X_2:bit):bit 
+STRstartsWith;
+Check if string starts with substring, case insensitive flag.
 str
 str
 command str.str(X_0:str):str 
@@ -50611,12 +50626,12 @@ Extract the suffix of a given length
 str
 toLower
 command str.toLower(X_0:str):str 
-STRLower;
+STRlower;
 Convert a string to lower case.
 str
 toUpper
 command str.toUpper(X_0:str):str 
-STRUpper;
+STRupper;
 Convert a string to upper case.
 str
 trim
diff --git a/clients/Tests/MAL-signatures.test 
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -38756,8 +38756,13 @@ Transform string from UTF8 to ASCII
 str
 endsWith
 command str.endsWith(X_0:str, X_1:str):bit 
-STRSuffix;
-Suffix check.
+STRendsWith;
+Check if string ends with substring.
+str
+endsWith
+pattern str.endsWith(X_0:str, X_1:str, X_2:bit):bit 
+STRendsWith;
+Check if string ends with substring, case insensitive flag.
 str
 epilogue
 command str.epilogue():void 
@@ -38874,6 +38879,11 @@ command str.search(X_0:str, X_1:str):int
 STRstrSearch;
 Search for a substring. Returns@position, -1 if not found.
 str
+search
+command str.search(X_0:str, X_1:str, X_2:bit):int 
+STRstrSearch;
+Search for a substring, case insensitive flag. Returns@position, -1 if not 
found.
+str
 space
 command str.space(X_0:int):str 
 STRspace;
@@ -38885,9 +38895,14 @@ STRsplitpart;
 Split string on delimiter. Returns@given field (counting from one.)
 str
 startsWith
-command str.startsWith(X_0:str, X_1:str):bit 
-STRPrefix;
-Prefix check.
+pattern str.startsWith(X_0:str, X_1:str):bit 
+STRstartsWith;
+Check if string starts with substring.
+str
+startsWith
+pattern str.startsWith(X_0:str, X_1:str, X_2:bit):bit 
+STRstartsWith;
+Check if string starts with substring, case insensitive flag.
 str
 str
 command str.str(X_0:str):str 
@@ -38936,12 +38951,12 @@ Extract the suffix of a given length
 str
 toLower
 command str.toLower(X_0:str):str 
-STRLower;
+STRlower;
 Convert a string to lower case.
 str
 toUpper
 command str.toUpper(X_0:str):str 
-STRUpper;
+STRupper;
 Convert a string to upper case.
 str
 trim
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -66,6 +66,7 @@
 #ifdef HAVE_ICONV
 #include <iconv.h>
 #endif
+#include "mal_interpreter.h"
 
 /*
  * UTF-8 Handling
@@ -3548,7 +3549,7 @@ str_lower(str *buf, size_t *buflen, cons
 }
 
 static str
-STRLower(str *res, const str *arg1)
+STRlower(str *res, const str *arg1)
 {
        str buf = NULL, msg = MAL_SUCCEED;
        const char *s = *arg1;
@@ -3587,7 +3588,7 @@ str_upper(str *buf, size_t *buflen, cons
 }
 
 static str
-STRUpper(str *res, const str *arg1)
+STRupper(str *res, const str *arg1)
 {
        str buf = NULL, msg = MAL_SUCCEED;
        const char *s = *arg1;
@@ -3627,37 +3628,25 @@ str_is_prefix(const char *s, const char 
 }
 
 static str
-STRPrefix(bit *res, const str *arg1, const str *arg2)
-{
-       const char *s = *arg1, *prefix = *arg2;
-
-       *res = (strNil(s) || strNil(prefix)) ? bit_nil : str_is_prefix(s, 
prefix);
-       return MAL_SUCCEED;
-}
-
-static str
-STRiPrefix(bit *res, const str *arg1, const str *arg2, const bit *b)
+STRstartsWith(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       const str s1 = *arg1, s2 = *arg2;
-       str msg = MAL_SUCCEED;
-       if (strNil(s1) || strNil(s2))
-               *res = bit_nil;
-       else {
-               if (*b) {
-                       str s1_lower, s2_lower;
-                       if ((msg = STRLower(&s1_lower, &s1)) != MAL_SUCCEED)
-                               return msg;
-                       if ((msg = STRLower(&s2_lower, &s2)) != MAL_SUCCEED) {
-                               GDKfree(s1_lower);
-                               return msg;
-                       }
-                       *res = str_is_prefix(s1_lower, s2_lower);
-                       GDKfree(s1_lower);
-                       GDKfree(s2_lower);
-               }
-               else
-                       *res = str_is_prefix(s1, s2);
+       (void)cntxt;
+       (void)mb;
+       bit *res = getArgReference(stk, pci, 0);
+       const str *arg1 = getArgReference(stk, pci, 1);
+       const str *arg2 = getArgReference(stk, pci, 2);
+       bit cs = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true : 
false;
+
+       str s = *arg1, prefix = *arg2;
+       str s_lower, prefix_lower, msg = MAL_SUCCEED;
+
+       if (cs) {
+               if ((msg = STRlower(&s, &s_lower)) != MAL_SUCCEED ||
+                       (msg = STRlower(&prefix, &prefix_lower)) != MAL_SUCCEED)
+                       goto bail;
        }
+       *res = (strNil(s) || strNil(prefix)) ? bit_nil :str_is_prefix(s, 
prefix) ;
+ bail:
        return msg;
 }
 
@@ -3674,37 +3663,25 @@ str_is_suffix(const char *s, const char 
 
 /* returns whether arg1 ends with arg2 */
 static str
-STRSuffix(bit *res, const str *arg1, const str *arg2)
-{
-       const char *s = *arg1, *suffix = *arg2;
-
-       *res = (strNil(s) || strNil(suffix)) ? bit_nil : str_is_suffix(s, 
suffix);
-       return MAL_SUCCEED;
-}
-
-static str
-STRiSuffix(bit *res, const str *arg1, const str *arg2, const bit *b)
+STRendsWith(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       const str s1 = *arg1, s2 = *arg2;
-       str msg = MAL_SUCCEED;
-       if (strNil(s1) || strNil(s2))
-               *res = bit_nil;
-       else {
-               if (*b) {
-                       str s1_lower, s2_lower;
-                       if ((msg = STRLower(&s1_lower, &s1)) != MAL_SUCCEED)
-                               return msg;
-                       if ((msg = STRLower(&s2_lower, &s2)) != MAL_SUCCEED) {
-                               GDKfree(s1_lower);
-                               return msg;
-                       }
-                       *res = str_is_suffix(s1_lower, s2_lower);
-                       GDKfree(s1_lower);
-                       GDKfree(s2_lower);
-               }
-               else
-                       *res = str_is_suffix(s1, s2);
+       (void)cntxt;
+       (void)mb;
+       bit *res = getArgReference(stk, pci, 0);
+       const str *arg1 = getArgReference(stk, pci, 1);
+       const str *arg2 = getArgReference(stk, pci, 2);
+       bit cs = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true : 
false;
+
+       str s = *arg1, suffix = *arg2;
+       str s_lower, suffix_lower, msg = MAL_SUCCEED;
+
+       if (cs) {
+               if ((msg = STRlower(&s, &s_lower)) != MAL_SUCCEED ||
+                       (msg = STRlower(&suffix, &suffix_lower)) != MAL_SUCCEED)
+                       goto bail;
        }
+       *res = (strNil(s) || strNil(suffix)) ? bit_nil :str_is_suffix(s, 
suffix) ;
+ bail:
        return msg;
 }
 
@@ -3720,37 +3697,25 @@ str_search(const char *s, const char *s2
 
 /* find first occurrence of needle in haystack */
 static str
-STRstrSearch(int *res, const str *haystack, const str *needle)
-{
-       const char *s = *haystack, *s2 = *needle;
-
-       *res = (strNil(s) || strNil(s2)) ? int_nil : str_search(s, s2);
-       return MAL_SUCCEED;
-}
-
-static str
-STRstrISearch(int *res, const str *haystack, const str *needle, const bit *b)
+STRstrSearch(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       const str h = *haystack, n = *needle;
-       str msg = MAL_SUCCEED;
-       if (strNil(h) || strNil(n))
-               *res = bit_nil;
-       else {
-               if (*b) {
-                       str h_lower, n_lower;
-                       if ((msg = STRLower(&h_lower, &h)) != MAL_SUCCEED)
-                               return msg;
-                       if ((msg = STRLower(&n_lower, &n)) != MAL_SUCCEED) {
-                               GDKfree(h_lower);
-                               return msg;
-                       }
-                       *res = str_is_suffix(h_lower, n_lower);
-                       GDKfree(h_lower);
-                       GDKfree(n_lower);
-               }
-               else
-                       *res = str_search(h, n);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to