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