static int cheevos_new_cheevo(cheevos_readud_t* ud) { cheevos_racheevo_t* cheevo = NULL; unsigned flags = (unsigned)strtol(ud->flags.string, NULL, 10); if (flags == 3) cheevo = ud->patchdata->core + ud->core_count++; else if (flags == 5) cheevo = ud->patchdata->unofficial + ud->unofficial_count++; else return 0; cheevo->title = cheevos_dupstr(&ud->title); cheevo->description = cheevos_dupstr(&ud->desc); cheevo->badge = cheevos_dupstr(&ud->badge); cheevo->memaddr = cheevos_dupstr(&ud->memaddr); cheevo->points = (unsigned)strtol(ud->points.string, NULL, 10); cheevo->id = (unsigned)strtol(ud->id.string, NULL, 10); if ( !cheevo->title || !cheevo->description || !cheevo->badge || !cheevo->memaddr) { CHEEVOS_FREE(cheevo->title); CHEEVOS_FREE(cheevo->description); CHEEVOS_FREE(cheevo->badge); CHEEVOS_FREE(cheevo->memaddr); return -1; } return 0; }
static int cheevos_new_lboard(cheevos_readud_t* ud) { cheevos_ralboard_t* lboard = ud->patchdata->lboards + ud->lboard_count++; lboard->title = cheevos_dupstr(&ud->title); lboard->description = cheevos_dupstr(&ud->desc); lboard->format = cheevos_dupstr(&ud->format); lboard->mem = cheevos_dupstr(&ud->memaddr); lboard->id = (unsigned)strtol(ud->id.string, NULL, 10); if ( !lboard->title || !lboard->description || !lboard->format || !lboard->mem) { CHEEVOS_FREE(lboard->title); CHEEVOS_FREE(lboard->description); CHEEVOS_FREE(lboard->format); CHEEVOS_FREE(lboard->mem); return -1; } return 0; }
static int cheevos_new_cheevo(cheevos_readud_t *ud) { const cheevos_condset_t *end; unsigned set; cheevos_condset_t *condset; cheevo_t *cheevo; int flags = strtol(ud->flags.string, NULL, 10); if (flags == 3) cheevo = cheevos_locals.core.cheevos + ud->core_count++; else cheevo = cheevos_locals.unofficial.cheevos + ud->unofficial_count++; cheevo->id = strtol(ud->id.string, NULL, 10); cheevo->title = cheevos_dupstr(&ud->title); cheevo->description = cheevos_dupstr(&ud->desc); cheevo->author = cheevos_dupstr(&ud->author); cheevo->badge = cheevos_dupstr(&ud->badge); cheevo->points = strtol(ud->points.string, NULL, 10); cheevo->dirty = 0; cheevo->active = 1; /* flags == 3; */ cheevo->modified = 0; if (!cheevo->title || !cheevo->description || !cheevo->author || !cheevo->badge) { free((void*)cheevo->title); free((void*)cheevo->description); free((void*)cheevo->author); free((void*)cheevo->badge); return -1; } cheevo->count = cheevos_count_cond_sets(ud->memaddr.string); if (cheevo->count) { cheevo->condsets = (cheevos_condset_t*)malloc(cheevo->count * sizeof(cheevos_condset_t)); if (!cheevo->condsets) return -1; memset((void*)cheevo->condsets, 0, cheevo->count * sizeof(cheevos_condset_t)); end = cheevo->condsets + cheevo->count; set = 0; for (condset = cheevo->condsets; condset < end; condset++) { condset->count = cheevos_count_conds_in_set(ud->memaddr.string, set++); if (condset->count) { condset->conds = (cheevos_cond_t*)malloc(condset->count * sizeof(cheevos_cond_t)); if (!condset->conds) return -1; memset((void*)condset->conds, 0, condset->count * sizeof(cheevos_cond_t)); condset->expression = cheevos_dupstr(&ud->memaddr); cheevos_parse_memaddr(condset->conds, ud->memaddr.string); } else condset->conds = NULL; } } return 0; }