ul_jsonwrt_object_close(json);
}
+
int filter_eval_expr(struct libscols_filter *fltr, struct filter_expr *n,
struct libscols_line *ln, int *status)
{
struct filter_node *filter_new_param(
struct libscols_filter *fltr,
- enum filter_ptype type,
+ enum filter_data type,
+ enum filter_holder holder,
void *data)
{
char *p;
F_NODE_PARAM,
sizeof(struct filter_param));
n->type = type;
+ n->holder = holder;
INIT_LIST_HEAD(&n->pr_params);
switch (type) {
- case F_PARAM_STRING:
+ case F_DATA_STRING:
p = data;
if (*p == '"') {
/* remove quotation marks */
data = p + 1;
}
/* fallthrough */
- case F_PARAM_NAME:
- n->val.str = strdup((char *) data);
- break;
- case F_PARAM_NUMBER:
+ case F_DATA_NUMBER:
n->val.num = *((unsigned long long *) data);
break;
- case F_PARAM_FLOAT:
+ case F_DATA_FLOAT:
n->val.fnum = *((long double *) data);
break;
- case F_PARAM_BOOLEAN:
+ case F_DATA_BOOLEAN:
n->val.boolean = *((bool *) data) == 0 ? 0 : 1;
break;
+ default:
+ break;
+ }
+
+ switch (holder) {
+ case F_HOLDER_COLUMN:
+ n->val.str = strdup((char *) data);
+ break;
+ default:
+ break;
}
list_add_tail(&n->pr_params, &fltr->params);
void filter_free_param(struct filter_param *n)
{
- if (n->type == F_PARAM_NAME || n->type == F_PARAM_STRING)
+ if (n->type == F_DATA_STRING || n->holder == F_HOLDER_COLUMN)
free(n->val.str);
list_del_init(&n->pr_params);
ul_jsonwrt_object_open(json, "param");
switch (n->type) {
- case F_PARAM_NAME:
- ul_jsonwrt_value_s(json, "name", n->val.str);
- break;
- case F_PARAM_STRING:
+ case F_DATA_STRING:
ul_jsonwrt_value_s(json, "string", n->val.str);
break;
- case F_PARAM_NUMBER:
+ case F_DATA_NUMBER:
ul_jsonwrt_value_u64(json, "number", n->val.num);
break;
- case F_PARAM_FLOAT:
+ case F_DATA_FLOAT:
ul_jsonwrt_value_double(json, "float", n->val.fnum);
break;
- case F_PARAM_BOOLEAN:
+ case F_DATA_BOOLEAN:
ul_jsonwrt_value_boolean(json, "bool", n->val.boolean);
break;
+ default:
+ break;
}
+
+ switch (n->holder) {
+ case F_HOLDER_COLUMN:
+ ul_jsonwrt_value_s(json, "column", n->val.str);
+ break;
+ default:
+ break;
+ }
+
ul_jsonwrt_object_close(json);
}
int rc = 0;
switch (n->type) {
- case F_PARAM_NAME: /* TODO */
+ case F_DATA_NONE:
+ /* probably holder without not-yet defined type */
break;
- case F_PARAM_STRING:
+ case F_DATA_STRING:
*status = n->val.str != NULL && *n->val.str != '\0';
break;
- case F_PARAM_NUMBER:
+ case F_DATA_NUMBER:
*status = n->val.num != 0;
break;
- case F_PARAM_FLOAT:
+ case F_DATA_FLOAT:
*status = n->val.fnum != 0.0;
break;
- case F_PARAM_BOOLEAN:
+ case F_DATA_BOOLEAN:
*status = n->val.boolean != false;
break;
default:
;
param:
- T_NUMBER { $$ = filter_new_param(fltr, F_PARAM_NUMBER, (void *) (&$1)); }
- | T_FLOAT { $$ = filter_new_param(fltr, F_PARAM_FLOAT, (void *) (&$1)); }
- | T_NAME { $$ = filter_new_param(fltr, F_PARAM_NAME, (void *) $1); }
- | T_STRING { $$ = filter_new_param(fltr, F_PARAM_STRING, (void *) $1); }
+ T_NUMBER { $$ = filter_new_param(fltr, F_DATA_NUMBER, 0, (void *) (&$1)); }
+ | T_FLOAT { $$ = filter_new_param(fltr, F_DATA_FLOAT, 0, (void *) (&$1)); }
+ | T_NAME { $$ = filter_new_param(fltr, F_DATA_NONE, F_HOLDER_COLUMN, (void *) $1); }
+ | T_STRING { $$ = filter_new_param(fltr, F_DATA_STRING, 0, (void *) $1); }
| T_TRUE {
bool x = true;
- $$ = filter_new_param(fltr, F_PARAM_BOOLEAN, (void *) &x);
+ $$ = filter_new_param(fltr, F_DATA_BOOLEAN, 0, (void *) &x);
}
| T_FALSE {
bool x = false;
- $$ = filter_new_param(fltr, F_PARAM_BOOLEAN, (void *) &x);
+ $$ = filter_new_param(fltr, F_DATA_BOOLEAN, 0, (void *) &x);
}
;
do {
rc = filter_next_param(fltr, itr, &prm);
- if (rc == 0 && prm->type == F_PARAM_NAME)
+ if (rc == 0 && prm->holder == F_HOLDER_COLUMN)
*name = prm->val.str;
} while (rc == 0 && !*name);
scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
while (filter_next_param(fltr, &itr, &prm) == 0) {
- if (prm->type != F_PARAM_NAME || strcmp(name, prm->val.str) != 0)
+ if (prm->holder != F_HOLDER_COLUMN || strcmp(name, prm->val.str) != 0)
continue;
prm->col = col;
scols_ref_column(col);
* Filter stuff
*/
+enum filter_data {
+ F_DATA_NONE,
+ F_DATA_STRING,
+ F_DATA_NUMBER,
+ F_DATA_FLOAT,
+ F_DATA_BOOLEAN
+};
+
+enum filter_holder {
+ F_HOLDER_NONE,
+ F_HOLDER_COLUMN /* column name */
+};
+
/* node types */
enum filter_ntype {
F_NODE_PARAM,
F_NODE_EXPR
};
-/* param types */
-enum filter_ptype {
- F_PARAM_NUMBER,
- F_PARAM_FLOAT,
- F_PARAM_NAME,
- F_PARAM_STRING,
- F_PARAM_BOOLEAN
-};
-
/* expresion types */
enum filter_etype {
F_EXPR_AND,
struct filter_param {
struct filter_node node;
- enum filter_ptype type;
+ enum filter_data type;
+ enum filter_holder holder;
union {
char *str;
/* required by parser */
struct filter_node *filter_new_param(struct libscols_filter *filter,
- enum filter_ptype type,
+ enum filter_data type,
+ enum filter_holder holder,
void *data);
struct filter_node *filter_new_expr(struct libscols_filter *filter,
enum filter_etype type,