void set_config(char *key, char *val) { ConfigEntry *e = findentry_config(key); if(!e) { printf("config_set(): unknown key '%s'", key); return; } switch(e->type) { case CFGT_INT: configdata.intval[e->key] = INTOF(val); break; case CFGT_KEYBINDING: configdata.intval[e->key] = INTOF(val+1); break; case CFGT_STRING: stralloc(&(configdata.strval[e->key]), val); break; } }
int replay_read(Replay *rpy, FILE *file) { int readstate = RPY_H_MAGIC; int bufidx = 0, eidx = 0; char buf[REPLAY_READ_MAXSTRLEN], c; ReplayStage *s; int stgnum = 0; memset(rpy, 0, sizeof(Replay)); while((c = fgetc(file)) != EOF) { if(c == ':') { buf[bufidx] = 0; bufidx = 0; switch(readstate) { case RPY_H_MAGIC: { int magic = INTOF(buf); if(magic != REPLAY_MAGICNUMBER) { printf("replay_read(): invalid magic number: %d\n", magic); replay_destroy(rpy); return False; } break; } case RPY_H_META1: stralloc(&rpy->playername, buf); printf("replay_read(): replay META1 is: %s\n", buf); break; case RPY_H_META2: // skip break; case RPY_H_STAGECOUNT: rpy->stgcount = INTOF(buf); if(rpy->stgcount <= 0) { printf("replay_read(): insane stage count: %i\n", rpy->stgcount); replay_destroy(rpy); return False; } rpy->stages = (ReplayStage*)malloc(sizeof(ReplayStage) * rpy->stgcount); s = &(rpy->stages[0]); memset(s, 0, sizeof(ReplayStage)); break; case RPY_G_STAGE: s->stage = INTOF(buf); break; case RPY_G_SEED: s->seed = INTOF(buf); break; case RPY_G_DIFF: s->diff = INTOF(buf); break; case RPY_G_PTS: s->points = INTOF(buf); break; case RPY_P_CHAR: s->plr_char = INTOF(buf); break; case RPY_P_SHOT: s->plr_shot = INTOF(buf); break; case RPY_P_POSREAL: s->plr_pos = FLOATOF(buf); break; case RPY_P_POSIMAG: s->plr_pos += FLOATOF(buf) * I;break; case RPY_P_FOCUS: s->plr_focus = INTOF(buf); break; case RPY_P_FIRE: s->plr_fire = INTOF(buf); break; case RPY_P_POWER: s->plr_power = FLOATOF(buf); break; case RPY_P_LIFES: s->plr_lifes = INTOF(buf); break; case RPY_P_BOMBS: s->plr_bombs = INTOF(buf); break; case RPY_P_MFLAGS: s->plr_mflags = INTOF(buf); break; case RPY_E_COUNT: s->capacity = s->ecount = INTOF(buf); if(s->capacity <= 0) { printf("replay_read(): insane capacity in stage %i: %i\n", stgnum, s->capacity); replay_destroy(rpy); return False; } s->events = (ReplayEvent*)malloc(sizeof(ReplayEvent) * s->capacity); break; case RPY_E_FRAME: s->events[eidx].frame = INTOF(buf); break; case RPY_E_TYPE: s->events[eidx].type = INTOF(buf); break; case RPY_E_KEY: s->events[eidx].key = INTOF(buf); eidx++; if(eidx == s->capacity) { if((++stgnum) >= rpy->stgcount) return True; s = &(rpy->stages[stgnum]); readstate = RPY_G_STAGE; eidx = 0; continue; } break; } if(readstate == RPY_E_KEY) readstate = RPY_E_FRAME; else ++readstate; } else { buf[bufidx++] = c; if(bufidx >= REPLAY_READ_MAXSTRLEN) { printf("replay_read(): item is too long\n"); replay_destroy(rpy); return False; } } } printf("replay_read(): replay isn't properly terminated\n"); replay_destroy(rpy); return False; }