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