aboutsummaryrefslogtreecommitdiff
path: root/src/nissy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nissy.c')
-rw-r--r--src/nissy.c115
1 files changed, 35 insertions, 80 deletions
diff --git a/src/nissy.c b/src/nissy.c
index 6b083e0..fe2747b 100644
--- a/src/nissy.c
+++ b/src/nissy.c
@@ -12,7 +12,7 @@
12#include "solvers/solvers.h" 12#include "solvers/solvers.h"
13 13
14int parse_h48_solver(const char *, uint8_t [static 1], uint8_t [static 1]); 14int parse_h48_solver(const char *, uint8_t [static 1], uint8_t [static 1]);
15STATIC int64_t write_result(cube_t, char [static NISSY_SIZE_B32]); 15STATIC long long write_result(cube_t, char [static NISSY_SIZE_B32]);
16STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], 16STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN],
17 const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); 17 const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t);
18STATIC bool checkdata(const char *, const tableinfo_t *); 18STATIC bool checkdata(const char *, const tableinfo_t *);
@@ -20,7 +20,7 @@ STATIC bool checkdata(const char *, const tableinfo_t *);
20#define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F } 20#define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F }
21struct { 21struct {
22 char *option; 22 char *option;
23 void (*fix)(int64_t *, int64_t *, int64_t *, int64_t *); 23 void (*fix)(long long *, long long *, long long *, long long *);
24} getcube_options[] = { 24} getcube_options[] = {
25 GETCUBE_OPTIONS("fix", getcube_fix), 25 GETCUBE_OPTIONS("fix", getcube_fix),
26 GETCUBE_OPTIONS(NULL, NULL) 26 GETCUBE_OPTIONS(NULL, NULL)
@@ -105,7 +105,7 @@ distribution_equal(
105 return wrong == 0; 105 return wrong == 0;
106} 106}
107 107
108STATIC int64_t 108STATIC long long
109write_result(cube_t cube, char result[static NISSY_SIZE_B32]) 109write_result(cube_t cube, char result[static NISSY_SIZE_B32])
110{ 110{
111 writecube("B32", cube, NISSY_SIZE_B32, result); 111 writecube("B32", cube, NISSY_SIZE_B32, result);
@@ -118,7 +118,7 @@ write_result(cube_t cube, char result[static NISSY_SIZE_B32])
118 return NISSY_OK; 118 return NISSY_OK;
119} 119}
120 120
121int64_t 121long long
122nissy_compose( 122nissy_compose(
123 const char cube[static NISSY_SIZE_B32], 123 const char cube[static NISSY_SIZE_B32],
124 const char permutation[static NISSY_SIZE_B32], 124 const char permutation[static NISSY_SIZE_B32],
@@ -126,7 +126,7 @@ nissy_compose(
126) 126)
127{ 127{
128 cube_t c, p, res; 128 cube_t c, p, res;
129 int64_t err; 129 long long err;
130 130
131 c = readcube("B32", cube); 131 c = readcube("B32", cube);
132 132
@@ -159,14 +159,14 @@ nissy_compose_error:
159 return err; 159 return err;
160} 160}
161 161
162int64_t 162long long
163nissy_inverse( 163nissy_inverse(
164 const char cube[static NISSY_SIZE_B32], 164 const char cube[static NISSY_SIZE_B32],
165 char result[static NISSY_SIZE_B32] 165 char result[static NISSY_SIZE_B32]
166) 166)
167{ 167{
168 cube_t c, res; 168 cube_t c, res;
169 int64_t err; 169 long long err;
170 170
171 c = readcube("B32", cube); 171 c = readcube("B32", cube);
172 172
@@ -191,7 +191,7 @@ nissy_inverse_error:
191 return err; 191 return err;
192} 192}
193 193
194int64_t 194long long
195nissy_applymoves( 195nissy_applymoves(
196 const char cube[static NISSY_SIZE_B32], 196 const char cube[static NISSY_SIZE_B32],
197 const char *moves, 197 const char *moves,
@@ -199,7 +199,7 @@ nissy_applymoves(
199) 199)
200{ 200{
201 cube_t c, res; 201 cube_t c, res;
202 int64_t err; 202 long long err;
203 203
204 if (moves == NULL) { 204 if (moves == NULL) {
205 LOG("Error: 'moves' argument is NULL\n"); 205 LOG("Error: 'moves' argument is NULL\n");
@@ -230,7 +230,7 @@ nissy_applymoves_error:
230 return err; 230 return err;
231} 231}
232 232
233int64_t 233long long
234nissy_applytrans( 234nissy_applytrans(
235 const char cube[static NISSY_SIZE_B32], 235 const char cube[static NISSY_SIZE_B32],
236 const char transformation[static NISSY_SIZE_TRANSFORMATION], 236 const char transformation[static NISSY_SIZE_TRANSFORMATION],
@@ -238,7 +238,7 @@ nissy_applytrans(
238) 238)
239{ 239{
240 cube_t c, res; 240 cube_t c, res;
241 int64_t err; 241 long long err;
242 242
243 c = readcube("B32", cube); 243 c = readcube("B32", cube);
244 244
@@ -263,47 +263,17 @@ nissy_applytrans_error:
263 return err; 263 return err;
264} 264}
265 265
266int64_t 266long long
267nissy_frommoves(
268 const char *moves,
269 char result[static NISSY_SIZE_B32]
270)
271{
272 cube_t res;
273 int64_t err;
274
275 if (moves == NULL) {
276 LOG("Error: 'moves' argument is NULL\n");
277 err = NISSY_ERROR_NULL_POINTER;
278 goto nissy_frommoves_error;
279 }
280
281 res = applymoves(SOLVED_CUBE, moves);
282
283 if (!isconsistent(res)) {
284 /* Assume we got a reasonable error message from applymoves */
285 err = NISSY_ERROR_INVALID_MOVES;
286 goto nissy_frommoves_error;
287 }
288
289 return write_result(res, result);
290
291nissy_frommoves_error:
292 writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result);
293 return err;
294}
295
296int64_t
297nissy_convert( 267nissy_convert(
298 const char *format_in, 268 const char *format_in,
299 const char *format_out, 269 const char *format_out,
300 const char *cube_string, 270 const char *cube_string,
301 uint64_t result_size, 271 unsigned result_size,
302 char result[result_size] 272 char result[result_size]
303) 273)
304{ 274{
305 cube_t c; 275 cube_t c;
306 int64_t err; 276 long long err;
307 277
308 if (format_in == NULL) { 278 if (format_in == NULL) {
309 LOG("Error: 'format_in' argument is NULL\n"); 279 LOG("Error: 'format_in' argument is NULL\n");
@@ -337,12 +307,12 @@ nissy_convert_error:
337 return err; 307 return err;
338} 308}
339 309
340int64_t 310long long
341nissy_getcube( 311nissy_getcube(
342 int64_t ep, 312 long long ep,
343 int64_t eo, 313 long long eo,
344 int64_t cp, 314 long long cp,
345 int64_t co, 315 long long co,
346 const char *options, 316 const char *options,
347 char result[static NISSY_SIZE_B32] 317 char result[static NISSY_SIZE_B32]
348) 318)
@@ -371,7 +341,7 @@ nissy_getcube(
371 return write_result(c, result); 341 return write_result(c, result);
372} 342}
373 343
374int64_t 344long long
375nissy_datasize( 345nissy_datasize(
376 const char *solver 346 const char *solver
377) 347)
@@ -385,7 +355,7 @@ nissy_datasize(
385 return nissy_gendata(solver, 0, NULL); 355 return nissy_gendata(solver, 0, NULL);
386} 356}
387 357
388int64_t 358long long
389nissy_datainfo( 359nissy_datainfo(
390 uint64_t data_size, 360 uint64_t data_size,
391 const char data[data_size], 361 const char data[data_size],
@@ -394,7 +364,7 @@ nissy_datainfo(
394{ 364{
395 uint8_t i; 365 uint8_t i;
396 tableinfo_t info; 366 tableinfo_t info;
397 int64_t ret; 367 long long ret;
398 368
399 ret = readtableinfo(data_size, data, &info); 369 ret = readtableinfo(data_size, data, &info);
400 if (ret != 0) 370 if (ret != 0)
@@ -434,10 +404,10 @@ nissy_datainfo(
434 return NISSY_OK; 404 return NISSY_OK;
435} 405}
436 406
437int64_t 407long long
438nissy_gendata( 408nissy_gendata(
439 const char *solver, 409 const char *solver,
440 uint64_t data_size, 410 unsigned long long data_size,
441 char data[data_size] 411 char data[data_size]
442) 412)
443{ 413{
@@ -463,9 +433,9 @@ nissy_gendata(
463 } 433 }
464} 434}
465 435
466int64_t 436long long
467nissy_checkdata( 437nissy_checkdata(
468 uint64_t data_size, 438 unsigned long long data_size,
469 const char data[data_size] 439 const char data[data_size]
470) 440)
471{ 441{
@@ -488,18 +458,18 @@ nissy_checkdata(
488 return NISSY_OK; 458 return NISSY_OK;
489} 459}
490 460
491int64_t 461long long
492nissy_solve( 462nissy_solve(
493 const char cube[static NISSY_SIZE_B32], 463 const char cube[static NISSY_SIZE_B32],
494 const char *solver, 464 const char *solver,
495 uint8_t nissflag, 465 unsigned nissflag,
496 int8_t minmoves, 466 unsigned minmoves,
497 int8_t maxmoves, 467 unsigned maxmoves,
498 int64_t maxsols, 468 unsigned maxsols,
499 int8_t optimal, 469 int optimal,
500 uint64_t data_size, 470 unsigned long long data_size,
501 const char data[data_size], 471 const char data[data_size],
502 uint64_t sols_size, 472 unsigned sols_size,
503 char sols[sols_size] 473 char sols[sols_size]
504) 474)
505{ 475{
@@ -524,21 +494,6 @@ nissy_solve(
524 return NISSY_ERROR_UNSOLVABLE_CUBE; 494 return NISSY_ERROR_UNSOLVABLE_CUBE;
525 } 495 }
526 496
527 if (minmoves < 0) {
528 LOG("solve: 'minmoves' is negative, setting it to 0\n");
529 minmoves = 0;
530 }
531
532 if (maxmoves < 0) {
533 LOG("solve: 'maxmoves' is negative, setting it to 20\n");
534 maxmoves = 20;
535 }
536
537 if (maxsols < 0) {
538 LOG("solve: 'maxsols' is negative, stopping\n");
539 return NISSY_ERROR_OPTIONS;
540 }
541
542 if (maxsols == 0) { 497 if (maxsols == 0) {
543 LOG("solve: 'maxsols' is 0, returning no solution\n"); 498 LOG("solve: 'maxsols' is 0, returning no solution\n");
544 return 0; 499 return 0;
@@ -565,7 +520,7 @@ nissy_solve(
565 } 520 }
566} 521}
567 522
568int64_t 523long long
569nissy_setlogger( 524nissy_setlogger(
570 void (*log)(const char *, ...) 525 void (*log)(const char *, ...)
571) 526)

Generated with cgit - Back to sebastiano.tronto.net