Mercurial > baum
view baum.c @ 6:ab87b154a96b
first tries for the read input function
author | meillo@marmaro.de |
---|---|
date | Fri, 08 Feb 2008 21:44:07 +0100 |
parents | c202ccccedb5 |
children | 6a6152cf63f7 |
line wrap: on
line source
/* * baum - an esoteric programming language * * (c) markus schnalke <meillo@marmaro.de> * and julian forster * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "baum.h" #include "actions.h" struct Node* root = 0; void logit(char* text) { fprintf(stderr, "[%s]\n", text); } /* new */ struct Node* newNode(char* name, unsigned char value) { struct Node* node; node = (struct Node*) malloc(sizeof(struct Node)); node->name = name; node->value = value; node->right = 0; node->down = 0; return node; } void setValue(struct Node* node, unsigned char value) { node->value = value; } struct Node* nextNode(struct Node* node) { return node->right; } struct Node* lastNode(struct Node* node) { while (node->right != NULL) { node = node->right; } return node; } void insertLast(struct Node* node, struct Node* insert) { node = lastNode(node); node->right = insert; } /* delete */ void delete(struct Node* node) { if (node != NULL) { if (node->down != NULL) { delete(node->down); } if (node->right != NULL) { delete(node->right); } free(node); node=0; } } /* print */ void printNode(struct Node* node) { if (node != NULL) { fprintf(stderr, "Node: %20s (%d|%c)\n", node->name, node->value, node->value); } } void printTree(struct Node* root) { if (root != NULL) { printNode(root); fprintf(stderr, " down: "); if (root->down != NULL) { printTree(root->down); } else { fprintf(stderr, "NULL\n"); } fprintf(stderr, " right: "); if (root->right != NULL) { printTree(root->right); } else { fprintf(stderr, "NULL\n"); } } } /* traverse */ void traverse(struct Node* root) { /* each node controlls the nodes below itself */ action(root); } /* init */ void init() { /* add some numbers root = newNode("print", 'n'); root->down = newNode("sum", 0); root->down->down = newNode("number", 60); root->down->down->right = newNode("number", 50); root->down->down->right->right = newNode("sum", 0); root->down->down->right->right->down = newNode("number", 1); root->down->down->right->right->down->right = newNode("number", 5); */ /* input numbers and add them root = newNode("print", 'n'); root->down = newNode("sum", 0); root->down->down = newNode("input", 0); root->down->down->right = newNode("input", 0); root->down->down->right->right = newNode("input", 0); */ /* prints HelloWorld */ struct Node* np = 0; root = newNode("blackhole", 0); root->down = newNode("sum", 0); root->down->down = newNode("print", 'c'); np = root->down->down; np->down = newNode("number", 'H'); np->right = newNode("print", 'c'); np->right->down = newNode("number", 'e'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'l'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'l'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'o'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", ' '); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'L'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'y'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'd'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 'i'); np = np->right; np->right = newNode("print", 'c'); np->right->down = newNode("number", 10); np = np->right; } /* read input */ void read_input(char* filename) { FILE* fp; char c; char* line; int indent; char* name; int value; fp = fopen(filename, "r"); indent = 0; while ((c = getc(fp)) != EOF) { if (c == ' ' || c == '\t') { indent++; } else if (c == '(') { fscanf(fp, "%d", &value); } else if (c == '\n') { if (strcmp(name, "") != 0) { printf("\nindent: %d\nname: %s\nvalue: %d\n", indent, name, value); } indent = 0; strcpy(name, ""); value = 0; } else { fscanf(fp, "%[a-z]", name); } } } /* main */ int main(int argc, char* argv[]) { unsigned char shell_return; /* init(); printTree(root); fprintf(stderr, "\n\n"); shell_return = action(root); fprintf(stderr, "\n\n"); printTree(root); delete(root); */ read_input("./input_addition"); exit(shell_return); }