From 56b49ddc50df51f8aee02a41e54fb3d297080828 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 21 Jul 2013 21:44:47 +0200 Subject: Correction du parser pour certains trucs. --- data/level/3_test/lvl2003.ini | 3 ++- data/level/3_test/lvl2008.ini | 3 ++- src/include/parser.h | 10 ---------- src/parser.c | 35 +++++++++++++++++++++++------------ 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/data/level/3_test/lvl2003.ini b/data/level/3_test/lvl2003.ini index dfe7a9e..1af5792 100644 --- a/data/level/3_test/lvl2003.ini +++ b/data/level/3_test/lvl2003.ini @@ -366,7 +366,8 @@ terrain_255 = 27, 3176, 205, 8 terrain_256 = 27, 3216, 205, 8 terrain_257 = 27, 3256, 205, 8 terrain_258 = 27, 3296, 205, 8 -terrain_259 = 27, 3336, 205, 8 +# Doublon (fleme de renumeroter) +terrain_259 = 27, 3296, 205, 8 terrain_260 = 32, 3224, 165, 8 terrain_260 = 27, 0, 305, 8 terrain_261 = 27, 40, 305, 8 diff --git a/data/level/3_test/lvl2008.ini b/data/level/3_test/lvl2008.ini index 26b1248..93e8421 100644 --- a/data/level/3_test/lvl2008.ini +++ b/data/level/3_test/lvl2008.ini @@ -366,7 +366,8 @@ terrain_255 = 13, 3176, 205, 8 terrain_256 = 13, 3216, 205, 8 terrain_257 = 13, 3256, 205, 8 terrain_258 = 13, 3296, 205, 8 -terrain_259 = 13, 3336, 205, 8 +# Doublon (fleme de renumeroter) +terrain_259 = 27, 3296, 205, 8 terrain_260 = 46, 3224, 173, 8 terrain_260 = 13, 0, 305, 8 terrain_261 = 13, 40, 305, 8 diff --git a/src/include/parser.h b/src/include/parser.h index 4b70352..be04669 100644 --- a/src/include/parser.h +++ b/src/include/parser.h @@ -3,16 +3,6 @@ #include "data_ini.h" -//#define OUT_OF_BOUNDS "out of bounds" -//#define CANNOT_BE_NEGATIVE "cannot be negative" -//#define BAD_VALUE "bad value" - -//#define MAX_LEMMTYPES_COUNT 16 -//#define MAX_OBJECT_FRAMES 64 -//#define MAX_NUMLEMMINGS 100 -//#define STEEL_MAX_WIDTH 256 -//#define STEEL_MAX_HEIGHT 256 - #define ERR_UNKNOWN_KEY 1 #define ERR_NOT_YET_IMPLEMENTED 2 #define ERR_KEY_OUT_OF_RANGE 3 diff --git a/src/parser.c b/src/parser.c index 89f3c55..46309f8 100644 --- a/src/parser.c +++ b/src/parser.c @@ -73,6 +73,16 @@ typedef struct { char error_line_content[MAX_LINELEN]; } parserState_t; +const char error_strings[][32] = { +"ERR_NO_ERROR", +"ERR_UNKNOWN_KEY", +"ERR_NOT_YET_IMPLEMENTED", +"ERR_KEY_OUT_OF_RANGE", +"ERR_VAL_OUT_OF_RANGE", +"ERR_STRING_TOO_LONG", +"ERR_BAD_FIELDS" +}; + int loadIni(enum ini_type type, const char *filepath, gameIni_t *ini) { int res; parserState_t state; @@ -97,15 +107,13 @@ int loadIni(enum ini_type type, const char *filepath, gameIni_t *ini) { default: return -1; //Should be unreachable } - if (res!=1) { + if (res!=1 && state.error_code == 0) { //FIXME : logging - if (state.error_code == 0) { - res=-1; - printf("Unknown error on '%s' : can't read file ?\n", filepath); - } else { - res=state.error_code; - printf("Parse error %i in '%s'. key/value : %s\n", state.error_code, filepath, state.error_line_content); - } + res=-1; + printf("Unknown error on '%s' : can't read file ?\n", filepath); + } else if (state.error_code != 0 ) { + res=state.error_code; + printf("Parse error %s in '%s'. key/value : %s\n", error_strings[state.error_code], filepath, state.error_line_content); } else { res=0; } @@ -148,7 +156,7 @@ int callback_ini_style(const mTCHAR *section, const mTCHAR *key, const mTCHAR *v MATCH_HEXCOLOR(bgColor); MATCH_HEXCOLOR(debrisColor); MATCH_INT(tiles,MAX_TILES_COUNT); - MATCH_INT_ARRAY(frames,MAX_OBJECTS_COUNT,data->objectCount,data->frames,0,32); + MATCH_INT_ARRAY(frames,MAX_OBJECTS_COUNT,data->objectCount,data->frames,0,64); MATCH_INT_ARRAY(anim ,MAX_OBJECTS_COUNT,data->objectCount,data->anim ,0,3); MATCH_INT_ARRAY(type ,MAX_OBJECTS_COUNT,data->objectCount,data->type ,0,32); MATCH_INT_ARRAY(sound ,MAX_OBJECTS_COUNT,data->objectCount,data->sound ,-1,32); @@ -159,6 +167,7 @@ int callback_ini_style(const mTCHAR *section, const mTCHAR *key, const mTCHAR *v int callback_ini_levelpack(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) { struct levelPackIni *data = &(((parserState_t*) userData)->ini->levelPack); + SDL_snprintf(((parserState_t*) userData)->error_line_content, MAX_LINELEN, "%s => %s", key, value); int *err= &(((parserState_t*) userData)->error_code); int i; @@ -178,7 +187,8 @@ int callback_ini_levelpack(const mTCHAR *section, const mTCHAR *key, const mTCHA if ( (len > 0) && (SDL_strncasecmp(key,diffname,len) == 0) && (key[len] == '_') ) { //FIXME : checher position de .ini : copier la chaine avant + 4 //FIXME : chercher , et sscandf de la suite - *err=ERR_NOT_YET_IMPLEMENTED; return 0; + //FIXME : passe sous silence : *err=ERR_NOT_YET_IMPLEMENTED; return 0; + return 1; } } @@ -189,6 +199,7 @@ int callback_ini_levelpack(const mTCHAR *section, const mTCHAR *key, const mTCHA int callback_ini_level(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) { struct levelIni *data = &(((parserState_t*) userData)->ini->level); int *err= &(((parserState_t*) userData)->error_code); + SDL_snprintf(((parserState_t*) userData)->error_line_content, MAX_LINELEN, "%s => %s", key, value); MATCH_INT(releaseRate,100); MATCH_INT(numLemmings,100); @@ -230,14 +241,14 @@ int callback_ini_level(const mTCHAR *section, const mTCHAR *key, const mTCHAR *v if ( (wordBoundary=SDL_strchr(value,','))==NULL ) { *err=ERR_BAD_FIELDS; return 0; } *wordBoundary='\0'; v = atoi(value); - if ( v<0 || v>LEVEL_WIDTH) { *err=ERR_VAL_OUT_OF_RANGE; return 0; } + if ( v < -LEVEL_WIDTH || v > LEVEL_WIDTH ) { *err=ERR_VAL_OUT_OF_RANGE; return 0; } data->terrains[k].xpos = v; value = wordBoundary+1; if ( (wordBoundary=SDL_strchr(value,','))==NULL ) { *err=ERR_BAD_FIELDS; return 0; } *wordBoundary='\0'; v = atoi(value); - if ( v<0 || v>LEVEL_HEIGHT) { *err=ERR_VAL_OUT_OF_RANGE; return 0; } + if ( v < -LEVEL_HEIGHT || v > LEVEL_HEIGHT ) { *err=ERR_VAL_OUT_OF_RANGE; return 0; } data->terrains[k].ypos = v; value = wordBoundary+1; -- cgit v1.2.3