From 3e7bb9b87ef9b47d8f643dbcae19a64ddbc81dbb Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Tue, 5 Aug 2025 09:04:00 +0200 Subject: Added DRFIN solver --- src/solvers/coord/utils.h | 53 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 14 deletions(-) (limited to 'src/solvers/coord/utils.h') diff --git a/src/solvers/coord/utils.h b/src/solvers/coord/utils.h index 93704cc..c8a9338 100644 --- a/src/solvers/coord/utils.h +++ b/src/solvers/coord/utils.h @@ -1,19 +1,35 @@ STATIC coord_t *parse_coord(size_t, const char *); -STATIC void parse_coord_and_trans(const char *, coord_t **, uint8_t *); +STATIC multicoord_t *parse_multicoord(size_t, const char *); +STATIC void parse_coord_and_trans( + const char *, coord_t **, multicoord_t **, uint8_t *); STATIC long long dataid_coord(const char *, char [static NISSY_SIZE_DATAID]); STATIC coord_t * parse_coord(size_t n, const char *coord) { int i; + const char *name; - /* - TODO Some coordinates are parsed incorrectly, e.g. DRFINNOE - TODO is matched by DRFIN. Check that strncmp is used correctly. - */ - for (i = 0; all_coordinates[i] != NULL; i++) - if (!strncmp(all_coordinates[i]->name, coord, n)) + for (i = 0; all_coordinates[i] != NULL; i++) { + name = all_coordinates[i]->name; + if (n == strlen(name) && !strncmp(name, coord, n)) return all_coordinates[i]; + } + + return NULL; +} + +STATIC multicoord_t * +parse_multicoord(size_t n, const char *coord) +{ + int i; + const char *name; + + for (i = 0; all_multicoordinates[i] != NULL; i++) { + name = all_multicoordinates[i]->name; + if (n == strlen(name) && !strncmp(name, coord, n)) + return all_multicoordinates[i]; + } return NULL; } @@ -22,18 +38,22 @@ STATIC void parse_coord_and_trans( const char *str, coord_t **coord, + multicoord_t **mcoord, uint8_t *trans ) { size_t i; - for (i = 6; i < strlen(str); i++) + for (i = 7; i < strlen(str); i++) if (str[i] == '_') break; if (coord != NULL) *coord = parse_coord(i-6, str+6); + if (mcoord != NULL) + *mcoord = parse_multicoord(i-7, str+7); + if (trans != NULL) *trans = i == strlen(str) ? UINT8_ERROR : readrotation(str+i+1); @@ -43,15 +63,20 @@ STATIC long long dataid_coord(const char *ca, char dataid[static NISSY_SIZE_DATAID]) { coord_t *c; + multicoord_t *mc; - parse_coord_and_trans(ca, &c, NULL); + parse_coord_and_trans(ca, &c, &mc, NULL); - if (c == NULL) { - LOG("Error: cannot parse coordinate from '%s'\n", ca); - return NISSY_ERROR_INVALID_SOLVER; + if (c != NULL) { + strcpy(dataid, c->name); + return NISSY_OK; } - strcpy(dataid, c->name); + if (mc != NULL) { + strcpy(dataid, mc->name); + return NISSY_OK; + } - return NISSY_OK; + LOG("Error: cannot parse coordinate from '%s'\n", ca); + return NISSY_ERROR_INVALID_SOLVER; } -- cgit v1.3