gesamt: variablen und calls 'mitzaehlen'
[uebersetzerbau-ss10.git] / gesamt / tree.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "tree.h"
5
6 #if 0
7 #define DDTREE
8 #endif
9
10 static struct treenode *_new_plain(int op)
11 {
12         struct treenode *new = (TREECAST) malloc(TREESIZE);
13         new->op = op;
14         new->kids[0] = new->kids[1] = TREENULL;
15         new->parent = TREENULL;
16         new->label = NULL;
17         new->name = new->reg = (char *)NULL;
18         new->val = 0;
19         new->param_index = -1;
20         return new;
21 }
22
23 struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
24 {
25         struct treenode *new = TREENULL;
26
27 #ifdef DDTREE
28         fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]);
29 #endif
30         if(op == O_SUB && l != TREENULL && r != TREENULL && l->op == O_NUM && r->op == O_NUM) {
31                 new = new_number(l->val - r->val);
32                 free(l); free(r);
33         } else  {
34                 new = _new_plain(op);
35                 new->kids[0] = l;
36                 new->kids[1] = r;
37         }
38         new->name = (char *)NULL;
39         return new;
40 }
41
42 struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index)
43 {
44         struct treenode *new = new_node(op, l, r);
45
46 #ifdef DDTREE
47         fprintf(stderr, "new_param: %i (index)\n", param_index);
48 #endif
49         new->param_index = param_index;
50         new->name = name;
51         return new;
52 }
53
54 struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset)
55 {
56         struct treenode *new = new_node(O_FIELD, l, r);
57
58 #ifdef DDTREE
59         fprintf(stderr, "new_field: %i (soffset)\n", soffset);
60 #endif
61         new->soffset = soffset;
62         new->name = name;
63         return new;
64 }
65
66 struct treenode *new_call(char *name, struct treenode *l, struct treenode *r)
67 {
68         struct treenode *new = new_node(O_CALL, l, r);
69
70 #ifdef DDTREE
71         fprintf(stderr, "new_call\n");
72 #endif
73         new->name = name;
74         return new;
75 }
76
77 struct treenode *new_number(long val)
78 {
79         struct treenode *new;
80         /* TODO: maximal groesse? */
81 #define BUFMAX 40
82         char *t = (char*) malloc(BUFMAX);
83
84         if (val == 0) {
85                 new = _new_plain(O_NULL);
86         } else if(val == -1) {
87                 new = _new_plain(O_MONE);
88         } else if(val == -2) {
89                 new = _new_plain(O_MTWO);
90         } else if(val == -4) {
91                 new = _new_plain(O_MFOUR);
92         } else if(val == -8) {
93                 new = _new_plain(O_MEIGHT);
94         } else {
95                 new = _new_plain(O_NUM);
96         }
97
98 #ifdef DDTREE
99         fprintf(stderr, "new_number: %i\n", val);
100 #endif
101         new->val = val;
102         memset(t, 0, BUFMAX);
103         sprintf(t, "%li", val);
104         new->name = t;
105
106         return new;
107 }
108
109 static void write_indent(int i)
110 {
111         int a;
112         for(a = 0; a < i; a++) {
113                 fprintf(stderr, "| ");
114         }
115 }
116
117 void write_tree(struct treenode *node, int indent)
118 {
119         if(node == TREENULL) return;
120         write_indent(indent);
121         fprintf(stderr, "%s @ %%%s. \"%s\"\n", o_names[node->op], node->reg, node->name == (char*) NULL ? "" : node->name);
122         if(node->kids[0] != TREENULL) {
123                 write_tree(node->kids[0], indent+1);
124         }
125         if(node->kids[1] != TREENULL) {
126                 write_tree(node->kids[1], indent+1);
127         }
128 }
129