Prevent transmission of spurious promo char to other engine
[xboard.git] / parser.l
index 76ec89d..033be7f 100644 (file)
--- a/parser.l
+++ b/parser.l
@@ -232,7 +232,7 @@ extern void CopyBoard P((Board to, Board from));
        currentMoveString[2] - AAA >= BOARD_RGHT   ||\r
        currentMoveString[0] - AAA <  BOARD_LEFT   ||\r
        currentMoveString[2] - AAA <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     piece = boards[yyboardindex]\r
       [currentMoveString[1] - ONE][currentMoveString[0] - AAA];\r
@@ -300,7 +300,7 @@ extern void CopyBoard P((Board to, Board from));
        currentMoveString[2] - AAA >= BOARD_RGHT   ||\r
        currentMoveString[0] - AAA <  BOARD_LEFT   ||\r
        currentMoveString[2] - AAA <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     result = LegalityTest(boards[yyboardindex],\r
                          PosFlags(yyboardindex)&~F_MANDATORY_CAPTURE, // [HGM] losers: might think we can e.p.!\r
@@ -310,22 +310,25 @@ extern void CopyBoard P((Board to, Board from));
                           currentMoveString[2] - AAA,\r
                          currentMoveString[4]);\r
 \r
-    if (currentMoveString[4] == NULLCHAR &&\r
-        (result == WhitePromotionKnight || result == BlackPromotionKnight ||\r
-         result == WhitePromotionQueen  || result == BlackPromotionQueen)) {\r
-        if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier)\r
-            currentMoveString[4] = PieceToChar(BlackFerz);\r
-        else if(gameInfo.variant == VariantGreat)\r
-            currentMoveString[4] = PieceToChar(BlackMan);\r
-        else\r
-            currentMoveString[4] = PieceToChar(BlackQueen);\r
-       currentMoveString[5] = NULLCHAR;\r
-    }\r
-\r
-    return (int) result;\r
-}\r
-\r
-[a-l][0-9]((=?\(?[A-Z]\)?)|=)?       {\r
+    if (currentMoveString[4] == NULLCHAR) {
+      if(result == WhitePromotionKnight || result == BlackPromotionKnight ||
+         result == WhitePromotionQueen  || result == BlackPromotionQueen) {
+        if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk)
+            currentMoveString[4] = PieceToChar(BlackFerz);
+        else if(gameInfo.variant == VariantGreat)
+            currentMoveString[4] = PieceToChar(BlackMan);
+        else
+            currentMoveString[4] = PieceToChar(BlackQueen);
+       currentMoveString[5] = NULLCHAR;
+      }
+    } else if(appData.testLegality && // strip off unnecessary and false promo characters
+       !(result == WhitePromotionQueen  || result == BlackPromotionQueen ||
+         result == WhiteNonPromotion    || result == BlackNonPromotion)) currentMoveString[4] = NULLCHAR;
+
+    return (int) result;
+}
+
+[a-l][0-9]((=?\(?[A-Za-z]\)?)|=)?       {\r
     /*\r
      * Pawn move, possibly with promotion\r
      */\r
@@ -343,14 +346,14 @@ extern void CopyBoard P((Board to, Board from));
     cl.ffIn = yytext[0] - AAA;\r
     cl.rtIn = yytext[1] - ONE;\r
     cl.ftIn = yytext[0] - AAA;\r
-    c = cl.promoCharIn = yytext[2+skip];\r
+    c = cl.promoCharIn = ToLower(yytext[2+skip]);\r
 \r
     /* [HGM] do not allow values beyond board size */\r
     if(cl.rtIn >= BOARD_HEIGHT ||\r
        cl.rtIn <  0            ||\r
        cl.ffIn >= BOARD_RGHT   ||\r
        cl.ftIn <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare)\r
       return IllegalMove;\r
@@ -405,7 +408,7 @@ extern void CopyBoard P((Board to, Board from));
        cl.ffIn <  BOARD_LEFT  ||\r
        cl.ftIn >= BOARD_RGHT  ||\r
        cl.ftIn <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare)\r
       return IllegalMove;\r
@@ -455,7 +458,7 @@ extern void CopyBoard P((Board to, Board from));
        currentMoveString[2] - AAA >= BOARD_RGHT   ||\r
        currentMoveString[0] - AAA <  BOARD_LEFT   ||\r
        currentMoveString[2] - AAA <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     if (gameInfo.variant == VariantXiangqi && /* [HGM] In Xiangqi rank stays same */\r
          currentMoveString[0] != currentMoveString[2] ) {\r
@@ -497,7 +500,7 @@ extern void CopyBoard P((Board to, Board from));
          result == WhitePromotionKnight || result == BlackPromotionKnight)) {\r
         currentMoveString[4] = PieceToChar(BlackQueen);\r
        // [HGM] shatranj: take care of variants without Queen\r
-       if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier)\r
+       if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk)\r
             currentMoveString[4] = PieceToChar(BlackFerz);\r
        if(gameInfo.variant == VariantGreat)\r
             currentMoveString[4] = PieceToChar(BlackMan);\r
@@ -579,7 +582,7 @@ extern void CopyBoard P((Board to, Board from));
        cl.rtIn <  0            ||\r
        cl.ftIn >= BOARD_RGHT   ||\r
        cl.ftIn <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), &cl);\r
 \r
@@ -639,7 +642,7 @@ extern void CopyBoard P((Board to, Board from));
        cl.rtIn <  0            ||\r
        cl.ftIn >= BOARD_RGHT   ||\r
        cl.ftIn <  BOARD_LEFT     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), &cl);\r
 \r
@@ -777,7 +780,7 @@ extern void CopyBoard P((Board to, Board from));
     /* [HGM] do not allow values beyond board size */\r
     if(currentMoveString[3] - ONE >= BOARD_HEIGHT ||\r
        currentMoveString[2] - AAA >= BOARD_WIDTH     )\r
-      return 0;\r
+      return ImpossibleMove;\r
 \r
     if (WhiteOnMove(yyboardindex)) {\r
        currentMoveString[0] = ToUpper(yytext[0]);\r
@@ -1085,10 +1088,10 @@ int yywrap()
 \r
 /* Parse a move from the given string s */\r
 /* ^ at start of pattern WON'T work here unless using flex */\r
-ChessMove yylexstr(boardIndex, s)\r
-     int boardIndex;\r
-     char *s;\r
-{\r
+ChessMove yylexstr(boardIndex, s, text, len)\r
+     int boardIndex, len;\r
+     char *s, *text;\r
+{
     ChessMove ret;\r
     char *oldStringToLex;\r
 #ifdef FLEX_SCANNER\r
@@ -1104,7 +1107,9 @@ ChessMove yylexstr(boardIndex, s)
     yy_switch_to_buffer(buffer);\r
 #endif /*FLEX_SCANNER*/\r
 \r
-    ret = (ChessMove) yylex();\r
+    ret = (ChessMove) yylex();
+     strncpy(text, yy_text, len-1); // [HGM] vari: yy_text is not available to caller after buffer switch ?!?
+     text[len-1] = NULLCHAR;\r
 \r
 #ifdef FLEX_SCANNER\r
     if (oldBuffer != NULL) \r