view baum.c @ 8:495a56e706dc

input is now read from stdin
author meillo@marmaro.de
date Sat, 09 Feb 2008 12:42:11 +0100
parents 6a6152cf63f7
children c020b0d1cfca
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() {
	int c;
	int indent;
	char name[256];
	int value;

	indent = 0;
	strcpy(name, "");
	value = 0;

	while ((c = getchar()) != EOF) {
		if (c == '#') { /* comment */
			while ((c = getchar()) != '\n') {
			}
		}

		if (c == ' ' || c == '\t') {  /* indent if at start of line */
			if (strlen(name) == 0) {
				indent++;
			}
		}

		if (c == '\n') {  /* end of line: create node */
			if (strlen(name) > 0) {
				printf(" %d - %s - %d\n", indent, name, value);
				/* create node */
			}
			indent = 0;
			strcpy(name, "");
			value = 0;
		}

		if (c >= 'a' && c <= 'z') {  /* name */
			int i = 1;
			name[0] = (char) c;
			while ((c = getchar()) != '(') {
				name[i] = (char) c;
				i++;
				if (i > 255) {
					break;
				}
			}
			name[i] = '\0';
		}

		if (c == '(') {  /* value */
			scanf("%d)", &value);
		}

	}

}

/* main */
int main(int argc, char* argv[]) {
	unsigned char shell_return = 0;
	/*
	init();

	printTree(root);
	fprintf(stderr, "\n\n");

	shell_return = action(root);

	fprintf(stderr, "\n\n");
	printTree(root);

	delete(root);
	*/
	
	read_input();
	exit(shell_return);
}