static bool set_suffix(w_query *res, json_t *ele, w_string_t **suffix) { if (!json_is_string(ele)) { res->errmsg = strdup("'suffix' must be a string or an array of strings"); return false; } *suffix = w_string_new_lower(json_string_value(ele)); return true; }
static w_query_expr *name_parser(w_query *query, json_t *term, bool caseless) { const char *pattern = NULL, *scope = "basename"; const char *which = caseless ? "iname" : "name"; struct name_data *data; json_t *name; w_ht_t *map = NULL; if (!json_is_array(term)) { ignore_result(asprintf(&query->errmsg, "Expected array for '%s' term", which)); return NULL; } if (json_array_size(term) > 3) { ignore_result(asprintf(&query->errmsg, "Invalid number of arguments for '%s' term", which)); return NULL; } if (json_array_size(term) == 3) { json_t *jscope; jscope = json_array_get(term, 2); if (!json_is_string(jscope)) { ignore_result(asprintf(&query->errmsg, "Argument 3 to '%s' must be a string", which)); return NULL; } scope = json_string_value(jscope); if (strcmp(scope, "basename") && strcmp(scope, "wholename")) { ignore_result(asprintf(&query->errmsg, "Invalid scope '%s' for %s expression", scope, which)); return NULL; } } name = json_array_get(term, 1); if (json_is_array(name)) { uint32_t i; for (i = 0; i < json_array_size(name); i++) { if (!json_is_string(json_array_get(name, i))) { ignore_result(asprintf(&query->errmsg, "Argument 2 to '%s' must be either a string or an array of string", which)); return NULL; } } map = w_ht_new(json_array_size(name), &w_ht_string_funcs); for (i = 0; i < json_array_size(name); i++) { w_string_t *element; const char *ele; ele = json_string_value(json_array_get(name, i)); if (caseless) { element = w_string_new_lower(ele); } else { element = w_string_new(ele); } w_ht_set(map, w_ht_ptr_val(element), 1); w_string_delref(element); } } else if (json_is_string(name)) { pattern = json_string_value(name); } else { ignore_result(asprintf(&query->errmsg, "Argument 2 to '%s' must be either a string or an array of string", which)); return NULL; } data = calloc(1, sizeof(*data)); if (pattern) { data->name = w_string_new(pattern); } data->map = map; data->caseless = caseless; data->wholename = !strcmp(scope, "wholename"); return w_query_expr_new(eval_name, dispose_name, data); }