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

str reverse search implementation.


diffs (58 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
@@ -3693,7 +3693,7 @@ str_search(const char *s, const char *s2
 
 /* find first occurrence of needle in haystack */
 static str
-STRstrSearch(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+STRstr_search(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        (void)cntxt;
        (void)mb;
@@ -3736,12 +3736,26 @@ str_reverse_str_search(const char *s, co
 
 /* find last occurrence of arg2 in arg1 */
 static str
-STRReverseStrSearch(int *res, const str *arg1, const str *arg2)
+STRrevstr_search(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       const char *s = *arg1, *s2 = *arg2;
-
-       *res = (strNil(s) || strNil(s2)) ? int_nil : str_reverse_str_search(s, 
s2);
-       return MAL_SUCCEED;
+       (void)cntxt;
+       (void)mb;
+       bit *res = getArgReference(stk, pci, 0);
+       const str *haystack = getArgReference(stk, pci, 1);
+       const str *needle = getArgReference(stk, pci, 2);
+       bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true 
: false;
+
+       str s = *haystack, h = *needle;
+       str s_lower, h_lower, msg = MAL_SUCCEED;
+
+       if (icase) {
+               if ((msg = STRlower(&s, &s_lower)) != MAL_SUCCEED ||
+                       (msg = STRlower(&h, &h_lower)) != MAL_SUCCEED)
+                       goto bail;
+       }
+       *res = (strNil(s) || strNil(h)) ? bit_nil : str_reverse_str_search(s, 
h) ;
+ bail:
+       return msg;
 }
 
 str
@@ -4899,9 +4913,10 @@ mel_func str_init_funcs[] = {
  pattern("str", "endsWith", STRendsWith, false, "Check if string ends with 
substring, icase flag.", args(1,4, 
arg("",bit),arg("s",str),arg("suffix",str),arg("icase",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))),
- pattern("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))),
- pattern("str", "search", STRstrSearch, false, "Search for a substring, icase 
flag. Returns\nposition, -1 if not found.", args(1,4, 
arg("",int),arg("s",str),arg("c",str),arg("icase",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))),
+ pattern("str", "search", STRstr_search, false, "Search for a substring. 
Returns\nposition, -1 if not found.", args(1,3, 
arg("",int),arg("s",str),arg("c",str))),
+ pattern("str", "search", STRstr_search, false, "Search for a substring, icase 
flag. Returns\nposition, -1 if not found.", args(1,4, 
arg("",int),arg("s",str),arg("c",str),arg("icase",bit))),
+ pattern("str", "r_search", STRrevstr_search, false, "Reverse search for a 
substring. Returns\nposition, -1 if not found.", args(1,3, 
arg("",int),arg("s",str),arg("c",str))),
+ pattern("str", "r_search", STRrevstr_search, false, "Reverse search for a 
substring, icase flag. Returns\nposition, -1 if not found.", args(1,4, 
arg("",int),arg("s",str),arg("c",str),arg("icase",bit))),
  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))),
  command("str", "ltrim", STRLtrim, false, "Strip whitespaces from start of a 
string.", args(1,2, arg("",str),arg("s",str))),
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to