summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2007-07-26 03:02:02 -0400
committerSøren Sandmann <sandmann@redhat.com>2007-07-26 03:02:02 -0400
commitc869dc2e15576dcd8b12a3f15a52e361a51e6566 (patch)
treeac31bbbddd6446a6137f342f6d49099740edc180 /ast.c
parent94c5d40908cff06b938efe86727623534de6d791 (diff)
Add ast_is() function; use it in symbol.c
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/ast.c b/ast.c
index cbf588a..e64dc9f 100644
--- a/ast.c
+++ b/ast.c
@@ -48,6 +48,36 @@ ast_statement_new_while (ast_expression_t *condition,
return statement;
}
+gboolean
+ast_is (ast_t *ast,
+ ast_type_t type,
+ int subtype)
+{
+ if (ast->common.type != type)
+ return FALSE;
+
+ switch (type)
+ {
+ case AST_DEFINITION:
+ return subtype == ast->definition.common.type;
+
+ case AST_STATEMENT:
+ return subtype == ast->statement.common.type;
+
+ case AST_EXPRESSION:
+ return subtype == ast->expression.common.type;
+
+ case AST_TYPE_SPEC:
+ return subtype == ast->type_spec.common.type;
+
+ case AST_PROGRAM:
+ return TRUE;
+ }
+
+ g_assert_not_reached();
+ return FALSE;
+}
+
ast_statement_t *
ast_statement_new_for (ast_expression_t *first,
ast_expression_t *second,