aboutsummaryrefslogtreecommitdiff
path: root/shell.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--shell.c70
1 files changed, 45 insertions, 25 deletions
diff --git a/shell.c b/shell.c
index 03618de..5706189 100644
--- a/shell.c
+++ b/shell.c
@@ -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
35static void print_cube_result(int64_t, char [static 22]); 35static void print_cube_result(int64_t, char [static 22]);
@@ -41,7 +41,7 @@ static int64_t applymoves_exec(args_t *);
41static int64_t applytrans_exec(args_t *); 41static int64_t applytrans_exec(args_t *);
42static int64_t frommoves_exec(args_t *); 42static int64_t frommoves_exec(args_t *);
43static int64_t convert_exec(args_t *); 43static int64_t convert_exec(args_t *);
44static int64_t gencube_exec(args_t *); 44static int64_t randomcube_exec(args_t *);
45static int64_t datasize_exec(args_t *); 45static int64_t datasize_exec(args_t *);
46static int64_t gendata_exec(args_t *); 46static int64_t gendata_exec(args_t *);
47static int64_t solve_exec(args_t *); 47static int64_t solve_exec(args_t *);
@@ -66,6 +66,8 @@ static bool set_maxmoves(int, char **, args_t *);
66static bool set_optimal(int, char **, args_t *); 66static bool set_optimal(int, char **, args_t *);
67static bool set_maxsolutions(int, char **, args_t *); 67static bool set_maxsolutions(int, char **, args_t *);
68static bool set_id(int, char **, args_t *); 68static bool set_id(int, char **, args_t *);
69
70static uint64_t rand64(void);
69 71
70#define COMMAND(N, E) { .name = N, .exec = E } 72#define COMMAND(N, E) { .name = N, .exec = E }
71struct { 73struct {
@@ -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
120static uint64_t
121rand64(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
119static void 131static void
120print_cube_result(int64_t ret, char result[static 22]) 132print_cube_result(int64_t ret, char result[static 22])
121{ 133{
@@ -220,12 +232,16 @@ convert_exec(args_t *args)
220} 232}
221 233
222static int64_t 234static int64_t
223gencube_exec(args_t *args) 235randomcube_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)
384static int 400static int
385parse_args(int argc, char **argv, args_t *args) 401parse_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
571static bool
572set_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
586void log_stderr(const char *str, ...) 605void 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);

Generated with cgit - Back to sebastiano.tronto.net