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_INT;
108 var->val.str = strdup($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: TOK_ID TOK_LEFT_BRACK postfix_expr TOK_RIGHT_BRACK {
137 evtr_variable_value_t val;
138 hsh = symtab_find(ctx->symtab, $1->str);
140 printd(PARSE, "creating hash: %s\n", $1->str);
141 hsh = evtr_var_new($1->str);
142 hsh->val.type = EVTR_VAL_HASH;
143 hsh->val.hashtab = hash_new();
144 symtab_insert(ctx->symtab, $1->str, hsh);
146 if (hsh->val.type != EVTR_VAL_HASH) {
147 printd(PARSE, "variable %s does not contain a hash\n", hsh->name);
151 if (val->type == EVTR_VAL_INT) {
153 uintptr_t key = val->num;
154 printd(PARSE, "looking up %s[%jd] in %p\n", $1->str, val->num, hsh->val.hashtab);
155 /* XXX: should definitely be using uintptr_t for keys/values */
156 if (hash_find(hsh->val.hashtab, key, &ret)) {
157 printd(PARSE, "didn't find it\n");
158 var = evtr_var_new(uniq_varname());
160 printd(PARSE, "inserting it as %s\n", var->name);
161 if (!hash_insert(hsh->val.hashtab, key, (uintptr_t)var)) {
162 fprintf(stderr, "can't insert tmp "
163 "variable into hash\n");
168 var = (struct evtr_variable *)ret;
171 fprintf(stderr, "trying to index hash w/ non-integral value\n");
175 fprintf(stderr, "no var!\n");
186 unary_expr: postfix_expr {
190 assign_expr: unary_expr TOK_EQ constant {
192 ctx->ev->type = EVTR_TYPE_STMT;
193 ctx->ev->stmt.var = $1;
194 ctx->ev->stmt.val = &$3->val;
195 ctx->ev->stmt.op = EVTR_OP_SET;
205 void * __ktrfmt_scan_string(const char *);
206 void __ktrfmt_delete_buffer(void *);
209 __ktrfmt_error (struct ktrfmt_parse_ctx *ctx, const char *s)
212 fprintf(stderr, "%s\n", s);
216 parse_string(evtr_event_t ev, struct symtab *symtab, const char *str)
220 struct ktrfmt_parse_ctx ctx;
222 printd(PARSE, "parsing \"%s\"\n", str);
225 bufstate = __ktrfmt_scan_string(str);
226 ret = __ktrfmt_parse(&ctx);
227 __ktrfmt_delete_buffer(bufstate);
233 parse_var(const char *str, struct symtab *symtab, struct evtr_variable **var)
237 struct ktrfmt_parse_ctx ctx;
242 bufstate = __ktrfmt_scan_string(str);
243 ret = __ktrfmt_parse(&ctx);
244 __ktrfmt_delete_buffer(bufstate);