diff options
| author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2003-03-24 17:17:00 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 20:59:42 -0700 |
| commit | db4589ae583bf9a9149c6d36af749dcce106df9e (patch) | |
| tree | 98d291489c566c9f87f70b875661c974a118d8b8 /show-parse.c | |
| parent | b15a8ebf5ab3ae464da6cba2170579606c5967ec (diff) | |
| download | sparse-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.c | 68 |
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"); |
