Bugfix for safeStrCpy patch for XBoard
[xboard.git] / backend.c
index 5c7ebad..a3a06b7 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -4804,7 +4804,7 @@ CoordsToComputerAlgebraic(rf, ff, rt, ft, promoChar, move)
                     AAA + ff, ONE + rf, AAA + ft, ONE + rt);
        } else {
            sprintf(move, "%c%c%c%c%c\n",
-                    AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar == '^' ? '+' : promoChar);
+                    AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar);
        }
     }
 }
@@ -4884,16 +4884,7 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar)
      int *fromX, *fromY, *toX, *toY;
      char *promoChar;
 {
-    char moveCopy[20], *p = moveCopy;
-    strncpy(moveCopy, move, 20); // make a copy of move to preprocess it
-    if(gameInfo.variant == VariantShogi) {
-        while(*p && *p != ' ') p++;
-        if(p[-1] == '+') p[-1] = '^'; // in Shogi '+' is promotion, distinguish from check
-    }
-    if (appData.debugMode) {
-        fprintf(debugFP, "move to parse: %s\n", moveCopy);
-    }
-    *moveType = yylexstr(moveNum, moveCopy, yy_textstr, sizeof yy_textstr);
+    *moveType = yylexstr(moveNum, move, yy_textstr, sizeof yy_textstr);
 
     switch (*moveType) {
       case WhitePromotion:
@@ -5700,14 +5691,14 @@ HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice)
            if(toY == 0 && piece == BlackPawn ||
               toY == 0 && piece == BlackQueen ||
               toY <= 1 && piece == BlackKnight) {
-               *promoChoice = '^';
+               *promoChoice = '+';
                return FALSE;
            }
        } else {
            if(toY == BOARD_HEIGHT-1 && piece == WhitePawn ||
               toY == BOARD_HEIGHT-1 && piece == WhiteQueen ||
               toY >= BOARD_HEIGHT-2 && piece == WhiteKnight) {
-               *promoChoice = '^';
+               *promoChoice = '+';
                return FALSE;
            }
        }
@@ -5744,7 +5735,7 @@ HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice)
              gameMode == IcsPlayingBlack &&  WhiteOnMove(currentMove);
     if(appData.testLegality && !premove) {
        moveType = LegalityTest(boards[currentMove], PosFlags(currentMove),
-                       fromY, fromX, toY, toX, gameInfo.variant == VariantShogi ? '^' : NULLCHAR);
+                       fromY, fromX, toY, toX, gameInfo.variant == VariantShogi ? '+' : NULLCHAR);
        if(moveType != WhitePromotion && moveType  != BlackPromotion)
            return FALSE;
     }
@@ -8650,11 +8641,11 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
        board[toY][toX] = EmptySquare;
       }
     }
-    if(promoChar == '^') {
+    if(promoChar == '+') {
         /* [HGM] Shogi-style promotions, to piece implied by original (Might overwrite orinary Pawn promotion) */
         board[toY][toX] = (ChessSquare) (PROMOTED piece);
-    } else if(!appData.testLegality) { // without legality testing, unconditionally believe promoChar
-        board[toY][toX] = CharToPiece(promoChar);
+    } else if(!appData.testLegality && promoChar != NULLCHAR && promoChar != '=') { // without legality testing, unconditionally believe promoChar
+        board[toY][toX] = CharToPiece(piece < BlackPawn ? ToUpper(promoChar) : ToLower(promoChar));
     }
     if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)
                && promoChar != NULLCHAR && gameInfo.holdingsSize) {
@@ -13337,7 +13328,7 @@ if(appData.debugMode) fprintf(debugFP, "Append: in='%s' %d\n", text, addBraces);
     } else {
        commentList[index] = (char *) malloc(len + 6); // perhaps wastes 4...
        if(addBraces)
-         safeStrCpy(commentList[index], "{\n", sizeof(commentList[index])/sizeof(commentList[index][0]));
+         safeStrCpy(commentList[index], "{\n", 3);
        else commentList[index][0] = NULLCHAR;
        strcat(commentList[index], text);
        strcat(commentList[index], "\n");