diff options
author | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-07-14 15:23:03 +0200 |
---|---|---|
committer | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-07-14 15:23:03 +0200 |
commit | 8ddc38f8a5706daf777b7394b5b5b842ba8c8a13 (patch) | |
tree | 22c53a9538ca541f3a5b3fcfb122bca9b75cdbfe /src | |
parent | 22ef62efac76adb97bd14be2d897823a108a154d (diff) | |
download | mplemmings-8ddc38f8a5706daf777b7394b5b5b842ba8c8a13.tar.gz mplemmings-8ddc38f8a5706daf777b7394b5b5b842ba8c8a13.tar.bz2 mplemmings-8ddc38f8a5706daf777b7394b5b5b842ba8c8a13.zip |
Debut de parser qui marche pour les style/*/*.ini
Diffstat (limited to 'src')
-rw-r--r-- | src/include/data_ini.h | 5 | ||||
-rw-r--r-- | src/include/parser.h | 8 | ||||
-rw-r--r-- | src/parser.c | 100 | ||||
-rw-r--r-- | src/test/testparseall.c | 275 |
4 files changed, 332 insertions, 56 deletions
diff --git a/src/include/data_ini.h b/src/include/data_ini.h index 1adfcbe..590f68e 100644 --- a/src/include/data_ini.h +++ b/src/include/data_ini.h @@ -7,6 +7,7 @@ #define LEVEL_WIDTH 1664*2 #define LEVEL_HEIGHT 160*2 +#define MAX_PARTICLE_COLORS 16 //////////////////////// LEVEL INI FILES //////////////////////// struct skills { @@ -48,8 +49,8 @@ struct styleObjects { struct styleIni { char *name; uint32_t bgColor, debrisColor; - int tiles, particleColorCount, objectCount; - uint32_t *particleColor; + int /*tiles,*/ particleColorCount, objectCount; + uint32_t particleColor[MAX_PARTICLE_COLORS]; struct styleObjects *objects; }; diff --git a/src/include/parser.h b/src/include/parser.h index 0a1d2d4..3c8b190 100644 --- a/src/include/parser.h +++ b/src/include/parser.h @@ -3,11 +3,11 @@ #include "data_ini.h" -#define OUT_OF_BOUNDS "out of bounds" -#define CANNOT_BE_NEGATIVE "cannot be negative" -#define BAD_VALUE "bad value" +//#define OUT_OF_BOUNDS "out of bounds" +//#define CANNOT_BE_NEGATIVE "cannot be negative" +//#define BAD_VALUE "bad value" -#define MAX_OBJECT_TYPES 32 +//#define MAX_OBJECT_TYPES 32 #define MAX_OBJECT_FRAMES 64 #define MAX_OBJECTS_COUNT 256 #define MAX_TERRAINS_COUNT 1024 diff --git a/src/parser.c b/src/parser.c index 44ab4ed..cca1318 100644 --- a/src/parser.c +++ b/src/parser.c @@ -15,139 +15,139 @@ int ini_browse(INI_CALLBACK Callback, const void *UserData, const mTCHAR *Filen typedef struct { int need_2pass; - gameIni_t *gIni; + 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 main() { - gameIni_t gIni; - return loadIni(&gIni,"/home/lpouzenc/Bureau/USB/lem/2010-netlemmings/trunk/styles/brick/brick.ini"); -} - -int loadIni(gameIni_t *gIni, const char *filepath) { +int loadIni(gameIni_t *ini, const char *filepath) { int res; parserState_t state; const void *UserData=(void *)&state; - state.gIni=gIni; + (void) SDL_memset(ini,0,sizeof(gameIni_t)); (void) SDL_memset(&state,0,sizeof(parserState_t)); - (void) SDL_memset(gIni,0,sizeof(gameIni_t)); + state.ini=ini; res=ini_browse(callback_pass1, UserData, filepath); - if (res!=0) return res; - if (state.need_2pass) { - res=ini_browse(callback_pass2, 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; } uint32_t hextext2rgb(const char str[]) { - return 42; //FIXME + int res; + unsigned int val; + res=SDL_sscanf(str,"0x%x",&val); + // Default value to opaque white. Should be visible on screen if problem here + 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) { - gameIni_t *gIni = ((parserState_t*) userData)->gIni; + gameIni_t *ini = ((parserState_t*) userData)->ini; + int *err= &(((parserState_t*) userData)->error_code); - if (SDL_strcasecmp(key,"bgcolor")==0) - {gIni->style.bgColor = hextext2rgb(value); return 0;} + // styles/*.ini + if (SDL_strcasecmp(key,"bgColor")==0) + {ini->style.bgColor = hextext2rgb(value); return 1;} if (SDL_strcasecmp(key,"debrisColor")==0) - {gIni->style.debrisColor = hextext2rgb(value); return 0;} + {ini->style.debrisColor = hextext2rgb(value); return 1;} if (SDL_strcasecmp(key,"particleColor")==0) { char *wordBoundary; int i=0; - ((parserState_t*) userData)->need_2pass=1; + //((parserState_t*) userData)->need_2pass=1; - while ( strlen(value)>0 && (wordBoundary=strchr(value,',')) != NULL ) { + while ( strlen(value)>0 && (wordBoundary=strchr(value,',')) != NULL && (i<MAX_PARTICLE_COLORS) ) { *wordBoundary='\0'; - //gIni->style.particleColor[i++]=hextext2rgb(value); // 2nd pass + ini->style.particleColor[i++]=hextext2rgb(value); value = wordBoundary+1; } // Parse the last one - //gIni->style.particleColor[i++]=hextext2rgb(value); //2nd pass - - if (gIni->style.particleColor != NULL ) { - return 1; - } - - gIni->style.particleColor=SDL_calloc(i,sizeof(uint32_t)); - if ( ! gIni->style.particleColor ) { - return 2; - } - gIni->style.particleColorCount=i; + ini->style.particleColor[i++]=hextext2rgb(value); + ini->style.particleColorCount=i; return 0; } if (SDL_strcasecmp(key,"tiles")==0) { int v = atoi(value); - if ( v<0 || v>MAX_OBJECT_TYPES) return 3; - gIni->style.tiles = v; + if ( v<0 || v>MAX_OBJECTS_COUNT) { *err=3; return 0; } + ini->style.objectCount = v; return 0; } if (SDL_strncasecmp(key,"frames_", 7) == 0) { int i = atoi(value+7); - if ( i<0 || i>=gIni->style.tiles) return 4; + if ( i<0 || i>=ini->style.objectCount) { *err=4; return 0; } int v = atoi(value); - if ( v<0 || v>MAX_OBJECT_FRAMES) return 5; + if ( v<0 || v>MAX_OBJECT_FRAMES) { *err=5; return 0; } - gIni->style.objects[i].frames = v; + ini->style.objects[i].frames = v; return 0; } if (SDL_strncasecmp(key,"anim_", 5) == 0) { int i = atoi(value+5); - if ( i<0 || i>=gIni->style.tiles) return 6; + if ( i<0 || i>=ini->style.objectCount) { *err=6; return 0; } int v = atoi(value); - if ( v<0 || v>3) return 7; + if ( v<0 || v>3) { *err=7; return 0; } - gIni->style.objects[i].anim = v; + ini->style.objects[i].anim = v; return 0; } if (SDL_strncasecmp(key,"type_", 5) == 0) { int i = atoi(value+5); - if ( i<0 || i>=gIni->style.tiles) return 8; + if ( i<0 || i>=ini->style.objectCount) { *err=8; return 0; } int v = atoi(value); - if (! (v==0 || v==32 || (v>=3 && v<=8))) return 9; + if (! (v==0 || v==32 || (v>=3 && v<=8))) { *err=9; return 0; } - gIni->style.objects[i].type = v; + ini->style.objects[i].type = v; return 0; } if (SDL_strncasecmp(key,"sound_", 6) == 0) { int i = atoi(value+6); - if ( i<0 || i>=gIni->style.tiles) return 10; + if ( i<0 || i>=ini->style.objectCount) { *err=10; return 0; } int v = atoi(value); - if ( v<0 || v>MAX_SOUNDS_COUNT) return 11; + if ( v<0 || v>MAX_SOUNDS_COUNT) { *err=11; return 0; } - gIni->style.objects[i].frames = v; + ini->style.objects[i].frames = v; return 0; } if (SDL_strncasecmp(key,"frames_", 7) == 0) { int i = atoi(value+7); - if ( i<0 || i>=gIni->style.tiles) return 4; + if ( i<0 || i>=ini->style.objectCount) { *err=12; return 0; } int v = atoi(value); - if ( v<0 || v>MAX_OBJECT_FRAMES) return 5; + if ( v<0 || v>MAX_OBJECT_FRAMES) { *err=13; return 0; } - gIni->style.objects[i].frames = v; + ini->style.objects[i].frames = v; return 0; } - return -1; + // No match is an error (unkown key) + *err=1; return -1; } int callback_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; } diff --git a/src/test/testparseall.c b/src/test/testparseall.c new file mode 100644 index 0000000..4913c5e --- /dev/null +++ b/src/test/testparseall.c @@ -0,0 +1,275 @@ +#include "parser.h" +#include <stdio.h> // printf, perror +#include <unistd.h> // TODO : remove chdir() call + +#define MAX_PATH_LEN 64 + +int main() { + int i,res; + + char paths[][MAX_PATH_LEN] = { + "styles/brick/brick.ini", + "styles/bubble/bubble.ini", + "styles/crystal/crystal.ini", + "styles/dirt/dirt.ini", + "styles/fire/fire.ini", + "styles/marble/marble.ini", + "styles/pillar/pillar.ini", + "styles/rock/rock.ini", + "styles/snow/snow.ini", + "styles/special/special.ini", + "level/1_orig/levelpack.ini", + "level/1_orig/lvl0000.ini", + "level/1_orig/lvl0001.ini", + "level/1_orig/lvl0002.ini", + "level/1_orig/lvl0003.ini", + "level/1_orig/lvl0004.ini", + "level/1_orig/lvl0005.ini", + "level/1_orig/lvl0006.ini", + "level/1_orig/lvl0006b.ini", + "level/1_orig/lvl0007.ini", + "level/1_orig/lvl0007b.ini", + "level/1_orig/lvl0010.ini", + "level/1_orig/lvl0011.ini", + "level/1_orig/lvl0012.ini", + "level/1_orig/lvl0012b.ini", + "level/1_orig/lvl0013.ini", + "level/1_orig/lvl0014.ini", + "level/1_orig/lvl0015.ini", + "level/1_orig/lvl0016.ini", + "level/1_orig/lvl0017.ini", + "level/1_orig/lvl0017b.ini", + "level/1_orig/lvl0020.ini", + "level/1_orig/lvl0021.ini", + "level/1_orig/lvl0021b.ini", + "level/1_orig/lvl0022.ini", + "level/1_orig/lvl0022b.ini", + "level/1_orig/lvl0023.ini", + "level/1_orig/lvl0024.ini", + "level/1_orig/lvl0024b.ini", + "level/1_orig/lvl0025.ini", + "level/1_orig/lvl0026.ini", + "level/1_orig/lvl0027.ini", + "level/1_orig/lvl0027b.ini", + "level/1_orig/lvl0030.ini", + "level/1_orig/lvl0030b.ini", + "level/1_orig/lvl0031.ini", + "level/1_orig/lvl0031b.ini", + "level/1_orig/lvl0032.ini", + "level/1_orig/lvl0032b.ini", + "level/1_orig/lvl0033.ini", + "level/1_orig/lvl0033b.ini", + "level/1_orig/lvl0034.ini", + "level/1_orig/lvl0034b.ini", + "level/1_orig/lvl0035.ini", + "level/1_orig/lvl0036.ini", + "level/1_orig/lvl0037.ini", + "level/1_orig/lvl0040.ini", + "level/1_orig/lvl0041.ini", + "level/1_orig/lvl0041b.ini", + "level/1_orig/lvl0042.ini", + "level/1_orig/lvl0042b.ini", + "level/1_orig/lvl0043.ini", + "level/1_orig/lvl0043b.ini", + "level/1_orig/lvl0044.ini", + "level/1_orig/lvl0045.ini", + "level/1_orig/lvl0046.ini", + "level/1_orig/lvl0046b.ini", + "level/1_orig/lvl0047.ini", + "level/1_orig/lvl0047b.ini", + "level/1_orig/lvl0050.ini", + "level/1_orig/lvl0051.ini", + "level/1_orig/lvl0051b.ini", + "level/1_orig/lvl0052.ini", + "level/1_orig/lvl0053.ini", + "level/1_orig/lvl0054.ini", + "level/1_orig/lvl0055.ini", + "level/1_orig/lvl0056.ini", + "level/1_orig/lvl0057.ini", + "level/1_orig/lvl0057b.ini", + "level/1_orig/lvl0060.ini", + "level/1_orig/lvl0060b.ini", + "level/1_orig/lvl0061.ini", + "level/1_orig/lvl0061b.ini", + "level/1_orig/lvl0062.ini", + "level/1_orig/lvl0062b.ini", + "level/1_orig/lvl0063.ini", + "level/1_orig/lvl0063b.ini", + "level/1_orig/lvl0064.ini", + "level/1_orig/lvl0065.ini", + "level/1_orig/lvl0065b.ini", + "level/1_orig/lvl0066.ini", + "level/1_orig/lvl0067.ini", + "level/1_orig/lvl0067b.ini", + "level/1_orig/lvl0067c.ini", + "level/1_orig/lvl0070.ini", + "level/1_orig/lvl0071.ini", + "level/1_orig/lvl0071b.ini", + "level/1_orig/lvl0072.ini", + "level/1_orig/lvl0073.ini", + "level/1_orig/lvl0073b.ini", + "level/1_orig/lvl0074.ini", + "level/1_orig/lvl0075.ini", + "level/1_orig/lvl0076.ini", + "level/1_orig/lvl0077.ini", + "level/1_orig/lvl0077b.ini", + "level/1_orig/lvl0080.ini", + "level/1_orig/lvl0080b.ini", + "level/1_orig/lvl0081.ini", + "level/1_orig/lvl0082.ini", + "level/1_orig/lvl0082b.ini", + "level/1_orig/lvl0083.ini", + "level/1_orig/lvl0083b.ini", + "level/1_orig/lvl0084.ini", + "level/1_orig/lvl0084b.ini", + "level/1_orig/lvl0085.ini", + "level/1_orig/lvl0086.ini", + "level/1_orig/lvl0087.ini", + "level/1_orig/lvl0090.ini", + "level/1_orig/lvl0091.ini", + "level/1_orig/lvl0091b.ini", + "level/1_orig/lvl0092.ini", + "level/1_orig/lvl0092b.ini", + "level/1_orig/lvl0093.ini", + "level/1_orig/lvl0093b.ini", + "level/1_orig/lvl0094.ini", + "level/1_orig/lvl0094b.ini", + "level/1_orig/lvl0095.ini", + "level/1_orig/lvl0095b.ini", + "level/1_orig/lvl0096.ini", + "level/1_orig/lvl0097.ini", + "level/1_orig/lvl0097b.ini", + "level/2_ohno/levelpack.ini", + "level/2_ohno/lvl1000.ini", + "level/2_ohno/lvl1001.ini", + "level/2_ohno/lvl1002.ini", + "level/2_ohno/lvl1003.ini", + "level/2_ohno/lvl1004.ini", + "level/2_ohno/lvl1005.ini", + "level/2_ohno/lvl1006.ini", + "level/2_ohno/lvl1007.ini", + "level/2_ohno/lvl1010.ini", + "level/2_ohno/lvl1011.ini", + "level/2_ohno/lvl1012.ini", + "level/2_ohno/lvl1013.ini", + "level/2_ohno/lvl1014.ini", + "level/2_ohno/lvl1015.ini", + "level/2_ohno/lvl1016.ini", + "level/2_ohno/lvl1017.ini", + "level/2_ohno/lvl1020.ini", + "level/2_ohno/lvl1021.ini", + "level/2_ohno/lvl1022.ini", + "level/2_ohno/lvl1023.ini", + "level/2_ohno/lvl1024.ini", + "level/2_ohno/lvl1025.ini", + "level/2_ohno/lvl1026.ini", + "level/2_ohno/lvl1027.ini", + "level/2_ohno/lvl1030.ini", + "level/2_ohno/lvl1031.ini", + "level/2_ohno/lvl1032.ini", + "level/2_ohno/lvl1033.ini", + "level/2_ohno/lvl1034.ini", + "level/2_ohno/lvl1035.ini", + "level/2_ohno/lvl1036.ini", + "level/2_ohno/lvl1037.ini", + "level/2_ohno/lvl1040.ini", + "level/2_ohno/lvl1041.ini", + "level/2_ohno/lvl1042.ini", + "level/2_ohno/lvl1043.ini", + "level/2_ohno/lvl1044.ini", + "level/2_ohno/lvl1045.ini", + "level/2_ohno/lvl1046.ini", + "level/2_ohno/lvl1047.ini", + "level/2_ohno/lvl1050.ini", + "level/2_ohno/lvl1051.ini", + "level/2_ohno/lvl1052.ini", + "level/2_ohno/lvl1053.ini", + "level/2_ohno/lvl1054.ini", + "level/2_ohno/lvl1055.ini", + "level/2_ohno/lvl1056.ini", + "level/2_ohno/lvl1057.ini", + "level/2_ohno/lvl1060.ini", + "level/2_ohno/lvl1061.ini", + "level/2_ohno/lvl1062.ini", + "level/2_ohno/lvl1063.ini", + "level/2_ohno/lvl1064.ini", + "level/2_ohno/lvl1065.ini", + "level/2_ohno/lvl1066.ini", + "level/2_ohno/lvl1067.ini", + "level/2_ohno/lvl1070.ini", + "level/2_ohno/lvl1071.ini", + "level/2_ohno/lvl1072.ini", + "level/2_ohno/lvl1073.ini", + "level/2_ohno/lvl1074.ini", + "level/2_ohno/lvl1075.ini", + "level/2_ohno/lvl1076.ini", + "level/2_ohno/lvl1077.ini", + "level/2_ohno/lvl1080.ini", + "level/2_ohno/lvl1081.ini", + "level/2_ohno/lvl1082.ini", + "level/2_ohno/lvl1083.ini", + "level/2_ohno/lvl1084.ini", + "level/2_ohno/lvl1085.ini", + "level/2_ohno/lvl1086.ini", + "level/2_ohno/lvl1087.ini", + "level/2_ohno/lvl1090.ini", + "level/2_ohno/lvl1091.ini", + "level/2_ohno/lvl1092.ini", + "level/2_ohno/lvl1093.ini", + "level/2_ohno/lvl1094.ini", + "level/2_ohno/lvl1095.ini", + "level/2_ohno/lvl1096.ini", + "level/2_ohno/lvl1097.ini", + "level/2_ohno/lvl1100.ini", + "level/2_ohno/lvl1101.ini", + "level/2_ohno/lvl1102.ini", + "level/2_ohno/lvl1103.ini", + "level/2_ohno/lvl1104.ini", + "level/2_ohno/lvl1105.ini", + "level/2_ohno/lvl1106.ini", + "level/2_ohno/lvl1107.ini", + "level/2_ohno/lvl1110.ini", + "level/2_ohno/lvl1111.ini", + "level/2_ohno/lvl1112.ini", + "level/2_ohno/lvl1113.ini", + "level/2_ohno/lvl1114.ini", + "level/2_ohno/lvl1115.ini", + "level/2_ohno/lvl1116.ini", + "level/2_ohno/lvl1117.ini", + "level/2_ohno/tame_17.ini", + "level/2_ohno/tame_18.ini", + "level/2_ohno/tame_19.ini", + "level/2_ohno/tame_20.ini", + "level/3_test/levelpack.ini", + "level/3_test/lvl2000.ini", + "level/3_test/lvl2001.ini", + "level/3_test/lvl2002.ini", + "level/3_test/lvl2003.ini", + "level/3_test/lvl2004.ini", + "level/3_test/lvl2005.ini", + "level/3_test/lvl2006.ini", + "level/3_test/lvl2007.ini", + "level/3_test/lvl2008.ini", + "level/3_test/lvl2009.ini", + "misc/lemming.ini", + "" // Stop condition : empty string + }; + gameIni_t gIni; + + res=chdir("/home/lpouzenc/Bureau/USB/lem/2010-netlemmings/trunk"); + if (res!=0) { perror("Can't chdir()"); return -1; } + + res=0;i=0; + while (paths[i][0] != '\0') { + res=loadIni(&gIni,paths[i]); + if (res!=0) { + printf("Parse error %i on '%s'\n", res, paths[i]); + return res; + } + i++; + } + + printf("Successfully parsed %i ini files\n", i); + return 0; +} + |