diff options
Diffstat (limited to 'src/nissy.c')
| -rw-r--r-- | src/nissy.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/src/nissy.c b/src/nissy.c index bf56f40..27f2b35 100644 --- a/src/nissy.c +++ b/src/nissy.c | |||
| @@ -17,7 +17,7 @@ long long parse_h48_solver( | |||
| 17 | STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); | 17 | STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); |
| 18 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], | 18 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], |
| 19 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); | 19 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); |
| 20 | STATIC long long write_result(cube_t, char [static NISSY_SIZE_CUBE]); | 20 | STATIC long long write_result(oriented_cube_t, char [static NISSY_SIZE_CUBE]); |
| 21 | STATIC size_t my_strnlen(const char *, size_t); | 21 | STATIC size_t my_strnlen(const char *, size_t); |
| 22 | STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); | 22 | STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); |
| 23 | STATIC long long nissy_gendata_unsafe( | 23 | STATIC long long nissy_gendata_unsafe( |
| @@ -117,7 +117,7 @@ distribution_equal( | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | STATIC long long | 119 | STATIC long long |
| 120 | write_result(cube_t cube, char result[static NISSY_SIZE_CUBE]) | 120 | write_result(oriented_cube_t cube, char result[static NISSY_SIZE_CUBE]) |
| 121 | { | 121 | { |
| 122 | writecube(cube, NISSY_SIZE_CUBE, result); | 122 | writecube(cube, NISSY_SIZE_CUBE, result); |
| 123 | 123 | ||
| @@ -147,7 +147,7 @@ nissy_inverse( | |||
| 147 | char result[static NISSY_SIZE_CUBE] | 147 | char result[static NISSY_SIZE_CUBE] |
| 148 | ) | 148 | ) |
| 149 | { | 149 | { |
| 150 | cube_t c, res; | 150 | oriented_cube_t c, res; |
| 151 | long long err; | 151 | long long err; |
| 152 | 152 | ||
| 153 | c = readcube(cube); | 153 | c = readcube(cube); |
| @@ -158,7 +158,10 @@ nissy_inverse( | |||
| 158 | goto nissy_inverse_error; | 158 | goto nissy_inverse_error; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | res = inverse(c); | 161 | res = (oriented_cube_t) { |
| 162 | .cube = inverse(c.cube), | ||
| 163 | .orientation = c.orientation | ||
| 164 | }; | ||
| 162 | 165 | ||
| 163 | if (!isconsistent(res)) { | 166 | if (!isconsistent(res)) { |
| 164 | LOG("[inverse] Unknown error: inverted cube is invalid\n"); | 167 | LOG("[inverse] Unknown error: inverted cube is invalid\n"); |
| @@ -169,7 +172,7 @@ nissy_inverse( | |||
| 169 | return write_result(res, result); | 172 | return write_result(res, result); |
| 170 | 173 | ||
| 171 | nissy_inverse_error: | 174 | nissy_inverse_error: |
| 172 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 175 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 173 | return err; | 176 | return err; |
| 174 | } | 177 | } |
| 175 | 178 | ||
| @@ -180,7 +183,7 @@ nissy_applymoves( | |||
| 180 | char result[static NISSY_SIZE_CUBE] | 183 | char result[static NISSY_SIZE_CUBE] |
| 181 | ) | 184 | ) |
| 182 | { | 185 | { |
| 183 | cube_t c, res; | 186 | oriented_cube_t c, res; |
| 184 | long long err; | 187 | long long err; |
| 185 | 188 | ||
| 186 | if (moves == NULL) { | 189 | if (moves == NULL) { |
| @@ -208,7 +211,7 @@ nissy_applymoves( | |||
| 208 | return write_result(res, result); | 211 | return write_result(res, result); |
| 209 | 212 | ||
| 210 | nissy_applymoves_error: | 213 | nissy_applymoves_error: |
| 211 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 214 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 212 | return err; | 215 | return err; |
| 213 | } | 216 | } |
| 214 | 217 | ||
| @@ -219,7 +222,7 @@ nissy_applytrans( | |||
| 219 | char result[static NISSY_SIZE_CUBE] | 222 | char result[static NISSY_SIZE_CUBE] |
| 220 | ) | 223 | ) |
| 221 | { | 224 | { |
| 222 | cube_t c, res; | 225 | oriented_cube_t c, res; |
| 223 | long long err; | 226 | long long err; |
| 224 | 227 | ||
| 225 | c = readcube(cube); | 228 | c = readcube(cube); |
| @@ -241,7 +244,7 @@ nissy_applytrans( | |||
| 241 | return write_result(res, result); | 244 | return write_result(res, result); |
| 242 | 245 | ||
| 243 | nissy_applytrans_error: | 246 | nissy_applytrans_error: |
| 244 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 247 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 245 | return err; | 248 | return err; |
| 246 | } | 249 | } |
| 247 | 250 | ||
| @@ -269,13 +272,14 @@ nissy_getcube( | |||
| 269 | 272 | ||
| 270 | c = getcube(ep, eo, cp, co); | 273 | c = getcube(ep, eo, cp, co); |
| 271 | 274 | ||
| 272 | if (!isconsistent(c)) { | 275 | if (!isconsistent((oriented_cube_t){ .cube = c, .orientation = 0 })) { |
| 273 | LOG("[getcube] Error: could not get cube with ep=%lld, " | 276 | LOG("[getcube] Error: could not get cube with ep=%lld, " |
| 274 | "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); | 277 | "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); |
| 275 | return NISSY_ERROR_OPTIONS; | 278 | return NISSY_ERROR_OPTIONS; |
| 276 | } | 279 | } |
| 277 | 280 | ||
| 278 | return write_result(c, result); | 281 | /* TODO: should support orientation */ |
| 282 | return write_result((oriented_cube_t){.cube = c, .orientation = 0}, result); | ||
| 279 | } | 283 | } |
| 280 | 284 | ||
| 281 | long long | 285 | long long |
| @@ -456,6 +460,7 @@ nissy_solve( | |||
| 456 | long long stats[static NISSY_SIZE_SOLVE_STATS] | 460 | long long stats[static NISSY_SIZE_SOLVE_STATS] |
| 457 | ) | 461 | ) |
| 458 | { | 462 | { |
| 463 | oriented_cube_t oc; | ||
| 459 | cube_t c; | 464 | cube_t c; |
| 460 | long long parse_ret; | 465 | long long parse_ret; |
| 461 | uint8_t h, k; | 466 | uint8_t h, k; |
| @@ -466,14 +471,17 @@ nissy_solve( | |||
| 466 | return NISSY_ERROR_NULL_POINTER; | 471 | return NISSY_ERROR_NULL_POINTER; |
| 467 | } | 472 | } |
| 468 | 473 | ||
| 469 | c = readcube(cube); | 474 | oc = readcube(cube); |
| 475 | c = oc.cube; | ||
| 470 | 476 | ||
| 471 | if (!isconsistent(c)) { | 477 | /* TODO: solve should handle oriented cubes */ |
| 478 | |||
| 479 | if (!isconsistent(oc)) { | ||
| 472 | LOG("[solve] Error: cube is invalid\n"); | 480 | LOG("[solve] Error: cube is invalid\n"); |
| 473 | return NISSY_ERROR_INVALID_CUBE; | 481 | return NISSY_ERROR_INVALID_CUBE; |
| 474 | } | 482 | } |
| 475 | 483 | ||
| 476 | if (!issolvable(c)) { | 484 | if (!issolvable((oriented_cube_t){ .cube = c, .orientation = 0})) { |
| 477 | /* TODO: this is step-dependent */ | 485 | /* TODO: this is step-dependent */ |
| 478 | LOG("[solve] Error: cube is not solvable\n"); | 486 | LOG("[solve] Error: cube is not solvable\n"); |
| 479 | return NISSY_ERROR_UNSOLVABLE_CUBE; | 487 | return NISSY_ERROR_UNSOLVABLE_CUBE; |
