home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / OPENSTEP / Games / NeXTGo-3.0-MIS / smartgoparse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-06  |  3.2 KB  |  168 lines

  1. #include "comment.header"
  2.  
  3. /* $Id: smartgoparse.c,v 1.3 1997/07/06 19:35:09 ergo Exp $ */
  4.  
  5. /*
  6.  * $Log: smartgoparse.c,v $
  7.  * Revision 1.3  1997/07/06 19:35:09  ergo
  8.  * actual version
  9.  *
  10.  * Revision 1.2  1997/05/04 18:57:14  ergo
  11.  * added time control for moves
  12.  *
  13.  */
  14.  
  15. #include <stdlib.h>
  16. #include "smartgo.h"
  17.  
  18. /*  Define the following when debugging the tree parsing algorithm.  */
  19. /*  #define _DEBUG_ON_  */
  20.  
  21. char *currentChar;
  22. int currentNodeNumber;
  23.  
  24. void add_node(node* cur_node, char* node_loc)
  25. {
  26.   node* new_node;
  27.  
  28.   new_node = (node *) malloc((size_t) sizeof(node));
  29.  
  30.   new_node->nodenum = currentNodeNumber++;
  31.   cur_node->next = new_node;
  32.   new_node->prev = cur_node;
  33.   new_node->parent = cur_node->parent;
  34.   new_node->properties = node_loc;
  35.   new_node->next = new_node->next_var = new_node->prev_var =
  36.     new_node->variants = NULL;
  37.  
  38. #ifdef _DEBUG_ON_
  39.   printf("Add, ");
  40. #endif
  41. }
  42.  
  43. void add_variant(node* parent)
  44. {
  45.   node *new_var, *tnode;
  46.  
  47.   new_var = (node *) malloc((size_t) sizeof(node));
  48.  
  49.   if (parent->variants == NULL)
  50.     {
  51.       parent->variants = new_var;
  52.       new_var->prev_var = NULL;
  53.     }
  54.   else
  55.     {
  56.       tnode = parent->variants;
  57.       while (tnode->next_var != NULL)
  58.     tnode = tnode->next_var;
  59.       tnode->next_var = new_var;
  60.       new_var->prev_var = tnode;
  61.     }
  62.  
  63.   new_var->parent = parent;
  64.   new_var->properties = NULL;
  65.   new_var->nodenum = 0;
  66.   new_var->next_var = new_var->variants = new_var->next = new_var->prev = NULL;
  67.  
  68. #ifdef _DEBUG_ON_
  69.   printf("Pop, ");
  70. #endif
  71. }
  72.  
  73. void do_variant(node* startNode)
  74. {
  75.   node *subNode, *currentNode;
  76.   int level = 0;
  77.  
  78.   currentNode = startNode;
  79.  
  80.   while ((*currentChar != ')') && (*currentChar != 0))
  81.     {
  82.       if (*currentChar == '\\')
  83.     {
  84.       currentChar++;
  85.     }
  86.       else if (*currentChar == '[')
  87.     {
  88.       level++;
  89.     }
  90.       else if (*currentChar == ']')
  91.     {
  92.       level--;
  93.     }
  94.       else if ((*currentChar == '(') && (level == 0))
  95.     {
  96. #ifdef _DEBUG_ON_
  97.       printf("Down, ");
  98. #endif
  99.  
  100.       add_variant(currentNode);
  101.       subNode = currentNode->variants;
  102.       while (subNode->next_var != NULL)
  103.         subNode = subNode->next_var;
  104.  
  105.       currentChar++;
  106.       do_variant(subNode);
  107.     }
  108.       else if ((*currentChar == ';') && (level == 0))
  109.     {
  110.       add_node(currentNode, currentChar);
  111.       currentChar++;
  112.       currentNode = currentNode->next;
  113.     }
  114.       currentChar++;
  115.       if ((*currentChar == ')') && (level != 0))
  116.     currentChar++;
  117.     }
  118.  
  119. /*  currentChar++;  */
  120.  
  121. #ifdef _DEBUG_ON_
  122.   printf("Up, ");
  123. #endif
  124. }
  125.  
  126. node* parse_tree(char* inputBuffer)
  127. {
  128.   node *rootNode, *subNode;
  129.  
  130.   rootNode = (node *) malloc((size_t) sizeof(node));
  131.   rootNode->properties = NULL;
  132.   rootNode->nodenum = 0;
  133.   rootNode->parent = rootNode->variants = rootNode->next_var =
  134.     rootNode->prev_var = rootNode->next = rootNode->prev = NULL;
  135.   currentNodeNumber = 0;
  136.  
  137.   currentChar = inputBuffer;
  138.  
  139.   while (*currentChar != '(')
  140.     currentChar++;
  141.  
  142.   while ((*currentChar != ')') && (*currentChar != 0))
  143.     {
  144.       if (*currentChar == '(')
  145.     {
  146. #ifdef _DEBUG_ON_
  147.       printf("Down, ");
  148. #endif
  149.  
  150.       add_variant(rootNode);
  151.       subNode = rootNode->variants;
  152.       while (subNode->next_var != NULL)
  153.         subNode = subNode->next_var;
  154.  
  155.       currentChar++;
  156.       do_variant(subNode);
  157.     }
  158.       currentChar++;
  159.     }
  160.  
  161. #ifdef _DEBUG_ON_
  162.   printf("\n\n\n");
  163. #endif
  164.  
  165.   return rootNode;
  166. }
  167.  
  168.