diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2024-07-04 17:09:55 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2024-07-04 17:09:55 +0200 |
| commit | 518d98ad5f9eec0cf4124375bdbb84d1296b3f3f (patch) | |
| tree | 467b2b0387f23a0b379cf428c6883937ec18c134 /shell.c | |
| parent | 425eee24421bf0a19c7e0199d2e3ecba3318c8f4 (diff) | |
| download | nissy-core-518d98ad5f9eec0cf4124375bdbb84d1296b3f3f.tar.gz nissy-core-518d98ad5f9eec0cf4124375bdbb84d1296b3f3f.zip | |
(almost) added getcube
Diffstat (limited to 'shell.c')
| -rw-r--r-- | shell.c | 70 |
1 files changed, 45 insertions, 25 deletions
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <stdio.h> | 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
| 7 | #include <string.h> | 7 | #include <string.h> |
| 8 | #include <time.h> | ||
| 8 | 9 | ||
| 9 | #include "src/cube.h" | 10 | #include "src/cube.h" |
| 10 | 11 | ||
| @@ -29,7 +30,6 @@ typedef struct { | |||
| 29 | int8_t maxmoves; | 30 | int8_t maxmoves; |
| 30 | int8_t optimal; | 31 | int8_t optimal; |
| 31 | int64_t maxsolutions; | 32 | int64_t maxsolutions; |
| 32 | uint8_t id[16]; | ||
| 33 | } args_t; | 33 | } args_t; |
| 34 | 34 | ||
| 35 | static void print_cube_result(int64_t, char [static 22]); | 35 | static void print_cube_result(int64_t, char [static 22]); |
| @@ -41,7 +41,7 @@ static int64_t applymoves_exec(args_t *); | |||
| 41 | static int64_t applytrans_exec(args_t *); | 41 | static int64_t applytrans_exec(args_t *); |
| 42 | static int64_t frommoves_exec(args_t *); | 42 | static int64_t frommoves_exec(args_t *); |
| 43 | static int64_t convert_exec(args_t *); | 43 | static int64_t convert_exec(args_t *); |
| 44 | static int64_t gencube_exec(args_t *); | 44 | static int64_t randomcube_exec(args_t *); |
| 45 | static int64_t datasize_exec(args_t *); | 45 | static int64_t datasize_exec(args_t *); |
| 46 | static int64_t gendata_exec(args_t *); | 46 | static int64_t gendata_exec(args_t *); |
| 47 | static int64_t solve_exec(args_t *); | 47 | static int64_t solve_exec(args_t *); |
| @@ -66,6 +66,8 @@ static bool set_maxmoves(int, char **, args_t *); | |||
| 66 | static bool set_optimal(int, char **, args_t *); | 66 | static bool set_optimal(int, char **, args_t *); |
| 67 | static bool set_maxsolutions(int, char **, args_t *); | 67 | static bool set_maxsolutions(int, char **, args_t *); |
| 68 | static bool set_id(int, char **, args_t *); | 68 | static bool set_id(int, char **, args_t *); |
| 69 | |||
| 70 | static uint64_t rand64(void); | ||
| 69 | 71 | ||
| 70 | #define COMMAND(N, E) { .name = N, .exec = E } | 72 | #define COMMAND(N, E) { .name = N, .exec = E } |
| 71 | struct { | 73 | struct { |
| @@ -78,7 +80,7 @@ struct { | |||
| 78 | COMMAND("applytrans", applytrans_exec), | 80 | COMMAND("applytrans", applytrans_exec), |
| 79 | COMMAND("frommoves", frommoves_exec), | 81 | COMMAND("frommoves", frommoves_exec), |
| 80 | COMMAND("convert", convert_exec), | 82 | COMMAND("convert", convert_exec), |
| 81 | COMMAND("gencube", gencube_exec), | 83 | COMMAND("randomcube", randomcube_exec), |
| 82 | COMMAND("datasize", datasize_exec), | 84 | COMMAND("datasize", datasize_exec), |
| 83 | COMMAND("gendata", gendata_exec), | 85 | COMMAND("gendata", gendata_exec), |
| 84 | COMMAND("solve", solve_exec), | 86 | COMMAND("solve", solve_exec), |
| @@ -106,7 +108,6 @@ struct { | |||
| 106 | OPTION("-M", 1, set_maxmoves), | 108 | OPTION("-M", 1, set_maxmoves), |
| 107 | OPTION("-O", 1, set_optimal), | 109 | OPTION("-O", 1, set_optimal), |
| 108 | OPTION("-n", 1, set_maxsolutions), | 110 | OPTION("-n", 1, set_maxsolutions), |
| 109 | OPTION("-id", 16, set_id), | ||
| 110 | OPTION(NULL, 0, NULL) | 111 | OPTION(NULL, 0, NULL) |
| 111 | }; | 112 | }; |
| 112 | 113 | ||
| @@ -116,6 +117,17 @@ char *tablepaths[] = { | |||
| 116 | NULL | 117 | NULL |
| 117 | }; | 118 | }; |
| 118 | 119 | ||
| 120 | static uint64_t | ||
| 121 | rand64(void) | ||
| 122 | { | ||
| 123 | uint64_t i, ret; | ||
| 124 | |||
| 125 | for (i = 0, ret = 0; i < 64; i++) | ||
| 126 | ret |= (uint64_t)(rand() % 2) << i; | ||
| 127 | |||
| 128 | return ret; | ||
| 129 | } | ||
| 130 | |||
| 119 | static void | 131 | static void |
| 120 | print_cube_result(int64_t ret, char result[static 22]) | 132 | print_cube_result(int64_t ret, char result[static 22]) |
| 121 | { | 133 | { |
| @@ -220,12 +232,16 @@ convert_exec(args_t *args) | |||
| 220 | } | 232 | } |
| 221 | 233 | ||
| 222 | static int64_t | 234 | static int64_t |
| 223 | gencube_exec(args_t *args) | 235 | randomcube_exec(args_t *args) |
| 224 | { | 236 | { |
| 225 | char result[PRINTCUBE_BUFFER_SIZE]; | 237 | char result[PRINTCUBE_BUFFER_SIZE]; |
| 226 | int64_t ret; | 238 | int64_t ret, ep, eo, cp, co; |
| 227 | 239 | ||
| 228 | ret = nissy_gencube(args->id, args->str_options, result); | 240 | ep = rand64(); |
| 241 | eo = rand64(); | ||
| 242 | cp = rand64(); | ||
| 243 | co = rand64(); | ||
| 244 | ret = nissy_getcube(ep, eo, cp, co, args->str_options, result); | ||
| 229 | print_str_result(ret, result); | 245 | print_str_result(ret, result); |
| 230 | 246 | ||
| 231 | return ret; | 247 | return ret; |
| @@ -289,7 +305,7 @@ gendata_exec(args_t *args) | |||
| 289 | } | 305 | } |
| 290 | if (ret != size) { | 306 | if (ret != size) { |
| 291 | fprintf(stderr, "Unknown error: unexpected data size " | 307 | fprintf(stderr, "Unknown error: unexpected data size " |
| 292 | "(got %zu, expected %zu)\n", ret, size); | 308 | "got %" PRId64 ", expected %" PRId64)\n", ret, size); |
| 293 | fclose(file); | 309 | fclose(file); |
| 294 | free(buf); | 310 | free(buf); |
| 295 | return -5; | 311 | return -5; |
| @@ -303,7 +319,7 @@ gendata_exec(args_t *args) | |||
| 303 | fprintf(stderr, | 319 | fprintf(stderr, |
| 304 | "Error: data was generated correctly, but could not be " | 320 | "Error: data was generated correctly, but could not be " |
| 305 | "written to file (generated %" PRId64 " bytes, written " | 321 | "written to file (generated %" PRId64 " bytes, written " |
| 306 | "%zu)\n", written, size); | 322 | "%zu)\n", size, written); |
| 307 | return -6; | 323 | return -6; |
| 308 | } | 324 | } |
| 309 | 325 | ||
| @@ -384,9 +400,27 @@ solve_exec(args_t *args) | |||
| 384 | static int | 400 | static int |
| 385 | parse_args(int argc, char **argv, args_t *args) | 401 | parse_args(int argc, char **argv, args_t *args) |
| 386 | { | 402 | { |
| 387 | /* TODO: this function should set sensible defaults for all options */ | ||
| 388 | int i, j, n; | 403 | int i, j, n; |
| 389 | 404 | ||
| 405 | *args = (args_t) { | ||
| 406 | .command_index = -1, | ||
| 407 | .cube = "", | ||
| 408 | .cube_perm = "", | ||
| 409 | .str_cube = "", | ||
| 410 | .str_format = "", | ||
| 411 | .str_format_in = "", | ||
| 412 | .str_format_out = "", | ||
| 413 | .str_moves = "", | ||
| 414 | .str_trans = "", | ||
| 415 | .str_solver = "", | ||
| 416 | .str_options = "", | ||
| 417 | .str_nisstype = "", | ||
| 418 | .minmoves = 0, | ||
| 419 | .maxmoves = 20, | ||
| 420 | .optimal = -1, | ||
| 421 | .maxsolutions = 1, | ||
| 422 | }; | ||
| 423 | |||
| 390 | if (argc == 0) { | 424 | if (argc == 0) { |
| 391 | printf("No command given\n"); | 425 | printf("No command given\n"); |
| 392 | return 1; | 426 | return 1; |
| @@ -568,21 +602,6 @@ set_maxsolutions(int argc, char **argv, args_t *args) | |||
| 568 | return parse_int64(argv[0], &args->maxsolutions); | 602 | return parse_int64(argv[0], &args->maxsolutions); |
| 569 | } | 603 | } |
| 570 | 604 | ||
| 571 | static bool | ||
| 572 | set_id(int argc, char **argv, args_t *args) | ||
| 573 | { | ||
| 574 | int i; | ||
| 575 | int64_t n; | ||
| 576 | |||
| 577 | for (i = 0; i < 16; i++) { | ||
| 578 | if (!parse_int64(argv[i], &n)) | ||
| 579 | return false; | ||
| 580 | args->id[i] = (uint8_t)n; | ||
| 581 | } | ||
| 582 | |||
| 583 | return true; | ||
| 584 | } | ||
| 585 | |||
| 586 | void log_stderr(const char *str, ...) | 605 | void log_stderr(const char *str, ...) |
| 587 | { | 606 | { |
| 588 | va_list args; | 607 | va_list args; |
| @@ -597,6 +616,7 @@ int main(int argc, char **argv) | |||
| 597 | int parse_error; | 616 | int parse_error; |
| 598 | args_t args; | 617 | args_t args; |
| 599 | 618 | ||
| 619 | srand(time(NULL)); | ||
| 600 | nissy_setlogger(log_stderr); | 620 | nissy_setlogger(log_stderr); |
| 601 | 621 | ||
| 602 | parse_error = parse_args(argc-1, argv+1, &args); | 622 | parse_error = parse_args(argc-1, argv+1, &args); |
