From e2a459e240a51d77d6e4d5c963e6a6df47329a5c Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sun, 16 Jun 2024 23:50:21 +0200 Subject: [PATCH] first code for restore functions --- constant.h | 4 +++ function.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ scrabble.c | 18 ++++++------ 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/constant.h b/constant.h index 1d7f0f4..9da30bf 100644 --- a/constant.h +++ b/constant.h @@ -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); diff --git a/function.c b/function.c index 4ecf3e1..6f18edf 100644 --- a/function.c +++ b/function.c @@ -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: */ diff --git a/scrabble.c b/scrabble.c index 25f2cb7..56f051d 100644 --- a/scrabble.c +++ b/scrabble.c @@ -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); -- 2.30.2