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;
        }
}
Esempio n. 2
0
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;
}