Allow the game number in smoves to be negative
authorH.G.Muller <hgm@hgm-xboard.(none)>
Fri, 8 May 2015 11:02:55 +0000 (13:02 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Fri, 8 May 2015 11:02:55 +0000 (13:02 +0200)
Negative game numbers now indicate relative game numbers compared to
the end of the list: -1 means latest game, -2 the game before it, etc.

lasker-2.2.3/src/command_list.h
lasker-2.2.3/src/obsproc.c

index 064f961..31a69e6 100644 (file)
@@ -29,6 +29,7 @@
   d - integer
   p - optional integer
   i - word or integer
+  j - word or signed integer
   n - optional word or integer
   s - string to end
   t - optional string to end
@@ -136,7 +137,7 @@ static struct command_type command_list[] = {
   {"simpass",          "",     com_simpass,    ADMIN_USER },
   {"simprev",           "",     com_simprev,    ADMIN_USER },
   {"sought",           "p",    com_sought,     ADMIN_USER },
-  {"smoves",           "wi",   com_smoves,     ADMIN_USER },
+  {"smoves",           "wj",   com_smoves,     ADMIN_USER },
   {"sposition",                "ww",   com_sposition,  ADMIN_USER },
   {"statistics",       "",     com_statistics, ADMIN_USER },
   {"stored",           "o",    com_stored,     ADMIN_USER },
index 236e665..0043496 100644 (file)
@@ -770,12 +770,13 @@ static char *FindHistory(int p, int p1, int game,char* type)
 {
   FILE *fpHist;
   static char fileName[MAX_FILENAME_SIZE];
-  int index;
+  int index, last = -1;
   long when;
   char typestr[4];
 
   sprintf(fileName, "%s/player_data/%c/%s.%s", STATS_DIR,
          player_globals.parray[p1].login[0], player_globals.parray[p1].login, STATS_GAMES);
+ again:
   fpHist = fopen_s(fileName, "r");
   if (fpHist == NULL) {
     pprintf(p, "No games in history for %s.\n", player_globals.parray[p1].name);
@@ -784,8 +785,18 @@ static char *FindHistory(int p, int p1, int game,char* type)
   do {
     fscanf(fpHist, "%d %*c %*d %*c %*d %*s %s %*d %*d %*d %*d %*s %*s %ld",
           &index, typestr, &when);
+    last = index; // [HGM] remember most recent game
   } while (!feof(fpHist) && index != game);
 
+  if(game < 0) { // [HGM] requested game relative to end
+    game += last + 1; // calculate absolute game number
+    if(game < 0) game += 100; // wrap
+    if(game >= 0) { // try again with valid absolute number
+      fclose(fpHist);
+      goto again;
+    }
+  }
+
   if (feof(fpHist)) {
     pprintf(p, "There is no history game %d for %s.\n", game, player_globals.parray[p1].name);
     fclose(fpHist);
@@ -1076,6 +1087,9 @@ static void stored_mail_moves(int p, int mail, param_list param)
   if (!FindPlayer(p, param[0].val.word, &wp, &wconnected))
     return;
 
+  if (param[1].type == TYPE_WORD && sscanf(param[1].val.word, "%d", &(param[1].val.integer) == 1 && param[1].val.integer < 0)
+    param[1].type = TYPE_INT; /* [HGM] allow negative number */
+
   if (param[1].type == TYPE_INT) { /* look for a game from history */
     fileName = FindHistory(p, wp, param[1].val.integer,&type);
     if (fileName != NULL) {