diff options
author | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-07-21 21:44:47 +0200 |
---|---|---|
committer | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-07-21 21:44:47 +0200 |
commit | 56b49ddc50df51f8aee02a41e54fb3d297080828 (patch) | |
tree | cbe10d8269449eba910b06a97d45a1daedf4b860 /src/parser.c | |
parent | bf2391843b679d8919e0a9d054d71e320b9f5afc (diff) | |
download | mplemmings-56b49ddc50df51f8aee02a41e54fb3d297080828.tar.gz mplemmings-56b49ddc50df51f8aee02a41e54fb3d297080828.tar.bz2 mplemmings-56b49ddc50df51f8aee02a41e54fb3d297080828.zip |
Correction du parser pour certains trucs.
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 35 |
1 files changed, 23 insertions, 12 deletions
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; |