summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-14 16:01:44 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-14 16:01:44 +0200
commit893b33145439f68990b29a3aad3f628aede78711 (patch)
tree2544097d5caec069bd241d91de6de44da5f25ec6 /src/parser.c
parent8ddc38f8a5706daf777b7394b5b5b842ba8c8a13 (diff)
downloadmplemmings-893b33145439f68990b29a3aad3f628aede78711.tar.gz
mplemmings-893b33145439f68990b29a3aad3f628aede78711.tar.bz2
mplemmings-893b33145439f68990b29a3aad3f628aede78711.zip
Parser pas plus intellignet que le coup précédent, mais separation des callbacks par type de fichier ini. Adaptation des tests en fonction.
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/src/parser.c b/src/parser.c
index cca1318..18924b6 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -14,16 +14,17 @@ int ini_browse(INI_CALLBACK Callback, const void *UserData, const mTCHAR *Filen
*/
typedef struct {
- int need_2pass;
int error_code;
gameIni_t *ini;
} parserState_t;
-int callback_pass1(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData);
-int callback_pass2(const mTCHAR *Section, const mTCHAR *key, const mTCHAR *value, const void *userData);
+int callback_ini_style (const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData);
+int callback_ini_levelpack (const mTCHAR *Section, const mTCHAR *key, const mTCHAR *value, const void *userData);
+int callback_ini_level_pass1(const mTCHAR *Section, const mTCHAR *key, const mTCHAR *value, const void *userData);
+int callback_ini_level_pass2(const mTCHAR *Section, const mTCHAR *key, const mTCHAR *value, const void *userData);
-int loadIni(gameIni_t *ini, const char *filepath) {
+int loadIni(enum ini_type type, const char *filepath, gameIni_t *ini) {
int res;
parserState_t state;
const void *UserData=(void *)&state;
@@ -32,12 +33,20 @@ int loadIni(gameIni_t *ini, const char *filepath) {
(void) SDL_memset(&state,0,sizeof(parserState_t));
state.ini=ini;
- res=ini_browse(callback_pass1, UserData, filepath);
- if (res!=0) return state.error_code;
- if (state.need_2pass==0) return 0;
-
- res=ini_browse(callback_pass2, UserData, filepath);
- return state.error_code;
+ switch (type) {
+ case ini_style:
+ res=ini_browse(callback_ini_style, UserData, filepath);
+ return (res!=0)?state.error_code:0;
+ case ini_levelpack:
+ res=ini_browse(callback_ini_levelpack, UserData, filepath);
+ return (res!=0)?state.error_code:0;
+ case ini_level:
+ res=ini_browse(callback_ini_level_pass1, UserData, filepath);
+ if (res!=0) return state.error_code;
+ res=ini_browse(callback_ini_level_pass2, UserData, filepath);
+ return state.error_code;
+ }
+ return -1; // Unreachable
}
uint32_t hextext2rgb(const char str[]) {
@@ -48,10 +57,7 @@ uint32_t hextext2rgb(const char str[]) {
return (res!=1)?0xffffffff:(uint32_t)val;
}
-/*#define IS(str) if (SDL_strcasecmp(Key,str)==0)
-#define PREFIX(str) if (SDL_strncasecmp(Key,str)==0)
-*/
-int callback_pass1(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) {
+int callback_ini_style(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) {
gameIni_t *ini = ((parserState_t*) userData)->ini;
int *err= &(((parserState_t*) userData)->error_code);
@@ -143,11 +149,28 @@ int callback_pass1(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value
*err=1; return -1;
}
-int callback_pass2(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) {
+int callback_ini_levelpack(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) {
+ //gameIni_t *ini = ((parserState_t*) userData)->ini;
+ int *err= &(((parserState_t*) userData)->error_code);
+
+ // No match is an error (unkown key)
+ *err=1; return -1;
+}
+
+int callback_ini_level_pass1(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) {
//gameIni_t *ini = ((parserState_t*) userData)->ini;
int *err= &(((parserState_t*) userData)->error_code);
// No match is an error (unkown key)
*err=1; return -1;
+}
+
+int callback_ini_level_pass2(const mTCHAR *section, const mTCHAR *key, const mTCHAR *value, const void *userData) {
+ //gameIni_t *ini = ((parserState_t*) userData)->ini;
+ int *err= &(((parserState_t*) userData)->error_code);
+ // No match is an error (unkown key)
+ *err=1; return -1;
}
+
+