annotate baum.c @ 1:3da0ff17c8e7

added features (print, sum, number); split in header file
author meillo@marmaro.de
date Thu, 07 Feb 2008 14:31:02 +0100
parents 2f71d692d4f9
children 557fa4df2bcd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
1 /*
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
2 * baum - an esoteric programming language
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
3 *
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
4 * (c) markus schnalke <meillo@marmaro.de>
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
5 * and julian forster
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
6 *
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
7 */
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
8
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
9
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
10 #include <stdio.h>
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
11 #include <stdlib.h>
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
12 #include <string.h>
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
13
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
14 #include "baum.h"
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
15
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
16 char action(struct Node* node);
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
17
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
18 struct Node* root;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
19
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
20
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
21 void logit(char* text) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
22 fprintf(stderr, "[%s]\n", text);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
23 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
24
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
25
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
26 /* new */
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
27 struct Node* newNode(char* name) {
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
28 struct Node* node;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
29 node = (struct Node*) malloc(sizeof(struct Node));
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
30 node->name = name;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
31 node->value = 0;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
32 node->right = 0;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
33 node->down = 0;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
34 return node;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
35 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
36
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
37
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
38 /* delete */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
39 void delete(struct Node* node) {
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
40 if (node->down != NULL) {
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
41 delete(node->down);
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
42 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
43 if (node->right != NULL) {
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
44 delete(node->right);
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
45 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
46 free(node); node=0;
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
47 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
48
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
49
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
50 /* print */
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
51 void printNode(struct Node* node) {
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
52 printf("Node: %20s (%c)\n", node->name, node->value);
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
53 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
54
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
55 void printTree(struct Node* root) {
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
56 printNode(root);
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
57 printf(" down: ");
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
58 if (root->down != NULL) {
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
59 printTree(root->down);
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
60 } else {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
61 printf("NULL\n");
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
62 }
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
63 printf(" right: ");
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
64 if (root->right != NULL) {
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
65 printTree(root->right);
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
66 } else {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
67 printf("NULL\n");
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
68 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
69 }
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
70
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
71
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
72 char action_print(struct Node* node) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
73 printf("%c\n", action(node->down));
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
74 return 0;
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
75 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
76
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
77 char action_sum(struct Node* node) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
78 struct Node* tp;
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
79 tp = node->down;
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
80 while (tp != NULL) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
81 node->value += action(tp);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
82 tp = tp->right;
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
83 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
84 return node->value;
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
85 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
86
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
87 char action_number(struct Node* node) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
88 return node->value;
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
89 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
90
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
91 char action(struct Node* node) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
92 if (strcmp(node->name, "print") == 0) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
93 logit("print-node");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
94 return action_print(node);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
95 } else if (strcmp(node->name, "sum") == 0) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
96 logit("sum-node");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
97 return action_sum(node);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
98 } else if (strcmp(node->name, "number") == 0) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
99 logit("number-node");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
100 return action_number(node);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
101 } else {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
102 fprintf(stderr, "unknown kind of node");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
103 exit(1);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
104 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
105 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
106
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
107
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
108
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
109 /* traverse */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
110 void traverse(struct Node* root) {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
111 /* each node controlls the nodes below itself */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
112 action(root);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
113 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
114
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
115 /* init */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
116 void init() {
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
117 root = newNode("print");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
118 root->down = newNode("number");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
119 root->down = newNode("sum");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
120 root->down->down = newNode("number");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
121 root->down->down->value = 70; /* 'F' */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
122 root->down->down->right = newNode("number");
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
123 root->down->down->right->value = 50; /* '2' */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
124 /* result should be 'x' */
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
125 }
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
126
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
127
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
128 /* main */
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
129 int main(int argc, char* argv[]) {
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
130 init();
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
131 printTree(root);
1
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
132
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
133 action(root);
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
134
3da0ff17c8e7 added features (print, sum, number); split in header file
meillo@marmaro.de
parents: 0
diff changeset
135 delete(root);
0
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
136
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
137 return(0);
2f71d692d4f9 initial commit
meillo@marmaro.de
parents:
diff changeset
138 }