Changeset: 4b4e9c5ff1ae for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4b4e9c5ff1ae
Modified Files:
monetdb5/modules/atoms/str.c
Branch: ascii-flag
Log Message:
Some code cleanup.
diffs (truncated from 472 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
@@ -691,12 +691,11 @@ STRWChrAt(int *res, const char *const *a
}
static inline str
-doStrConvert(str *res, const char *const *arg1, gdk_return (*func)(char
**restrict, size_t *restrict, const char *restrict))
+doStrConvert(str *res, const char *arg1, gdk_return (*func)(char **restrict,
size_t *restrict, const char *restrict))
{
str buf = NULL, msg = MAL_SUCCEED;
- const char *s = *arg1;
-
- if (strNil(s)) {
+
+ if (strNil(arg1)) {
*res = GDKstrdup(str_nil);
} else {
size_t buflen = INITIAL_STR_BUFFER_LENGTH;
@@ -704,7 +703,7 @@ doStrConvert(str *res, const char *const
*res = NULL;
if (!(buf = GDKmalloc(buflen)))
throw(MAL, "str.lower", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- if ((*func)(&buf, &buflen, s) != GDK_SUCCEED) {
+ if ((*func)(&buf, &buflen, arg1) != GDK_SUCCEED) {
GDKfree(buf);
throw(MAL, "str.lower", GDK_EXCEPTION);
}
@@ -721,19 +720,19 @@ doStrConvert(str *res, const char *const
static inline str
STRlower(str *res, const char *const *arg1)
{
- return doStrConvert(res, arg1, GDKtolower);
+ return doStrConvert(res, *arg1, GDKtolower);
}
static inline str
STRupper(str *res, const char *const *arg1)
{
- return doStrConvert(res, arg1, GDKtoupper);
+ return doStrConvert(res, *arg1, GDKtoupper);
}
static inline str
STRcasefold(str *res, const char *const *arg1)
{
- return doStrConvert(res, arg1, GDKcasefold);
+ return doStrConvert(res, *arg1, GDKcasefold);
}
/* returns whether arg1 starts with arg2 */
@@ -795,24 +794,16 @@ str_icontains(const char *h, const char
return GDKstrcasestr(h, n) == NULL;
}
-#define STR_MAPARGS(STK, PCI, R, S1, S2, ICASE)
\
- do{
\
- R = getArgReference(STK, PCI, 0);
\
- S1 = *getArgReference_str(STK, PCI, 1);
\
- S2 = *getArgReference_str(STK, PCI, 2);
\
- icase = PCI->argc == 4 && *getArgReference_bit(STK, PCI, 3);
\
- } while(0)
-
static str
STRstartswith(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
(void) cntxt;
(void) mb;
- str s1, s2;
- bit *r, icase;
-
- STR_MAPARGS(stk, pci, r, s1, s2, icase);
+ bit *r = getArgReference_bit(stk, pci, 0);
+ const char *s1 = *getArgReference_str(stk, pci, 1);
+ const char *s2 = *getArgReference_str(stk, pci, 2);
+ bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3);
if (strNil(s1) || strNil(s2)) {
*r = bit_nil;
@@ -831,10 +822,10 @@ STRendswith(Client cntxt, MalBlkPtr mb,
(void) cntxt;
(void) mb;
- str s1, s2;
- bit *r, icase;
-
- STR_MAPARGS(stk, pci, r, s1, s2, icase);
+ bit *r = getArgReference_bit(stk, pci, 0);
+ const char *s1 = *getArgReference_str(stk, pci, 1);
+ const char *s2 = *getArgReference_str(stk, pci, 2);
+ bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3);
if (strNil(s1) || strNil(s2)) {
*r = bit_nil;
@@ -854,10 +845,10 @@ STRcontains(Client cntxt, MalBlkPtr mb,
(void) cntxt;
(void) mb;
- str s1, s2;
- bit *r, icase;
-
- STR_MAPARGS(stk, pci, r, s1, s2, icase);
+ bit *r = getArgReference_bit(stk, pci, 0);
+ const char *s1 = *getArgReference_str(stk, pci, 1);
+ const char *s2 = *getArgReference_str(stk, pci, 2);
+ bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3);
if (strNil(s1) || strNil(s2)) {
*r = bit_nil;
@@ -900,7 +891,7 @@ STRstr_search(Client cntxt, MalBlkPtr mb
const char *haystack = *getArgReference_str(stk, pci, 1);
const char *needle = *getArgReference_str(stk, pci, 2);
bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3);
- char *msg = MAL_SUCCEED;
+
if (strNil(haystack) || strNil(needle)) {
*res = bit_nil;
} else {
@@ -908,7 +899,7 @@ STRstr_search(Client cntxt, MalBlkPtr mb
str_isearch(haystack, needle) :
str_search(haystack, needle);
}
- return msg;
+ return MAL_SUCCEED;
}
int
@@ -2069,106 +2060,50 @@ BBPnreclaim(int nargs, ...)
va_end(valist);
}
-/* scan select loop with or without candidates */
-#define scanloop(TEST, KEEP_NULLS)
\
- do {
\
- TRC_DEBUG(ALGO,
\
- "scanselect(b=%s#"BUNFMT",anti=%d): "
\
- "scanselect %s\n", BATgetId(b), BATcount(b),
\
- anti, #TEST);
\
- if (!s || BATtdense(s)) {
\
- for (; p < q; p++) {
\
- GDK_CHECK_TIMEOUT(qry_ctx, counter,
\
-
GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx)); \
- const char *restrict v = BUNtvar(bi, p - off);
\
- if ((TEST) || ((KEEP_NULLS) && *v == '\200'))
\
- vals[cnt++] = p;
\
- }
\
- } else {
\
- for (; p < ncands; p++) {
\
- GDK_CHECK_TIMEOUT(qry_ctx, counter,
\
-
GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx)); \
- oid o = canditer_next(ci);
\
- const char *restrict v = BUNtvar(bi, o - off);
\
- if ((TEST) || ((KEEP_NULLS) && *v == '\200'))
\
- vals[cnt++] = o;
\
- }
\
- }
\
+#define HANDLE_TIMEOUT(qc)
\
+ do {
\
+ TIMEOUT_ERROR(qc, __FILE__, __func__, __LINE__); \
+ msg = createException(MAL, fname, GDK_EXCEPTION); \
} while (0)
-/* scan select loop with or without candidates */
-#define scanloop_anti(TEST, KEEP_NULLS)
\
- do {
\
- TRC_DEBUG(ALGO,
\
- "scanselect(b=%s#"BUNFMT",anti=%d): "
\
- "scanselect %s\n", BATgetId(b), BATcount(b),
\
- anti, #TEST);
\
- if (!s || BATtdense(s)) {
\
- for (; p < q; p++) {
\
- GDK_CHECK_TIMEOUT(qry_ctx, counter,
\
-
GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx)); \
- const char *restrict v = BUNtvar(bi, p - off);
\
- if ((TEST) || ((KEEP_NULLS) && *v == '\200'))
\
- vals[cnt++] = p;
\
- }
\
- } else {
\
- for (; p < ncands; p++) {
\
- GDK_CHECK_TIMEOUT(qry_ctx, counter,
\
-
GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx)); \
- oid o = canditer_next(ci);
\
- const char *restrict v = BUNtvar(bi, o - off);
\
- if ((TEST) || ((KEEP_NULLS) && *v == '\200'))
\
- vals[cnt++] = o;
\
- }
\
- }
\
+#define scanloop(TEST, canditer_next)
\
+ do {
\
+ const oid off = b->hseqbase;
\
+ TIMEOUT_LOOP(ci.ncand, qry_ctx) {
\
+ oid o = canditer_next(&ci);
\
+ const char *restrict v = BUNtvar(bi, o - off); \
+ assert(rcnt < BATcapacity(bn));
\
+ if (TEST)
\
+ vals[rcnt++] = o;
\
+ }
\
} while (0)
static str
-str_select(BAT *bn, BAT *b, BAT *s, struct canditer *ci, BUN p, BUN q,
- BUN *rcnt, const char *key, bool anti,
- int (*str_cmp)(const char *, const char *,
int),
- bool keep_nulls)
-{
- if (strNil(key))
- return MAL_SUCCEED;
-
- BATiter bi = bat_iterator(b);
- BUN cnt = 0, ncands = ci->ncand;
- oid off = b->hseqbase, *restrict vals = Tloc(bn, 0);
- str msg = MAL_SUCCEED;
- int klen = str_strlen(key);
-
- size_t counter = 0;
- QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-
- if (anti) /* keep nulls ? (use
false for now) */
- scanloop_anti(!strNil(v) && str_cmp(v, key, klen) != 0,
keep_nulls);
- else
- scanloop(!strNil(v) && str_cmp(v, key, klen) == 0, keep_nulls);
-
- bailout:
- bat_iterator_end(&bi);
- *rcnt = cnt;
- return msg;
-}
-
-static str
-STRselect(bat *r_id, const bat *b_id, const bat *cb_id, const char *key,
- const bit anti, int (*str_cmp)(const char *, const
char *, int),
- const char *fname)
+STRselect(MalStkPtr stk, InstrPtr pci,
+ int (*str_icmp)(const char *, const char *, int),
+ int (*str_cmp)(const char *, const char *, int),
+ const char *fname)
{
str msg = MAL_SUCCEED;
- BAT *b, *cb = NULL, *r = NULL, *old_s = NULL;;
- BUN p = 0, q = 0, rcnt = 0;
+ bat *r_id = getArgReference_bat(stk, pci, 0);
+ bat b_id = *getArgReference_bat(stk, pci, 1);
+ bat cb_id = *getArgReference_bat(stk, pci, 2);
+ const char *key = *getArgReference_str(stk, pci, 3);
+ bit icase = pci->argc != 5;
+ bit anti = pci->argc == 5 ? *getArgReference_bit(stk, pci, 4) :
+ *getArgReference_bit(stk, pci, 5);
+
+ BAT *b, *cb = NULL, *bn = NULL, *old_s = NULL;;
+ BUN rcnt = 0;
struct canditer ci;
bool with_strimps = false,
with_strimps_anti = false;
- if (!(b = BATdescriptor(*b_id)))
+ if (!(b = BATdescriptor(b_id)))
throw(MAL, fname, RUNTIME_OBJECT_MISSING);
- if (cb_id && !is_bat_nil(*cb_id) && !(cb = BATdescriptor(*cb_id))) {
+ if (!is_bat_nil(cb_id) && !(cb = BATdescriptor(cb_id))) {
BBPreclaim(b);
throw(MAL, fname, RUNTIME_OBJECT_MISSING);
}
@@ -2176,17 +2111,16 @@ STRselect(bat *r_id, const bat *b_id, co
assert(ATOMstorage(b->ttype) == TYPE_str);
if (BAThasstrimps(b)) {
- if (STRMPcreate(b, NULL) == GDK_SUCCEED) {
- BAT *tmp_s = STRMPfilter(b, cb, key, anti);
- if (tmp_s) {
- old_s = cb;
- cb = tmp_s;
- if (!anti)
- with_strimps = true;
- else
- with_strimps_anti = true;
- }
+ BAT *tmp_s;
+ if (STRMPcreate(b, NULL) == GDK_SUCCEED && (tmp_s =
STRMPfilter(b, cb, key, anti)) != NULL) {
+ old_s = cb;
+ cb = tmp_s;
+ if (!anti)
+ with_strimps = true;
+ else
+ with_strimps_anti = true;
} else {
+ /* strimps failed, continue without */
GDKclrerr();
}
}
@@ -2198,84 +2132,79 @@ STRselect(bat *r_id, const bat *b_id, co
: "string_select:
strcmp function with no accelerator"));
canditer_init(&ci, b, cb);
- if (!(r = COLnew(0, TYPE_oid, ci.ncand, TRANSIENT))) {
+ if (!(bn = COLnew(0, TYPE_oid, ci.ncand, TRANSIENT))) {
BBPnreclaim(2, b, cb);
throw(MAL, fname, SQLSTATE(HY013) MAL_MALLOC_FAIL);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]