baum

annotate baum.c @ 12:8e34daa80f64

input is now read from file again (because of input node)
author meillo@marmaro.de
date Tue, 12 Feb 2008 15:53:08 +0100
parents 0e15841ae111
children bf660b45bba9
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@12 135 void read_input(char* filename) {
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@12 143 FILE* file;
meillo@6 144
meillo@8 145 indent = 0;
meillo@8 146 strcpy(name, "");
meillo@8 147 value = 0;
meillo@9 148 last_indent = -1;
meillo@9 149 root = newNode("blackhole", 0);
meillo@9 150 last_node = root;
meillo@12 151 file = fopen(filename, "r");
meillo@6 152
meillo@12 153 while ((c = getc(file)) != EOF) {
meillo@8 154 if (c == '#') { /* comment */
meillo@12 155 while ((c = getc(file)) != '\n') {
meillo@7 156 }
meillo@7 157 }
meillo@7 158
meillo@8 159 if (c == ' ' || c == '\t') { /* indent if at start of line */
meillo@8 160 if (strlen(name) == 0) {
meillo@8 161 indent++;
meillo@8 162 }
meillo@7 163 }
meillo@6 164
meillo@8 165 if (c == '\n') { /* end of line: create node */
meillo@7 166 if (strlen(name) > 0) {
meillo@9 167 fprintf(stderr, " %d - %s - %d\n", indent, name, value);
meillo@8 168 /* create node */
meillo@9 169 node = newNode((char*) name, value);
meillo@9 170 if (indent > last_indent) { /* down */
meillo@9 171 last_node->down = node;
meillo@9 172 push(last_node);
meillo@9 173 } else if (indent == last_indent) { /* right */
meillo@9 174 last_node->right = node;
meillo@9 175 } else if (indent < last_indent) { /* up */
meillo@9 176 /* FIXME what if it goes more than one level up? */
meillo@9 177 last_node = pull();
meillo@9 178 last_node->right = node;
meillo@9 179 }
meillo@9 180 last_indent = indent;
meillo@9 181 last_node = node;
meillo@6 182 }
meillo@6 183 indent = 0;
meillo@6 184 strcpy(name, "");
meillo@6 185 value = 0;
meillo@6 186 }
meillo@7 187
meillo@8 188 if (c >= 'a' && c <= 'z') { /* name */
meillo@7 189 int i = 1;
meillo@7 190 name[0] = (char) c;
meillo@12 191 while ((c = getc(file)) != '(') {
meillo@7 192 name[i] = (char) c;
meillo@7 193 i++;
meillo@8 194 if (i > 255) {
meillo@8 195 break;
meillo@8 196 }
meillo@7 197 }
meillo@7 198 name[i] = '\0';
meillo@7 199 }
meillo@7 200
meillo@8 201 if (c == '(') { /* value */
meillo@12 202 fscanf(file, "%d)", &value);
meillo@7 203 }
meillo@7 204
meillo@6 205 }
meillo@7 206
meillo@12 207 fclose(file);
meillo@12 208
meillo@6 209 }
meillo@6 210
meillo@1 211 /* main */
meillo@0 212 int main(int argc, char* argv[]) {
meillo@7 213 unsigned char shell_return = 0;
meillo@9 214
meillo@12 215 read_input("./input_sum3input");
meillo@0 216 printTree(root);
meillo@1 217
meillo@5 218 shell_return = action(root);
meillo@1 219
meillo@3 220 printTree(root);
meillo@9 221 delete(root);
meillo@4 222
meillo@5 223 exit(shell_return);
meillo@0 224 }