aboutsummaryrefslogtreecommitdiff
path: root/src/core/cube.h
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-04-22 09:00:15 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-04-22 09:00:15 +0200
commit8b72e391c7185e3da0dfbf0ab60068ac37e4d5cc (patch)
treeb79d8154f16a0dadd8d8265d32b8bd95e96263aa /src/core/cube.h
parent510a7471348788fccba6b7c4b9f7b7cc9aee6ba9 (diff)
downloadnissy-core-8b72e391c7185e3da0dfbf0ab60068ac37e4d5cc.tar.gz
nissy-core-8b72e391c7185e3da0dfbf0ab60068ac37e4d5cc.zip
Removed old scripts and updated public API
Diffstat (limited to '')
-rw-r--r--src/core/cube.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/core/cube.h b/src/core/cube.h
index ce8a6b8..798c99c 100644
--- a/src/core/cube.h
+++ b/src/core/cube.h
@@ -174,3 +174,193 @@ getcube(int64_t ep, int64_t eo, int64_t cp, int64_t co)
174 174
175 return cubefromarray(carr, earr); 175 return cubefromarray(carr, earr);
176} 176}
177
178
179/******************************************************************************/
180
181STATIC cube_t readcube(const char *, const char *);
182STATIC int64_t writecube(const char *, cube_t, size_t n, char [n]);
183STATIC uint8_t readco(const char *);
184STATIC uint8_t readcp(const char *);
185STATIC uint8_t readeo(const char *);
186STATIC uint8_t readep(const char *);
187
188STATIC cube_t readcube_B32(const char *);
189STATIC int64_t writecube_B32(cube_t, size_t n, char [n]);
190
191STATIC uint8_t b32toedge(char);
192STATIC uint8_t b32tocorner(char);
193STATIC char edgetob32(uint8_t);
194STATIC char cornertob32(uint8_t);
195
196STATIC cube_t
197readcube(const char *format, const char *buf)
198{
199 return readcube_B32(buf);
200}
201
202STATIC int64_t
203writecube(const char *format, cube_t cube, size_t buf_size, char buf[buf_size])
204{
205 return writecube_B32(cube, buf_size, buf);
206}
207
208STATIC uint8_t
209readco(const char *str)
210{
211 if (*str == '0')
212 return 0;
213 if (*str == '1')
214 return CTWIST_CW;
215 if (*str == '2')
216 return CTWIST_CCW;
217
218 LOG("Error reading CO\n");
219 return UINT8_ERROR;
220}
221
222STATIC uint8_t
223readcp(const char *str)
224{
225 uint8_t c;
226
227 for (c = 0; c < 8; c++)
228 if (!strncmp(str, cornerstr[c], 3) ||
229 !strncmp(str, cornerstralt[c], 3))
230 return c;
231
232 LOG("Error reading CP\n");
233 return UINT8_ERROR;
234}
235
236STATIC uint8_t
237readeo(const char *str)
238{
239 if (*str == '0')
240 return 0;
241 if (*str == '1')
242 return EFLIP;
243
244 LOG("Error reading EO\n");
245 return UINT8_ERROR;
246}
247
248STATIC uint8_t
249readep(const char *str)
250{
251 uint8_t e;
252
253 for (e = 0; e < 12; e++)
254 if (!strncmp(str, edgestr[e], 2))
255 return e;
256
257 LOG("Error reading EP\n");
258 return UINT8_ERROR;
259}
260
261STATIC cube_t
262readcube_B32(const char *buf)
263{
264 int i;
265 uint8_t c[8], e[12];
266
267 for (i = 0; i < 8; i++) {
268 c[i] = b32tocorner(buf[i]);
269 if (c[i] == UINT8_ERROR) {
270 LOG("Error reading B32 corner %d ", i);
271 if (buf[i] == 0) {
272 LOG("(string terminated early)\n");
273 } else {
274 LOG("(char '%c')\n", buf[i]);
275 }
276 return ZERO_CUBE;
277 }
278 }
279
280 if (buf[8] != '=') {
281 LOG("Error reading B32 separator: a single '=' "
282 "must be used to separate edges and corners\n");
283 return ZERO_CUBE;
284 }
285
286 for (i = 0; i < 12; i++) {
287 e[i] = b32toedge(buf[i+9]);
288 if (e[i] == UINT8_ERROR) {
289 LOG("Error reading B32 edge %d ", i);
290 if (buf[i+9] == 0) {
291 LOG("(string terminated early)\n");
292 } else {
293 LOG("(char '%c')\n", buf[i+9]);
294 }
295 return ZERO_CUBE;
296 }
297 }
298
299 return cubefromarray(c, e);
300}
301
302STATIC int64_t
303writecube_B32(cube_t cube, size_t buf_size, char buf[buf_size])
304{
305 int i;
306 uint8_t corner[8], edge[12];
307
308 if (buf_size < NISSY_SIZE_CUBE) {
309 LOG("Cannot write cube: buffer size must be at least %u "
310 "bytes, but the provided one is %zu bytes.\n",
311 NISSY_SIZE_CUBE, buf_size);
312 return NISSY_ERROR_BUFFER_SIZE;
313 }
314
315 pieces(&cube, corner, edge);
316
317 for (i = 0; i < 8; i++)
318 buf[i] = cornertob32(corner[i]);
319
320 buf[8] = '=';
321
322 for (i = 0; i < 12; i++)
323 buf[i+9] = edgetob32(edge[i]);
324
325 buf[21] = '\0';
326
327 return NISSY_OK;
328}
329
330STATIC uint8_t
331b32toedge(char c)
332{
333 if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'f')))
334 return UINT8_ERROR;
335
336 return c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26;
337}
338
339STATIC uint8_t
340b32tocorner(char c) {
341 uint8_t val;
342
343 if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'f')))
344 return UINT8_ERROR;
345
346 val = c <= 'Z' ? (uint8_t)(c - 'A') : (uint8_t)(c - 'a') + 26;
347
348 return (val & 7) | ((val & 24) << 2);
349}
350
351STATIC char
352edgetob32(uint8_t edge)
353{
354 return edge < 26 ? 'A' + (char)edge : 'a' + (char)(edge - 26);
355}
356
357STATIC char
358cornertob32(uint8_t corner)
359{
360 uint8_t val;
361
362 val = (corner & 7) | ((corner & 96) >> 2);
363
364 return val < 26 ? 'A' + (char)val : 'a' + (char)(val - 26);
365}
366/******************************************************************************/

Generated with cgit - Back to sebastiano.tronto.net