9 #include "ktrfmt.tab.h"
12 struct ktrfmt_parse_ctx {
13 struct symtab *symtab;
14 struct evtr_variable *var;
15 struct evtr_variable_value *val;
19 int __ktrfmtlex(YYSTYPE *);
20 #define __ktrfmt_lex __ktrfmtlex
22 void __ktrfmt_error (struct ktrfmt_parse_ctx *, const char *);
25 struct evtr_variable *
26 evtr_var_new(const char *name)
28 struct evtr_variable *var;
30 var = calloc(1, sizeof(*var));
32 var->name = strdup(name);
34 var->val.type = EVTR_VAL_NIL;
40 * XXX: should be reentrant
50 snprintf(buf, sizeof(buf), "@%ld", serno);
59 %name-prefix "__ktrfmt_"
61 %parse-param{struct ktrfmt_parse_ctx *ctx}
65 struct evtr_variable *var;
66 struct evtr_variable_value *val;
75 %token<na> TOK_LEFT_BRACK
76 %token<na> TOK_RIGHT_BRACK
80 %type<var> primary_expr
81 %type<var> postfix_expr
97 var = evtr_var_new(uniq_varname());
98 var->val.type = EVTR_VAL_INT;
100 atoll($1->str); /* XXX */
106 var = evtr_var_new(uniq_varname());
107 var->val.type = EVTR_VAL_STR;
108 var->val.str = $1->str;
110 fprintf(stderr, "oom\n");
118 primary_expr: TOK_ID {
120 printd(PARSE, "TOK_ID\n");
121 printd(PARSE, "tok: %p, str = %p\n", $1, $1->str);
122 var = symtab_find(ctx->symtab, $1->str);
124 var = evtr_var_new($1->str); /* XXX: oom */
125 printd(PARSE, "creating var %s\n", $1->str);
126 symtab_insert(ctx->symtab, $1->str, var);
135 postfix_expr: primary_expr TOK_LEFT_BRACK postfix_expr TOK_RIGHT_BRACK {
137 evtr_variable_value_t val;
139 hsh = symtab_find(ctx->symtab, $1->name);
142 printd(PARSE, "creating hash: %s\n", $1->name);
143 hsh = evtr_var_new($1->name);
144 hsh->val.type = EVTR_VAL_HASH;
145 hsh->val.hashtab = hash_new();
146 symtab_insert(ctx->symtab, $1->str, hsh);
149 if (hsh->val.type == EVTR_VAL_NIL) {
150 /* it's probably the first time we see this "variable" */
151 printd(PARSE, "creating hash for %s\n", hsh->name);
152 hsh->val.type = EVTR_VAL_HASH;
153 hsh->val.hashtab = hash_new();
154 } else if (hsh->val.type != EVTR_VAL_HASH) {
155 printd(PARSE, "trying to use type %d as hash\n", hsh->val.type);
159 if (val->type == EVTR_VAL_INT) {
161 printd(PARSE, "looking up %s[%jd] in %p\n", hsh->name, val->num, hsh->val.hashtab);
162 } else if (val->type == EVTR_VAL_STR) {
163 key = (uintptr_t)val->str;
164 printd(PARSE, "looking up %s[\"%s\"] in %p\n", hsh->name, val->str, hsh->val.hashtab);
166 fprintf(stderr, "trying to index hash w/ non-supported value\n");
170 if (hash_find(hsh->val.hashtab, key, &ret)) {
171 printd(PARSE, "didn't find it\n");
172 var = evtr_var_new(uniq_varname());
174 printd(PARSE, "inserting it as %s\n", var->name);
175 if (!hash_insert(hsh->val.hashtab, key, (uintptr_t)var)) {
176 fprintf(stderr, "can't insert tmp "
177 "variable into hash\n");
184 var = (struct evtr_variable *)ret;
187 fprintf(stderr, "no var!\n");
193 | primary_expr TOK_DOT TOK_ID {
200 unary_expr: postfix_expr {
204 assign_expr: unary_expr TOK_EQ constant {
206 ctx->ev->type = EVTR_TYPE_STMT;
207 ctx->ev->stmt.var = $1;
208 ctx->ev->stmt.val = &$3->val;
209 ctx->ev->stmt.op = EVTR_OP_SET;
219 void * __ktrfmt_scan_string(const char *);
220 void __ktrfmt_delete_buffer(void *);
223 __ktrfmt_error (struct ktrfmt_parse_ctx *ctx, const char *s)
226 fprintf(stderr, "%s\n", s);
230 parse_string(evtr_event_t ev, struct symtab *symtab, const char *str)
234 struct ktrfmt_parse_ctx ctx;
236 printd(PARSE, "parsing \"%s\"\n", str);
239 bufstate = __ktrfmt_scan_string(str);
240 ret = __ktrfmt_parse(&ctx);
241 __ktrfmt_delete_buffer(bufstate);
247 parse_var(const char *str, struct symtab *symtab, struct evtr_variable **var)
251 struct ktrfmt_parse_ctx ctx;
256 bufstate = __ktrfmt_scan_string(str);
257 ret = __ktrfmt_parse(&ctx);
258 __ktrfmt_delete_buffer(bufstate);