summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c35
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;