aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/show-parse.c
diff options
authorLinus Torvalds <torvalds@penguin.transmeta.com>2003-03-24 17:17:00 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 20:59:42 -0700
commitdb4589ae583bf9a9149c6d36af749dcce106df9e (patch)
tree98d291489c566c9f87f70b875661c974a118d8b8 /show-parse.c
parentb15a8ebf5ab3ae464da6cba2170579606c5967ec (diff)
downloadsparse-dev-db4589ae583bf9a9149c6d36af749dcce106df9e.tar.gz
Replace for/while/do-while loops with a generic internal
'iterator' representation so that the parse tree doesn't have to care.
Diffstat (limited to 'show-parse.c')
-rw-r--r--show-parse.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/show-parse.c b/show-parse.c
index 426990fa..bf3d8d2a 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -263,31 +263,51 @@ void show_statement(struct statement *stmt)
printf("\tbreak");
break;
- case STMT_WHILE:
- printf("\twhile (");
- show_expression(stmt->e1);
- printf(")\n");
- show_statement(stmt->iterate);
- break;
-
- case STMT_DO:
- printf("\tdo");
- show_statement(stmt->iterate);
- printf("\nwhile (");
- show_expression(stmt->e1);
- printf(")\n");
- break;
-
- case STMT_FOR:
- printf("\tfor (" );
- show_expression(stmt->e1);
- printf(" ; ");
- show_expression(stmt->e2);
- printf(" ; ");
- show_expression(stmt->e3);
- printf(")\n");
- show_statement(stmt->iterate);
+ case STMT_ITERATOR: {
+ struct statement *pre_statement = stmt->iterator_pre_statement;
+ struct expression *pre_condition = stmt->iterator_pre_condition;
+ struct statement *statement = stmt->iterator_statement;
+ struct statement *post_statement = stmt->iterator_post_statement;
+ struct expression *post_condition = stmt->iterator_post_condition;
+
+ /*
+ * THIS IS ONLY APPROXIMATE!
+ *
+ * Real iterators are more generic than
+ * any of for/while/do-while, and can't
+ * be printed out as C without goto's
+ */
+ if (post_statement) {
+ printf("\tfor (\n\t");
+ show_statement(pre_statement);
+ printf(";\n\t\t");
+ show_expression(pre_condition);
+ printf(";\n\t");
+ show_statement(post_statement);
+ printf("\n\t)\n");
+ show_statement(statement);
+ } else if (pre_condition) {
+ if (pre_statement) {
+ show_statement(pre_statement);
+ printf(";\n");
+ }
+ printf("\twhile (");
+ show_expression(pre_condition);
+ printf(")\n");
+ show_statement(statement);
+ } else {
+ if (pre_statement) {
+ show_statement(pre_statement);
+ printf(";\n");
+ }
+ printf("\tdo\n");
+ show_statement(statement);
+ printf("\twhile (");
+ show_expression(post_condition);
+ printf(")");
+ }
break;
+ }
default:
printf("WTF");