--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "smartcolsP.h"
+
+struct filter_node *filter_new_expr(
+ struct libscols_filter *fltr __attribute__((__unused__)),
+ enum filter_etype type,
+ struct filter_node *left,
+ struct filter_node *right)
+{
+ struct filter_expr *n = (struct filter_expr *) __filter_new_node(
+ F_NODE_EXPR, sizeof(struct filter_expr));
+
+ n->type = type;
+ switch (type) {
+ case F_EXPR_AND:
+ case F_EXPR_OR:
+ case F_EXPR_EQ:
+ case F_EXPR_NE:
+ case F_EXPR_LE:
+ case F_EXPR_LT:
+ case F_EXPR_GE:
+ case F_EXPR_GT:
+ case F_EXPR_REG:
+ case F_EXPR_NREG:
+ n->left = left;
+ n->right = right;
+ break;
+ case F_EXPR_NEG:
+ n->right = right;
+ break;
+
+ }
+ return (struct filter_node *) n;
+}
+
+void filter_free_expr(struct filter_expr *n)
+{
+ filter_unref_node(n->left);
+ filter_unref_node(n->right);
+ free(n);
+}
+
+static const char *expr_type_as_string(struct filter_expr *n)
+{
+ switch (n->type) {
+ case F_EXPR_AND:
+ return "AND";
+ case F_EXPR_OR:
+ return "OR";
+ case F_EXPR_EQ:
+ return "EQ";
+ case F_EXPR_NE:
+ return "NE";
+ case F_EXPR_LE:
+ return "LE";
+ case F_EXPR_LT:
+ return "LT";
+ case F_EXPR_GE:
+ return "GE";
+ case F_EXPR_GT:
+ return "GT";
+ case F_EXPR_REG:
+ return "REG";
+ case F_EXPR_NREG:
+ return "NREG";
+ case F_EXPR_NEG:
+ return "NOT";
+ }
+ return "";
+}
+
+void filter_dump_expr(struct ul_jsonwrt *json, struct filter_expr *n)
+{
+ ul_jsonwrt_object_open(json, "expr");
+ ul_jsonwrt_value_s(json, "type", expr_type_as_string(n));
+
+ if (n->left)
+ filter_dump_node(json, n->left);
+ if (n->right)
+ filter_dump_node(json, n->right);
+
+ ul_jsonwrt_object_close(json);
+}
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "smartcolsP.h"
+
+struct filter_node *filter_new_param(
+ struct libscols_filter *fltr,
+ enum filter_ptype type,
+ void *data)
+{
+ char *p;
+ struct filter_param *n = (struct filter_param *) __filter_new_node(
+ F_NODE_PARAM,
+ sizeof(struct filter_param));
+ n->type = type;
+ INIT_LIST_HEAD(&n->pr_params);
+
+ switch (type) {
+ case F_PARAM_STRING:
+ p = data;
+ if (*p == '"') {
+ /* remove quotation marks */
+ size_t len = strlen(p);
+ if (*(p + (len - 1)) == '"')
+ *(p + (len - 1)) = '\0';
+ data = p + 1;
+ }
+ /* fallthrough */
+ case F_PARAM_NAME:
+ n->val.str = strdup((char *) data);
+ break;
+ case F_PARAM_NUMBER:
+ n->val.num = *((unsigned long long *) data);
+ break;
+ case F_PARAM_FLOAT:
+ n->val.fnum = *((long double *) data);
+ break;
+ case F_PARAM_BOOLEAN:
+ n->val.boolean = *((bool *) data) == 0 ? 0 : 1;
+ break;
+ }
+
+ list_add_tail(&n->pr_params, &fltr->params);
+
+ return (struct filter_node *) n;
+}
+
+void filter_free_param(struct filter_param *n)
+{
+ if (n->type == F_PARAM_NAME || n->type == F_PARAM_STRING)
+ free(n->val.str);
+
+ list_del_init(&n->pr_params);
+ scols_unref_column(n->col);
+ free(n);
+}
+
+void filter_dump_param(struct ul_jsonwrt *json, struct filter_param *n)
+{
+ 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:
+ ul_jsonwrt_value_s(json, "string", n->val.str);
+ break;
+ case F_PARAM_NUMBER:
+ ul_jsonwrt_value_u64(json, "number", n->val.num);
+ break;
+ case F_PARAM_FLOAT:
+ ul_jsonwrt_value_double(json, "float", n->val.fnum);
+ break;
+ case F_PARAM_BOOLEAN:
+ ul_jsonwrt_value_boolean(json, "bool", n->val.boolean);
+ break;
+ }
+ ul_jsonwrt_object_close(json);
+}
+
+int filter_next_param(struct libscols_filter *fltr,
+ struct libscols_iter *itr, struct filter_param **prm)
+{
+ int rc = 1;
+
+ if (!fltr || !itr || !prm)
+ return -EINVAL;
+ *prm = NULL;
+
+ if (!itr->head)
+ SCOLS_ITER_INIT(itr, &fltr->params);
+ if (itr->p != itr->head) {
+ SCOLS_ITER_ITERATE(itr, *prm, struct filter_param, pr_params);
+ rc = 0;
+ }
+
+ return rc;
+}
+
#include "filter-parser.h"
#include "filter-scanner.h"
-static void filter_unref_node(struct filter_node *n);
-static void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n);
-
struct libscols_filter *scols_new_filter(const char *str)
{
struct libscols_filter *fltr = calloc(1, sizeof(*fltr));
/* This is generic allocater for a new node, always use the node type specific
* functions (e.g. filter_new_param() */
-static struct filter_node *new_node(enum filter_ntype type, size_t sz)
+struct filter_node *__filter_new_node(enum filter_ntype type, size_t sz)
{
void *x = calloc(1, sz);
struct filter_node *n = (struct filter_node *) x;
return n;
}
-struct filter_node *filter_new_param(
- struct libscols_filter *fltr,
- enum filter_ptype type,
- void *data)
-{
- char *p;
- struct filter_param *n = (struct filter_param *) new_node(
- F_NODE_PARAM,
- sizeof(struct filter_param));
- n->type = type;
- INIT_LIST_HEAD(&n->pr_params);
-
- switch (type) {
- case F_PARAM_STRING:
- p = data;
- if (*p == '"') {
- /* remove quotation marks */
- size_t len = strlen(p);
- if (*(p + (len - 1)) == '"')
- *(p + (len - 1)) = '\0';
- data = p + 1;
- }
- /* fallthrough */
- case F_PARAM_NAME:
- n->val.str = strdup((char *) data);
- break;
- case F_PARAM_NUMBER:
- n->val.num = *((unsigned long long *) data);
- break;
- case F_PARAM_FLOAT:
- n->val.fnum = *((long double *) data);
- break;
- case F_PARAM_BOOLEAN:
- n->val.boolean = *((bool *) data) == 0 ? 0 : 1;
- break;
- }
-
- list_add_tail(&n->pr_params, &fltr->params);
-
- return (struct filter_node *) n;
-}
-
-static void free_param(struct filter_param *n)
-{
- if (n->type == F_PARAM_NAME || n->type == F_PARAM_STRING)
- free(n->val.str);
-
- list_del_init(&n->pr_params);
- scols_unref_column(n->col);
- free(n);
-}
-
-static void dump_param(struct ul_jsonwrt *json, struct filter_param *n)
-{
- 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:
- ul_jsonwrt_value_s(json, "string", n->val.str);
- break;
- case F_PARAM_NUMBER:
- ul_jsonwrt_value_u64(json, "number", n->val.num);
- break;
- case F_PARAM_FLOAT:
- ul_jsonwrt_value_double(json, "float", n->val.fnum);
- break;
- case F_PARAM_BOOLEAN:
- ul_jsonwrt_value_boolean(json, "bool", n->val.boolean);
- break;
- }
- ul_jsonwrt_object_close(json);
-}
-
-struct filter_node *filter_new_expr(
- struct libscols_filter *fltr __attribute__((__unused__)),
- enum filter_etype type,
- struct filter_node *left,
- struct filter_node *right)
-{
- struct filter_expr *n = (struct filter_expr *) new_node(
- F_NODE_EXPR, sizeof(struct filter_expr));
-
- n->type = type;
- switch (type) {
- case F_EXPR_AND:
- case F_EXPR_OR:
- case F_EXPR_EQ:
- case F_EXPR_NE:
- case F_EXPR_LE:
- case F_EXPR_LT:
- case F_EXPR_GE:
- case F_EXPR_GT:
- case F_EXPR_REG:
- case F_EXPR_NREG:
- n->left = left;
- n->right = right;
- break;
- case F_EXPR_NEG:
- n->right = right;
- break;
-
- }
- return (struct filter_node *) n;
-}
-
-static void free_expr(struct filter_expr *n)
-{
- filter_unref_node(n->left);
- filter_unref_node(n->right);
- free(n);
-}
-
-static const char *expr_type_as_string(struct filter_expr *n)
-{
- switch (n->type) {
- case F_EXPR_AND:
- return "AND";
- case F_EXPR_OR:
- return "OR";
- case F_EXPR_EQ:
- return "EQ";
- case F_EXPR_NE:
- return "NE";
- case F_EXPR_LE:
- return "LE";
- case F_EXPR_LT:
- return "LT";
- case F_EXPR_GE:
- return "GE";
- case F_EXPR_GT:
- return "GT";
- case F_EXPR_REG:
- return "REG";
- case F_EXPR_NREG:
- return "NREG";
- case F_EXPR_NEG:
- return "NOT";
- }
- return "";
-}
-
-static void dump_expr(struct ul_jsonwrt *json, struct filter_expr *n)
-{
- ul_jsonwrt_object_open(json, "expr");
- ul_jsonwrt_value_s(json, "type", expr_type_as_string(n));
-
- if (n->left)
- filter_dump_node(json, n->left);
- if (n->right)
- filter_dump_node(json, n->right);
-
- ul_jsonwrt_object_close(json);
-}
-
-static void filter_unref_node(struct filter_node *n)
+void filter_unref_node(struct filter_node *n)
{
if (!n || --n->refcount > 0)
return;
switch (n->type) {
case F_NODE_EXPR:
- free_expr((struct filter_expr *) n);
+ filter_free_expr((struct filter_expr *) n);
break;
case F_NODE_PARAM:
- free_param((struct filter_param *) n);
+ filter_free_param((struct filter_param *) n);
break;
}
}
-/*
-static void filter_ref_node(struct filter_node *n)
+void filter_ref_node(struct filter_node *n)
{
if (n)
n->refcount++;
}
-*/
-static void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n)
+void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n)
{
if (!n)
return;
switch (n->type) {
case F_NODE_EXPR:
- dump_expr(json, (struct filter_expr *) n);
+ filter_dump_expr(json, (struct filter_expr *) n);
break;
case F_NODE_PARAM:
- dump_param(json, (struct filter_param *) n);
+ filter_dump_param(json, (struct filter_param *) n);
break;
}
}
return fltr ? fltr->errmsg : NULL;
}
-static int filter_next_param(struct libscols_filter *fltr,
- struct libscols_iter *itr, struct filter_param **prm)
-{
- int rc = 1;
-
- if (!fltr || !itr || !prm)
- return -EINVAL;
- *prm = NULL;
-
- if (!itr->head)
- SCOLS_ITER_INIT(itr, &fltr->params);
- if (itr->p != itr->head) {
- SCOLS_ITER_ITERATE(itr, *prm, struct filter_param, pr_params);
- rc = 0;
- }
-
- return rc;
-}
-
int scols_filter_next_name(struct libscols_filter *fltr,
struct libscols_iter *itr, const char **name)
{