Changeset: 8a3ae2f8cc58 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8a3ae2f8cc58
Modified Files:
        monetdb5/modules/atoms/str.c
        monetdb5/modules/atoms/str.h
        monetdb5/modules/kernel/batstr.c
Branch: alloc-less-str
Log Message:

Cleaned suffix, preffix and ascii functions


diffs (truncated from 409 to 300 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
@@ -3559,39 +3559,44 @@ STRWChrAt(int *res, const str *arg1, con
 }
 
 /* returns whether arg1 starts with arg2 */
+bit
+str_is_prefix(const char *s, const char *prefix)
+{
+       if (strNil(s) || strNil(prefix)) {
+               return bit_nil;
+       }
+       return strncmp(s, prefix, strlen(prefix)) == 0;
+}
+
 str
 STRPrefix(bit *res, const str *arg1, const str *arg2)
 {
-       const char *s = *arg1;
-       const char *prefix = *arg2;
+       *res = str_is_prefix(*arg1, *arg2);
+       return MAL_SUCCEED;
+}
+
+bit
+str_is_suffix(const char *s, const char *suffix)
+{
+       size_t sl, sul;
 
-       if (strNil(s) || strNil(prefix)) {
-               *res = bit_nil;
-               return MAL_SUCCEED;
+       if (strNil(s) || strNil(suffix)) {
+               return bit_nil;
        }
-       *res = strncmp(s, prefix, strlen(prefix)) == 0;
-       return MAL_SUCCEED;
+       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 */
 str
 STRSuffix(bit *res, const str *arg1, const str *arg2)
 {
-       size_t sl, sul;
-       const char *s = *arg1;
-       const char *suffix = *arg2;
-
-       if (strNil(s) || strNil(suffix)) {
-               *res = bit_nil;
-               return MAL_SUCCEED;
-       }
-       sl = strlen(s);
-       sul = strlen(suffix);
-
-       if (sl < sul)
-               *res = 0;
-       else
-               *res = strcmp(s + sl - sul, suffix) == 0;
+       *res = str_is_suffix(*arg1, *arg2);
        return MAL_SUCCEED;
 }
 
@@ -4129,8 +4134,7 @@ STRSubstitute(str *res, const str *arg1,
 str
 STRascii(int *ret, const str *s)
 {
-       int offset=0;
-       return STRWChrAt(ret,s,&offset);
+       return str_wchr_at(ret, *s, 0);
 }
 
 str
diff --git a/monetdb5/modules/atoms/str.h b/monetdb5/modules/atoms/str.h
--- a/monetdb5/modules/atoms/str.h
+++ b/monetdb5/modules/atoms/str.h
@@ -21,6 +21,9 @@ int str_bytes(const char *s);
 str str_from_wchr(str *buf, int *buflen, int c);
 str str_wchr_at(int *res, const char *s, int at);
 
+bit str_is_prefix(const char *s, const char *prefix);
+bit str_is_suffix(const char *s, const char *suffix);
+
 str str_tail(str *buf, int *buflen, const char *s, int off);
 str str_Sub_String(str *buf, int *buflen, const char *s, int off, int l);
 str str_substring_tail(str *buf, int *buflen, const char *s, int start);
diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c
--- a/monetdb5/modules/kernel/batstr.c
+++ b/monetdb5/modules/kernel/batstr.c
@@ -74,7 +74,6 @@ str_prefix(str *buf, int *buflen, const 
        return str_Sub_String(buf, buflen, s, 0, l);
 }
 
-
 static str
 do_batstr_int(bat *res, const bat *l, const char *name, int (*func)(const char 
*))
 {
@@ -133,39 +132,50 @@ STRbatBytes(bat *ret, const bat *l)
 }
 
 static str
-STRbatAscii(bat *ret, const bat *l)
+STRbatAscii(bat *res, const bat *l)
 {
-       BATiter bi;
-       BAT *bn, *b;
+       BATiter lefti;
+       BAT *bn = NULL, *left = NULL;
        BUN p, q;
-       str x;
-       int y;
-       str msg = MAL_SUCCEED;
+       int *restrict vals, next;
+       str x, msg = MAL_SUCCEED;
+       bool nils = false;
 
-       prepareOperand(b, l, "batstr.Ascii");
-       prepareResult(bn, b, TYPE_int, "batstr.Ascii");
-
-       bi = bat_iterator(b);
+       if (!(left = BATdescriptor(*l))) {
+               msg = createException(MAL, "batstr.unicodeAt", SQLSTATE(HY005) 
RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
+       q = BATcount(left);
+       if (!(bn = COLnew(left->hseqbase, TYPE_int, q, TRANSIENT))) {
+               msg = createException(MAL, "batstr.unicodeAt", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
 
-       BATloop(b, p, q) {
-               x = (str) BUNtvar(bi, p);
-               if ((msg = STRascii(&y, &x)) != MAL_SUCCEED)
-                       goto bunins_failed;
-               if (is_int_nil(y)) {
-                       bn->tnonil = false;
-                       bn->tnil = true;
-               }
-               if (bunfastappTYPE(int, bn, &y) != GDK_SUCCEED)
-                       goto bunins_failed;
+       lefti = bat_iterator(left);
+       vals = Tloc(bn, 0);
+       for (p = 0; p < q ; p++) {
+               x = (str) BUNtail(lefti, p);
+
+               if ((msg = str_wchr_at(&next, x, 0)) != MAL_SUCCEED)
+                       goto bailout;
+               vals[p] = next;
+               nils |= is_int_nil(next);
        }
-       finalizeResult(ret, bn, b);
-       return MAL_SUCCEED;
-bunins_failed:
-       BBPunfix(b->batCacheid);
-       BBPunfix(bn->batCacheid);
-       if (msg != MAL_SUCCEED)
-               return msg;
-       throw(MAL, "batstr.Ascii", OPERATION_FAILED " During bulk operation");
+
+bailout:
+       if (left)
+               BBPunfix(left->batCacheid);
+       if (bn && !msg) {
+               BATsetcount(bn, q);
+               bn->tnil = nils;
+               bn->tnonil = !nils;
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*res = bn->batCacheid);
+       } else if (bn)
+               BBPreclaim(bn);
+       return msg;
 }
 
 static str
@@ -888,132 +898,127 @@ STRbatRpad2_bat_bat(bat *ret, const bat 
  */
 
 static str
-STRbatPrefix(bat *ret, const bat *l, const bat *r)
+prefix_or_suffix(bat *res, const bat *l, const bat *r, const char *name, bit 
(*func)(const char *, const char *))
 {
        BATiter lefti, righti;
-       BAT *bn, *left, *right;
-       BUN p,q;
-       bit v;
+       BAT *bn = NULL, *left = NULL, *right = NULL;
+       BUN p, q;
+       bit *restrict vals, next;
+       str x, y, msg = MAL_SUCCEED;
+       bool nils = false;
 
-       prepareOperand2(left,l,right,r,"batstr.startsWith");
-       if(BATcount(left) != BATcount(right)) {
-               BBPunfix(left->batCacheid);
-               BBPunfix(right->batCacheid);
-               throw(MAL, "batstr.startsWith", ILLEGAL_ARGUMENT " Requires 
bats of identical size");
+       if (!(left = BATdescriptor(*l)) || !(right = BATdescriptor(*r))) {
+               msg = createException(MAL, name, SQLSTATE(HY005) 
RUNTIME_OBJECT_MISSING);
+               goto bailout;
        }
-       prepareResult2(bn,left,right,TYPE_bit,"batstr.startsWith");
+       if (BATcount(left) != BATcount(right)) {
+               msg = createException(MAL, name, ILLEGAL_ARGUMENT " Requires 
bats of identical size");
+               goto bailout;
+       }
+       q = BATcount(left);
+       if (!(bn = COLnew(left->hseqbase, TYPE_bit, q, TRANSIENT))) {
+               msg = createException(MAL, name, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
 
        lefti = bat_iterator(left);
        righti = bat_iterator(right);
+       vals = Tloc(bn, 0);
+       for (p = 0; p < q ; p++) {
+               x = (str) BUNtail(lefti, p);
+               y = (str) BUNtail(righti, p);
 
-       BATloop(left, p, q) {
-               str tl = (str) BUNtvar(lefti,p);
-               str tr = (str) BUNtvar(righti,p);
-               STRPrefix(&v, &tl, &tr);
-               if (bunfastappTYPE(bit, bn, &v) != GDK_SUCCEED)
-                       goto bunins_failed;
+               next = func(x, y);
+               vals[p] = next;
+               nils |= is_bit_nil(next);
        }
-       bn->tnonil = false;
-       BBPunfix(right->batCacheid);
-       finalizeResult(ret,bn,left);
-       return MAL_SUCCEED;
 
-bunins_failed:
-       BBPunfix(left->batCacheid);
-       BBPunfix(right->batCacheid);
-       BBPunfix(*ret);
-       throw(MAL, "batstr.startsWith", OPERATION_FAILED " During bulk 
operation");
+bailout:
+       if (left)
+               BBPunfix(left->batCacheid);
+       if (right)
+               BBPunfix(right->batCacheid);
+       if (bn && !msg) {
+               BATsetcount(bn, q);
+               bn->tnil = nils;
+               bn->tnonil = !nils;
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*res = bn->batCacheid);
+       } else if (bn)
+               BBPreclaim(bn);
+       return msg;
+}
+
+static str
+STRbatPrefix(bat *res, const bat *l, const bat *r) 
+{
+       return prefix_or_suffix(res, l, r, "batstr.startsWith", str_is_prefix);
 }
 
 static str
-STRbatPrefixcst(bat *ret, const bat *l, const str *cst)
+STRbatSuffix(bat *res, const bat *l, const bat *r) 
 {
-       BATiter lefti;
-       BAT *bn, *left;
-       BUN p,q;
-       bit v;
-
-       prepareOperand(left,l,"batstr.startsWith");
-       prepareResult(bn,left,TYPE_bit,"batstr.startsWith");
-
-       lefti = bat_iterator(left);
-
-       BATloop(left, p, q) {
-               str tl = (str) BUNtvar(lefti,p);
-               STRPrefix(&v, &tl, cst);
-               if (bunfastappTYPE(bit, bn, &v) != GDK_SUCCEED) {
-                       BBPunfix(left->batCacheid);
-                       BBPunfix(*ret);
-                       throw(MAL, "batstr.startsWith",
-                                 OPERATION_FAILED " During bulk operation");
-               }
-       }
-       bn->tnonil = false;
-       finalizeResult(ret,bn,left);
-       return MAL_SUCCEED;
+       return prefix_or_suffix(res, l, r, "batstr.endsWith", str_is_suffix);
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to