From 5e291466fbbc45aed74f67a1b2e555d1f0c44d8f Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 10 Oct 2024 19:49:48 +0200 Subject: Improved error messages and add some comments in nissy.h --- src/core/cube.h | 14 ++---------- src/core/io_cube.h | 62 +++++++++++++++++++++++++++++++++++++++++----------- src/core/io_trans.h | 1 - src/core/moves.h | 24 ++++++++------------ src/core/transform.h | 6 +++-- 5 files changed, 64 insertions(+), 43 deletions(-) (limited to 'src/core') diff --git a/src/core/cube.h b/src/core/cube.h index 2252a85..a3c3e14 100644 --- a/src/core/cube.h +++ b/src/core/cube.h @@ -66,16 +66,10 @@ isconsistent(cube_t cube) return true; inconsistent_ep: - LOG("Inconsistent EP\n"); - return false; inconsistent_cp: - LOG("Inconsistent CP\n"); - return false; inconsistent_eo: - LOG("Inconsistent EO\n"); - return false; inconsistent_co: - LOG("Inconsistent CO\n"); + /* We used to do more logging here, hence the 4 different labels */ return false; } @@ -115,13 +109,9 @@ issolvable(cube_t cube) return true; issolvable_parity: - LOG("EP and CP parities are different\n"); - return false; issolvable_eo: - LOG("Odd number of flipped edges\n"); - return false; issolvable_co: - LOG("Sum of corner orientation is not multiple of 3\n"); + /* We used to do more logging here, hence the 3 different labels */ return false; } diff --git a/src/core/io_cube.h b/src/core/io_cube.h index 9ae82d7..1ac8ec7 100644 --- a/src/core/io_cube.h +++ b/src/core/io_cube.h @@ -1,3 +1,6 @@ +STATIC cube_t readcube(const char *, const char *); +STATIC int writecube(const char *, cube_t, char *); +STATIC void log_available_formats(void); STATIC uint8_t readco(const char *); STATIC uint8_t readcp(const char *); STATIC uint8_t readeo(const char *); @@ -29,7 +32,7 @@ STATIC struct { { .name = "NONE", .read = NULL, .write = NULL }, }; -cube_t +STATIC cube_t readcube(const char *format, const char *buf) { int i; @@ -38,11 +41,12 @@ readcube(const char *format, const char *buf) if (!strcmp(format, ioformat[i].name)) return ioformat[i].read(buf); - LOG("Cannot read cube in the given format\n"); + LOG("Cannot read cube: unknown format '%s'\n", format); + log_available_formats(); return ZERO_CUBE; } -void +STATIC int writecube(const char *format, cube_t cube, char *buf) { char *errormsg; @@ -58,18 +62,30 @@ writecube(const char *format, cube_t cube, char *buf) for (i = 0; ioformat[i].write != NULL; i++) { if (!strcmp(format, ioformat[i].name)) { ioformat[i].write(cube, buf); - return; + return 0; } } + LOG("Cannot write cube: unknown format '%s'\n", format); + log_available_formats(); errormsg = "ERROR: format"; writecube_error: - LOG("writecube error, see stdout for details\n"); len = strlen(errormsg); memcpy(buf, errormsg, len); - buf[len] = '\n'; - buf[len+1] = '\0'; + buf[len] = '\0'; + return 1; +} + +STATIC void +log_available_formats(void) +{ + int i; + + LOG("Available formats: "); + for (i = 0; ioformat[i].read != NULL; i++) + LOG("'%s' ", ioformat[i].name); + LOG("\n"); } STATIC uint8_t @@ -133,14 +149,34 @@ readcube_B32(const char *buf) for (i = 0; i < 8; i++) { c[i] = b32tocorner(buf[i]); - DBG_ASSERT(c[i] < 255, ZERO_CUBE, - "Error reading B32 corner %d (char %d)\n", i, i); + if (c[i] == UINT8_ERROR) { + LOG("Error reading B32 corner %d ", i); + if (buf[i] == 0) { + LOG("(string terminated early)\n"); + } else { + LOG("(char '%c')\n", buf[i]); + } + return ZERO_CUBE; + } + } + + if (buf[8] != '=') { + LOG("Error reading B32 separator: a single '=' " + "must be used to separate edges and corners\n"); + return ZERO_CUBE; } for (i = 0; i < 12; i++) { e[i] = b32toedge(buf[i+9]); - DBG_ASSERT(e[i] < 255, ZERO_CUBE, - "Error reading B32 edge %d (char %d)\n", i, i+9); + if (e[i] == UINT8_ERROR) { + LOG("Error reading B32 edge %d ", i); + if (buf[i+9] == 0) { + LOG("(string terminated early)\n"); + } else { + LOG("(char '%c')\n", buf[i+9]); + } + return ZERO_CUBE; + } } return cubefromarray(c, e); @@ -314,7 +350,7 @@ STATIC uint8_t b32toedge(char c) { if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'f'))) - return 255; + return UINT8_ERROR; return c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26; } @@ -324,7 +360,7 @@ b32tocorner(char c) { uint8_t val; if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'f'))) - return 255; + return UINT8_ERROR; val = c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26; diff --git a/src/core/io_trans.h b/src/core/io_trans.h index d91e9a2..f4e8ace 100644 --- a/src/core/io_trans.h +++ b/src/core/io_trans.h @@ -10,7 +10,6 @@ readtrans(const char *buf) if (!strncmp(buf, transstr[t], 11)) return t; - LOG("readtrans error\n"); return UINT8_ERROR; } diff --git a/src/core/moves.h b/src/core/moves.h index f0d7646..28abc7f 100644 --- a/src/core/moves.h +++ b/src/core/moves.h @@ -18,7 +18,7 @@ STATIC cube_t applymoves(cube_t, const char *); STATIC cube_t frommoves(const char *); #define FOREACH_READMOVE(ARG_BUF, ARG_MOVE, ARG_C, ARG_MAX, \ - LABEL_ERROR, ARG_ACTION) \ + RET_ERROR, ARG_ACTION) \ const char *VAR_B; \ uint8_t VAR_MOVE_NOMOD, VAR_MOD; \ for (VAR_B = ARG_BUF, ARG_C = 0; *VAR_B != '\0'; VAR_B++, ARG_C++) { \ @@ -26,8 +26,10 @@ STATIC cube_t frommoves(const char *); VAR_B++; \ if (*VAR_B == '\0' || ARG_C == ARG_MAX) \ break; \ - if ((VAR_MOVE_NOMOD = readmove(*VAR_B)) == UINT8_ERROR) \ - goto LABEL_ERROR; \ + if ((VAR_MOVE_NOMOD = readmove(*VAR_B)) == UINT8_ERROR) { \ + LOG("Error: unknown move '%c'\n", *VAR_B); \ + return RET_ERROR; \ + } \ if ((VAR_MOD = readmodifier(*(VAR_B+1))) != 0) \ VAR_B++; \ ARG_MOVE = VAR_MOVE_NOMOD + VAR_MOD; \ @@ -124,7 +126,7 @@ move(cube_t c, uint8_t m) case MOVE_B3: return MOVE(B3, c); default: - LOG("move error, unknown move\n"); + LOG("move error: unknown move %" PRIu8 "\n", m); return ZERO_CUBE; } } @@ -171,7 +173,7 @@ premove(cube_t c, uint8_t m) case MOVE_B3: return PREMOVE(B, c); default: - LOG("move error, unknown move\n"); + LOG("premove error: unknown move %" PRIu8 "\n", m); return ZERO_CUBE; } } @@ -222,15 +224,11 @@ readmoves(const char *buf, int max, uint8_t *ret) uint8_t m; int c; - FOREACH_READMOVE(buf, m, c, max, readmoves_error, + FOREACH_READMOVE(buf, m, c, max, -1, ret[c] = m; ) return c; - -readmoves_error: - LOG("readmoves error\n"); - return -1; } STATIC cube_t @@ -242,15 +240,11 @@ applymoves(cube_t cube, const char *buf) DBG_ASSERT(isconsistent(cube), ZERO_CUBE, "move error: inconsistent cube\n"); - FOREACH_READMOVE(buf, m, c, -1, applymoves_error, + FOREACH_READMOVE(buf, m, c, -1, ZERO_CUBE, cube = move(cube, m); ) return cube; - -applymoves_error: - LOG("applymoves error\n"); - return ZERO_CUBE; } STATIC cube_t diff --git a/src/core/transform.h b/src/core/transform.h index 83204d5..73636fe 100644 --- a/src/core/transform.h +++ b/src/core/transform.h @@ -229,7 +229,7 @@ transform_corners(cube_t c, uint8_t t) case TRANS_BLm: return TRANS_CORNERS_MIRRORED(BLm, c); default: - LOG("transform error, unknown transformation %" PRIu8 "\n", t); + LOG("transform error: unknown transformation %" PRIu8 "\n", t); return ZERO_CUBE; } } @@ -335,7 +335,6 @@ transform(cube_t c, uint8_t t) case TRANS_BLm: return TRANS_MIRRORED(BLm, c); default: - LOG("transform error, unknown transformation %" PRIu8 "\n", t); return ZERO_CUBE; } } @@ -350,5 +349,8 @@ applytrans(cube_t cube, const char *buf) t = readtrans(buf); + if (t == UINT8_ERROR) + LOG("Unknown transformation '%s'\n", buf); + return transform(cube, t); } -- cgit v1.3