summaryrefslogtreecommitdiff
path: root/src/parser/parse_ini.yy
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/parse_ini.yy')
-rw-r--r--src/parser/parse_ini.yy325
1 files changed, 0 insertions, 325 deletions
diff --git a/src/parser/parse_ini.yy b/src/parser/parse_ini.yy
deleted file mode 100644
index 36e4f39..0000000
--- a/src/parser/parse_ini.yy
+++ /dev/null
@@ -1,325 +0,0 @@
-%{
-#include "parser.h"
-#include <SDL_stdinc.h>
-
-extern FILE *yyin;
-extern int yylineno;
-extern char *yytext;
-extern int yyparse(gameIni_t *gIni);
-
-int yylex();
-void yyerror(gameIni_t *gIni, char *s);
-
-void yyassert(int condition, char what[], char why[]);
-void callocIfNull(void **ptr, size_t nmemb, size_t size);
-uint32_t convrgb(uint32_t in);
-
-%}
-
-%parse-param { gameIni_t *gIni }
-
-%union {char* str; int num; uint32_t uint32; uint32_t *p_uint32;}
-
-%token LEXERROR EOL
-
-%token STYLE NAME SLEM
-%token TILES FRAMES ANIM TYPE SOUND
-%token BGCOLOR DEBRISCOLOR PARTICLECOLOR
-%token XPOS OBJECT TERRAIN STEEL RELEASERATE NUMLEMMINGS NUMTORESCUE TIMELIMIT
-%token NUMCLIMBERS NUMFLOATERS NUMBOMBERS NUMBLOCKERS NUMBUILDERS NUMBASHERS NUMMINERS NUMDIGGERS
-%token MAXFALLDISTANCE CODESEED MUSIC LEVEL
-%token LEMM POS MASK IMASK
-%token DIFFICULTY
-
-%token AFF
-%token VIR
-
-%token <str> STR
-%token <num> INT
-%token <uint32> INTHEX
-
-%type <p_uint32> particles
-
-%start ini
-%%
-
-ini: /*epsilon*/
-| decl ini
-| EOL ini
-
- /* styles/...ini */
-decl: BGCOLOR AFF INTHEX { gIni->style.bgColor = convrgb($3); }
-| DEBRISCOLOR AFF INTHEX { gIni->style.debrisColor = convrgb($3); }
-| PARTICLECOLOR AFF particles {
- gIni->style.particleColorCount=16;
- gIni->style.particleColor = $3;
- }
-| TILES AFF INT {
- yyassert($3>0 && $3<100,"tiles", OUT_OF_BOUNDS);
- gIni->style.tiles = $3;
- //TODO check coherence par rapport aux fichiers trouvés
- }
-| FRAMES INT AFF INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "frame_ index", OUT_OF_BOUNDS);
- yyassert($4>0 && $4<MAX_OBJECT_FRAMES, "frame_ value", OUT_OF_BOUNDS);
- gIni->style.objectCount++;
- } else {
- yyassert($2<gIni->style.objectCount, "frame_ index", OUT_OF_BOUNDS);
- gIni->style.objects[$2].frames = $4;
- }
- }
-| ANIM INT AFF INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "anim_ index", OUT_OF_BOUNDS);
- yyassert($4>=0 && $4<=3, "anim_ value", BAD_VALUE);
- } else {
- yyassert($2<gIni->style.objectCount, "anim_ index", OUT_OF_BOUNDS);
- gIni->style.objects[$2].anim = $4;
- }
- }
-| TYPE INT AFF INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "type_ index", OUT_OF_BOUNDS);
- yyassert($4==0 || $4==32 || ($4>=3 && $4<=8), "type_ value", BAD_VALUE);
- } else {
- yyassert($2<gIni->style.objectCount, "type_ index", OUT_OF_BOUNDS);
- gIni->style.objects[$2].type = $4;
- }
- }
-| SOUND INT AFF INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "sound_ index", OUT_OF_BOUNDS);
- yyassert($4>=-1 && $4<=MAX_SOUNDS_COUNT, "sound_ value", OUT_OF_BOUNDS);
- } else {
- yyassert($2<gIni->style.objectCount, "sound_ index", OUT_OF_BOUNDS);
- gIni->style.objects[$2].sound = $4;
- }
- }
-
- /*lvl_xxxx.ini*/
-| RELEASERATE AFF INT {
- yyassert($3>=0 && $3<=99, "releaseRate", OUT_OF_BOUNDS);
- gIni->level.initSkills.releaseRate = $3;
- }
-| NUMLEMMINGS AFF INT {
- yyassert($3>=0 && $3<=MAX_NUMLEMMINGS, "numLemmings", OUT_OF_BOUNDS);
- gIni->level.initSkills.numLemmings = $3; }
-| NUMTORESCUE AFF INT {
- yyassert($3>=0 && $3<=99, "numToRescue", OUT_OF_BOUNDS);
- gIni->level.initSkills.numToRescue = $3;
- }
-| TIMELIMIT AFF INT {
- yyassert($3>=0 && $3<=99, "timeLimit", OUT_OF_BOUNDS);
- gIni->level.initSkills.timeLimit = $3;
- }
-| NUMCLIMBERS AFF INT {
- yyassert($3>=0 && $3<=99, "numClimbers", OUT_OF_BOUNDS);
- gIni->level.initSkills.numClimbers = $3;
- }
-| NUMFLOATERS AFF INT {
- yyassert($3>=0 && $3<=99, "numFloaters", OUT_OF_BOUNDS);
- gIni->level.initSkills.numFloaters = $3;
- }
-| NUMBOMBERS AFF INT {
- yyassert($3>=0 && $3<=99, "numBombers", OUT_OF_BOUNDS);
- gIni->level.initSkills.numBombers = $3;
- }
-| NUMBLOCKERS AFF INT {
- yyassert($3>=0 && $3<=99, "numBlockers", OUT_OF_BOUNDS);
- gIni->level.initSkills.numBlockers = $3;
- }
-| NUMBUILDERS AFF INT {
- yyassert($3>=0 && $3<=99, "numBuilders", OUT_OF_BOUNDS);
- gIni->level.initSkills.numBuilders = $3;
- }
-| NUMBASHERS AFF INT {
- yyassert($3>=0 && $3<=99, "numBashers", OUT_OF_BOUNDS);
- gIni->level.initSkills.numBashers = $3;
- }
-| NUMMINERS AFF INT {
- yyassert($3>=0 && $3<=99, "numMiners", OUT_OF_BOUNDS);
- gIni->level.initSkills.numMiners = $3;
- }
-| NUMDIGGERS AFF INT {
- yyassert($3>=0 && $3<=99, "numDiggers", OUT_OF_BOUNDS);
- gIni->level.initSkills.numDiggers = $3;
- }
-| XPOS AFF INT {
- yyassert($3>=0 && $3<=LEVEL_WIDTH, "xPos", OUT_OF_BOUNDS);
- gIni->level.xPos = $3;
- }
-| STYLE AFF STR { gIni->level.style = $3; }
-| SLEM AFF STR { gIni->level.superLemming = strcasecmp("true", $3)==0; }
-| OBJECT INT AFF INT VIR INT VIR INT VIR INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_OBJECTS_COUNT, "object_ index", OUT_OF_BOUNDS);
- yyassert($4>=0 , "object_ id value", OUT_OF_BOUNDS);
- //yyassert($6%2==0 , "object_ xpos is odd", BAD_VALUE);
- //yyassert($8%2==0 , "object_ ypos is odd", BAD_VALUE);
- yyassert($10==0 || $10==4 || $10==8, "object_ paintMode value", BAD_VALUE);
- yyassert($12==0 || $12==1, "object_ ud value", BAD_VALUE);
-
- gIni->level.objectCount++;
- } else {
- yyassert($2<gIni->level.objectCount, "object_ index", OUT_OF_BOUNDS);
- gIni->level.objects[$2].id = $4;
- gIni->level.objects[$2].xpos = $6;
- gIni->level.objects[$2].ypos = $8;
- gIni->level.objects[$2].paintMode = $10;
- gIni->level.objects[$2].ud = $12;
- }
- }
-| TERRAIN INT AFF INT VIR INT VIR INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_TERRAINS_COUNT, "terrain_ index", OUT_OF_BOUNDS);
- yyassert($4>=0 , "terrain_ id value", OUT_OF_BOUNDS);
- //yyassert($6%2==0 , "terrain_ xpos is odd", BAD_VALUE);
- //yyassert($8%2==0 , "terrain_ ypos is odd", BAD_VALUE);
- yyassert($10>=0 && $10<16, "terrain_ modifier value", BAD_VALUE);
-
- gIni->level.terrainCount++;
- } else {
- yyassert($2<gIni->level.terrainCount, "terrain_ index", OUT_OF_BOUNDS);
- gIni->level.terrains[$2].id = $4;
- gIni->level.terrains[$2].xpos = $6;
- gIni->level.terrains[$2].ypos = $8;
- gIni->level.terrains[$2].modifier = $10;
- }
- }
-| STEEL INT AFF INT VIR INT VIR INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_STEELS_COUNT, "steel_ index", OUT_OF_BOUNDS);
- //yyassert($4%2==0 , "steel_ xpos is odd", BAD_VALUE);
- //yyassert($6%2==0 , "steel_ ypos is odd", BAD_VALUE);
- yyassert($4>=0 && $4<LEVEL_WIDTH , "steel_ xpos value", OUT_OF_BOUNDS);
- yyassert($6>=0 && $6<LEVEL_HEIGHT , "steel_ ypos value", OUT_OF_BOUNDS);
- yyassert($8>=0 && $8<=STEEL_MAX_WIDTH, "steel_ width value", BAD_VALUE);
- yyassert($10>=0 && $10<=STEEL_MAX_HEIGHT, "steel_ height value", BAD_VALUE);
-
- gIni->level.steelCount++;
- } else {
- yyassert($2<gIni->level.steelCount, "steel_ index", OUT_OF_BOUNDS);
- gIni->level.steels[$2].xpos = $4;
- gIni->level.steels[$2].ypos = $6;
- gIni->level.steels[$2].width = $8;
- gIni->level.steels[$2].height = $10;
- }
- }
-| LEMM INT AFF INT VIR INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "lemm_ index", OUT_OF_BOUNDS);
- yyassert($4>=0 , "lemm_ frame value", OUT_OF_BOUNDS);
- yyassert($6==1 || $6==2, "lemm_ dirs", BAD_VALUE);
- yyassert($8==0 || $8==1, "lemm_ animType value", BAD_VALUE);
-
- gIni->misc.lemmingAnimCount++;
- } else {
- yyassert($2<gIni->misc.lemmingAnimCount, "lemm_ index", OUT_OF_BOUNDS);
- gIni->misc.lemmingAnims[$2].lemmFrames = $4;
- gIni->misc.lemmingAnims[$2].lemmDirs = $6;
- gIni->misc.lemmingAnims[$2].lemmAnimType = $8;
- }
- }
-| POS INT AFF INT VIR INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "pos_ index", OUT_OF_BOUNDS);
- yyassert($4>=0, "pos_ x value", OUT_OF_BOUNDS);
- yyassert($6>=0, "pos_ y dirs", BAD_VALUE);
- yyassert($8==8, "pos_ flags value", BAD_VALUE);
- } else {
- yyassert($2<gIni->misc.lemmingAnimCount, "pos_ index", OUT_OF_BOUNDS);
- gIni->misc.lemmingAnims[$2].xPos = $4;
- gIni->misc.lemmingAnims[$2].yPos = $6;
- gIni->misc.lemmingAnims[$2].posFlags = $8;
- }
- }
-| MASK INT AFF INT VIR INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "mask_ index", OUT_OF_BOUNDS);
- yyassert($4>=0 , "mask_ frame value", OUT_OF_BOUNDS);
- yyassert($6==1 || $6==2, "mask_ dirs value", BAD_VALUE);
- yyassert($8>=0, "mask_ startFrame value", BAD_VALUE);
- } else {
- yyassert($2<gIni->misc.lemmingAnimCount, "mask_ index", OUT_OF_BOUNDS);
- gIni->misc.lemmingAnims[$2].maskFrames = $4;
- gIni->misc.lemmingAnims[$2].maskDirs = $6;
- gIni->misc.lemmingAnims[$2].maskStartFrame = $8;
- }
- }
-| IMASK INT AFF INT VIR INT {
- if ( gIni->firstPass==1 ) {
- yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "imask_ index", OUT_OF_BOUNDS);
- yyassert($4>=0 , "imask_ frame value", OUT_OF_BOUNDS);
- yyassert($6==1 || $6==2, "imask_ dirs value", BAD_VALUE);
- } else {
- yyassert($2<gIni->misc.lemmingAnimCount, "imask_ index", OUT_OF_BOUNDS);
- gIni->misc.lemmingAnims[$2].imaskFrames = $4;
- gIni->misc.lemmingAnims[$2].imaskDirs = $6;
- }
- }
-| NAME AFF STR { gIni->level.name = $3; } /* TODO : attention, si fichier levelpack, name n'est pas le nom d'unniveau */
- /* levelpack.ini */
-| MAXFALLDISTANCE AFF INT {
- yyassert($3>=0, "maxFallDistance", OUT_OF_BOUNDS);
- gIni->levelPack.maxFallDistance = $3;
- }
-| CODESEED AFF STR { gIni->levelPack.codeSeed = $3; }
-| MUSIC INT AFF STR { }
-| LEVEL INT AFF STR {}
-| DIFFICULTY INT AFF STR VIR INT {}
-
-particles: INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX VIR INTHEX {
- $$=malloc(16*sizeof(uint32_t));
-// TODO : use of convrgb
- $$[0]=$1; $$[1]=$3; $$[2]=$5; $$[3]=$7; $$[4]=$9; $$[5]=$11; $$[6]=$13; $$[7]=$15 ;$$[8]=$17; $$[9]=$19; $$[10]=$21; $$[11]=$23; $$[12]=$25; $$[13]=$27; $$[14]=$29; $$[15]=$31;
- }
-%%
-int parse(gameIni_t *gIni) {
- int res=0;
- //FIXME : récupérer les valeurs de retour
- gIni->firstPass=1;
- yyparse(gIni);
-
- callocIfNull((void **)&gIni->style.objects, gIni->style.objectCount, sizeof(struct styleObjects));
- callocIfNull((void **)&gIni->level.objects, gIni->level.objectCount, sizeof(struct levelItem));
- callocIfNull((void **)&gIni->level.terrains, gIni->level.terrainCount, sizeof(struct levelItem));
- callocIfNull((void **)&gIni->level.steels, gIni->level.steelCount, sizeof(struct levelItem));
-
- callocIfNull((void **)&gIni->misc.lemmingAnims, gIni->misc.lemmingAnimCount, sizeof(struct lemmingAnim));
-
- rewind(yyin);
- yylineno=0;
- gIni->firstPass=0;
- yyparse(gIni);
-
- return res;
-}
-
-void yyassert(int condition, char what[], char why[]){
- char msg[256];
- if (!condition) {
- sprintf(msg, "%s for %s", why, what);
- yyerror(NULL, msg);
- }
-}
-
-void yyerror(gameIni_t *gIni, char *s) {
- fprintf(stderr, "(stdin):%i: error: %s near '%s'\n", yylineno, s, yytext);
- gIni=NULL; /* Faire quelque chose de propre ici */
- exit(1);
-}
-
-void callocIfNull(void **ptr, size_t nmemb, size_t size) {
- if (*ptr==NULL && nmemb>0) {
- *ptr=calloc(nmemb, size);
- }
-}
-
-uint32_t convrgb(uint32_t in) {
- uint32_t res=0;
- res |= (in & 0x000000ff) << 16;
- res |= (in & 0x0000ff00);
- res |= (in & 0x00ff0000) >> 16;
- return res;
-}