home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume4 / chtrans / chtrans.c next >
C/C++ Source or Header  |  1988-06-07  |  4KB  |  156 lines

  1. /*
  2.  *    Copyright (c) 1987 by Ray Balogh (rabalogh@ccng.waterloo.edu)
  3.  *
  4.  *    Permission is granted to anyone to use this software for any
  5.  *    purpose on any computer system, and to redistribute it freely,
  6.  *    subject to the following restrictions:
  7.  *
  8.  *    1. The author is not responsible for the consequences of use of
  9.  *    this software, no matter how awful, even if they arise
  10.  *    from defects in it.
  11.  *
  12.  *    2. The origin of this software must not be misrepresented, either
  13.  *    by explicit claim or by omission.
  14.  *
  15.  *    3. Altered versions must be plainly marked as such, and must not
  16.  *    be misrepresented as being the original software.
  17.  *
  18.  */
  19.  
  20. /* see "regexp.c" for the copyright notice pertaining to the regular
  21.  * expression parser.
  22.  */
  23.  
  24. #include <stdio.h>
  25. #include "regexp.h"
  26.  
  27. #define DUNNO    '_'
  28.  
  29. char buf[20];
  30.  
  31. char gram1_castle[] =
  32.   "^[oO0]-[oO0](-[oO0])?(ch|mt|[+])?[!?,.;]*$";
  33. char gram1_general[] =
  34.   "^([NBRQK]?)([a-h]?)([1-8]?)([xX:-]?)([a-h]?)([1-8]?)(ch|mt|[+])?[!?,.;]*$";
  35. char gram1_ignore[] =
  36. "^([0-9]+\\.?|a|be|each|he|ch|mt|Re:)$";
  37.  
  38. #define SUBEX(p,i)    (p->startp[i])
  39. #define NILSUBEX(p,i)    (p->endp[i] == p->startp[i])
  40. #define SUBEXLEN(p,i)    (p->endp[i] - p->startp[i])
  41. #define BDCHAR(p,i)    ((!NILSUBEX(p,i)) ? *SUBEX(p,i) : DUNNO)
  42.  
  43.  
  44. /* gobble (possibly nested) comments */
  45. gobble( s, openc, closec )
  46. char *s, openc, closec;
  47. {
  48.     int c;
  49.  
  50.     while ( *++s != '\0' )
  51.     if ( *s == openc )
  52.         gobble( s, openc, closec );
  53.     else if ( *s == closec )
  54.         return;
  55.     while ( (c = getchar()) != EOF && c != (int)closec )
  56.     if ( c == (int)openc )
  57.         gobble( " ", openc, closec );
  58. }
  59.  
  60.  
  61. /* check if s contains any valid move spec. char */
  62. int
  63. testmove( s )
  64. char *s;
  65. {
  66.     static int testtab[128] = {
  67.       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  68.       0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
  69.       0,0,50,0,0,0,0,0,0,0,0,50,0,0,50,-1,0,50,50,0,0,0,0,0,0,0,0,0,0,0,0,0,
  70.       0,50,50,50,50,50,50,50,50,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  71.     };
  72.     register int sum;
  73.     register char *p;
  74.  
  75.     for ( sum = 0, p = s; *p != '\0' ; p++ )
  76.     sum += testtab[ (int)*p & 0xFF ];
  77.     return ( sum > 50 || sum < -2 );
  78. }
  79.  
  80.  
  81. /* ARGSUSED */
  82. main(argc, argv)
  83. int argc;
  84. char *argv[];
  85. {
  86.     regexp *g1_ignore, *g1_castle, *g1_general, *expr;
  87.     int i,j;
  88.     char piece, sep, f1, r1, f2, r2;
  89.     char s[256];
  90.     static int ply = 0;
  91.  
  92.     if ( (g1_ignore = regcomp(gram1_ignore)) == NULL ||
  93.      (g1_castle =  regcomp(gram1_castle)) == NULL ||
  94.      (g1_general = regcomp(gram1_general)) == NULL ) {
  95.     fprintf( stderr, "bad grammar\n" );
  96.     exit(1);
  97.     }
  98.  
  99.     while ( scanf("%s",s) == 1 ) {
  100.  
  101.     /* gobble comments */
  102.     if ( *s == '#' ) {
  103.         gobble( s, '\0', '\n' );
  104.         continue;
  105.     }
  106.     if ( *s == '(' ) {
  107.         gobble( s, '(', ')' );
  108.         continue;
  109.     }
  110.     /* DEBUG fprintf( stderr, "[%s] ", s ); */
  111.  
  112.     if ( ! testmove(s) )    /* make cursory validity check */
  113.         continue;
  114.  
  115.     if ( regexec(g1_ignore, s) == 1 ) {
  116.         continue;
  117.     } else
  118.     if ( regexec(g1_castle, s) == 1 ) {
  119.         expr = g1_castle;
  120.         if ( expr->startp[1] == expr->endp[1] )    /* king's side */
  121.         {sprintf( buf, "Ke%c-g%c", DUNNO, DUNNO ); trans(buf, ++ply);}
  122.         else
  123.         {sprintf( buf, "Ke%c-c%c", DUNNO, DUNNO ); trans(buf, ++ply);}
  124.         continue;
  125.     } else
  126.     if ( regexec(g1_general, s) == 1 ) {
  127.         expr = g1_general;
  128.         piece = BDCHAR(expr,1);
  129.         f1 = BDCHAR(expr,2); r1 = BDCHAR(expr,3);
  130.         f2 = BDCHAR(expr,5); r2 = BDCHAR(expr,6);
  131.         sep = BDCHAR(expr,4);
  132.  
  133.         if ( f2 == DUNNO && r2 == DUNNO ) {
  134.         f2 = f1; r2 = r1;
  135.         f1 = DUNNO; r1 = DUNNO;
  136.         }
  137.         if ( piece == DUNNO )
  138.         piece = 'P';
  139.         /*            if sep is not given, leave it as unspecified
  140.         if ( sep == DUNNO )
  141.         sep = '-';
  142.         */
  143.         if (sep != '-' && sep != DUNNO)
  144.         sep = ':';
  145.         sprintf( buf, "%c%c%c%c%c%c%.*s",
  146.         piece, f1, r1, sep, f2, r2, SUBEXLEN(expr,7), SUBEX(expr,7) );
  147.         trans(buf, ++ply);
  148.         continue;
  149.     } else {
  150.         /* fprintf( stderr, "syntax error\n" ); */
  151.         continue;
  152.     }
  153.     }
  154.     exit(0);
  155. }
  156.