lev_comp int vs long

Fix lev_comp's variable argument usage by changing it to make
add_opvars() expect an int rather than a long when given the "i"
indicator, and add "l" for really passing a long.  The ints are
conveted to longs when setting up the interpreter.  I think I changed
just about all the integer opvars to int, although there is one use
of "l" in lev_main.c just to make sure it works.  There could be
arguments that really do need to be 'long'; if so, the add_opvars()
calls for them will have to have its indicator string updated and
possibly add or remove some casts.

There's a lot of reformatting included but it's not consistent about
tab replacement.  Some of the changes are due to renaming long-named
'variable_definitions' to 'vardefs' to shorten a bunch of lines.

Updated sys/share/*_yacc.c will be checked in separately.  The ones
currently in the repository won't work with patched lev_main.c due to
that renamed variable.
This commit is contained in:
PatR
2018-11-27 18:21:58 -08:00
parent 554ec17c8b
commit 5d2686e7c1
6 changed files with 242 additions and 171 deletions
+3
View File
@@ -222,6 +222,9 @@ attempting to untrap an adjacent trap while on the edge of--not in--a pit
failed due to not being able to reach the floor failed due to not being able to reach the floor
magic trap's deafening roar effect wasn't waking nearby monsters magic trap's deafening roar effect wasn't waking nearby monsters
scattering of objects might leave source location with wrong thing displayed scattering of objects might leave source location with wrong thing displayed
for configurations with 'long int' larger than 'int', lev_comp wrote some
garbage into the *.lev files, but nethack seemed unaffected by that
(at least on little-endian hardare) and loaded the levels successfully
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
+2 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 sp_lev.h $NHDT-Date: 1524287214 2018/04/21 05:06:54 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.23 $ */ /* NetHack 3.6 sp_lev.h $NHDT-Date: 1543371689 2018/11/28 02:21:29 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.24 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -221,7 +221,7 @@ enum sp_obj_var_flags {
#define SPOVAR_SEL 0x09 /* selection. char[COLNO][ROWNO] in str */ #define SPOVAR_SEL 0x09 /* selection. char[COLNO][ROWNO] in str */
#define SPOVAR_ARRAY 0x40 /* used in splev_var & lc_vardefs, not in opvar */ #define SPOVAR_ARRAY 0x40 /* used in splev_var & lc_vardefs, not in opvar */
#define SP_COORD_IS_RANDOM 0x01000000 #define SP_COORD_IS_RANDOM 0x01000000L
/* Humidity flags for get_location() and friends, used with /* Humidity flags for get_location() and friends, used with
* SP_COORD_PACK_RANDOM() */ * SP_COORD_PACK_RANDOM() */
#define DRY 0x01 #define DRY 0x01
+3 -3
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 tradstdc.h $NHDT-Date: 1501803107 2017/08/03 23:31:47 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.29 $ */ /* NetHack 3.6 tradstdc.h $NHDT-Date: 1543371689 2018/11/28 02:21:29 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.32 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2006. */ /*-Copyright (c) Robert Patrick Rankin, 2006. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -95,7 +95,7 @@
{ \ { \
va_list the_args; va_list the_args;
#define VA_INIT(var1, typ1) #define VA_INIT(var1, typ1)
#define VA_NEXT(var1, typ1) var1 = va_arg(the_args, typ1) #define VA_NEXT(var1, typ1) (var1 = va_arg(the_args, typ1))
#define VA_ARGS the_args #define VA_ARGS the_args
#define VA_START(x) va_start(the_args, x) #define VA_START(x) va_start(the_args, x)
#define VA_END() \ #define VA_END() \
@@ -123,7 +123,7 @@
#define VA_ARGS the_args #define VA_ARGS the_args
#define VA_START(x) va_start(the_args) #define VA_START(x) va_start(the_args)
#define VA_INIT(var1, typ1) var1 = va_arg(the_args, typ1) #define VA_INIT(var1, typ1) var1 = va_arg(the_args, typ1)
#define VA_NEXT(var1, typ1) var1 = va_arg(the_args, typ1) #define VA_NEXT(var1, typ1) (var1 = va_arg(the_args, typ1))
#define VA_END() \ #define VA_END() \
va_end(the_args); \ va_end(the_args); \
} }
+3 -3
View File
@@ -1,5 +1,5 @@
%{ %{
/* NetHack 3.6 lev_comp.l $NHDT-Date: 1455415007 2016/02/14 01:56:47 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.24 $ */ /* NetHack 3.6 lev_comp.l $NHDT-Date: 1543371690 2018/11/28 02:21:30 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.25 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -77,7 +77,7 @@ long FDECL(corefunc_str_check, (char *, long));
extern void VDECL(lc_error, (const char *, ...)); extern void VDECL(lc_error, (const char *, ...));
extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int)); extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int));
extern struct lc_vardefs *variable_definitions; extern struct lc_vardefs *vardefs;
extern long FDECL(method_defined, (char *, long, long *)); extern long FDECL(method_defined, (char *, long, long *));
@@ -384,7 +384,7 @@ handle_varstring_check()
struct lc_vardefs *vd; struct lc_vardefs *vd;
yylval.map = dupstr(yytext); yylval.map = dupstr(yytext);
if ((vd = vardef_defined(variable_definitions, yytext, 1)) != 0) { if ((vd = vardef_defined(vardefs, yytext, 1)) != 0) {
long l = vd->var_type; long l = vd->var_type;
int a = ((l & SPOVAR_ARRAY) == SPOVAR_ARRAY); int a = ((l & SPOVAR_ARRAY) == SPOVAR_ARRAY);
+216 -157
View File
@@ -1,5 +1,5 @@
%{ %{
/* NetHack 3.6 lev_comp.y $NHDT-Date: 1455746893 2016/02/17 22:08:13 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.21 $ */ /* NetHack 3.6 lev_comp.y $NHDT-Date: 1543371691 2018/11/28 02:21:31 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.22 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -114,7 +114,8 @@ int obj_containment = 0;
int in_container_obj = 0; int in_container_obj = 0;
/* integer value is possibly an inconstant value (eg. dice notation or a variable) */ /* integer value is possibly an inconstant value (eg. dice notation
or a variable) */
int is_inconstant_number = 0; int is_inconstant_number = 0;
int in_switch_statement = 0; int in_switch_statement = 0;
@@ -127,7 +128,7 @@ int n_switch_case_list = 0;
int allow_break_statements = 0; int allow_break_statements = 0;
struct lc_breakdef *break_list = NULL; struct lc_breakdef *break_list = NULL;
extern struct lc_vardefs *variable_definitions; extern struct lc_vardefs *vardefs; /* variable definitions */
struct lc_vardefs *function_tmp_var_defs = NULL; struct lc_vardefs *function_tmp_var_defs = NULL;
@@ -148,39 +149,39 @@ extern char curr_token[512];
%union %union
{ {
long i; long i;
char* map; char *map;
struct {
long room;
long wall;
long door;
} corpos;
struct { struct {
long area; long room;
long x1; long wall;
long y1; long door;
long x2; } corpos;
long y2; struct {
long area;
long x1;
long y1;
long x2;
long y2;
} lregn; } lregn;
struct { struct {
long x; long x;
long y; long y;
} crd; } crd;
struct { struct {
long ter; long ter;
long lit; long lit;
} terr; } terr;
struct { struct {
long height; long height;
long width; long width;
} sze; } sze;
struct { struct {
long die; long die;
long num; long num;
} dice; } dice;
struct { struct {
long cfunc; long cfunc;
char *varstr; char *varstr;
} meth; } meth;
} }
@@ -214,7 +215,8 @@ extern char curr_token[512];
%token <i> MSG_OUTPUT_TYPE %token <i> MSG_OUTPUT_TYPE
%token <i> COMPARE_TYPE %token <i> COMPARE_TYPE
%token <i> UNKNOWN_TYPE %token <i> UNKNOWN_TYPE
%token <i> rect_ID fillrect_ID line_ID randline_ID grow_ID selection_ID flood_ID %token <i> rect_ID fillrect_ID line_ID randline_ID grow_ID
%token <i> selection_ID flood_ID
%token <i> rndcoord_ID circle_ID ellipse_ID filter_ID complement_ID %token <i> rndcoord_ID circle_ID ellipse_ID filter_ID complement_ID
%token <i> gradient_ID GRADIENT_TYPE LIMITED HUMIDITY_TYPE %token <i> gradient_ID GRADIENT_TYPE LIMITED HUMIDITY_TYPE
%token <i> ',' ':' '(' ')' '[' ']' '{' '}' %token <i> ',' ':' '(' ')' '[' ']' '{' '}'
@@ -247,12 +249,14 @@ extern char curr_token[512];
%type <i> dir_list teleprt_detail %type <i> dir_list teleprt_detail
%type <i> object_infos object_info monster_infos monster_info %type <i> object_infos object_info monster_infos monster_info
%type <i> levstatements stmt_block region_detail_end %type <i> levstatements stmt_block region_detail_end
%type <i> engraving_type flag_list roomregionflag roomregionflags optroomregionflags %type <i> engraving_type flag_list roomregionflag roomregionflags
%type <i> optroomregionflags
%type <i> humidity_flags %type <i> humidity_flags
%type <i> comparestmt encodecoord encoderegion mapchar %type <i> comparestmt encodecoord encoderegion mapchar
%type <i> seen_trap_mask %type <i> seen_trap_mask
%type <i> encodemonster encodeobj encodeobj_list %type <i> encodemonster encodeobj encodeobj_list
%type <i> integer_list string_list encodecoord_list encoderegion_list mapchar_list encodemonster_list %type <i> integer_list string_list encodecoord_list encoderegion_list
%type <i> mapchar_list encodemonster_list
%type <i> opt_percent opt_fillchar %type <i> opt_percent opt_fillchar
%type <i> all_integers %type <i> all_integers
%type <i> ter_selection ter_selection_x %type <i> ter_selection ter_selection_x
@@ -286,21 +290,22 @@ level : level_def flags levstatements
{ {
if (fatal_error > 0) { if (fatal_error > 0) {
(void) fprintf(stderr, (void) fprintf(stderr,
"%s: %d errors detected for level \"%s\". No output created!\n", "%s: %d errors detected for level \"%s\". No output created!\n",
fname, fatal_error, $1); fname, fatal_error, $1);
fatal_error = 0; fatal_error = 0;
got_errors++; got_errors++;
} else if (!got_errors) { } else if (!got_errors) {
if (!write_level_file($1, splev)) { if (!write_level_file($1, splev)) {
lc_error("Can't write output file for '%s'!", $1); lc_error("Can't write output file for '%s'!",
$1);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
Free($1); Free($1);
Free(splev); Free(splev);
splev = NULL; splev = NULL;
vardef_free_all(variable_definitions); vardef_free_all(vardefs);
variable_definitions = NULL; vardefs = NULL;
} }
; ;
@@ -314,10 +319,11 @@ level_def : LEVEL_ID ':' STRING
start_level_def(&splev, $3); start_level_def(&splev, $3);
if ($5 == -1) { if ($5 == -1) {
add_opvars(splev, "iiiiiiiio", add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MAZEGRID,HWALL,0,0, VA_PASS9(LVLINIT_MAZEGRID, HWALL, 0,0,
0,0,0,0, SPO_INITLEVEL)); 0,0,0,0, SPO_INITLEVEL));
} else { } else {
long bg = what_map_char((char) $5); int bg = (int) what_map_char((char) $5);
add_opvars(splev, "iiiiiiiio", add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_SOLIDFILL, bg, 0,0, VA_PASS9(LVLINIT_SOLIDFILL, bg, 0,0,
0,0,0,0, SPO_INITLEVEL)); 0,0,0,0, SPO_INITLEVEL));
@@ -342,21 +348,25 @@ mazefiller : RANDOM_TYPE
lev_init : LEV_INIT_ID ':' SOLID_FILL_ID ',' terrain_type lev_init : LEV_INIT_ID ':' SOLID_FILL_ID ',' terrain_type
{ {
long filling = $5.ter; int filling = (int) $5.ter;
if (filling == INVALID_TYPE || filling >= MAX_TYPE) if (filling == INVALID_TYPE || filling >= MAX_TYPE)
lc_error("INIT_MAP: Invalid fill char type."); lc_error("INIT_MAP: Invalid fill char type.");
add_opvars(splev, "iiiiiiiio", add_opvars(splev, "iiiiiiiio",
LVLINIT_SOLIDFILL,filling,0,(long)$5.lit, 0,0,0,0, SPO_INITLEVEL); VA_PASS9(LVLINIT_SOLIDFILL, filling,
0, (int) $5.lit,
0,0,0,0, SPO_INITLEVEL));
max_x_map = COLNO-1; max_x_map = COLNO-1;
max_y_map = ROWNO; max_y_map = ROWNO;
} }
| LEV_INIT_ID ':' MAZE_GRID_ID ',' CHAR | LEV_INIT_ID ':' MAZE_GRID_ID ',' CHAR
{ {
long filling = what_map_char((char) $5); int filling = (int) what_map_char((char) $5);
if (filling == INVALID_TYPE || filling >= MAX_TYPE) if (filling == INVALID_TYPE || filling >= MAX_TYPE)
lc_error("INIT_MAP: Invalid fill char type."); lc_error("INIT_MAP: Invalid fill char type.");
add_opvars(splev, "iiiiiiiio", add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MAZEGRID,filling,0,0, VA_PASS9(LVLINIT_MAZEGRID, filling, 0,0,
0,0,0,0, SPO_INITLEVEL)); 0,0,0,0, SPO_INITLEVEL));
max_x_map = COLNO-1; max_x_map = COLNO-1;
max_y_map = ROWNO; max_y_map = ROWNO;
@@ -369,13 +379,14 @@ lev_init : LEV_INIT_ID ':' SOLID_FILL_ID ',' terrain_type
} }
| LEV_INIT_ID ':' MINES_ID ',' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled opt_fillchar | LEV_INIT_ID ':' MINES_ID ',' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled opt_fillchar
{ {
long fg = what_map_char((char) $5); int fg = (int) what_map_char((char) $5),
long bg = what_map_char((char) $7); bg = (int) what_map_char((char) $7);
long smoothed = $9; int smoothed = (int) $9,
long joined = $11; joined = (int) $11,
long lit = $13; lit = (int) $13,
long walled = $15; walled = (int) $15,
long filling = $16; filling = (int) $16;
if (fg == INVALID_TYPE || fg >= MAX_TYPE) if (fg == INVALID_TYPE || fg >= MAX_TYPE)
lc_error("INIT_MAP: Invalid foreground type."); lc_error("INIT_MAP: Invalid foreground type.");
if (bg == INVALID_TYPE || bg >= MAX_TYPE) if (bg == INVALID_TYPE || bg >= MAX_TYPE)
@@ -387,8 +398,8 @@ lev_init : LEV_INIT_ID ':' SOLID_FILL_ID ',' terrain_type
lc_error("INIT_MAP: Invalid fill char type."); lc_error("INIT_MAP: Invalid fill char type.");
add_opvars(splev, "iiiiiiiio", add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MINES,filling,walled,lit, VA_PASS9(LVLINIT_MINES, filling, walled, lit,
joined,smoothed,bg,fg, joined, smoothed, bg, fg,
SPO_INITLEVEL)); SPO_INITLEVEL));
max_x_map = COLNO-1; max_x_map = COLNO-1;
max_y_map = ROWNO; max_y_map = ROWNO;
@@ -437,7 +448,8 @@ flags : /* nothing */
} }
| FLAGS_ID ':' flag_list | FLAGS_ID ':' flag_list
{ {
add_opvars(splev, "io", VA_PASS2($3, SPO_LEVEL_FLAGS)); add_opvars(splev, "io",
VA_PASS2((int) $3, SPO_LEVEL_FLAGS));
} }
; ;
@@ -547,10 +559,14 @@ any_var_or_unk : VARSTRING
shuffle_detail : SHUFFLE_ID ':' any_var_array shuffle_detail : SHUFFLE_ID ':' any_var_array
{ {
struct lc_vardefs *vd; struct lc_vardefs *vd;
if ((vd = vardef_defined(variable_definitions, $3, 1))) {
if ((vd = vardef_defined(vardefs, $3, 1))) {
if (!(vd->var_type & SPOVAR_ARRAY)) if (!(vd->var_type & SPOVAR_ARRAY))
lc_error("Trying to shuffle non-array variable '%s'", $3); lc_error("Trying to shuffle non-array variable '%s'",
} else lc_error("Trying to shuffle undefined variable '%s'", $3); $3);
} else
lc_error("Trying to shuffle undefined variable '%s'",
$3);
add_opvars(splev, "so", VA_PASS2($3, SPO_SHUFFLE_ARRAY)); add_opvars(splev, "so", VA_PASS2($3, SPO_SHUFFLE_ARRAY));
Free($3); Free($3);
} }
@@ -558,104 +574,118 @@ shuffle_detail : SHUFFLE_ID ':' any_var_array
variable_define : any_var_or_arr '=' math_expr_var variable_define : any_var_or_arr '=' math_expr_var
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_INT); vardefs = add_vardef_type(vardefs, $1, SPOVAR_INT);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' selection_ID ':' ter_selection | any_var_or_arr '=' selection_ID ':' ter_selection
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_SEL); vardefs = add_vardef_type(vardefs, $1, SPOVAR_SEL);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' string_expr | any_var_or_arr '=' string_expr
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_STRING); vardefs = add_vardef_type(vardefs, $1, SPOVAR_STRING);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' terrainid ':' mapchar_or_var | any_var_or_arr '=' terrainid ':' mapchar_or_var
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR); vardefs = add_vardef_type(vardefs, $1, SPOVAR_MAPCHAR);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' monsterid ':' monster_or_var | any_var_or_arr '=' monsterid ':' monster_or_var
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_MONST); vardefs = add_vardef_type(vardefs, $1, SPOVAR_MONST);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' objectid ':' object_or_var | any_var_or_arr '=' objectid ':' object_or_var
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_OBJ); vardefs = add_vardef_type(vardefs, $1, SPOVAR_OBJ);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' coord_or_var | any_var_or_arr '=' coord_or_var
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_COORD); vardefs = add_vardef_type(vardefs, $1, SPOVAR_COORD);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' region_or_var | any_var_or_arr '=' region_or_var
{ {
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_REGION); vardefs = add_vardef_type(vardefs, $1, SPOVAR_REGION);
add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' '{' integer_list '}' | any_var_or_arr '=' '{' integer_list '}'
{ {
long n_items = $4; int n_items = (int) $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_INT|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_INT | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' '{' encodecoord_list '}' | any_var_or_arr '=' '{' encodecoord_list '}'
{ {
long n_items = $4; int n_items = (int) $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_COORD|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_COORD | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' '{' encoderegion_list '}' | any_var_or_arr '=' '{' encoderegion_list '}'
{ {
long n_items = $4; int n_items = (int) $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_REGION|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_REGION | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' terrainid ':' '{' mapchar_list '}' | any_var_or_arr '=' terrainid ':' '{' mapchar_list '}'
{ {
long n_items = $6; int n_items = (int) $6;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_MAPCHAR | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' monsterid ':' '{' encodemonster_list '}' | any_var_or_arr '=' monsterid ':' '{' encodemonster_list '}'
{ {
long n_items = $6; int n_items = (int) $6;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_MONST|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_MONST | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' objectid ':' '{' encodeobj_list '}' | any_var_or_arr '=' objectid ':' '{' encodeobj_list '}'
{ {
long n_items = $6; int n_items = (int) $6;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_OBJ|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_OBJ | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
} }
| any_var_or_arr '=' '{' string_list '}' | any_var_or_arr '=' '{' string_list '}'
{ {
long n_items = $4; int n_items = (int) $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_STRING|SPOVAR_ARRAY);
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_STRING | SPOVAR_ARRAY);
add_opvars(splev, "iso", add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT)); VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1); Free($1);
@@ -759,8 +789,8 @@ function_define : FUNCTION_ID NQSTRING '('
splev = &(funcdef->code); splev = &(funcdef->code);
Free($2); Free($2);
curr_function = funcdef; curr_function = funcdef;
function_tmp_var_defs = variable_definitions; function_tmp_var_defs = vardefs;
variable_definitions = NULL; vardefs = NULL;
} }
func_params_list ')' func_params_list ')'
{ {
@@ -772,22 +802,26 @@ function_define : FUNCTION_ID NQSTRING '('
splev = function_splev_backup; splev = function_splev_backup;
in_function_definition--; in_function_definition--;
curr_function = NULL; curr_function = NULL;
vardef_free_all(variable_definitions); vardef_free_all(vardefs);
variable_definitions = function_tmp_var_defs; vardefs = function_tmp_var_defs;
} }
; ;
function_call : NQSTRING '(' func_call_params_list ')' function_call : NQSTRING '(' func_call_params_list ')'
{ {
struct lc_funcdefs *tmpfunc; struct lc_funcdefs *tmpfunc;
tmpfunc = funcdef_defined(function_definitions, $1, 1); tmpfunc = funcdef_defined(function_definitions, $1, 1);
if (tmpfunc) { if (tmpfunc) {
long l; int l;
long nparams = strlen( $3 ); int nparams = (int) strlen($3);
char *fparamstr = funcdef_paramtypes(tmpfunc); char *fparamstr = funcdef_paramtypes(tmpfunc);
if (strcmp($3, fparamstr)) { if (strcmp($3, fparamstr)) {
char *tmps = strdup(decode_parm_str(fparamstr)); char *tmps = strdup(decode_parm_str(fparamstr));
lc_error("Function '%s' requires params '%s', got '%s' instead.", $1, tmps, decode_parm_str($3));
lc_error("Function '%s' requires params '%s', got '%s' instead.",
$1, tmps, decode_parm_str($3));
Free(tmps); Free(tmps);
} }
Free(fparamstr); Free(fparamstr);
@@ -795,9 +829,11 @@ function_call : NQSTRING '(' func_call_params_list ')'
if (!(tmpfunc->n_called)) { if (!(tmpfunc->n_called)) {
/* we haven't called the function yet, so insert it in the code */ /* we haven't called the function yet, so insert it in the code */
struct opvar *jmp = New(struct opvar); struct opvar *jmp = New(struct opvar);
set_opvar_int(jmp, splev->n_opcodes+1); set_opvar_int(jmp, splev->n_opcodes+1);
add_opcode(splev, SPO_PUSH, jmp); add_opcode(splev, SPO_PUSH, jmp);
add_opcode(splev, SPO_JMP, NULL); /* we must jump past it first, then CALL it, due to RETURN. */ /* we must jump past it first, then CALL it, due to RETURN. */
add_opcode(splev, SPO_JMP, NULL);
tmpfunc->addr = splev->n_opcodes; tmpfunc->addr = splev->n_opcodes;
@@ -812,9 +848,10 @@ function_call : NQSTRING '(' func_call_params_list ')'
} }
splev_add_from(splev, &(tmpfunc->code)); splev_add_from(splev, &(tmpfunc->code));
set_opvar_int(jmp, splev->n_opcodes - jmp->vardata.l); set_opvar_int(jmp,
splev->n_opcodes - jmp->vardata.l);
} }
l = tmpfunc->addr - splev->n_opcodes - 2; l = (int) (tmpfunc->addr - splev->n_opcodes - 2);
add_opvars(splev, "iio", add_opvars(splev, "iio",
VA_PASS3(nparams, l, SPO_CALL)); VA_PASS3(nparams, l, SPO_CALL));
tmpfunc->n_called++; tmpfunc->n_called++;
@@ -845,7 +882,7 @@ comparestmt : PERCENT
{ {
/* val > rn2(100) */ /* val > rn2(100) */
add_opvars(splev, "iio", add_opvars(splev, "iio",
VA_PASS3((long)$1, 100, SPO_RN2)); VA_PASS3((int) $1, 100, SPO_RN2));
$$ = SPO_JG; $$ = SPO_JG;
} }
| '[' math_expr_var COMPARE_TYPE math_expr_var ']' | '[' math_expr_var COMPARE_TYPE math_expr_var ']'
@@ -867,6 +904,7 @@ switchstatement : SWITCH_ID
'[' integer_or_var ']' '[' integer_or_var ']'
{ {
struct opvar *chkjmp; struct opvar *chkjmp;
if (in_switch_statement > 0) if (in_switch_statement > 0)
lc_error("Cannot nest switch-statements."); lc_error("Cannot nest switch-statements.");
@@ -935,6 +973,7 @@ switchcase : CASE_ID all_integers ':'
{ {
if (n_switch_case_list < MAX_SWITCH_CASES) { if (n_switch_case_list < MAX_SWITCH_CASES) {
struct opvar *tmppush = New(struct opvar); struct opvar *tmppush = New(struct opvar);
set_opvar_int(tmppush, splev->n_opcodes); set_opvar_int(tmppush, splev->n_opcodes);
switch_case_value[n_switch_case_list] = $2; switch_case_value[n_switch_case_list] = $2;
switch_case_list[n_switch_case_list++] = tmppush; switch_case_list[n_switch_case_list++] = tmppush;
@@ -986,8 +1025,7 @@ forstmt_start : FOR_ID any_var_or_unk '=' math_expr_var for_to_span math_expr_va
/* the value of which is already in stack (the 2nd math_expr) */ /* the value of which is already in stack (the 2nd math_expr) */
add_opvars(splev, "iso", VA_PASS3(0, buf, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, buf, SPO_VAR_INIT));
variable_definitions = add_vardef_type(variable_definitions, vardefs = add_vardef_type(vardefs, $2, SPOVAR_INT);
$2, SPOVAR_INT);
/* define the for-loop variable. value is in stack (1st math_expr) */ /* define the for-loop variable. value is in stack (1st math_expr) */
add_opvars(splev, "iso", VA_PASS3(0, $2, SPO_VAR_INIT)); add_opvars(splev, "iso", VA_PASS3(0, $2, SPO_VAR_INIT));
@@ -1017,6 +1055,7 @@ forstatement : forstmt_start
} }
stmt_block stmt_block
{ {
int l;
char buf[256], buf2[256]; char buf[256], buf2[256];
n_forloops--; n_forloops--;
@@ -1035,10 +1074,9 @@ forstatement : forstmt_start
VA_PASS3(0, forloop_list[n_forloops].varname, VA_PASS3(0, forloop_list[n_forloops].varname,
SPO_VAR_INIT)); SPO_VAR_INIT));
/* jump back if compared values were not equal */ /* jump back if compared values were not equal */
add_opvars(splev, "io", l = (int) (forloop_list[n_forloops].jmp_point
VA_PASS2( - splev->n_opcodes - 1);
forloop_list[n_forloops].jmp_point - splev->n_opcodes - 1, add_opvars(splev, "io", VA_PASS2(l, SPO_JNE));
SPO_JNE));
Free(forloop_list[n_forloops].varname); Free(forloop_list[n_forloops].varname);
break_stmt_end(splev); break_stmt_end(splev);
} }
@@ -1065,10 +1103,11 @@ loopstatement : LOOP_ID '[' integer_or_var ']'
add_opvars(splev, "oio", VA_PASS3(SPO_COPY, 0, SPO_CMP)); add_opvars(splev, "oio", VA_PASS3(SPO_COPY, 0, SPO_CMP));
tmppush = (struct opvar *) if_list[--n_if_list]; tmppush = (struct opvar *) if_list[--n_if_list];
set_opvar_int(tmppush, tmppush->vardata.l - splev->n_opcodes-1); set_opvar_int(tmppush,
tmppush->vardata.l - splev->n_opcodes-1);
add_opcode(splev, SPO_PUSH, tmppush); add_opcode(splev, SPO_PUSH, tmppush);
add_opcode(splev, SPO_JG, NULL); add_opcode(splev, SPO_JG, NULL);
add_opcode(splev, SPO_POP, NULL); /* get rid of the count value in stack */ add_opcode(splev, SPO_POP, NULL); /* discard count */
break_stmt_end(splev); break_stmt_end(splev);
} }
; ;
@@ -1097,8 +1136,10 @@ chancestatement : comparestmt ':'
{ {
if (n_if_list > 0) { if (n_if_list > 0) {
struct opvar *tmppush; struct opvar *tmppush;
tmppush = (struct opvar *) if_list[--n_if_list]; tmppush = (struct opvar *) if_list[--n_if_list];
set_opvar_int(tmppush, splev->n_opcodes - tmppush->vardata.l); set_opvar_int(tmppush,
splev->n_opcodes - tmppush->vardata.l);
} else lc_error("IF: Huh?! No start address?"); } else lc_error("IF: Huh?! No start address?");
} }
; ;
@@ -1133,8 +1174,10 @@ if_ending : stmt_block
{ {
if (n_if_list > 0) { if (n_if_list > 0) {
struct opvar *tmppush; struct opvar *tmppush;
tmppush = (struct opvar *) if_list[--n_if_list]; tmppush = (struct opvar *) if_list[--n_if_list];
set_opvar_int(tmppush, splev->n_opcodes - tmppush->vardata.l); set_opvar_int(tmppush,
splev->n_opcodes - tmppush->vardata.l);
} else lc_error("IF: Huh?! No start address?"); } else lc_error("IF: Huh?! No start address?");
} }
| stmt_block | stmt_block
@@ -1150,7 +1193,8 @@ if_ending : stmt_block
tmppush2 = (struct opvar *) if_list[--n_if_list]; tmppush2 = (struct opvar *) if_list[--n_if_list];
set_opvar_int(tmppush2, splev->n_opcodes - tmppush2->vardata.l); set_opvar_int(tmppush2,
splev->n_opcodes - tmppush2->vardata.l);
if_list[n_if_list++] = tmppush; if_list[n_if_list++] = tmppush;
} else lc_error("IF: Huh?! No else-part address?"); } else lc_error("IF: Huh?! No else-part address?");
} }
@@ -1363,21 +1407,21 @@ door_pos : INTEGER
map_definition : NOMAP_ID map_definition : NOMAP_ID
{ {
add_opvars(splev, "ciisiio", add_opvars(splev, "ciisiio",
VA_PASS7(0, 0, 1, (char *)0, 0, 0, SPO_MAP)); VA_PASS7(0, 0, 1, (char *) 0, 0, 0, SPO_MAP));
max_x_map = COLNO-1; max_x_map = COLNO-1;
max_y_map = ROWNO; max_y_map = ROWNO;
} }
| GEOMETRY_ID ':' h_justif ',' v_justif roomfill MAP_ID | GEOMETRY_ID ':' h_justif ',' v_justif roomfill MAP_ID
{ {
add_opvars(splev, "cii", add_opvars(splev, "cii",
VA_PASS3(SP_COORD_PACK(($3),($5)), VA_PASS3(SP_COORD_PACK(($3), ($5)),
1, (long)$6)); 1, (int) $6));
scan_map($7, splev); scan_map($7, splev);
Free($7); Free($7);
} }
| GEOMETRY_ID ':' coord_or_var roomfill MAP_ID | GEOMETRY_ID ':' coord_or_var roomfill MAP_ID
{ {
add_opvars(splev, "ii", VA_PASS2(2, (long)$4)); add_opvars(splev, "ii", VA_PASS2(2, (int) $4));
scan_map($5, splev); scan_map($5, splev);
Free($5); Free($5);
} }
@@ -1418,6 +1462,7 @@ monster_desc : monster_or_var ',' coord_or_var monster_infos
monster_infos : /* nothing */ monster_infos : /* nothing */
{ {
struct opvar *stopit = New(struct opvar); struct opvar *stopit = New(struct opvar);
set_opvar_int(stopit, SP_M_V_END); set_opvar_int(stopit, SP_M_V_END);
add_opcode(splev, SPO_PUSH, stopit); add_opcode(splev, SPO_PUSH, stopit);
$$ = 0x0000; $$ = 0x0000;
@@ -1438,25 +1483,25 @@ monster_info : string_expr
| MON_ATTITUDE | MON_ATTITUDE
{ {
add_opvars(splev, "ii", add_opvars(splev, "ii",
VA_PASS2((long)$<i>1, SP_M_V_PEACEFUL)); VA_PASS2((int) $<i>1, SP_M_V_PEACEFUL));
$$ = 0x0002; $$ = 0x0002;
} }
| MON_ALERTNESS | MON_ALERTNESS
{ {
add_opvars(splev, "ii", add_opvars(splev, "ii",
VA_PASS2((long)$<i>1, SP_M_V_ASLEEP)); VA_PASS2((int) $<i>1, SP_M_V_ASLEEP));
$$ = 0x0004; $$ = 0x0004;
} }
| alignment_prfx | alignment_prfx
{ {
add_opvars(splev, "ii", add_opvars(splev, "ii",
VA_PASS2((long)$1, SP_M_V_ALIGN)); VA_PASS2((int) $1, SP_M_V_ALIGN));
$$ = 0x0008; $$ = 0x0008;
} }
| MON_APPEARANCE string_expr | MON_APPEARANCE string_expr
{ {
add_opvars(splev, "ii", add_opvars(splev, "ii",
VA_PASS2((long)$<i>1, SP_M_V_APPEAR)); VA_PASS2((int) $<i>1, SP_M_V_APPEAR));
$$ = 0x0010; $$ = 0x0010;
} }
| FEMALE_ID | FEMALE_ID
@@ -1512,7 +1557,7 @@ monster_info : string_expr
| SEENTRAPS_ID ':' seen_trap_mask | SEENTRAPS_ID ':' seen_trap_mask
{ {
add_opvars(splev, "ii", add_opvars(splev, "ii",
VA_PASS2((long)$3, SP_M_V_SEENTRAPS)); VA_PASS2((int) $3, SP_M_V_SEENTRAPS));
$$ = 0x8000; $$ = 0x8000;
} }
; ;
@@ -1520,6 +1565,7 @@ monster_info : string_expr
seen_trap_mask : STRING seen_trap_mask : STRING
{ {
int token = get_trap_type($1); int token = get_trap_type($1);
if (token == ERR || token == 0) if (token == ERR || token == 0)
lc_error("Unknown trap type '%s'!", $1); lc_error("Unknown trap type '%s'!", $1);
Free($1); Free($1);
@@ -1544,14 +1590,18 @@ seen_trap_mask : STRING
object_detail : OBJECT_ID ':' object_desc object_detail : OBJECT_ID ':' object_desc
{ {
long cnt = 0; int cnt = 0;
if (in_container_obj) cnt |= SP_OBJ_CONTENT;
if (in_container_obj)
cnt |= SP_OBJ_CONTENT;
add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT)); add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT));
} }
| COBJECT_ID ':' object_desc | COBJECT_ID ':' object_desc
{ {
long cnt = SP_OBJ_CONTAINER; int cnt = SP_OBJ_CONTAINER;
if (in_container_obj) cnt |= SP_OBJ_CONTENT;
if (in_container_obj)
cnt |= SP_OBJ_CONTENT;
add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT)); add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT));
in_container_obj++; in_container_obj++;
break_stmt_start(); break_stmt_start();
@@ -1591,7 +1641,7 @@ object_infos : /* nothing */
object_info : CURSE_TYPE object_info : CURSE_TYPE
{ {
add_opvars(splev, "ii", add_opvars(splev, "ii",
VA_PASS2((long)$1, SP_O_V_CURSE)); VA_PASS2((int) $1, SP_O_V_CURSE));
$$ = 0x0001; $$ = 0x0001;
} }
| MONTYPE_ID ':' monster_or_var | MONTYPE_ID ':' monster_or_var
@@ -1621,7 +1671,7 @@ object_info : CURSE_TYPE
} }
| LIGHT_STATE | LIGHT_STATE
{ {
add_opvars(splev, "ii", VA_PASS2((long)$1, SP_O_V_LIT)); add_opvars(splev, "ii", VA_PASS2((int) $1, SP_O_V_LIT));
$$ = 0x0040; $$ = 0x0040;
} }
| ERODED_ID ':' integer_or_var | ERODED_ID ':' integer_or_var
@@ -1647,7 +1697,8 @@ object_info : CURSE_TYPE
} }
| TRAPPED_STATE | TRAPPED_STATE
{ {
add_opvars(splev, "ii", VA_PASS2($1, SP_O_V_TRAPPED)); add_opvars(splev, "ii",
VA_PASS2((int) 1, SP_O_V_TRAPPED));
$$ = 0x0400; $$ = 0x0400;
} }
| RECHARGED_ID ':' integer_or_var | RECHARGED_ID ':' integer_or_var
@@ -1674,7 +1725,7 @@ object_info : CURSE_TYPE
trap_detail : TRAP_ID ':' trap_name ',' coord_or_var trap_detail : TRAP_ID ':' trap_name ',' coord_or_var
{ {
add_opvars(splev, "io", VA_PASS2((long)$3, SPO_TRAP)); add_opvars(splev, "io", VA_PASS2((int) $3, SPO_TRAP));
} }
; ;
@@ -1710,13 +1761,13 @@ drawbridge_detail: DRAWBRIDGE_ID ':' coord_or_var ',' DIRECTION ',' door_state
mazewalk_detail : MAZEWALK_ID ':' coord_or_var ',' DIRECTION mazewalk_detail : MAZEWALK_ID ':' coord_or_var ',' DIRECTION
{ {
add_opvars(splev, "iiio", add_opvars(splev, "iiio",
VA_PASS4((long)$5, 1, 0, SPO_MAZEWALK)); VA_PASS4((int) $5, 1, 0, SPO_MAZEWALK));
} }
| MAZEWALK_ID ':' coord_or_var ',' DIRECTION ',' BOOLEAN opt_fillchar | MAZEWALK_ID ':' coord_or_var ',' DIRECTION ',' BOOLEAN opt_fillchar
{ {
add_opvars(splev, "iiio", add_opvars(splev, "iiio",
VA_PASS4((long)$5, (long)$<i>7, VA_PASS4((int) $5, (int) $<i>7,
(long)$8, SPO_MAZEWALK)); (int) $8, SPO_MAZEWALK));
} }
; ;
@@ -1735,14 +1786,14 @@ wallify_detail : WALLIFY_ID
ladder_detail : LADDER_ID ':' coord_or_var ',' UP_OR_DOWN ladder_detail : LADDER_ID ':' coord_or_var ',' UP_OR_DOWN
{ {
add_opvars(splev, "io", add_opvars(splev, "io",
VA_PASS2((long)$<i>5, SPO_LADDER)); VA_PASS2((int) $<i>5, SPO_LADDER));
} }
; ;
stair_detail : STAIR_ID ':' coord_or_var ',' UP_OR_DOWN stair_detail : STAIR_ID ':' coord_or_var ',' UP_OR_DOWN
{ {
add_opvars(splev, "io", add_opvars(splev, "io",
VA_PASS2((long)$<i>5, SPO_STAIR)); VA_PASS2((int) $<i>5, SPO_STAIR));
} }
; ;
@@ -2040,15 +2091,16 @@ string_or_var : STRING
} }
| VARSTRING_STRING | VARSTRING_STRING
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_STRING); check_vardef_type(vardefs, $1, SPOVAR_STRING);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
| VARSTRING_STRING_ARRAY '[' math_expr_var ']' | VARSTRING_STRING_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_STRING|SPOVAR_ARRAY); check_vardef_type(vardefs, $1,
vardef_used(variable_definitions, $1); SPOVAR_STRING | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
@@ -2071,15 +2123,16 @@ coord_or_var : encodecoord
} }
| VARSTRING_COORD | VARSTRING_COORD
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_COORD); check_vardef_type(vardefs, $1, SPOVAR_COORD);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
| VARSTRING_COORD_ARRAY '[' math_expr_var ']' | VARSTRING_COORD_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_COORD|SPOVAR_ARRAY); check_vardef_type(vardefs, $1,
vardef_used(variable_definitions, $1); SPOVAR_COORD | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
@@ -2088,7 +2141,8 @@ coord_or_var : encodecoord
encodecoord : '(' INTEGER ',' INTEGER ')' encodecoord : '(' INTEGER ',' INTEGER ')'
{ {
if ($2 < 0 || $4 < 0 || $2 >= COLNO || $4 >= ROWNO) if ($2 < 0 || $4 < 0 || $2 >= COLNO || $4 >= ROWNO)
lc_error("Coordinates (%li,%li) out of map range!", $2, $4); lc_error("Coordinates (%li,%li) out of map range!",
$2, $4);
$$ = SP_COORD_PACK($2, $4); $$ = SP_COORD_PACK($2, $4);
} }
| RANDOM_TYPE | RANDOM_TYPE
@@ -2097,7 +2151,7 @@ encodecoord : '(' INTEGER ',' INTEGER ')'
} }
| RANDOM_TYPE_BRACKET humidity_flags ']' | RANDOM_TYPE_BRACKET humidity_flags ']'
{ {
$$ = SP_COORD_PACK_RANDOM( $2 ); $$ = SP_COORD_PACK_RANDOM($2);
} }
; ;
@@ -2119,15 +2173,16 @@ region_or_var : encoderegion
} }
| VARSTRING_REGION | VARSTRING_REGION
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_REGION); check_vardef_type(vardefs, $1, SPOVAR_REGION);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
| VARSTRING_REGION_ARRAY '[' math_expr_var ']' | VARSTRING_REGION_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_REGION|SPOVAR_ARRAY); check_vardef_type(vardefs, $1,
vardef_used(variable_definitions, $1); SPOVAR_REGION | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
@@ -2136,8 +2191,10 @@ region_or_var : encoderegion
encoderegion : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' encoderegion : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'
{ {
long r = SP_REGION_PACK($2, $4, $6, $8); long r = SP_REGION_PACK($2, $4, $6, $8);
if ( $2 > $6 || $4 > $8 )
lc_error("Region start > end: (%li,%li,%li,%li)!", $2, $4, $6, $8); if ($2 > $6 || $4 > $8)
lc_error("Region start > end: (%ld,%ld,%ld,%ld)!",
$2, $4, $6, $8);
add_opvars(splev, "r", VA_PASS1(r)); add_opvars(splev, "r", VA_PASS1(r));
$$ = r; $$ = r;
@@ -2150,15 +2207,16 @@ mapchar_or_var : mapchar
} }
| VARSTRING_MAPCHAR | VARSTRING_MAPCHAR
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR); check_vardef_type(vardefs, $1, SPOVAR_MAPCHAR);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
| VARSTRING_MAPCHAR_ARRAY '[' math_expr_var ']' | VARSTRING_MAPCHAR_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR|SPOVAR_ARRAY); check_vardef_type(vardefs, $1,
vardef_used(variable_definitions, $1); SPOVAR_MAPCHAR | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
@@ -2190,15 +2248,16 @@ monster_or_var : encodemonster
} }
| VARSTRING_MONST | VARSTRING_MONST
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_MONST); check_vardef_type(vardefs, $1, SPOVAR_MONST);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
| VARSTRING_MONST_ARRAY '[' math_expr_var ']' | VARSTRING_MONST_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_MONST|SPOVAR_ARRAY); check_vardef_type(vardefs, $1,
vardef_used(variable_definitions, $1); SPOVAR_MONST | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
@@ -2246,15 +2305,16 @@ object_or_var : encodeobj
} }
| VARSTRING_OBJ | VARSTRING_OBJ
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_OBJ); check_vardef_type(vardefs, $1, SPOVAR_OBJ);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
| VARSTRING_OBJ_ARRAY '[' math_expr_var ']' | VARSTRING_OBJ_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_OBJ|SPOVAR_ARRAY); check_vardef_type(vardefs, $1,
vardef_used(variable_definitions, $1); SPOVAR_OBJ | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
@@ -2267,7 +2327,8 @@ encodeobj : STRING
lc_error("Unknown object \"%s\"!", $1); lc_error("Unknown object \"%s\"!", $1);
$$ = -1; $$ = -1;
} else } else
$$ = SP_OBJ_PACK(m, 1); /* obj class != 0 to force generation of a specific item */ /* obj class != 0 to force generation of a specific item */
$$ = SP_OBJ_PACK(m, 1);
Free($1); Free($1);
} }
| CHAR | CHAR
@@ -2317,17 +2378,17 @@ math_expr_var : INTEGER
} }
| VARSTRING_INT | VARSTRING_INT
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_INT); check_vardef_type(vardefs, $1, SPOVAR_INT);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
is_inconstant_number = 1; is_inconstant_number = 1;
} }
| VARSTRING_INT_ARRAY '[' math_expr_var ']' | VARSTRING_INT_ARRAY '[' math_expr_var ']'
{ {
check_vardef_type(variable_definitions, check_vardef_type(vardefs, $1,
$1, SPOVAR_INT|SPOVAR_ARRAY); SPOVAR_INT | SPOVAR_ARRAY);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
is_inconstant_number = 1; is_inconstant_number = 1;
@@ -2398,9 +2459,7 @@ func_param_part : any_var_or_arr ':' func_param_type
lc_error("Unknown func param conversion."); lc_error("Unknown func param conversion.");
break; break;
} }
variable_definitions = add_vardef_type( vardefs = add_vardef_type( vardefs, $1, vt);
variable_definitions,
$1, vt);
} }
Free($1); Free($1);
} }
@@ -2531,8 +2590,8 @@ ter_selection_x : coord_or_var
} }
| VARSTRING_SEL | VARSTRING_SEL
{ {
check_vardef_type(variable_definitions, $1, SPOVAR_SEL); check_vardef_type(vardefs, $1, SPOVAR_SEL);
vardef_used(variable_definitions, $1); vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1)); add_opvars(splev, "v", VA_PASS1($1));
Free($1); Free($1);
} }
+15 -6
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 lev_main.c $NHDT-Date: 1501723418 2017/08/03 01:23:38 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.47 $ */ /* NetHack 3.6 lev_main.c $NHDT-Date: 1543371692 2018/11/28 02:21:32 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.56 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -226,7 +226,7 @@ extern int nh_line_number;
extern int token_start_pos; extern int token_start_pos;
extern char curr_token[512]; extern char curr_token[512];
struct lc_vardefs *variable_definitions = NULL; struct lc_vardefs *vardefs = NULL;
struct lc_funcdefs *function_definitions = NULL; struct lc_funcdefs *function_definitions = NULL;
extern int allow_break_statements; extern int allow_break_statements;
@@ -641,9 +641,18 @@ VA_DECL2(sp_lev *, sp, const char *, fmt)
switch (*p) { switch (*p) {
case ' ': case ' ':
break; break;
case 'i': /* integer */ case 'i': /* integer (via plain 'int') */
{ {
struct opvar *ov = New(struct opvar); struct opvar *ov = New(struct opvar);
set_opvar_int(ov, (long) VA_NEXT(la, int));
add_opcode(sp, SPO_PUSH, ov);
break;
}
case 'l': /* integer (via 'long int') */
{
struct opvar *ov = New(struct opvar);
set_opvar_int(ov, VA_NEXT(la, long)); set_opvar_int(ov, VA_NEXT(la, long));
add_opcode(sp, SPO_PUSH, ov); add_opcode(sp, SPO_PUSH, ov);
break; break;
@@ -1105,8 +1114,8 @@ char *ldfname;
(*splev)->n_opcodes = 0; (*splev)->n_opcodes = 0;
(*splev)->opcodes = NULL; (*splev)->opcodes = NULL;
vardef_free_all(variable_definitions); vardef_free_all(vardefs);
variable_definitions = NULL; vardefs = NULL;
} }
/* /*
@@ -1436,7 +1445,7 @@ sp_lev *sp;
mbuf[((max_hig - 1) * max_len) + (max_len - 1) + 1] = '\0'; mbuf[((max_hig - 1) * max_len) + (max_len - 1) + 1] = '\0';
add_opvars(sp, "siio", VA_PASS4(mbuf, (long) max_hig, (long) max_len, add_opvars(sp, "sllo", VA_PASS4(mbuf, (long) max_hig, (long) max_len,
SPO_MAP)); SPO_MAP));
for (dy = 0; dy < max_hig; dy++) for (dy = 0; dy < max_hig; dy++)