aboutsummaryrefslogtreecommitdiff
path: root/src/nissy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nissy.c')
-rw-r--r--src/nissy.c77
1 files changed, 22 insertions, 55 deletions
diff --git a/src/nissy.c b/src/nissy.c
index 8aa0334..27f2b35 100644
--- a/src/nissy.c
+++ b/src/nissy.c
@@ -17,7 +17,7 @@ long long parse_h48_solver(
17STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); 17STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]);
18STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], 18STATIC 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);
20STATIC long long write_result(cube_t, char [static NISSY_SIZE_CUBE]); 20STATIC long long write_result(oriented_cube_t, char [static NISSY_SIZE_CUBE]);
21STATIC size_t my_strnlen(const char *, size_t); 21STATIC size_t my_strnlen(const char *, size_t);
22STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); 22STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]);
23STATIC long long nissy_gendata_unsafe( 23STATIC long long nissy_gendata_unsafe(
@@ -117,7 +117,7 @@ distribution_equal(
117} 117}
118 118
119STATIC long long 119STATIC long long
120write_result(cube_t cube, char result[static NISSY_SIZE_CUBE]) 120write_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
@@ -142,53 +142,12 @@ my_strnlen(const char *str, size_t maxlen)
142} 142}
143 143
144long long 144long long
145nissy_compose(
146 const char cube[static NISSY_SIZE_CUBE],
147 const char permutation[static NISSY_SIZE_CUBE],
148 char result[static NISSY_SIZE_CUBE]
149)
150{
151 cube_t c, p, res;
152 long long err;
153
154 c = readcube(cube);
155
156 if (!isconsistent(c)) {
157 LOG("[compose] Error: the given cube is invalid\n");
158 err = NISSY_ERROR_INVALID_CUBE;
159 goto nissy_compose_error;
160 }
161
162 p = readcube(permutation);
163
164 if (!isconsistent(p)) {
165 LOG("[compose] Error: given permutation is invalid\n");
166 err = NISSY_ERROR_INVALID_CUBE;
167 goto nissy_compose_error;
168 }
169
170 res = compose(c, p);
171
172 if (!isconsistent(res)) {
173 LOG("[compose] Unknown error: resulting cube is invalid\n");
174 err = NISSY_ERROR_UNKNOWN;
175 goto nissy_compose_error;
176 }
177
178 return write_result(res, result);
179
180nissy_compose_error:
181 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result);
182 return err;
183}
184
185long long
186nissy_inverse( 145nissy_inverse(
187 const char cube[static NISSY_SIZE_CUBE], 146 const char cube[static NISSY_SIZE_CUBE],
188 char result[static NISSY_SIZE_CUBE] 147 char result[static NISSY_SIZE_CUBE]
189) 148)
190{ 149{
191 cube_t c, res; 150 oriented_cube_t c, res;
192 long long err; 151 long long err;
193 152
194 c = readcube(cube); 153 c = readcube(cube);
@@ -199,7 +158,10 @@ nissy_inverse(
199 goto nissy_inverse_error; 158 goto nissy_inverse_error;
200 } 159 }
201 160
202 res = inverse(c); 161 res = (oriented_cube_t) {
162 .cube = inverse(c.cube),
163 .orientation = c.orientation
164 };
203 165
204 if (!isconsistent(res)) { 166 if (!isconsistent(res)) {
205 LOG("[inverse] Unknown error: inverted cube is invalid\n"); 167 LOG("[inverse] Unknown error: inverted cube is invalid\n");
@@ -210,7 +172,7 @@ nissy_inverse(
210 return write_result(res, result); 172 return write_result(res, result);
211 173
212nissy_inverse_error: 174nissy_inverse_error:
213 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); 175 writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result);
214 return err; 176 return err;
215} 177}
216 178
@@ -221,7 +183,7 @@ nissy_applymoves(
221 char result[static NISSY_SIZE_CUBE] 183 char result[static NISSY_SIZE_CUBE]
222) 184)
223{ 185{
224 cube_t c, res; 186 oriented_cube_t c, res;
225 long long err; 187 long long err;
226 188
227 if (moves == NULL) { 189 if (moves == NULL) {
@@ -249,7 +211,7 @@ nissy_applymoves(
249 return write_result(res, result); 211 return write_result(res, result);
250 212
251nissy_applymoves_error: 213nissy_applymoves_error:
252 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); 214 writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result);
253 return err; 215 return err;
254} 216}
255 217
@@ -260,7 +222,7 @@ nissy_applytrans(
260 char result[static NISSY_SIZE_CUBE] 222 char result[static NISSY_SIZE_CUBE]
261) 223)
262{ 224{
263 cube_t c, res; 225 oriented_cube_t c, res;
264 long long err; 226 long long err;
265 227
266 c = readcube(cube); 228 c = readcube(cube);
@@ -282,7 +244,7 @@ nissy_applytrans(
282 return write_result(res, result); 244 return write_result(res, result);
283 245
284nissy_applytrans_error: 246nissy_applytrans_error:
285 writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); 247 writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result);
286 return err; 248 return err;
287} 249}
288 250
@@ -310,13 +272,14 @@ nissy_getcube(
310 272
311 c = getcube(ep, eo, cp, co); 273 c = getcube(ep, eo, cp, co);
312 274
313 if (!isconsistent(c)) { 275 if (!isconsistent((oriented_cube_t){ .cube = c, .orientation = 0 })) {
314 LOG("[getcube] Error: could not get cube with ep=%lld, " 276 LOG("[getcube] Error: could not get cube with ep=%lld, "
315 "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); 277 "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co);
316 return NISSY_ERROR_OPTIONS; 278 return NISSY_ERROR_OPTIONS;
317 } 279 }
318 280
319 return write_result(c, result); 281/* TODO: should support orientation */
282 return write_result((oriented_cube_t){.cube = c, .orientation = 0}, result);
320} 283}
321 284
322long long 285long long
@@ -497,6 +460,7 @@ nissy_solve(
497 long long stats[static NISSY_SIZE_SOLVE_STATS] 460 long long stats[static NISSY_SIZE_SOLVE_STATS]
498) 461)
499{ 462{
463 oriented_cube_t oc;
500 cube_t c; 464 cube_t c;
501 long long parse_ret; 465 long long parse_ret;
502 uint8_t h, k; 466 uint8_t h, k;
@@ -507,14 +471,17 @@ nissy_solve(
507 return NISSY_ERROR_NULL_POINTER; 471 return NISSY_ERROR_NULL_POINTER;
508 } 472 }
509 473
510 c = readcube(cube); 474 oc = readcube(cube);
475 c = oc.cube;
511 476
512 if (!isconsistent(c)) { 477/* TODO: solve should handle oriented cubes */
478
479 if (!isconsistent(oc)) {
513 LOG("[solve] Error: cube is invalid\n"); 480 LOG("[solve] Error: cube is invalid\n");
514 return NISSY_ERROR_INVALID_CUBE; 481 return NISSY_ERROR_INVALID_CUBE;
515 } 482 }
516 483
517 if (!issolvable(c)) { 484 if (!issolvable((oriented_cube_t){ .cube = c, .orientation = 0})) {
518/* TODO: this is step-dependent */ 485/* TODO: this is step-dependent */
519 LOG("[solve] Error: cube is not solvable\n"); 486 LOG("[solve] Error: cube is not solvable\n");
520 return NISSY_ERROR_UNSOLVABLE_CUBE; 487 return NISSY_ERROR_UNSOLVABLE_CUBE;

Generated with cgit - Back to sebastiano.tronto.net