diff options
author | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-07-14 16:01:44 +0200 |
---|---|---|
committer | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-07-14 16:01:44 +0200 |
commit | 893b33145439f68990b29a3aad3f628aede78711 (patch) | |
tree | 2544097d5caec069bd241d91de6de44da5f25ec6 /src/parser.c | |
parent | 8ddc38f8a5706daf777b7394b5b5b842ba8c8a13 (diff) | |
download | mplemmings-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.c | 53 |
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; } + + |