meillo@0: /* meillo@0: * baum - an esoteric programming language meillo@0: * meillo@0: * (c) markus schnalke meillo@0: * and julian forster meillo@0: * meillo@0: */ meillo@0: meillo@0: meillo@0: #include meillo@0: #include meillo@1: #include meillo@0: meillo@1: #include "baum.h" meillo@2: #include "actions.h" meillo@0: meillo@0: meillo@5: struct Node* root = 0; meillo@0: meillo@0: meillo@1: void logit(char* text) { meillo@1: fprintf(stderr, "[%s]\n", text); meillo@1: } meillo@1: meillo@1: meillo@1: /* new */ meillo@3: struct Node* newNode(char* name, unsigned char value) { meillo@0: struct Node* node; meillo@0: node = (struct Node*) malloc(sizeof(struct Node)); meillo@0: node->name = name; meillo@3: node->value = value; meillo@0: node->right = 0; meillo@0: node->down = 0; meillo@0: return node; meillo@0: } meillo@0: meillo@0: meillo@3: void setValue(struct Node* node, unsigned char value) { meillo@3: node->value = value; meillo@3: } meillo@3: meillo@3: meillo@3: struct Node* nextNode(struct Node* node) { meillo@3: return node->right; meillo@3: } meillo@3: meillo@3: struct Node* lastNode(struct Node* node) { meillo@3: while (node->right != NULL) { meillo@3: node = node->right; meillo@3: } meillo@3: return node; meillo@3: } meillo@3: meillo@3: void insertLast(struct Node* node, struct Node* insert) { meillo@3: node = lastNode(node); meillo@3: node->right = insert; meillo@3: } meillo@3: meillo@1: /* delete */ meillo@1: void delete(struct Node* node) { meillo@5: if (node != NULL) { meillo@5: if (node->down != NULL) { meillo@5: delete(node->down); meillo@5: } meillo@5: if (node->right != NULL) { meillo@5: delete(node->right); meillo@5: } meillo@5: free(node); node=0; meillo@0: } meillo@0: } meillo@0: meillo@1: meillo@1: /* print */ meillo@0: void printNode(struct Node* node) { meillo@5: if (node != NULL) { meillo@5: fprintf(stderr, "Node: %20s (%d|%c)\n", node->name, node->value, node->value); meillo@5: } meillo@0: } meillo@0: meillo@0: void printTree(struct Node* root) { meillo@5: if (root != NULL) { meillo@5: printNode(root); meillo@5: fprintf(stderr, " down: "); meillo@5: if (root->down != NULL) { meillo@5: printTree(root->down); meillo@5: } else { meillo@5: fprintf(stderr, "NULL\n"); meillo@5: } meillo@5: fprintf(stderr, " right: "); meillo@5: if (root->right != NULL) { meillo@5: printTree(root->right); meillo@5: } else { meillo@5: fprintf(stderr, "NULL\n"); meillo@5: } meillo@0: } meillo@0: } meillo@0: meillo@0: meillo@1: meillo@1: /* traverse */ meillo@1: void traverse(struct Node* root) { meillo@1: /* each node controlls the nodes below itself */ meillo@1: action(root); meillo@1: } meillo@1: meillo@1: /* init */ meillo@1: void init() { meillo@3: /* add some numbers meillo@5: root = newNode("print", 'n'); meillo@3: root->down = newNode("sum", 0); meillo@3: meillo@3: root->down->down = newNode("number", 60); meillo@3: meillo@3: root->down->down->right = newNode("number", 50); meillo@3: meillo@3: root->down->down->right->right = newNode("sum", 0); meillo@3: root->down->down->right->right->down = newNode("number", 1); meillo@3: root->down->down->right->right->down->right = newNode("number", 5); meillo@3: */ meillo@3: meillo@5: /* input numbers and add them meillo@5: root = newNode("print", 'n'); meillo@3: root->down = newNode("sum", 0); meillo@3: root->down->down = newNode("input", 0); meillo@3: root->down->down->right = newNode("input", 0); meillo@3: root->down->down->right->right = newNode("input", 0); meillo@5: */ meillo@5: meillo@5: /* prints HelloWorld meillo@5: */ meillo@5: struct Node* np = 0; meillo@5: meillo@5: root = newNode("blackhole", 0); meillo@5: root->down = newNode("sum", 0); meillo@5: root->down->down = newNode("print", 'c'); meillo@5: np = root->down->down; meillo@5: np->down = newNode("number", 'H'); meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'e'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'l'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'l'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'o'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", ' '); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'L'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'y'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'd'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 'i'); meillo@5: np = np->right; meillo@5: meillo@5: np->right = newNode("print", 'c'); meillo@5: np->right->down = newNode("number", 10); meillo@5: np = np->right; meillo@5: meillo@5: meillo@1: } meillo@1: meillo@1: meillo@1: /* main */ meillo@0: int main(int argc, char* argv[]) { meillo@5: unsigned char shell_return; meillo@0: init(); meillo@4: meillo@0: printTree(root); meillo@5: fprintf(stderr, "\n\n"); meillo@1: meillo@5: shell_return = action(root); meillo@1: meillo@5: fprintf(stderr, "\n\n"); meillo@3: printTree(root); meillo@4: meillo@1: delete(root); meillo@0: meillo@5: exit(shell_return); meillo@0: }