first code for restore functions
authorLaurent Mazet <mazet@softndesign.org>
Sun, 16 Jun 2024 21:50:21 +0000 (23:50 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 16 Jun 2024 21:50:21 +0000 (23:50 +0200)
constant.h
function.c
scrabble.c

index 1d7f0f40862a3ee918f69b92e89506799a8f4142..9da30bf0c40df5986fbf7ffb61ab507ad7c4dd52 100644 (file)
@@ -3,6 +3,10 @@
 
 #include "type.h"
 
+#define MAXNBPLAYERS 4
+#define MAXBOARDSIZE 22
+#define MAXNBTILES 120
+
 board_t *getboard (char *name);
 
 bag_t *getbag (char *lang);
index 4ecf3e158e3fbb1befd8bc9b35a9b344f3bc9d38..6f18edf53efbb0904ba0715121bd84792d00e048 100644 (file)
@@ -584,4 +584,86 @@ int writedata (char *filename, char *data)
     return ret;
 }
 
+char *atos (char *str)
+{
+    char *ret = NULL;
+
+    if (*str == '"') {
+        char *ptr = ++str;
+        while ((*ptr != '"') && (*ptr != '\0')) {
+            ptr++;
+        }
+        if (*ptr == '"') {
+            *ptr = '\0';
+            ret = str;
+        }
+    }
+
+    return ret;
+}
+
+int loaddata (char *str, int *nbplayers, char *lang, char *board, play_t *play, draw_t *draw, draw_t **game, int *n, play_t **turn, int *score)
+{
+    int ret = 1;
+
+    char *saveptr1, *saveptr2;
+
+    char *line = strtok_r (str, "\n", &saveptr1);
+    while (line) {
+
+        char *name = strtok_r (line, ":", &saveptr2);
+
+        char *value = line + strlen (name) + 1;
+        while (*value == ' ') {
+            value++;
+        }
+
+        if (strcmp (name,  "nbplayers") == 0) {
+            *nbplayers = atoi (value);
+        } else if (strcmp (name,  "lang") == 0) {
+            strcpy (lang, atos (value));
+        } else if (strcmp (name,  "board") == 0) {
+            strcpy (board, atos (value));
+        } else if (strcmp (name,  "play") == 0) {
+            strcpy (play->tab, atos (value));
+        } else if (strcmp (name,  "ntiles") == 0) {
+            draw->nbtiles = atoi (value);
+        } else if (strcmp (name,  "tiles") == 0) {
+            strcpy (draw->tiles, atos (value));
+        } else if (strcmp (name,  "game[0]") == 0) {
+            strcpy (game[0]->tiles, atos (value));
+        } else if (strcmp (name,  "game[1]") == 0) {
+            strcpy (game[1]->tiles, atos (value));
+        } else if (strcmp (name,  "game[2]") == 0) {
+            strcpy (game[2]->tiles, atos (value));
+        } else if (strcmp (name,  "game[3]") == 0) {
+            strcpy (game[3]->tiles, atos (value));
+        } else if (strcmp (name,  "current") == 0) {
+            *n = atoi (value);
+        } else if (strcmp (name,  "turn[0]") == 0) {
+            strcpy (turn[0]->tab, atos (value));
+        } else if (strcmp (name,  "turn[1]") == 0) {
+            strcpy (turn[1]->tab, atos (value));
+        } else if (strcmp (name,  "turn[2]") == 0) {
+            strcpy (turn[2]->tab, atos (value));
+        } else if (strcmp (name,  "turn[3]") == 0) {
+            strcpy (turn[3]->tab, atos (value));
+        } else if (strcmp (name,  "score[0]") == 0) {
+            score[0] = atoi (value);
+        } else if (strcmp (name,  "score[1]") == 0) {
+            score[1] = atoi (value);
+        } else if (strcmp (name,  "score[2]") == 0) {
+            score[2] = atoi (value);
+        } else if (strcmp (name,  "score[3]") == 0) {
+            score[3] = atoi (value);
+        } else {
+            VERBOSE (WARNING, printf ("unknown key word: %s\n", name));
+        }
+
+        line = strtok_r (NULL, "\n", &saveptr1);
+    }
+
+    return ret;
+}
+
 /* vim: set ts=4 sw=4 et: */
