summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-21 21:44:47 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-21 21:44:47 +0200
commit56b49ddc50df51f8aee02a41e54fb3d297080828 (patch)
treecbe10d8269449eba910b06a97d45a1daedf4b860
parentbf2391843b679d8919e0a9d054d71e320b9f5afc (diff)
downloadmplemmings-56b49ddc50df51f8aee02a41e54fb3d297080828.tar.gz
mplemmings-56b49ddc50df51f8aee02a41e54fb3d297080828.tar.bz2
mplemmings-56b49ddc50df51f8aee02a41e54fb3d297080828.zip
Correction du parser pour certains trucs.
-rw-r--r--data/level/3_test/lvl2003.ini3
-rw-r--r--data/level/3_test/lvl2008.ini3
-rw-r--r--src/include/parser.h10
-rw-r--r--src/parser.c35
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;