diff options
Diffstat (limited to 'cube.c')
| -rw-r--r-- | cube.c | 72 |
1 files changed, 40 insertions, 32 deletions
| @@ -849,9 +849,10 @@ _static uint8_t readcp(char *); | |||
| 849 | _static uint8_t readeo(char *); | 849 | _static uint8_t readeo(char *); |
| 850 | _static uint8_t readep(char *); | 850 | _static uint8_t readep(char *); |
| 851 | _static cube_t readcube_H48(char *); | 851 | _static cube_t readcube_H48(char *); |
| 852 | _static int writepiece_SRC(uint8_t, char *); | 852 | _static uint8_t readpiece_LST(char **); |
| 853 | _static cube_t readcube_LST(char *); | ||
| 854 | _static int writepiece_LST(uint8_t, char *); | ||
| 853 | _static void writecube_H48(cube_t, char *); | 855 | _static void writecube_H48(cube_t, char *); |
| 854 | _static void writecube_SRC(cube_t, char *); | ||
| 855 | _static void writecube_LST(cube_t, char *); | 856 | _static void writecube_LST(cube_t, char *); |
| 856 | _static uint8_t readmove(char); | 857 | _static uint8_t readmove(char); |
| 857 | _static uint8_t readmodifier(char); | 858 | _static uint8_t readmodifier(char); |
| @@ -1083,6 +1084,8 @@ readcube(char *format, char *buf) | |||
| 1083 | 1084 | ||
| 1084 | if (!strcmp(format, "H48")) { | 1085 | if (!strcmp(format, "H48")) { |
| 1085 | cube = readcube_H48(buf); | 1086 | cube = readcube_H48(buf); |
| 1087 | } else if (!strcmp(format, "LST")) { | ||
| 1088 | cube = readcube_LST(buf); | ||
| 1086 | } else { | 1089 | } else { |
| 1087 | DBG_LOG("Cannot read cube in the given format\n"); | 1090 | DBG_LOG("Cannot read cube in the given format\n"); |
| 1088 | cube = zero; | 1091 | cube = zero; |
| @@ -1104,8 +1107,6 @@ writecube(char *format, cube_t cube, char *buf) | |||
| 1104 | 1107 | ||
| 1105 | if (!strcmp(format, "H48")) { | 1108 | if (!strcmp(format, "H48")) { |
| 1106 | writecube_H48(cube, buf); | 1109 | writecube_H48(cube, buf); |
| 1107 | } else if (!strcmp(format, "SRC")) { | ||
| 1108 | writecube_SRC(cube, buf); | ||
| 1109 | } else if (!strcmp(format, "LST")) { | 1110 | } else if (!strcmp(format, "LST")) { |
| 1110 | writecube_LST(cube, buf); | 1111 | writecube_LST(cube, buf); |
| 1111 | } else { | 1112 | } else { |
| @@ -1225,8 +1226,40 @@ readcube_H48(char *buf) | |||
| 1225 | return ret; | 1226 | return ret; |
| 1226 | } | 1227 | } |
| 1227 | 1228 | ||
| 1229 | _static uint8_t | ||
| 1230 | readpiece_LST(char **b) | ||
| 1231 | { | ||
| 1232 | uint8_t ret; | ||
| 1233 | bool read; | ||
| 1234 | |||
| 1235 | while (**b == ',' || **b == ' ' || **b == '\t' || **b == '\n') | ||
| 1236 | (*b)++; | ||
| 1237 | |||
| 1238 | for (ret = 0, read = false; **b >= '0' && **b <= '9'; (*b)++) { | ||
| 1239 | read = true; | ||
| 1240 | ret = ret * 10 + (**b) - '0'; | ||
| 1241 | } | ||
| 1242 | |||
| 1243 | return read ? ret : _error; | ||
| 1244 | } | ||
| 1245 | |||
| 1246 | _static cube_t | ||
| 1247 | readcube_LST(char *buf) | ||
| 1248 | { | ||
| 1249 | int i; | ||
| 1250 | cube_t ret = {0}; | ||
| 1251 | |||
| 1252 | for (i = 0; i < 8; i++) | ||
| 1253 | ret.corner[i] = readpiece_LST(&buf); | ||
| 1254 | |||
| 1255 | for (i = 0; i < 12; i++) | ||
| 1256 | ret.edge[i] = readpiece_LST(&buf); | ||
| 1257 | |||
| 1258 | return ret; | ||
| 1259 | } | ||
| 1260 | |||
| 1228 | _static int | 1261 | _static int |
| 1229 | writepiece_SRC(uint8_t piece, char *buf) | 1262 | writepiece_LST(uint8_t piece, char *buf) |
| 1230 | { | 1263 | { |
| 1231 | char digits[3]; | 1264 | char digits[3]; |
| 1232 | int i, len = 0; | 1265 | int i, len = 0; |
| @@ -1278,31 +1311,6 @@ writecube_H48(cube_t cube, char *buf) | |||
| 1278 | } | 1311 | } |
| 1279 | 1312 | ||
| 1280 | _static void | 1313 | _static void |
| 1281 | writecube_SRC(cube_t cube, char *buf) | ||
| 1282 | { | ||
| 1283 | int i, ptr; | ||
| 1284 | uint8_t piece; | ||
| 1285 | |||
| 1286 | memcpy(buf, "{\n\t.corner = {", 14); | ||
| 1287 | ptr = 14; | ||
| 1288 | |||
| 1289 | for (i = 0; i < 8; i++) { | ||
| 1290 | piece = cube.corner[i]; | ||
| 1291 | ptr += writepiece_SRC(piece, buf + ptr); | ||
| 1292 | } | ||
| 1293 | |||
| 1294 | memcpy(buf+ptr-2, "},\n\t.edge = {", 13); | ||
| 1295 | ptr += 11; | ||
| 1296 | |||
| 1297 | for (i = 0; i < 12; i++) { | ||
| 1298 | piece = cube.edge[i]; | ||
| 1299 | ptr += writepiece_SRC(piece, buf + ptr); | ||
| 1300 | } | ||
| 1301 | |||
| 1302 | memcpy(buf+ptr-2, "}\n}\0", 4); | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | _static void | ||
| 1306 | writecube_LST(cube_t cube, char *buf) | 1314 | writecube_LST(cube_t cube, char *buf) |
| 1307 | { | 1315 | { |
| 1308 | int i, ptr; | 1316 | int i, ptr; |
| @@ -1312,12 +1320,12 @@ writecube_LST(cube_t cube, char *buf) | |||
| 1312 | 1320 | ||
| 1313 | for (i = 0; i < 8; i++) { | 1321 | for (i = 0; i < 8; i++) { |
| 1314 | piece = cube.corner[i]; | 1322 | piece = cube.corner[i]; |
| 1315 | ptr += writepiece_SRC(piece, buf + ptr); | 1323 | ptr += writepiece_LST(piece, buf + ptr); |
| 1316 | } | 1324 | } |
| 1317 | 1325 | ||
| 1318 | for (i = 0; i < 12; i++) { | 1326 | for (i = 0; i < 12; i++) { |
| 1319 | piece = cube.edge[i]; | 1327 | piece = cube.edge[i]; |
| 1320 | ptr += writepiece_SRC(piece, buf + ptr); | 1328 | ptr += writepiece_LST(piece, buf + ptr); |
| 1321 | } | 1329 | } |
| 1322 | 1330 | ||
| 1323 | *(buf+ptr-2) = 0; | 1331 | *(buf+ptr-2) = 0; |
