Changeset: b022d7490f80 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b022d7490f80
Modified Files:
        monetdb5/modules/atoms/str.c
Branch: txtsim
Log Message:

startsWith, endsWith, contains with case insensitive flag implementation(no bat 
versions yet)


diffs (190 lines):

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
@@ -3541,43 +3541,6 @@ STRWChrAt(int *res, const str *arg1, con
        return str_wchr_at(res, *arg1, *at);
 }
 
-/* returns whether arg1 starts with arg2 */
-bit
-str_is_prefix(const char *s, const char *prefix)
-{
-       return strncmp(s, prefix, strlen(prefix)) == 0;
-}
-
-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;
-}
-
-bit
-str_is_suffix(const char *s, const char *suffix)
-{
-       size_t sl = strlen(s), sul = strlen(suffix);
-
-       if (sl < sul)
-               return 0;
-       else
-               return strcmp(s + sl - sul, suffix) == 0;
-}
-
-/* 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;
-}
-
 str
 str_lower(str *buf, size_t *buflen, const char *s)
 {
@@ -3656,6 +3619,95 @@ STRUpper(str *res, const str *arg1)
        return msg;
 }
 
+/* returns whether arg1 starts with arg2 */
+bit
+str_is_prefix(const char *s, const char *prefix)
+{
+       return strncmp(s, prefix, strlen(prefix)) == 0;
+}
+
+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)
+{
+       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);
+       }
+       return msg;
+}
+
+bit
+str_is_suffix(const char *s, const char *suffix)
+{
+       size_t sl = strlen(s), sul = strlen(suffix);
+
+       if (sl < sul)
+               return 0;
+       else
+               return strcmp(s + sl - sul, suffix) == 0;
+}
+
+/* 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)
+{
+       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);
+       }
+       return msg;
+}
+
 int
 str_search(const char *s, const char *s2)
 {
@@ -3676,6 +3728,32 @@ STRstrSearch(int *res, const str *haysta
        return MAL_SUCCEED;
 }
 
+static str
+STRstrISearch(int *res, const str *haystack, const str *needle, const bit *b)
+{
+       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);
+       }
+       return msg;
+}
+
 int
 str_reverse_str_search(const char *s, const char *s2)
 {
@@ -4855,10 +4933,13 @@ mel_func str_init_funcs[] = {
  command("str", "unicodeAt", STRWChrAt, false, "get a unicode character\n(as 
an int) from a string position.", args(1,3, 
arg("",int),arg("s",str),arg("index",int))),
  command("str", "unicode", STRFromWChr, false, "convert a unicode to a 
character.", args(1,2, arg("",str),arg("wchar",int))),
  command("str", "startsWith", STRPrefix, false, "Prefix check.", args(1,3, 
arg("",bit),arg("s",str),arg("prefix",str))),
+ command("str", "startsWith", STRiPrefix, false, "Prefix check with case 
insensitive flag.", args(1,4, 
arg("",bit),arg("s",str),arg("prefix",str),arg("cs",bit))),
  command("str", "endsWith", STRSuffix, false, "Suffix check.", args(1,3, 
arg("",bit),arg("s",str),arg("suffix",str))),
+ command("str", "endsWith", STRiSuffix, false, "Suffix check with case 
insensitive flag.", args(1,4, 
arg("",bit),arg("s",str),arg("suffix",str),arg("cs",bit))),
  command("str", "toLower", STRLower, false, "Convert a string to lower case.", 
args(1,2, arg("",str),arg("s",str))),
  command("str", "toUpper", STRUpper, false, "Convert a string to upper case.", 
args(1,2, arg("",str),arg("s",str))),
  command("str", "search", STRstrSearch, false, "Search for a substring. 
Returns\nposition, -1 if not found.", args(1,3, 
arg("",int),arg("s",str),arg("c",str))),
+ command("str", "search", STRstrISearch, false, "Search for a substring. 
Returns\nposition, -1 if not found.", args(1,4, 
arg("",int),arg("s",str),arg("c",str),arg("cs",bit))),
  command("str", "r_search", STRReverseStrSearch, false, "Reverse search for a 
substring. Returns\nposition, -1 if not found.", args(1,3, 
arg("",int),arg("s",str),arg("c",str))),
  command("str", "splitpart", STRsplitpart, false, "Split string on delimiter. 
Returns\ngiven field (counting from one.)", args(1,4, 
arg("",str),arg("s",str),arg("needle",str),arg("field",int))),
  command("str", "trim", STRStrip, false, "Strip whitespaces around a string.", 
args(1,2, arg("",str),arg("s",str))),
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to