9ee0b479161005c252aa2b103b4c5c2488589ed2
[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_number(long val, int exprcount)
51 {
52         struct treenode *new = _new_plain(O_NUM);
53         /* TODO: maximal groesse? */
54 #define BUFMAX 40
55         char *t = (char*) malloc(BUFMAX);
56
57 #ifdef DDTREE
58         fprintf(stderr, "new_number: %i\n", val);
59 #endif
60         new->val = val;
61         new->exprcount = exprcount;
62         memset(t, 0, BUFMAX);
63         sprintf(t, "%li", val);
64         new->name = t;
65
66         return new;
67 }
68
69 static void write_indent(int i)
70 {
71         int a;
72         for(a = 0; a < i; a++) {
73                 fprintf(stderr, "| ");
74         }
75 }
76
77 void write_tree(struct treenode *node, int indent)
78 {
79         write_indent(indent);
80         fprintf(stderr, "%s @ %%%s (%i). \"%s\"\n", o_names[node->op], node->reg, node->exprcount, node->name == (char*) NULL ? "" : node->name);
81         if(node->kids[0] != TREENULL) {
82                 write_tree(node->kids[0], indent+1);
83         }
84         if(node->kids[1] != TREENULL) {
85                 write_tree(node->kids[1], indent+1);
86         }
87 }
88