index 25f2cb707a00e49433dd799c86054e2eaedd3919..56f051d8daf9a195d47417f12473e689d8773db8 100644 (file)
@@ -149,8 +149,8 @@ int main (int argc, char *argv[])
         VERBOSE (ERROR, fprintf (stderr, "language not found\n"));
         return 1;
     }
-    if ((nbplayers < 1) || (nbplayers > 4)) {
-        VERBOSE (ERROR, fprintf (stderr, "incorrect number of player [1, 4] (%d)\n", nbplayers));
+    if ((nbplayers < 1) || (nbplayers > MAXNBPLAYERS)) {
+        VERBOSE (ERROR, fprintf (stderr, "incorrect number of player [1, %d] (%d)\n", MAXNBPLAYERS, nbplayers));
         return 1;
     }
     if (dict) {
@@ -172,16 +172,16 @@ int main (int argc, char *argv[])
     play_t *play = initplay (board->xsize, board->ysize);
     VERBOSE (DEBUG, printf ("play: 0x%p\nboard: 0x%p\n", play, board));
     draw_t *draw = initdraw (bag);
-    draw_t **game = (draw_t **) calloc (nbplayers, sizeof (draw_t *));
+    draw_t **game = (draw_t **) calloc (MAXNBPLAYERS, sizeof (draw_t *));
     CHECKALLOC (game);
     for (n = 0; n < nbplayers; n++) {
         game[n] = retrievetiles (draw, board->length, NULL, 0);
     }
     VERBOSE (DEBUG, printf ("bag: 0x%p\ndraw: 0x%p\ngame: 0x%p\ngame[0]: 0x%p", bag, draw, game, game[0]));
 
-    play_t **turn = (play_t **) calloc (nbplayers, sizeof (play_t *));
+    play_t **turn = (play_t **) calloc (MAXNBPLAYERS, sizeof (play_t *));
     CHECKALLOC (turn);
-    for (n = 0; n < nbplayers; n++) {
+    for (n = 0; n < MAXNBPLAYERS; n++) {
         turn[n] = initplay (board->xsize, board->ysize);
     }
 
@@ -200,11 +200,11 @@ int main (int argc, char *argv[])
     int yvaluewin = yoffset - 1;
     int xhelpwin = xvaluewin + xoffset + 10;
     int yhelpwin = yoffset - 1;
-    int *xdrawwin = (int *) calloc (nbplayers, sizeof (int));
+    int *xdrawwin = (int *) calloc (MAXNBPLAYERS, sizeof (int));
     CHECKALLOC (xdrawwin);
-    int *ydrawwin = (int *) calloc (nbplayers, sizeof (int));
+    int *ydrawwin = (int *) calloc (MAXNBPLAYERS, sizeof (int));
     CHECKALLOC (ydrawwin);
-    for (n = 0; n < nbplayers; n++) {
+    for (n = 0; n < MAXNBPLAYERS; n++) {
         xdrawwin[n] = (n + 1) * xoffset + n * (board->length * 2 - 1);
         ydrawwin[n] = 2 * yoffset + max (board->ysize, 1 + (bag->nbletters + 1) /2);
     }
@@ -223,7 +223,7 @@ int main (int argc, char *argv[])
     int x = (play->xsize + 1)/ 2 - 1;
     int y = (play->ysize + 1)/ 2 - 1;
 
-    int *score = (int *) calloc (nbplayers, sizeof (int));
+    int *score = (int *) calloc (MAXNBPLAYERS, sizeof (int));
     CHECKALLOC (score);
     for (n = 0; n < nbplayers; n++) {
         drawwindow (game[n], score[n], xdrawwin[n], ydrawwin[n], 0);