word_t xdict_query(xdict_t xd, const char *key, int len) { word_t value, value2; value = value2 = NULL; while (xd != NULL) { if (xd->xmode == SCWS_XDICT_MEM) { /* this is ThreadSafe, recommend. */ value = (word_t) xtree_nget((xtree_t) xd->xdict, key, len, NULL); } else { /* the value malloced in lib-XDB. free required */ value = (word_t) xdb_nget((xdb_t) xd->xdict, key, len, NULL); if (value != NULL) value->flag |= SCWS_WORD_MALLOCED; } xd = xd->next; // check value2 if (value != NULL) { if (value2 == NULL) { if (_FLAG_BOTH(value)) return value; value2 = value; } else { if (_FLAG_FULL(value2) && _FLAG_PART(value)) { value2->flag |= SCWS_WORD_PART; if (_FLAG_MALLOC(value)) free(value); return value2; } if (_FLAG_FULL(value) && _FLAG_PART(value2)) { value->flag |= SCWS_WORD_PART; if (_FLAG_MALLOC(value2)) free(value2); return value; } if (_FLAG_MALLOC(value)) free(value); } } } return value2; }
void *xdb_get(xdb_t x, const char *key, unsigned int *vlen) { if (x == NULL || key == NULL) return NULL; return xdb_nget(x, key, strlen(key), vlen); }