home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume8 / mgt / part01 / parse.c < prev    next >
C/C++ Source or Header  |  1990-02-23  |  5KB  |  265 lines

  1.  
  2. /*
  3.  
  4.         "mgt" Copyright 1990 Shodan
  5.         All Rights Reserved.
  6.         Program by Greg Hale
  7.  
  8. Permission to use, copy, modify, and distribute this software and its
  9. documentation for any purpose and without fee is hereby granted,
  10. provided that this entire comment and copyright notice appear in all
  11. copies and that both that copyright notice and this permission notice
  12. appear in supporting documentation.  No representations are made about
  13. the suitability of this software for any purpose.  It is provided "as
  14. is" without express or implied warranty.
  15.  
  16. Please send copies of extensions to:
  17.  
  18. hale@scam.berkeley.edu
  19. 128.32.138.4    scam.berkeley.edu sting sting.Berkeley.EDU
  20.  
  21. Donations for the 'From My Go Teacher' series may be sent to:
  22.     Shodan
  23.     P.O. Box 4456
  24.     Berkeley, CA 94704
  25.     (415) 849-9475
  26.  
  27. */
  28.  
  29. #include <strings.h>
  30. #include "mgt.h"
  31. #include "var.h"
  32. #include "file.h"
  33.  
  34.  
  35. static char *tokenStr[] = {
  36.     "USer", "ANalysis", "CoPyright", "SOurce",
  37.     "TiMe", "KoMi", "PlayBlack", "PlayWhite",
  38.     "PlaCe", "DaTe", "EVent", "GameName",
  39.     "FileFormat", "VieW", "GaMe",
  40.  
  41.     "BlackSpec","WhiteSpec",
  42.     "White", "Black", "\(", "\)", "\;", "Comment[", 
  43.     "AddWhite", "AddBlack",
  44.     "Letter",
  45.     "\[", "AddEmpty","Name[",
  46.     "Size[", "[","]"
  47. };
  48.  
  49. static token tokenVal[] = {
  50.     t_WS, t_WS, t_WS, t_WS, 
  51.     t_WS, t_WS, t_WS, t_WS, 
  52.     t_WS, t_WS, t_WS, t_WS, 
  53.     t_WS, t_WS, t_WS,
  54.  
  55.     t_BlackSpec, t_WhiteSpec,
  56.     t_White, t_Black, t_Open, t_Close, t_NewNode, t_Comment,
  57.     t_AddWhite, t_AddBlack,
  58.     t_Letter,
  59.     t_LParen, t_AddEmpty, t_Name,
  60.     t_Size, t_LBracket, t_RBracket
  61. };
  62.  
  63.  
  64. char buf[1024],*curin;
  65.  
  66. FUNCTION void readInit()
  67. {
  68.     buf[0]='\0';
  69.     curin = &buf[0];
  70. }
  71.  
  72. FUNCTION char readChar()
  73. {
  74.     if (!*curin) {
  75.         curin = &buf[0];
  76.         buf[0] = '\0';
  77.         fgets(&buf[0],1023,input);
  78.         return 0;
  79.  
  80.     }
  81.     return *(curin++);
  82. }
  83.  
  84. FUNCTION void readAdvance(i)
  85. int i;
  86. {
  87.     while (i-->0)
  88.         readChar();
  89. }
  90.  
  91.  
  92. FUNCTION void getCoordStr(co)
  93. coord *co;
  94. {
  95.     co->x = lettertox(curin[1]); 
  96.     co->y = curin[2] -'a';
  97.     readAdvance(4);
  98. }
  99.  
  100. FUNCTION boolean isCoordStr()
  101. {
  102.     return curin[0] =='[' && curin[1] >='a' && curin[1] <= 's'
  103.         && curin[2] >= 'a' && curin[2] <= 's' && curin[3] == ']';
  104. }
  105.  
  106. FUNCTION void getCoordList(clp)
  107. coordListP clp;
  108. {
  109.     coord co;
  110.     while (isCoordStr()) {
  111.             getCoordStr(&co);
  112.             setCoord(co.x,co.y,clp);
  113.     }
  114. }
  115.  
  116.  
  117.  
  118. FUNCTION token tokenize()
  119. {
  120.     int i;
  121.     token t;
  122.     if (feof(input))
  123.         return t_EOF;
  124.     for (i = 0; i < sizeof(tokenStr)/sizeof(tokenStr[0]); i++) {
  125.         if (!strncmp(curin, tokenStr[i], strlen(tokenStr[i]))) {
  126.             readAdvance(strlen(tokenStr[i]));
  127.             return tokenVal[i];
  128.         }
  129.     }
  130.     readAdvance(1);
  131.     return t_WS;
  132. }
  133.  
  134.  
  135. /*************************************************/
  136.  
  137. FUNCTION void addMoveArrayProp(t,n)
  138. token t;
  139. nodep n;
  140. {
  141.     coordListP cl;
  142.     property *p;
  143.  
  144.     p = (property *)calloc(1,sizeof(property));
  145.     cl = (coordListP)calloc(1,sizeof(coordList));
  146.     if (!p || !cl)
  147.         barf("Memory allocation failure (addMoveArrayProp)");
  148.  
  149.     p->t = t;
  150.     p->d = (data *)cl;
  151.     getCoordList(cl);
  152.     addprop(n,p);
  153. }
  154.  
  155. FUNCTION void doSize()
  156. {
  157.     int size;
  158.     char *s,c,b[25];
  159.     s = &b[0];
  160.     while ((c = readChar()) != ']')
  161.         if (c && c!='\\')
  162.             *s++ = c;
  163.     *s = 0;
  164.     size = atoi(b);
  165.     if ((size > 0) && (size < 19))
  166.         boardsize =  size;
  167. }
  168.  
  169.  
  170. doComment(n,t)
  171. nodep n;
  172. token t;
  173. {
  174.     char c,*s;
  175.     char buffer[(2<<10) + 1];
  176.     property *p;
  177.  
  178.     p = (property *)calloc(1,sizeof(property));
  179.     if (!p)
  180.         barf("Memory Allocation Failure (doComment)");
  181.     s = &buffer[0];
  182.     while ((c = readChar()) != ']')
  183.         if (c && c!='\\')
  184.             *s++ = c;
  185.     *s = 0;
  186.     p->t = t;
  187.     p->d = (data *) dupStr(&buffer[0]);
  188.     addprop(n,p);
  189. }
  190.  
  191. FUNCTION void addChild(n,c) /* add child c to node n */
  192. nodep n,c;
  193. {
  194.     if (n) {
  195.         if (n->child) {
  196.             nodep s;
  197.             s = treeLastSibling(child(n,false),false);
  198.             s->nextSibling = c;
  199.             c->lastSibling = s;
  200.             c->parent = n;
  201.         } else {
  202.             n->child = c;
  203.             c->parent = n;
  204.         }
  205.     }
  206. }
  207.  
  208.  
  209. FUNCTION nodep parse()
  210. {
  211.     nodep r,n,new,temp;
  212.     token t;
  213.  
  214.     r = n = 0;
  215.     for(;;) {
  216.         t = tokenize();
  217.         switch (t) {
  218.             case t_LBracket:
  219.                 do {
  220.                     t = tokenize();
  221.                 } while (t != t_RBracket && t != t_EOF);
  222.                 break;
  223.             case t_Size:
  224.                 doSize();
  225.                 break;
  226.             case t_AddWhite:
  227.             case t_AddBlack:
  228.             case t_AddEmpty:
  229.             case t_White:
  230.             case t_Black:
  231.             case t_Letter:
  232.                 if (n) addMoveArrayProp(t,n);
  233.                 else fprintf(stderr,"Error - property w/o node in data\n");
  234.                 break;
  235.  
  236.             case t_Name:
  237.             case t_Comment:
  238.                 if (n) doComment(n,t);
  239.                 else fprintf(stderr,"Error - property w/o node in data\n");
  240.                 break;
  241.  
  242.             case t_NewNode:
  243.                 new = newNode();
  244.                 if (!r)
  245.                     r = new;
  246.                 else
  247.                     addChild(n,new);
  248.                 n = new;
  249.                 break;
  250.             case t_Open:
  251.                 new = parse();
  252.                 addChild(n,new);
  253.                 if (!r)
  254.                     r = new;
  255.                 break;
  256.             case t_Close:
  257.             case t_EOF:
  258.                 return r;
  259.             default:
  260.                 break;
  261.         }
  262.     }
  263. }
  264.  
  265.