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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to