From 400cc84911ab19921eaba649fd2b66d80eb14044 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Tue, 12 Nov 2019 20:04:13 +0200 Subject: [PATCH] ast: use a separate expr struct for action list Currently it's under UnaryExpr, which just doesn't make sense. Signed-off-by: Ran Benita --- src/xkbcomp/ast-build.c | 16 +++++++++++++++- src/xkbcomp/ast-build.h | 3 +++ src/xkbcomp/ast.h | 7 +++++++ src/xkbcomp/parser.y | 2 +- src/xkbcomp/symbols.c | 4 ++-- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/xkbcomp/ast-build.c b/src/xkbcomp/ast-build.c index d01aa24..64051c7 100644 --- a/src/xkbcomp/ast-build.c +++ b/src/xkbcomp/ast-build.c @@ -206,6 +206,16 @@ ExprCreateAction(xkb_atom_t name, ExprDef *args) return expr; } +ExprDef * +ExprCreateActionList(ExprDef *actions) +{ + ExprDef *expr = ExprCreate(EXPR_ACTION_LIST, EXPR_TYPE_ACTIONS, sizeof(ExprActionList)); + if (!expr) + return NULL; + expr->actions.actions = actions; + return expr; +} + ExprDef * ExprCreateKeysymList(xkb_keysym_t sym) { @@ -592,7 +602,6 @@ FreeExpr(ExprDef *expr) return; switch (expr->expr.op) { - case EXPR_ACTION_LIST: case EXPR_NEGATE: case EXPR_UNARY_PLUS: case EXPR_NOT: @@ -613,6 +622,10 @@ FreeExpr(ExprDef *expr) FreeStmt((ParseCommon *) expr->action.args); break; + case EXPR_ACTION_LIST: + FreeStmt((ParseCommon *) expr->actions.actions); + break; + case EXPR_ARRAY_REF: FreeStmt((ParseCommon *) expr->array_ref.entry); break; @@ -812,6 +825,7 @@ static const char *expr_value_type_strings[_EXPR_TYPE_NUM_VALUES] = { [EXPR_TYPE_FLOAT] = "float", [EXPR_TYPE_STRING] = "string", [EXPR_TYPE_ACTION] = "action", + [EXPR_TYPE_ACTIONS] = "actions", [EXPR_TYPE_KEYNAME] = "keyname", [EXPR_TYPE_SYMBOLS] = "symbols", }; diff --git a/src/xkbcomp/ast-build.h b/src/xkbcomp/ast-build.h index 6c76f38..46c7fbb 100644 --- a/src/xkbcomp/ast-build.h +++ b/src/xkbcomp/ast-build.h @@ -64,6 +64,9 @@ ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry); ExprDef * ExprCreateAction(xkb_atom_t name, ExprDef *args); +ExprDef * +ExprCreateActionList(ExprDef *actions); + ExprDef * ExprCreateMultiKeysymList(ExprDef *list); diff --git a/src/xkbcomp/ast.h b/src/xkbcomp/ast.h index 49c5ada..ee61106 100644 --- a/src/xkbcomp/ast.h +++ b/src/xkbcomp/ast.h @@ -98,6 +98,7 @@ enum expr_value_type { EXPR_TYPE_FLOAT, EXPR_TYPE_STRING, EXPR_TYPE_ACTION, + EXPR_TYPE_ACTIONS, EXPR_TYPE_KEYNAME, EXPR_TYPE_SYMBOLS, @@ -228,6 +229,11 @@ typedef struct { ExprDef *args; } ExprAction; +typedef struct { + ExprCommon expr; + ExprDef *actions; +} ExprActionList; + typedef struct { ExprCommon expr; darray(xkb_keysym_t) syms; @@ -249,6 +255,7 @@ union ExprDef { ExprFieldRef field_ref; ExprArrayRef array_ref; ExprAction action; + ExprActionList actions; ExprKeysymList keysym_list; }; diff --git a/src/xkbcomp/parser.y b/src/xkbcomp/parser.y index f33a850..daf2cdd 100644 --- a/src/xkbcomp/parser.y +++ b/src/xkbcomp/parser.y @@ -454,7 +454,7 @@ SymbolsVarDecl : Lhs EQUALS Expr { $$ = VarCreate($1, $3); } ArrayInit : OBRACKET OptKeySymList CBRACKET { $$ = $2; } | OBRACKET ActionList CBRACKET - { $$ = ExprCreateUnary(EXPR_ACTION_LIST, EXPR_TYPE_ACTION, $2); } + { $$ = ExprCreateActionList($2); } ; GroupCompatDecl : GROUP Integer EQUALS Expr SEMI diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c index f693bae..ffef6a4 100644 --- a/src/xkbcomp/symbols.c +++ b/src/xkbcomp/symbols.c @@ -753,7 +753,7 @@ AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, } nActs = 0; - for (act = value->unary.child; act; act = (ExprDef *) act->common.next) + for (act = value->actions.actions; act; act = (ExprDef *) act->common.next) nActs++; if (darray_size(groupi->levels) < nActs) @@ -761,7 +761,7 @@ AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, groupi->defined |= GROUP_FIELD_ACTS; - act = value->unary.child; + act = value->actions.actions; for (unsigned i = 0; i < nActs; i++) { union xkb_action *toAct = &darray_item(groupi->levels, i).action;