1 // SPDX-License-Identifier: GPL-2.0
5 #include "expr-bison.h"
12 /* Caller must make sure id is allocated */
13 void expr__add_id(struct expr_parse_ctx *ctx, const char *name, double val)
17 assert(ctx->num_ids < MAX_PARSE_ID);
19 ctx->ids[idx].name = name;
20 ctx->ids[idx].val = val;
23 void expr__ctx_init(struct expr_parse_ctx *ctx)
29 __expr__parse(double *val, struct expr_parse_ctx *ctx, const char *expr,
30 int start, int runtime)
32 struct expr_scanner_ctx scanner_ctx = {
36 YY_BUFFER_STATE buffer;
40 ret = expr_lex_init_extra(&scanner_ctx, &scanner);
44 buffer = expr__scan_string(expr, scanner);
48 expr_set_debug(1, scanner);
51 ret = expr_parse(val, ctx, scanner);
53 expr__flush_buffer(buffer, scanner);
54 expr__delete_buffer(buffer, scanner);
55 expr_lex_destroy(scanner);
59 int expr__parse(double *final_val, struct expr_parse_ctx *ctx, const char *expr, int runtime)
61 return __expr__parse(final_val, ctx, expr, EXPR_PARSE, runtime) ? -1 : 0;
65 already_seen(const char *val, const char *one, const char **other,
70 if (one && !strcasecmp(one, val))
72 for (i = 0; i < num_other; i++)
73 if (!strcasecmp(other[i], val))
78 int expr__find_other(const char *expr, const char *one, const char ***other,
79 int *num_other, int runtime)
81 int err, i = 0, j = 0;
82 struct expr_parse_ctx ctx;
85 err = __expr__parse(NULL, &ctx, expr, EXPR_OTHER, runtime);
89 *other = malloc((ctx.num_ids + 1) * sizeof(char *));
93 for (i = 0, j = 0; i < ctx.num_ids; i++) {
94 const char *str = ctx.ids[i].name;
96 if (already_seen(str, one, *other, j))
107 if (i != ctx.num_ids) {
109 free((char *) (*other)[i]);