summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-14 15:23:03 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-14 15:23:03 +0200
commit8ddc38f8a5706daf777b7394b5b5b842ba8c8a13 (patch)
tree22c53a9538ca541f3a5b3fcfb122bca9b75cdbfe /src
parent22ef62efac76adb97bd14be2d897823a108a154d (diff)
downloadmplemmings-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.h5
-rw-r--r--src/include/parser.h8
-rw-r--r--src/parser.c100
-rw-r--r--src/test/testparseall.c275
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;
+}
+