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
);
50 ret
= expr_parse(val
, ctx
, scanner
);
52 expr__flush_buffer(buffer
, scanner
);
53 expr__delete_buffer(buffer
, scanner
);
54 expr_lex_destroy(scanner
);
58 int expr__parse(double *final_val
, struct expr_parse_ctx
*ctx
, const char *expr
, int runtime
)
60 return __expr__parse(final_val
, ctx
, expr
, EXPR_PARSE
, runtime
) ? -1 : 0;
64 already_seen(const char *val
, const char *one
, const char **other
,
69 if (one
&& !strcasecmp(one
, val
))
71 for (i
= 0; i
< num_other
; i
++)
72 if (!strcasecmp(other
[i
], val
))
77 int expr__find_other(const char *expr
, const char *one
, const char ***other
,
78 int *num_other
, int runtime
)
80 int err
, i
= 0, j
= 0;
81 struct expr_parse_ctx ctx
;
84 err
= __expr__parse(NULL
, &ctx
, expr
, EXPR_OTHER
, runtime
);
88 *other
= malloc((ctx
.num_ids
+ 1) * sizeof(char *));
92 for (i
= 0, j
= 0; i
< ctx
.num_ids
; i
++) {
93 const char *str
= ctx
.ids
[i
].name
;
95 if (already_seen(str
, one
, *other
, j
))
106 if (i
!= ctx
.num_ids
) {
108 free((char *) (*other
)[i
]);