if (!ce)
return -EINVAL;
+ ce->is_filled = 1;
rc = strdup_to_struct_member(ce, data, data);
ce->datasiz = ce->data ? strlen(ce->data) + 1: 0;
return rc;
free(ce->data);
ce->data = data;
ce->datasiz = ce->data ? strlen(ce->data) + 1: 0;
+ ce->is_filled = 1;
return 0;
}
}
DBG(FPARAM, ul_debugobj(n, "fetching %s data", n->holder_name));
+ if (fltr->filler_cb && !scols_line_is_filled(ln, n->col->seqnum)) {
+ rc = fltr->filler_cb(fltr, ln, n->col->seqnum, fltr->filler_data);
+ if (rc)
+ return rc;
+ }
+
/* read column data, use it as string */
data = scols_line_get_column_data(ln, n->col);
rc = param_set_data(n, F_DATA_STRING, data);
DBG(FLTR, ul_debugobj(fltr, "filter done [rc=%d, status=%d]", rc, *status));
return rc;
}
+
+int scols_filter_set_filler_cb(struct libscols_filter *fltr,
+ int (*cb)(struct libscols_filter *,
+ struct libscols_line *, size_t, void *),
+ void *userdata)
+{
+ if (!fltr)
+ return -EINVAL;
+ fltr->filler_cb = cb;
+ fltr->filler_data = userdata;
+
+ return 0;
+}
struct libscols_column *cl);
extern int scols_line_set_data(struct libscols_line *ln, size_t n, const char *data);
extern int scols_line_refer_data(struct libscols_line *ln, size_t n, char *data);
+extern int scols_line_is_filled(struct libscols_line *ln, size_t n);
extern int scols_line_set_column_data(struct libscols_line *ln, struct libscols_column *cl, const char *data);
extern const char *scols_line_get_column_data(struct libscols_line *ln, struct libscols_column *cl);
extern int scols_line_refer_column_data(struct libscols_line *ln, struct libscols_column *cl, char *data);
extern int scols_filter_assign_column(struct libscols_filter *fltr,
struct libscols_iter *itr,
const char *name, struct libscols_column *col);
+extern int scols_filter_set_filler_cb(struct libscols_filter *fltr,
+ int (*cb)(struct libscols_filter *,
+ struct libscols_line *, size_t, void *),
+ void *userdata);
#ifdef __cplusplus
}
scols_filter_next_holder;
scols_filter_assign_column;
scols_line_apply_filter;
+ scols_filter_set_filler_cb;
+ scols_line_is_filled;
} SMARTCOLS_2.39;
return scols_cell_refer_data(ce, data);
}
+/**
+ * scols_line_is_filled:
+ * @ln: a pointer to a struct libscols_line instance
+ * @n: number of the cell
+ *
+ * Returns: 0 or 1 if cell was already filled (note that NULL is also valid filler)
+ */
+int scols_line_is_filled(struct libscols_line *ln, size_t n)
+{
+ struct libscols_cell *ce = scols_line_get_cell(ln, n);
+
+ return ce ? ce->is_filled : 0;
+}
+
/**
* scols_line_refer_column_data:
* @ln: a pointer to a struct libscols_line instance
void *userdata;
int flags;
size_t width;
+
+ unsigned int is_filled : 1;
};
extern int scols_line_move_cells(struct libscols_line *ln, size_t newn, size_t oldn);
struct filter_node *root;
FILE *src;
+ int (*filler_cb)(struct libscols_filter *, struct libscols_line *, size_t, void *);
+ void *filler_data;
+
struct list_head params;
};
void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n);
int filter_eval_node(struct libscols_filter *fltr, struct libscols_line *ln,
struct filter_node *n, int *status);
-
/* param */
int filter_compile_param(struct libscols_filter *fltr, struct filter_param *n);
void filter_dump_param(struct ul_jsonwrt *json, struct filter_param *n);