7e7c715fab3f69dce60e446701a4b591147ccb7b
[uebersetzerbau-ss10.git] / codea / 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 = new->skip = new->exprcount = 0;
19         new->param_index = -1;
20         return new;
21 }
22
23 struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount)
24 {
25         struct treenode *new = _new_plain(op);
26
27 #ifdef DDTREE
28         fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]);
29 #endif
30
31         new->kids[0] = l;
32         new->kids[1] = r;
33         new->name = (char *)NULL;
34         new->exprcount = exprcount;
35         return new;
36 }
37
38 struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index, int exprcount)
39 {
40         struct treenode *new = new_node(op, l, r, exprcount);
41
42 #ifdef DDTREE
43         fprintf(stderr, "new_param: %i (index)\n", param_index);
44 #endif
45         new->param_index = param_index;
46         new->name = name;
47         return new;
48 }
49
50 struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset, int exprcount)
51 {
52         struct treenode *new = new_node(O_FIELD, l, r, exprcount);
53
54 #ifdef DDTREE
55         fprintf(stderr, "new_field: %i (soffset)\n", soffset);
56 #endif
57         new->soffset = soffset;
58         new->name = name;
59         return new;
60 }
61
62 struct treenode *new_number(long val, int exprcount)
63 {
64         struct treenode *new = _new_plain(O_NUM);
65         /* TODO: maximal groesse? */
66 #define BUFMAX 40
67         char *t = (char*) malloc(BUFMAX);
68
69 #ifdef DDTREE
70         fprintf(stderr, "new_number: %i\n", val);
71 #endif
72         new->val = val;
73         new->exprcount = exprcount;
74         memset(t, 0, BUFMAX);
75         sprintf(t, "%li", val);
76         new->name = t;
77
78         return new;
79 }
80
81 static void write_indent(int i)
82 {
83         int a;
84         for(a = 0; a < i; a++) {
85                 fprintf(stderr, "| ");
86         }
87 }
88
89 void write_tree(struct treenode *node, int indent)
90 {
91         write_indent(indent);
92         fprintf(stderr, "%s @ %%%s (%i). \"%s\"\n", o_names[node->op], node->reg, node->exprcount, node->name == (char*) NULL ? "" : node->name);
93         if(node->kids[0] != TREENULL) {
94                 write_tree(node->kids[0], indent+1);
95         }
96         if(node->kids[1] != TREENULL) {
97                 write_tree(node->kids[1], indent+1);
98         }
99 }
100