void retro_cheat_set(unsigned index, bool enabled, const char* code) { UNUSED(index); UNUSED(enabled); // Convert the super wonky unportable libretro format to something normal char realCode[] = "XXXXXXXX XXXXXXXX"; size_t len = strlen(code) + 1; // Include null terminator size_t i, pos; for (i = 0, pos = 0; i < len; ++i) { if (isspace((int) code[i]) || code[i] == '+') { realCode[pos] = ' '; } else { realCode[pos] = code[i]; } if ((pos == 13 && (realCode[pos] == ' ' || !realCode[pos])) || pos == 17) { realCode[pos] = '\0'; GBACheatAddLine(&cheatSet, realCode); pos = 0; continue; } ++pos; } }
bool GBACheatParseFile(struct GBACheatDevice* device, struct VFile* vf) { char cheat[MAX_LINE_LENGTH]; struct GBACheatSet* set = 0; struct GBACheatSet* newSet; int gsaVersion = 0; bool nextDisabled = false; bool reset = false; while (true) { size_t i = 0; ssize_t bytesRead = vf->readline(vf, cheat, sizeof(cheat)); if (bytesRead == 0) { break; } if (bytesRead < 0) { return false; } while (isspace((int) cheat[i])) { ++i; } switch (cheat[i]) { case '#': do { ++i; } while (isspace((int) cheat[i])); newSet = malloc(sizeof(*set)); GBACheatSetInit(newSet, &cheat[i]); newSet->enabled = !nextDisabled; nextDisabled = false; if (set) { GBACheatAddSet(device, set); } if (set && !reset) { GBACheatSetCopyProperties(newSet, set); } else { GBACheatSetGameSharkVersion(newSet, gsaVersion); } reset = false; set = newSet; break; case '!': do { ++i; } while (isspace((int) cheat[i])); if (strncasecmp(&cheat[i], "GSAv", 4) == 0 || strncasecmp(&cheat[i], "PARv", 4) == 0) { i += 4; gsaVersion = atoi(&cheat[i]); break; } if (strcasecmp(&cheat[i], "disabled") == 0) { nextDisabled = true; break; } if (strcasecmp(&cheat[i], "reset") == 0) { reset = true; break; } break; default: if (!set) { set = malloc(sizeof(*set)); GBACheatSetInit(set, 0); set->enabled = !nextDisabled; nextDisabled = false; GBACheatSetGameSharkVersion(set, gsaVersion); } GBACheatAddLine(set, cheat); break; } } if (set) { GBACheatAddSet(device, set); } return true; }