From a44ca504d2b6dfa9edc75c1ec49850af193ba86d Mon Sep 17 00:00:00 2001 From: Petr Tesarik Date: Thu, 11 Oct 2012 18:12:09 +0200 Subject: [PATCH] Rewrite the hed_expr API Rename hed_expr_compile to hed_expr_new and pass the callback functions to it. That way, it looks more like an encapsulated object which always knows how to handle itself. --- libhed/expr.c | 20 +++++++++++--------- libhed/expr.h | 7 +++++-- libhed/file.c | 2 +- src/ui/fileshow.c | 35 ++++++++++++++++++----------------- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/libhed/expr.c b/libhed/expr.c index d2a7597..16cb1f1 100644 --- a/libhed/expr.c +++ b/libhed/expr.c @@ -905,14 +905,19 @@ compile_till(struct hed_expr *expr, char **sexpr, char till) } struct hed_expr * -hed_expr_compile(char *sexpr) +hed_expr_new(char *sexpr, + hed_expr_reg_cb reg_cb, hed_expr_mark_cb mark_cb, void *cb_data) { struct hed_expr *expr = calloc(1, sizeof(struct hed_expr)); if (!expr) return NULL; + expr->reg_cb = reg_cb; + expr->mark_cb = mark_cb; + expr->cb_data = cb_data; INIT_LIST_HEAD(&expr->atoms); + if (compile_till(expr, &sexpr, '\0')) return expr; @@ -1010,9 +1015,10 @@ atom_register(struct hed_expr *expr, struct atom *atom, return 0; } - if (hed_expr_eval(&data->offset, expr->reg_cb, - expr->mark_cb, expr->cb_data) - & HED_AEF_ERROR) + data->offset.reg_cb = expr->reg_cb; + data->offset.mark_cb = expr->mark_cb; + data->offset.cb_data = expr->cb_data; + if (hed_expr_eval(&data->offset) & HED_AEF_ERROR) return HED_AEF_ERROR; ofs = hed_expr2off(&data->offset); @@ -1025,14 +1031,10 @@ atom_register(struct hed_expr *expr, struct atom *atom, long -hed_expr_eval(struct hed_expr *expr, - hed_expr_reg_cb rcb, hed_expr_mark_cb mcb, void *data) +hed_expr_eval(struct hed_expr *expr) { struct atom *a; - expr->reg_cb = rcb; - expr->mark_cb = mcb; - expr->cb_data = data; expr->cb_pos = 0; expr->flags = 0; diff --git a/libhed/expr.h b/libhed/expr.h index 6cf63e0..6dfa53c 100644 --- a/libhed/expr.h +++ b/libhed/expr.h @@ -88,8 +88,11 @@ struct hed_expr { * 1 x x negative */ -struct hed_expr *hed_expr_compile(char *sexpr); -long hed_expr_eval(struct hed_expr *expr, hed_expr_reg_cb rcb, hed_expr_mark_cb mcb, void *data); +struct hed_expr *hed_expr_new(char *sexpr, + hed_expr_reg_cb reg_cb, + hed_expr_mark_cb mark_cb, + void *cb_data); +long hed_expr_eval(struct hed_expr *expr); void hed_expr_free(struct hed_expr *expr); static inline size_t diff --git a/libhed/file.c b/libhed/file.c index 617447f..98e8869 100644 --- a/libhed/file.c +++ b/libhed/file.c @@ -2517,7 +2517,7 @@ find_expr(struct hed_file *file, hed_cursor_t *from, int dir, unsigned char *p; size_t pos; - if (hed_expr_eval(expr, eval_reg_cb, NULL, data) & HED_AEF_ERROR) + if (hed_expr_eval(expr) & HED_AEF_ERROR) return HED_FINDOFF_ERROR; buf = hed_expr_buf(expr); diff --git a/src/ui/fileshow.c b/src/ui/fileshow.c index 448aadd..7b9ce22 100644 --- a/src/ui/fileshow.c +++ b/src/ui/fileshow.c @@ -527,15 +527,15 @@ static void jump_offset(struct inputline_data *inpline, void *hookdata) { struct fileshow_priv *data = hookdata; - struct hed_expr *expr = hed_expr_compile(inpline->buf); + struct hed_expr *expr; off_t pos; + expr = hed_expr_new(inpline->buf, eval_reg_cb, eval_mark_cb, data); if (!expr) { errmsg("Invalid expression"); return; } - if (hed_expr_eval(expr, eval_reg_cb, eval_mark_cb, data) - & HED_AEF_ERROR) { + if (hed_expr_eval(expr) & HED_AEF_ERROR) { errmsg("Cannot evaluate expression"); hed_expr_free(expr); return; @@ -608,7 +608,8 @@ expr_search(struct inputline_data *inpline, void *hookdata) if (data->last_search) hed_expr_free(data->last_search); - data->last_search = hed_expr_compile(inpline->buf); + data->last_search = hed_expr_new(inpline->buf, + eval_reg_cb, eval_mark_cb, data); if (!data->last_search) { errmsg("Invalid expression"); return; @@ -624,7 +625,7 @@ expr_subst(struct inputline_data *inpline, void *hookdata) struct fileshow_priv *data = hookdata; struct hed_expr *subst; - subst = hed_expr_compile(inpline->buf); + subst = hed_expr_new(inpline->buf, eval_reg_cb, eval_mark_cb, data); if (!subst) { errmsg("Invalid expression"); return; @@ -632,8 +633,7 @@ expr_subst(struct inputline_data *inpline, void *hookdata) data->last_search_dir = SDIR_FORWARD; while (do_search(data) != HED_FINDOFF_NO_MATCH) { - if (hed_expr_eval(subst, eval_reg_cb, eval_mark_cb, data) - & HED_AEF_ERROR) { + if (hed_expr_eval(subst) & HED_AEF_ERROR) { errmsg("Cannot evaluate expression"); break; } @@ -654,7 +654,8 @@ expr_subst1(struct inputline_data *inpline, void *hookdata) if (data->last_search) hed_expr_free(data->last_search); - data->last_search = hed_expr_compile(inpline->buf); + data->last_search = hed_expr_new(inpline->buf, + eval_reg_cb, eval_mark_cb, data); if (!data->last_search) { errmsg("Invalid expression"); return; @@ -1087,14 +1088,14 @@ static void ieval_expr(struct inputline_data *inpline, void *hookdata) { struct fileshow_priv *data = hookdata; - struct hed_expr *expr = hed_expr_compile(inpline->buf); + struct hed_expr *expr; + expr = hed_expr_new(inpline->buf, eval_reg_cb, eval_mark_cb, data); if (!expr) { errmsg("Invalid expression"); return; } - if (hed_expr_eval(expr, eval_reg_cb, eval_mark_cb, data) - & HED_AEF_ERROR) { + if (hed_expr_eval(expr) & HED_AEF_ERROR) { errmsg("Cannot evaluate expression"); hed_expr_free(expr); return; @@ -1108,18 +1109,18 @@ static void peval_expr(struct inputline_data *inpline, void *hookdata) { struct fileshow_priv *data = hookdata; - struct hed_expr *expr = hed_expr_compile(inpline->buf); + struct hed_expr *expr; static char *resbuf; char *p; size_t i, len; unsigned char *buf; + expr = hed_expr_new(inpline->buf, eval_reg_cb, eval_mark_cb, data); if (!expr) { errmsg("Invalid expression"); return; } - if (hed_expr_eval(expr, eval_reg_cb, eval_mark_cb, data) - & HED_AEF_ERROR) { + if (hed_expr_eval(expr) & HED_AEF_ERROR) { errmsg("Cannot evaluate expression"); hed_expr_free(expr); return; @@ -1146,10 +1147,11 @@ static void reval_expr(struct inputline_data *inpline, void *hookdata) { struct fileshow_priv *data = hookdata; - struct hed_expr *expr = hed_expr_compile(inpline->buf); + struct hed_expr *expr; int elen; size_t i, len; + expr = hed_expr_new(inpline->buf, eval_reg_cb, eval_mark_cb, data); if (!expr) { errmsg("Invalid expression"); goto out; @@ -1158,8 +1160,7 @@ reval_expr(struct inputline_data *inpline, void *hookdata) len = visual_extents(data, &xre); for (i = 0; i < len; i += elen) { size_t rlen; - if (hed_expr_eval(expr, eval_reg_cb, eval_mark_cb, data) - & HED_AEF_ERROR) { + if (hed_expr_eval(expr) & HED_AEF_ERROR) { errmsg("Cannot evaluate expression"); break; } -- 2.11.4.GIT