forked from stepcode/stepcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpretty_stmt.c
More file actions
118 lines (108 loc) · 3.28 KB
/
pretty_stmt.c
File metadata and controls
118 lines (108 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/** \file pretty_stmt.c
* split out of exppp.c 9/21/13
*/
#include <exppp/exppp.h>
#include "pp.h"
#include "pretty_expr.h"
#include "pretty_case.h"
#include "pretty_loop.h"
#include "pretty_stmt.h"
void STMT_out( Statement s, int level ) {
bool first_time = true;
if( !s ) { /* null statement */
raw( "%*s;\n", level, "" );
return;
}
indent2 = level + exppp_continuation_indent;
switch( s->type ) {
case STMT_ASSIGN:
raw( "%*s", level, "" );
EXPR_out( s->u.assign->lhs, 0 );
wrap( " := " );
EXPR_out( s->u.assign->rhs, 0 );
raw( ";\n", level, "" );
break;
case STMT_CASE:
CASEout( s->u.Case, level );
break;
case STMT_COMPOUND:
raw( "\n%*sBEGIN\n", level, "" );
STMTlist_out( s->u.compound->statements, level + exppp_nesting_indent );
raw( "%*sEND;\n", level, "" );
break;
case STMT_COND:
raw( "%*sIF ", level, "" );
EXPR_out( s->u.cond->test, 0 );
wrap( " THEN\n" );
STMTlist_out( s->u.cond->code, level + exppp_nesting_indent );
if( s->u.cond->otherwise ) {
raw( "%*sELSE\n", level, "" );
STMTlist_out( s->u.cond->otherwise, level + exppp_nesting_indent );
}
raw( "%*sEND_IF;\n", level, "" );
break;
case STMT_LOOP:
LOOPout( s->u.loop, level );
break;
case STMT_PCALL:
raw( "%*s%s( ", level, "", s->symbol.name );
LISTdo( s->u.proc->parameters, p, Expression )
if( first_time ) {
first_time = false;
} else {
raw( ", " );
}
EXPR_out( p, 0 );
LISTod
raw( " );\n" );
break;
case STMT_RETURN:
raw( "%*sRETURN", level, "" );
if( s->u.ret->value ) {
wrap( "( " );
EXPR_out( s->u.ret->value, 0 );
raw( " )" );
}
raw( ";\n" );
break;
case STMT_ALIAS:
raw( "%*sALIAS %s for %s;\n", level, "", s->symbol.name,
/* should be generalized reference */
s->u.alias->variable->name->symbol.name );
STMTlist_out( s->u.alias->statements, level + exppp_nesting_indent );
raw( "%*sEND_ALIAS;", level, "" );
tail_comment( s->symbol.name );
break;
case STMT_SKIP:
raw( "%*sSKIP;\n", level, "" );
break;
case STMT_ESCAPE:
raw( "%*sESCAPE;\n", level, "" );
break;
}
}
void STMTlist_out( Linked_List stmts, int level ) {
LISTdo( stmts, stmt, Statement )
STMT_out( stmt, level );
LISTod
}
char * STMTto_string( Statement s ) {
if( prep_string() ) {
return placeholder;
}
STMT_out( s, 0 );
return ( finish_string() );
}
/* return length of buffer used */
int STMTto_buffer( Statement s, char * buffer, int length ) {
if( prep_buffer( buffer, length ) ) {
return -1;
}
STMT_out( s, 0 );
return( finish_buffer() );
}
void STMTout( Statement s ) {
prep_file();
STMT_out( s, 0 );
finish_file();
}