char*
safeStrCpy( char *dst, const char *src, size_t count )
-{
- /* see for example: https://buildsecurityin.us-cert.gov/bsi-rules/home/g1/854-BSI.html
- *
- * usage: safeStrCpy( stringA, stringB, sizeof(stringA)/sizeof(stringA[0]);
- */
-
+{ // [HGM] made safe
+ int i;
assert( dst != NULL );
assert( src != NULL );
assert( count > 0 );
- strncpy( dst, src, count );
- if( dst[ count-1 ] != '\0' )
+ for(i=0; i<count; i++) if((dst[i] = src[i]) == NULLCHAR) break;
+ if( i == count-1 && dst[i] != NULLCHAR)
{
+ dst[ count-1 ] = '\0'; // make sure incomplete copy still null-terminated
if(appData.debugMode)
printf("safeStrCpy: copying %s into %s didn't work, not enough space %d\n",src,dst,count);
}
- dst[ count-1 ] = '\0';
return dst;
}
case VariantJanus: /* should work */
case VariantSuper: /* experimental */
case VariantGreat: /* experimental, requires legality testing to be off */
+ case VariantSChess: /* S-Chess, should work */
break;
}
}
MarkTargetSquares(0);
DragPieceBegin(xPix, yPix);
}
- return;
}
+ if(x == fromX && y == fromY) return; // if OnlyMove altered (x,y) we go on
+ second = FALSE;
}
// ignore clicks on holdings
if(x < BOARD_LEFT || x >= BOARD_RGHT) return;
}
// off-board moves should not be highlighted
- if(x < 0 || x < 0) ClearHighlights();
+ if(x < 0 || y < 0) ClearHighlights();
if (HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice)) {
SetHighlights(fromX, fromY, toX, toY);
* Look for communication commands
*/
if (!strncmp(message, "telluser ", 9)) {
- EscapeExpand(message+9, message+9); // [HGM] esc: allow escape sequences in popup box
+ if(message[9] == '\\' && message[10] == '\\')
+ EscapeExpand(message+9, message+11); // [HGM] esc: allow escape sequences in popup box
DisplayNote(message + 9);
return;
}
if (!strncmp(message, "tellusererror ", 14)) {
cps->userError = 1;
- EscapeExpand(message+14, message+14); // [HGM] esc: allow escape sequences in popup box
+ if(message[14] == '\\' && message[15] == '\\')
+ EscapeExpand(message+14, message+16); // [HGM] esc: allow escape sequences in popup box
DisplayError(message + 14, 0);
return;
}
sscanf(message, "error %c", &c)!=1 && sscanf(message, "illegal %c", &c)!=1 &&
sscanf(message, "tell%c", &c)!=1 && sscanf(message, "0-1 %c", &c)!=1 &&
sscanf(message, "1-0 %c", &c)!=1 && sscanf(message, "1/2-1/2 %c", &c)!=1 &&
+ sscanf(message, "setboard %c", &c)!=1 && sscanf(message, "setup %c", &c)!=1 &&
+ sscanf(message, "hint: %c", &c)!=1 &&
sscanf(message, "pong %c", &c)!=1 && start != '#') {
quote = appData.engineComments == 2 ? "# " : "### NON-COMPLIANT! ### ";
print = (appData.engineComments >= 2);