diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nissy.c | 28 | ||||
| -rw-r--r-- | src/solvers/dispatch.h | 46 |
2 files changed, 53 insertions, 21 deletions
diff --git a/src/nissy.c b/src/nissy.c index 17ef960..4bfdb56 100644 --- a/src/nissy.c +++ b/src/nissy.c | |||
| @@ -213,15 +213,15 @@ nissy_getcube( | |||
| 213 | STATIC long long | 213 | STATIC long long |
| 214 | nissy_dataid(const char *solver, char dataid[static NISSY_SIZE_DATAID]) | 214 | nissy_dataid(const char *solver, char dataid[static NISSY_SIZE_DATAID]) |
| 215 | { | 215 | { |
| 216 | solver_dispatch_t *dispatch; | 216 | solver_dispatch_t dispatch; |
| 217 | 217 | ||
| 218 | dispatch = match_solver(solver); | 218 | dispatch = match_solver(solver); |
| 219 | if (dispatch == NULL) { | 219 | if (dispatch.prefix == NULL) { |
| 220 | LOG("[dataid] Unknown solver %s\n", solver); | 220 | LOG("[dataid] Unknown solver %s\n", solver); |
| 221 | return NISSY_ERROR_INVALID_SOLVER; | 221 | return NISSY_ERROR_INVALID_SOLVER; |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | return dispatch->dataid(solver, dataid); | 224 | return dispatch.dataid(dispatch.solvername, dataid); |
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | long long | 227 | long long |
| @@ -255,7 +255,7 @@ nissy_gendata_unsafe( | |||
| 255 | unsigned char *data | 255 | unsigned char *data |
| 256 | ) | 256 | ) |
| 257 | { | 257 | { |
| 258 | solver_dispatch_t *dispatch; | 258 | solver_dispatch_t dispatch; |
| 259 | 259 | ||
| 260 | if (solver == NULL) { | 260 | if (solver == NULL) { |
| 261 | LOG("[gendata] Error: 'solver' argument is NULL\n"); | 261 | LOG("[gendata] Error: 'solver' argument is NULL\n"); |
| @@ -268,12 +268,12 @@ nissy_gendata_unsafe( | |||
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | dispatch = match_solver(solver); | 270 | dispatch = match_solver(solver); |
| 271 | if (dispatch == NULL) { | 271 | if (dispatch.prefix == NULL) { |
| 272 | LOG("[gendata] Unknown solver %s\n", solver); | 272 | LOG("[gendata] Unknown solver %s\n", solver); |
| 273 | return NISSY_ERROR_INVALID_SOLVER; | 273 | return NISSY_ERROR_INVALID_SOLVER; |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | return dispatch->gendata(solver, data_size, data); | 276 | return dispatch.gendata(dispatch.solvername, data_size, data); |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | long long | 279 | long long |
| @@ -283,15 +283,15 @@ nissy_checkdata( | |||
| 283 | const unsigned char *data | 283 | const unsigned char *data |
| 284 | ) | 284 | ) |
| 285 | { | 285 | { |
| 286 | solver_dispatch_t *dispatch; | 286 | solver_dispatch_t dispatch; |
| 287 | 287 | ||
| 288 | dispatch = match_solver(solver); | 288 | dispatch = match_solver(solver); |
| 289 | if (dispatch == NULL) { | 289 | if (dispatch.prefix == NULL) { |
| 290 | LOG("[checkdata] Unknown solver %s\n", solver); | 290 | LOG("[checkdata] Unknown solver %s\n", solver); |
| 291 | return NISSY_ERROR_INVALID_SOLVER; | 291 | return NISSY_ERROR_INVALID_SOLVER; |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | return dispatch->checkdata(solver, data_size, data); | 294 | return dispatch.checkdata(dispatch.solvername, data_size, data); |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | long long | 297 | long long |
| @@ -315,7 +315,7 @@ nissy_solve( | |||
| 315 | { | 315 | { |
| 316 | oriented_cube_t oc; | 316 | oriented_cube_t oc; |
| 317 | int t; | 317 | int t; |
| 318 | solver_dispatch_t *dispatch; | 318 | solver_dispatch_t dispatch; |
| 319 | 319 | ||
| 320 | if (solver == NULL) { | 320 | if (solver == NULL) { |
| 321 | LOG("[solve] Error: 'solver' argument is NULL\n"); | 321 | LOG("[solve] Error: 'solver' argument is NULL\n"); |
| @@ -359,13 +359,13 @@ nissy_solve( | |||
| 359 | } | 359 | } |
| 360 | 360 | ||
| 361 | dispatch = match_solver(solver); | 361 | dispatch = match_solver(solver); |
| 362 | if (dispatch == NULL) { | 362 | if (dispatch.prefix == NULL) { |
| 363 | LOG("[solve] Error: unknown solver '%s'\n", solver); | 363 | LOG("[solve] Error: unknown solver '%s'\n", solver); |
| 364 | return NISSY_ERROR_INVALID_SOLVER; | 364 | return NISSY_ERROR_INVALID_SOLVER; |
| 365 | } | 365 | } |
| 366 | return dispatch->solve(oc, solver, nissflag, minmoves, maxmoves, | 366 | return dispatch.solve(oc, dispatch.solvername, nissflag, minmoves, |
| 367 | maxsols, optimal, t, data_size, data, sols_size, sols, stats, | 367 | maxmoves, maxsols, optimal, t, data_size, data, sols_size, sols, |
| 368 | poll_status, poll_status_data); | 368 | stats, poll_status, poll_status_data); |
| 369 | } | 369 | } |
| 370 | 370 | ||
| 371 | long long | 371 | long long |
diff --git a/src/solvers/dispatch.h b/src/solvers/dispatch.h index 013468c..7e647ce 100644 --- a/src/solvers/dispatch.h +++ b/src/solvers/dispatch.h | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | typedef struct { | 1 | typedef struct { |
| 2 | const char *solvername; | ||
| 2 | const char *prefix; | 3 | const char *prefix; |
| 3 | long long (*dataid)(const char *, char [static NISSY_SIZE_DATAID]); | 4 | long long (*dataid)(const char *, char [static NISSY_SIZE_DATAID]); |
| 4 | long long (*gendata)( | 5 | long long (*gendata)( |
| @@ -12,7 +13,7 @@ typedef struct { | |||
| 12 | int (*)(void *), void *); | 13 | int (*)(void *), void *); |
| 13 | } solver_dispatch_t; | 14 | } solver_dispatch_t; |
| 14 | 15 | ||
| 15 | STATIC solver_dispatch_t *match_solver(const char *); | 16 | STATIC solver_dispatch_t match_solver(const char *); |
| 16 | 17 | ||
| 17 | solver_dispatch_t solver_dispatchers[] = { | 18 | solver_dispatch_t solver_dispatchers[] = { |
| 18 | { | 19 | { |
| @@ -41,20 +42,51 @@ solver_dispatch_t solver_dispatchers[] = { | |||
| 41 | } | 42 | } |
| 42 | }; | 43 | }; |
| 43 | 44 | ||
| 44 | STATIC solver_dispatch_t * | 45 | const char *solver_aliases[][2] = { |
| 46 | { "optimal", "h48h7k2" }, | ||
| 47 | { "eofb", "coord_EO_UF" }, | ||
| 48 | { "eorl", "coord_EO_UR" }, | ||
| 49 | { "eoud", "coord_EO_FD" }, | ||
| 50 | { "drud", "coord_DR_UF" }, | ||
| 51 | { "drrl", "coord_DR_RF" }, | ||
| 52 | { "drfb", "coord_DR_FD" }, | ||
| 53 | { "drudslice", "coord_DRSLICE_UF" }, | ||
| 54 | { "drrlslice", "coord_DRSLICE_LF" }, | ||
| 55 | { "drfbslice", "coord_DRSLICE_BU" }, | ||
| 56 | { "drud-eofb", "coord_DREO_UF" }, | ||
| 57 | { "drrl-eofb", "coord_DREO_RF" }, | ||
| 58 | { "drud-eorl", "coord_DREO_UR" }, | ||
| 59 | { "drfb-eorl", "coord_DREO_RU" }, | ||
| 60 | { "drrl-eoud", "coord_DREO_FR" }, | ||
| 61 | { "drfb-eoud", "coord_DREO_FD" }, | ||
| 62 | { "drudfin", "mcoord_DRFIN_UF" }, | ||
| 63 | { "drrlfin", "mcoord_DRFIN_LF" }, | ||
| 64 | { "drfbfin", "mcoord_DRFIN_BU" }, | ||
| 65 | { "htr-drud", "coord_HTR_UF" }, | ||
| 66 | { "htr-drrl", "coord_HTR_LF" }, | ||
| 67 | { "htr-drfb", "coord_HTR_BU" }, | ||
| 68 | { NULL, NULL } | ||
| 69 | }; | ||
| 70 | |||
| 71 | STATIC solver_dispatch_t | ||
| 45 | match_solver(const char *name) | 72 | match_solver(const char *name) |
| 46 | { | 73 | { |
| 47 | const char *prefix; | 74 | const char *prefix; |
| 75 | solver_dispatch_t ret; | ||
| 48 | int i; | 76 | int i; |
| 49 | 77 | ||
| 50 | if (name == NULL) | 78 | for (i = 0; solver_aliases[i][0] != NULL; i++) |
| 51 | return NULL; | 79 | if (!strcmp(name, solver_aliases[i][0])) |
| 80 | return match_solver(solver_aliases[i][1]); | ||
| 52 | 81 | ||
| 53 | for (i = 0; solver_dispatchers[i].prefix != NULL; i++) { | 82 | for (i = 0; solver_dispatchers[i].prefix != NULL; i++) { |
| 54 | prefix = solver_dispatchers[i].prefix; | 83 | prefix = solver_dispatchers[i].prefix; |
| 55 | if (!strncmp(name, prefix, strlen(prefix))) | 84 | if (!strncmp(name, prefix, strlen(prefix))) { |
| 56 | return &solver_dispatchers[i]; | 85 | ret = solver_dispatchers[i]; |
| 86 | ret.solvername = name; | ||
| 87 | return ret; | ||
| 88 | } | ||
| 57 | } | 89 | } |
| 58 | 90 | ||
| 59 | return NULL; | 91 | return solver_dispatchers[i]; |
| 60 | } | 92 | } |
