comparison baum.c @ 33:2e564bf8599c

new error code 6; more readable printTree; cleanups
author meillo@marmaro.de
date Sat, 01 Mar 2008 17:36:59 +0100
parents 4e60d96265f0
children e986c6abed2b
comparison
equal deleted inserted replaced
32:3903effae5ef 33:2e564bf8599c
21 21
22 struct Node* root = 0; 22 struct Node* root = 0;
23 struct Stackitem* stack = NULL; 23 struct Stackitem* stack = NULL;
24 24
25 25
26 void printNode(struct Node* node); 26 void printNode(struct Node* node, int level);
27 void printTree(struct Node* root); 27 void printTree(struct Node* root, int level);
28 struct Node* lastNode(struct Node* node); 28 struct Node* lastNode(struct Node* node);
29 void delete(struct Node* node); 29 void delete(struct Node* node);
30 30
31 31
32 32
67 /* delete */ 67 /* delete */
68 void delete(struct Node* node) { 68 void delete(struct Node* node) {
69 if (node == NULL) { 69 if (node == NULL) {
70 return; 70 return;
71 } 71 }
72 if (node->down != NULL) { 72 delete(node->down);
73 delete(node->down); 73 delete(node->right);
74 }
75 if (node->right != NULL) {
76 delete(node->right);
77 }
78 free(node); node=0; 74 free(node); node=0;
79 } 75 }
80 76
81 77
82 /* print */ 78 /* print */
83 void printNode(struct Node* node) { 79 void printNode(struct Node* node, int level) {
84 if (node != NULL) { 80 if (node != NULL) {
85 fprintf(stderr, "Node: %10s (%d|%c)\n", node->name, node->value, node->value); 81 while (level-- > 0) {
86 } 82 fprintf(stderr, "\t");
87 } 83 }
88 84 fprintf(stderr, "%s (%d|%c)\n", node->name, node->value, node->value);
89 void printTree(struct Node* root) { 85 }
86 }
87
88 void printTree(struct Node* root, int level) {
90 if (root == NULL) { 89 if (root == NULL) {
91 return; 90 return;
92 } 91 }
93 92 printNode(root, level);
94 printNode(root); 93 printTree(root->down, level+1);
95 fprintf(stderr, " down: "); 94 printTree(root->right, level);
96 if (root->down != NULL) {
97 printTree(root->down);
98 } else {
99 fprintf(stderr, "NULL\n");
100 }
101 fprintf(stderr, " right: ");
102 if (root->right != NULL) {
103 printTree(root->right);
104 } else {
105 fprintf(stderr, "NULL\n");
106 }
107 } 95 }
108 96
109 97
110 98
111 99
173 } 161 }
174 /* create node */ 162 /* create node */
175 node = newNode((char*) name, value); 163 node = newNode((char*) name, value);
176 if (indent > last_indent) { /* down */ 164 if (indent > last_indent) { /* down */
177 /* if it goes more than one level down -> error */ 165 /* if it goes more than one level down -> error */
178 if (indent - last_indent > 1) { 166 if (indent > last_indent + 1) {
179 fprintf(stderr, "error: Indention over more than one level. Only indent by one!\n"); 167 fprintf(stderr, "error: Indention over more than one level. Only indent by one!\n");
180 exit(5); 168 exit(5);
181 } 169 }
182 last_node->down = node; 170 last_node->down = node;
183 push(last_node); 171 push(last_node);
204 name[0] = (char) c; 192 name[0] = (char) c;
205 while ((c = getc(file)) != '(') { 193 while ((c = getc(file)) != '(') {
206 name[i] = (char) c; 194 name[i] = (char) c;
207 i++; 195 i++;
208 if (i > 255) { 196 if (i > 255) {
209 break; 197 fprintf(stderr, "error: node name too long, or no value given\n");
198 exit(6);
210 } 199 }
211 } 200 }
212 name[i] = '\0'; 201 name[i] = '\0';
213 } 202 }
214 203
268 } 257 }
269 258
270 read_input(argv[0]); 259 read_input(argv[0]);
271 260
272 if (option_verbose) { 261 if (option_verbose) {
273 printTree(root); 262 printTree(root, 0);
274 } 263 }
275 264
276 shell_return = action(root); 265 shell_return = action(root);
277 266
278 if (option_verbose) { 267 if (option_verbose) {
279 printTree(root); 268 printTree(root, 0);
280 } 269 }
281 270
282 delete(root); 271 delete(root);
283 exit(shell_return); 272 exit(shell_return);
284 } 273 }