%{ /* * static char *reader_l = * "$Id: reader.l 11578 2009-02-23 22:02:27Z lalo $"; */ /* CrossFire, A Multiplayer game for X-windows Copyright (C) 1994 Mark Wedel Copyright (C) 1992 Frank Tore Johansen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. The author can be reached via e-mail to mark@pyramid.com */ #include #include #include #include #define YY_DECL int rmap_lex_read(RMParms *RP) static char *rmap_yval(void); static int rmap_lex_error; #define IVAL atoi(rmap_yval()) #define FVAL atof(rmap_yval()) /** * Error handler. * * @param s * lex-generated error message. */ static int yyerror(const char *s) { LOG(llevError, "%s: %s\n", s, yytext); return -1; } %} S [ \t]+.+ WS [ \t]* %x MESSAGE /* Don't have to link with -lfl with this */ %option noyywrap /* need yy_push_state, yy_pop_state */ %option stack %% %{ /* Declare some local variables */ rmap_lex_error = 0; %} ^wallstyle{S} strncpy(RP->wallstyle, rmap_yval(), RM_SIZE); ^floorstyle{S} strncpy(RP->floorstyle, rmap_yval(), RM_SIZE); ^monsterstyle{S} strncpy(RP->monsterstyle, rmap_yval(), RM_SIZE); ^treasurestyle{S} strncpy(RP->treasurestyle, rmap_yval(), RM_SIZE); ^layoutstyle{S} strncpy(RP->layoutstyle, rmap_yval(), RM_SIZE); ^doorstyle{S} strncpy(RP->doorstyle, rmap_yval(), RM_SIZE); ^decorstyle{S} strncpy(RP->decorstyle, rmap_yval(), RM_SIZE); ^xsize{S} RP->Xsize = IVAL; ^ysize{S} RP->Ysize = IVAL; ^expand2x{S} RP->expand2x = IVAL; ^layoutoptions1{S} RP->layoutoptions1 = IVAL; ^layoutoptions2{S} RP->layoutoptions2 = IVAL; ^layoutoptions3{S} RP->layoutoptions3 = IVAL; ^symmetry{S} RP->symmetry = IVAL; ^difficulty{S} RP->difficulty = IVAL; ^difficulty_increase{S} RP->difficulty_increase = FVAL; ^decoroptions{S} RP->decoroptions = IVAL; ^exitstyle{S} strncpy(RP->exitstyle, rmap_yval(), RM_SIZE); ^dungeon_level{S} RP->dungeon_level = IVAL; ^dungeon_name{S} strncpy(RP->dungeon_name, rmap_yval(), RM_SIZE); ^dungeon_depth{S} RP->dungeon_depth = IVAL; ^final_map{S} strncpy(RP->final_map, rmap_yval(), RM_SIZE); ^final_exit_archetype{S} strncpy(RP->final_exit_archetype, rmap_yval(), RM_SIZE); ^orientation{S} RP-> orientation = IVAL; ^origin_x{S} RP->origin_x = IVAL; ^origin_y{S} RP-> origin_y = IVAL; ^origin_map{S} strncpy(RP->origin_map, rmap_yval(), RM_SIZE); ^random_seed{S} RP->random_seed = IVAL; ^treasureoptions{S} RP->treasureoptions = IVAL; ^exit_on_final_map{S} strncpy(RP->exit_on_final_map, rmap_yval(), RM_SIZE); ^multiple_floors{S} RP->multiple_floors = IVAL; <*>(^{WS}$)|\n {/* ignore empty lines, newlines we don't do above */} #.*\n { } <> {/* If we got an error, return the error. Otherwise, return that we got EOF */ if (rmap_lex_error != 0) return rmap_lex_error; else return LL_EOF;} .* { yyerror( "Unrecognized string"); rmap_lex_error= -1; } %% /* Our save file syntax is very simple, so we can use a very simple * processing mechanism here instead using something like bison * This skips over the space and returns the value, or "" if no value * is found. */ static char *rmap_yval(void) { static char *em = ""; char *cp; cp = strchr(yytext, ' '); if (cp) return cp+1; else return em; } int load_parameters(FILE *fp, int bufstate, RMParms *RP) { int retval; char inbuf[MAX_BUF]; if (bufstate == LO_NEWFILE || bufstate == LO_NOREAD) { yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); if (bufstate == LO_NOREAD) return LL_NORMAL; } if (bufstate == LO_LINEMODE) { YY_BUFFER_STATE yybufstate; while (fgets(inbuf, MAX_BUF-3, fp)) { yybufstate = yy_scan_string(inbuf); retval = rmap_lex_read(RP); yy_delete_buffer(yybufstate); if (retval == LL_NORMAL) return retval; } return LL_EOF; } retval = rmap_lex_read(RP); /* LOG(llevDebug, " load completed, object=%s\n", op->name);*/ return retval; } /* This takes a buffer, scans it for variables, and sets those variables * as appropriate in op. * * This function appears to be used in only 2 places - in crossedit to * override values and in c_wiz to mutate values. */ int set_random_map_variable(RMParms *rp, const char *buf) { YY_BUFFER_STATE yybufstate; int retval; yybufstate = yy_scan_string(buf); retval = rmap_lex_read(rp); yy_delete_buffer(yybufstate); return retval; }