#include "tree.h"

treeNode::treeNode(char *id) {
	value = strdup(id);
	left = right = NULL;
}

treeNode::treeNode(FILE *f, int lo, int hi) {
	left = right = NULL;

	int mid = (lo + hi) / 2;

	// First load this node
	value = (char *)malloc(80);
	fseek(f, mid*80, SEEK_SET);
	fread(value, 80, 1, f);
	value[79] = 0;

	// Left node
	if (mid - 1 >= lo) left = new treeNode(f, lo, mid - 1);
	// Right node
	if (mid + 1 <= hi) right = new treeNode(f, mid + 1, hi);
}

int treeNode::inTree(char *id) {
	int 	res;

	res = strcmp(id, value);

	if (res == 0) return TRUE;
	else if (res < 0) {
		if (left) return left->inTree(id);
		else { left = new treeNode(id); return FALSE; }
	} else if (res > 0) {
		if (right) return right->inTree(id);
		else { right = new treeNode(id); return FALSE; }
	}
}

void treeNode::saveNode(FILE *f) {
	if (left) left->saveNode(f);

	char tmp[80];		// Make sure string is 80 chars
	strcpy(tmp, value);
	tmp[79] = 0;		// And does terminate.

	fwrite(tmp,80,1,f);

	if (right) right->saveNode(f);
}

void treeNode::printDepth(int d) {
    if (!left && !right)
	printf("Depth: %d\n",d);
    else {
	if(left)
	    left->printDepth(d+1);
	if(right)
	    right->printDepth(d+1);
    }
}

void treeNode::printNode() {
	if (left) left->printNode();

	printf("%s\n\r", value);

	if (right) right->printNode();
}

void binaryTree::printTree() {
	root->printNode();
}

int binaryTree::inTree(char *id) {
	if (!id) return FALSE;

	if (strlen(id) > 79) id[79] = 0;

	if (root == NULL) { root = new treeNode(id); checkSave(); return FALSE; }
	else { 
		if (root->inTree(id)) return TRUE; 
		else { checkSave(); return FALSE; }
	}
}

void binaryTree::checkSave() {
	addsSinceLastSave++;

	if (addsSinceLastSave == 5) {
		saveTree();
		addsSinceLastSave = 0;
	}
}

void binaryTree::saveTree() {
	FILE *groupFile;

	groupFile = fopen(groupName,"w");

	if (root) root->saveNode(groupFile);
	
	fclose(groupFile);
}

void binaryTree::loadTree() {
	FILE *groupFile;
	long fsize;

	groupFile = fopen(groupName,"r");
	if (groupFile) {
		fseek(groupFile, 0, SEEK_END);
		fsize = ftell(groupFile) / 80;

		root = new treeNode(groupFile, 0, fsize-1);

		fclose(groupFile);
	}
}

void binaryTree::printDepth() {
    if( root )
	root->printDepth(1);
}


syntax highlighted by Code2HTML, v. 0.9.1