aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/coord/utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/coord/utils.h')
-rw-r--r--src/solvers/coord/utils.h53
1 files changed, 39 insertions, 14 deletions
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 @@
1STATIC coord_t *parse_coord(size_t, const char *); 1STATIC coord_t *parse_coord(size_t, const char *);
2STATIC void parse_coord_and_trans(const char *, coord_t **, uint8_t *); 2STATIC multicoord_t *parse_multicoord(size_t, const char *);
3STATIC void parse_coord_and_trans(
4 const char *, coord_t **, multicoord_t **, uint8_t *);
3STATIC long long dataid_coord(const char *, char [static NISSY_SIZE_DATAID]); 5STATIC long long dataid_coord(const char *, char [static NISSY_SIZE_DATAID]);
4 6
5STATIC coord_t * 7STATIC coord_t *
6parse_coord(size_t n, const char *coord) 8parse_coord(size_t n, const char *coord)
7{ 9{
8 int i; 10 int i;
11 const char *name;
9 12
10 /* 13 for (i = 0; all_coordinates[i] != NULL; i++) {
11 TODO Some coordinates are parsed incorrectly, e.g. DRFINNOE 14 name = all_coordinates[i]->name;
12 TODO is matched by DRFIN. Check that strncmp is used correctly. 15 if (n == strlen(name) && !strncmp(name, coord, n))
13 */
14 for (i = 0; all_coordinates[i] != NULL; i++)
15 if (!strncmp(all_coordinates[i]->name, coord, n))
16 return all_coordinates[i]; 16 return all_coordinates[i];
17 }
18
19 return NULL;
20}
21
22STATIC multicoord_t *
23parse_multicoord(size_t n, const char *coord)
24{
25 int i;
26 const char *name;
27
28 for (i = 0; all_multicoordinates[i] != NULL; i++) {
29 name = all_multicoordinates[i]->name;
30 if (n == strlen(name) && !strncmp(name, coord, n))
31 return all_multicoordinates[i];
32 }
17 33
18 return NULL; 34 return NULL;
19} 35}
@@ -22,18 +38,22 @@ STATIC void
22parse_coord_and_trans( 38parse_coord_and_trans(
23 const char *str, 39 const char *str,
24 coord_t **coord, 40 coord_t **coord,
41 multicoord_t **mcoord,
25 uint8_t *trans 42 uint8_t *trans
26) 43)
27{ 44{
28 size_t i; 45 size_t i;
29 46
30 for (i = 6; i < strlen(str); i++) 47 for (i = 7; i < strlen(str); i++)
31 if (str[i] == '_') 48 if (str[i] == '_')
32 break; 49 break;
33 50
34 if (coord != NULL) 51 if (coord != NULL)
35 *coord = parse_coord(i-6, str+6); 52 *coord = parse_coord(i-6, str+6);
36 53
54 if (mcoord != NULL)
55 *mcoord = parse_multicoord(i-7, str+7);
56
37 if (trans != NULL) 57 if (trans != NULL)
38 *trans = i == strlen(str) ? 58 *trans = i == strlen(str) ?
39 UINT8_ERROR : readrotation(str+i+1); 59 UINT8_ERROR : readrotation(str+i+1);
@@ -43,15 +63,20 @@ STATIC long long
43dataid_coord(const char *ca, char dataid[static NISSY_SIZE_DATAID]) 63dataid_coord(const char *ca, char dataid[static NISSY_SIZE_DATAID])
44{ 64{
45 coord_t *c; 65 coord_t *c;
66 multicoord_t *mc;
46 67
47 parse_coord_and_trans(ca, &c, NULL); 68 parse_coord_and_trans(ca, &c, &mc, NULL);
48 69
49 if (c == NULL) { 70 if (c != NULL) {
50 LOG("Error: cannot parse coordinate from '%s'\n", ca); 71 strcpy(dataid, c->name);
51 return NISSY_ERROR_INVALID_SOLVER; 72 return NISSY_OK;
52 } 73 }
53 74
54 strcpy(dataid, c->name); 75 if (mc != NULL) {
76 strcpy(dataid, mc->name);
77 return NISSY_OK;
78 }
55 79
56 return NISSY_OK; 80 LOG("Error: cannot parse coordinate from '%s'\n", ca);
81 return NISSY_ERROR_INVALID_SOLVER;
57} 82}

Generated with cgit - Back to sebastiano.tronto.net