This is smartgoparse.c in view mode; [Download] [Up]
#include "comment.header" /* $Id: smartgoparse.c,v 1.3 1997/07/06 19:35:09 ergo Exp $ */ /* * $Log: smartgoparse.c,v $ * Revision 1.3 1997/07/06 19:35:09 ergo * actual version * * Revision 1.2 1997/05/04 18:57:14 ergo * added time control for moves * */ #include <stdlib.h> #include "smartgo.h" /* Define the following when debugging the tree parsing algorithm. */ /* #define _DEBUG_ON_ */ char *currentChar; int currentNodeNumber; void add_node(node* cur_node, char* node_loc) { node* new_node; new_node = (node *) malloc((size_t) sizeof(node)); new_node->nodenum = currentNodeNumber++; cur_node->next = new_node; new_node->prev = cur_node; new_node->parent = cur_node->parent; new_node->properties = node_loc; new_node->next = new_node->next_var = new_node->prev_var = new_node->variants = NULL; #ifdef _DEBUG_ON_ printf("Add, "); #endif } void add_variant(node* parent) { node *new_var, *tnode; new_var = (node *) malloc((size_t) sizeof(node)); if (parent->variants == NULL) { parent->variants = new_var; new_var->prev_var = NULL; } else { tnode = parent->variants; while (tnode->next_var != NULL) tnode = tnode->next_var; tnode->next_var = new_var; new_var->prev_var = tnode; } new_var->parent = parent; new_var->properties = NULL; new_var->nodenum = 0; new_var->next_var = new_var->variants = new_var->next = new_var->prev = NULL; #ifdef _DEBUG_ON_ printf("Pop, "); #endif } void do_variant(node* startNode) { node *subNode, *currentNode; int level = 0; currentNode = startNode; while ((*currentChar != ')') && (*currentChar != 0)) { if (*currentChar == '\\') { currentChar++; } else if (*currentChar == '[') { level++; } else if (*currentChar == ']') { level--; } else if ((*currentChar == '(') && (level == 0)) { #ifdef _DEBUG_ON_ printf("Down, "); #endif add_variant(currentNode); subNode = currentNode->variants; while (subNode->next_var != NULL) subNode = subNode->next_var; currentChar++; do_variant(subNode); } else if ((*currentChar == ';') && (level == 0)) { add_node(currentNode, currentChar); currentChar++; currentNode = currentNode->next; } currentChar++; if ((*currentChar == ')') && (level != 0)) currentChar++; } /* currentChar++; */ #ifdef _DEBUG_ON_ printf("Up, "); #endif } node* parse_tree(char* inputBuffer) { node *rootNode, *subNode; rootNode = (node *) malloc((size_t) sizeof(node)); rootNode->properties = NULL; rootNode->nodenum = 0; rootNode->parent = rootNode->variants = rootNode->next_var = rootNode->prev_var = rootNode->next = rootNode->prev = NULL; currentNodeNumber = 0; currentChar = inputBuffer; while (*currentChar != '(') currentChar++; while ((*currentChar != ')') && (*currentChar != 0)) { if (*currentChar == '(') { #ifdef _DEBUG_ON_ printf("Down, "); #endif add_variant(rootNode); subNode = rootNode->variants; while (subNode->next_var != NULL) subNode = subNode->next_var; currentChar++; do_variant(subNode); } currentChar++; } #ifdef _DEBUG_ON_ printf("\n\n\n"); #endif return rootNode; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.