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@2
|
15 #include "actions.h"
|
meillo@0
|
16
|
meillo@0
|
17
|
meillo@5
|
18 struct Node* root = 0;
|
meillo@10
|
19 struct Stackitem* stack = NULL;
|
meillo@0
|
20
|
meillo@0
|
21
|
meillo@1
|
22 void logit(char* text) {
|
meillo@1
|
23 fprintf(stderr, "[%s]\n", text);
|
meillo@1
|
24 }
|
meillo@1
|
25
|
meillo@1
|
26
|
meillo@1
|
27 /* new */
|
meillo@3
|
28 struct Node* newNode(char* name, unsigned char value) {
|
meillo@0
|
29 struct Node* node;
|
meillo@0
|
30 node = (struct Node*) malloc(sizeof(struct Node));
|
meillo@9
|
31 strcpy(node->name, name);
|
meillo@3
|
32 node->value = value;
|
meillo@0
|
33 node->right = 0;
|
meillo@0
|
34 node->down = 0;
|
meillo@0
|
35 return node;
|
meillo@0
|
36 }
|
meillo@0
|
37
|
meillo@0
|
38
|
meillo@3
|
39 void setValue(struct Node* node, unsigned char value) {
|
meillo@3
|
40 node->value = value;
|
meillo@3
|
41 }
|
meillo@3
|
42
|
meillo@3
|
43
|
meillo@3
|
44 struct Node* nextNode(struct Node* node) {
|
meillo@3
|
45 return node->right;
|
meillo@3
|
46 }
|
meillo@3
|
47
|
meillo@3
|
48 struct Node* lastNode(struct Node* node) {
|
meillo@3
|
49 while (node->right != NULL) {
|
meillo@3
|
50 node = node->right;
|
meillo@3
|
51 }
|
meillo@3
|
52 return node;
|
meillo@3
|
53 }
|
meillo@3
|
54
|
meillo@3
|
55 void insertLast(struct Node* node, struct Node* insert) {
|
meillo@3
|
56 node = lastNode(node);
|
meillo@3
|
57 node->right = insert;
|
meillo@3
|
58 }
|
meillo@3
|
59
|
meillo@1
|
60 /* delete */
|
meillo@1
|
61 void delete(struct Node* node) {
|
meillo@5
|
62 if (node != NULL) {
|
meillo@5
|
63 if (node->down != NULL) {
|
meillo@5
|
64 delete(node->down);
|
meillo@5
|
65 }
|
meillo@5
|
66 if (node->right != NULL) {
|
meillo@5
|
67 delete(node->right);
|
meillo@5
|
68 }
|
meillo@5
|
69 free(node); node=0;
|
meillo@0
|
70 }
|
meillo@0
|
71 }
|
meillo@0
|
72
|
meillo@1
|
73
|
meillo@1
|
74 /* print */
|
meillo@0
|
75 void printNode(struct Node* node) {
|
meillo@5
|
76 if (node != NULL) {
|
meillo@9
|
77 fprintf(stderr, "Node: %10s (%d|%c)\n", node->name, node->value, node->value);
|
meillo@5
|
78 }
|
meillo@0
|
79 }
|
meillo@0
|
80
|
meillo@0
|
81 void printTree(struct Node* root) {
|
meillo@5
|
82 if (root != NULL) {
|
meillo@5
|
83 printNode(root);
|
meillo@5
|
84 fprintf(stderr, " down: ");
|
meillo@5
|
85 if (root->down != NULL) {
|
meillo@5
|
86 printTree(root->down);
|
meillo@5
|
87 } else {
|
meillo@5
|
88 fprintf(stderr, "NULL\n");
|
meillo@5
|
89 }
|
meillo@5
|
90 fprintf(stderr, " right: ");
|
meillo@5
|
91 if (root->right != NULL) {
|
meillo@5
|
92 printTree(root->right);
|
meillo@5
|
93 } else {
|
meillo@5
|
94 fprintf(stderr, "NULL\n");
|
meillo@5
|
95 }
|
meillo@0
|
96 }
|
meillo@0
|
97 }
|
meillo@0
|
98
|
meillo@0
|
99
|
meillo@1
|
100
|
meillo@1
|
101 /* traverse */
|
meillo@1
|
102 void traverse(struct Node* root) {
|
meillo@1
|
103 /* each node controlls the nodes below itself */
|
meillo@1
|
104 action(root);
|
meillo@1
|
105 }
|
meillo@1
|
106
|
meillo@3
|
107
|
meillo@3
|
108
|
meillo@3
|
109
|
meillo@9
|
110 void push(struct Node* node) {
|
meillo@10
|
111 struct Stackitem* tmp;
|
meillo@10
|
112 struct Stackitem* new;
|
meillo@10
|
113 new = (struct Stackitem*) malloc(sizeof(struct Stackitem));
|
meillo@9
|
114 new->node = node;
|
meillo@10
|
115 tmp = stack;
|
meillo@10
|
116 stack = new;
|
meillo@10
|
117 stack->next = tmp;
|
meillo@9
|
118 }
|
meillo@9
|
119 struct Node* pull() {
|
meillo@10
|
120 if (stack == NULL) {
|
meillo@9
|
121 return NULL;
|
meillo@9
|
122 }
|
meillo@10
|
123 struct Stackitem* tmp;
|
meillo@9
|
124 struct Node* node;
|
meillo@10
|
125 tmp = stack;
|
meillo@10
|
126 stack = stack->next;
|
meillo@9
|
127 node = tmp->node;
|
meillo@9
|
128 free(tmp); tmp=0;
|
meillo@9
|
129 return node;
|
meillo@9
|
130 }
|
meillo@3
|
131
|
meillo@1
|
132
|
meillo@1
|
133
|
meillo@6
|
134 /* read input */
|
meillo@8
|
135 void read_input() {
|
meillo@7
|
136 int c;
|
meillo@8
|
137 int indent;
|
meillo@7
|
138 char name[256];
|
meillo@6
|
139 int value;
|
meillo@9
|
140 int last_indent;
|
meillo@9
|
141 struct Node* last_node;
|
meillo@9
|
142 struct Node* node;
|
meillo@6
|
143
|
meillo@8
|
144 indent = 0;
|
meillo@8
|
145 strcpy(name, "");
|
meillo@8
|
146 value = 0;
|
meillo@9
|
147 last_indent = -1;
|
meillo@9
|
148 root = newNode("blackhole", 0);
|
meillo@9
|
149 last_node = root;
|
meillo@6
|
150
|
meillo@8
|
151 while ((c = getchar()) != EOF) {
|
meillo@8
|
152 if (c == '#') { /* comment */
|
meillo@8
|
153 while ((c = getchar()) != '\n') {
|
meillo@7
|
154 }
|
meillo@7
|
155 }
|
meillo@7
|
156
|
meillo@8
|
157 if (c == ' ' || c == '\t') { /* indent if at start of line */
|
meillo@8
|
158 if (strlen(name) == 0) {
|
meillo@8
|
159 indent++;
|
meillo@8
|
160 }
|
meillo@7
|
161 }
|
meillo@6
|
162
|
meillo@8
|
163 if (c == '\n') { /* end of line: create node */
|
meillo@7
|
164 if (strlen(name) > 0) {
|
meillo@9
|
165 fprintf(stderr, " %d - %s - %d\n", indent, name, value);
|
meillo@8
|
166 /* create node */
|
meillo@9
|
167 node = newNode((char*) name, value);
|
meillo@9
|
168 if (indent > last_indent) { /* down */
|
meillo@9
|
169 last_node->down = node;
|
meillo@9
|
170 push(last_node);
|
meillo@9
|
171 } else if (indent == last_indent) { /* right */
|
meillo@9
|
172 last_node->right = node;
|
meillo@9
|
173 } else if (indent < last_indent) { /* up */
|
meillo@9
|
174 /* FIXME what if it goes more than one level up? */
|
meillo@9
|
175 last_node = pull();
|
meillo@9
|
176 last_node->right = node;
|
meillo@9
|
177 }
|
meillo@9
|
178 last_indent = indent;
|
meillo@9
|
179 last_node = node;
|
meillo@6
|
180 }
|
meillo@6
|
181 indent = 0;
|
meillo@6
|
182 strcpy(name, "");
|
meillo@6
|
183 value = 0;
|
meillo@6
|
184 }
|
meillo@7
|
185
|
meillo@8
|
186 if (c >= 'a' && c <= 'z') { /* name */
|
meillo@7
|
187 int i = 1;
|
meillo@7
|
188 name[0] = (char) c;
|
meillo@8
|
189 while ((c = getchar()) != '(') {
|
meillo@7
|
190 name[i] = (char) c;
|
meillo@7
|
191 i++;
|
meillo@8
|
192 if (i > 255) {
|
meillo@8
|
193 break;
|
meillo@8
|
194 }
|
meillo@7
|
195 }
|
meillo@7
|
196 name[i] = '\0';
|
meillo@7
|
197 }
|
meillo@7
|
198
|
meillo@8
|
199 if (c == '(') { /* value */
|
meillo@8
|
200 scanf("%d)", &value);
|
meillo@7
|
201 }
|
meillo@7
|
202
|
meillo@6
|
203 }
|
meillo@7
|
204
|
meillo@6
|
205 }
|
meillo@6
|
206
|
meillo@1
|
207 /* main */
|
meillo@0
|
208 int main(int argc, char* argv[]) {
|
meillo@7
|
209 unsigned char shell_return = 0;
|
meillo@9
|
210
|
meillo@9
|
211 read_input();
|
meillo@0
|
212 printTree(root);
|
meillo@1
|
213
|
meillo@5
|
214 shell_return = action(root);
|
meillo@1
|
215
|
meillo@3
|
216 printTree(root);
|
meillo@9
|
217 delete(root);
|
meillo@4
|
218
|
meillo@5
|
219 exit(shell_return);
|
meillo@0
|
220 }
|