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

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
magic trap's deafening roar effect wasn't waking nearby monsters
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

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 */
/* 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_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
* SP_COORD_PACK_RANDOM() */
#define DRY 0x01

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) Robert Patrick Rankin, 2006. */
/* NetHack may be freely redistributed. See license for details. */
@@ -95,7 +95,7 @@
{ \
va_list the_args;
#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_START(x) va_start(the_args, x)
#define VA_END() \
@@ -123,7 +123,7 @@
#define VA_ARGS the_args
#define VA_START(x) va_start(the_args)
#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() \
va_end(the_args); \
}

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 */
/* 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 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 *));
@@ -384,7 +384,7 @@ handle_varstring_check()
struct lc_vardefs *vd;
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;
int a = ((l & SPOVAR_ARRAY) == SPOVAR_ARRAY);

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 */
/* NetHack may be freely redistributed. See license for details. */
@@ -114,7 +114,8 @@ int obj_containment = 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 in_switch_statement = 0;
@@ -127,7 +128,7 @@ int n_switch_case_list = 0;
int allow_break_statements = 0;
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;
@@ -148,39 +149,39 @@ extern char curr_token[512];
%union
{
long i;
char* map;
struct {
long room;
long wall;
long door;
} corpos;
long i;
char *map;
struct {
long area;
long x1;
long y1;
long x2;
long y2;
long room;
long wall;
long door;
} corpos;
struct {
long area;
long x1;
long y1;
long x2;
long y2;
} lregn;
struct {
long x;
long y;
long x;
long y;
} crd;
struct {
long ter;
long lit;
long ter;
long lit;
} terr;
struct {
long height;
long width;
long height;
long width;
} sze;
struct {
long die;
long num;
long die;
long num;
} dice;
struct {
long cfunc;
char *varstr;
long cfunc;
char *varstr;
} meth;
}
@@ -214,7 +215,8 @@ extern char curr_token[512];
%token <i> MSG_OUTPUT_TYPE
%token <i> COMPARE_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> gradient_ID GRADIENT_TYPE LIMITED HUMIDITY_TYPE
%token <i> ',' ':' '(' ')' '[' ']' '{' '}'
@@ -247,12 +249,14 @@ extern char curr_token[512];
%type <i> dir_list teleprt_detail
%type <i> object_infos object_info monster_infos monster_info
%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> comparestmt encodecoord encoderegion mapchar
%type <i> seen_trap_mask
%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> all_integers
%type <i> ter_selection ter_selection_x
@@ -286,21 +290,22 @@ level : level_def flags levstatements
{
if (fatal_error > 0) {
(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);
fatal_error = 0;
got_errors++;
} else if (!got_errors) {
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);
}
}
Free($1);
Free(splev);
splev = NULL;
vardef_free_all(variable_definitions);
variable_definitions = NULL;
vardef_free_all(vardefs);
vardefs = NULL;
}
;
@@ -314,10 +319,11 @@ level_def : LEVEL_ID ':' STRING
start_level_def(&splev, $3);
if ($5 == -1) {
add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MAZEGRID,HWALL,0,0,
VA_PASS9(LVLINIT_MAZEGRID, HWALL, 0,0,
0,0,0,0, SPO_INITLEVEL));
} else {
long bg = what_map_char((char) $5);
int bg = (int) what_map_char((char) $5);
add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_SOLIDFILL, bg, 0,0,
0,0,0,0, SPO_INITLEVEL));
@@ -342,21 +348,25 @@ mazefiller : RANDOM_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)
lc_error("INIT_MAP: Invalid fill char type.");
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_y_map = ROWNO;
}
| 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)
lc_error("INIT_MAP: Invalid fill char type.");
add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MAZEGRID,filling,0,0,
add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MAZEGRID, filling, 0,0,
0,0,0,0, SPO_INITLEVEL));
max_x_map = COLNO-1;
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
{
long fg = what_map_char((char) $5);
long bg = what_map_char((char) $7);
long smoothed = $9;
long joined = $11;
long lit = $13;
long walled = $15;
long filling = $16;
int fg = (int) what_map_char((char) $5),
bg = (int) what_map_char((char) $7);
int smoothed = (int) $9,
joined = (int) $11,
lit = (int) $13,
walled = (int) $15,
filling = (int) $16;
if (fg == INVALID_TYPE || fg >= MAX_TYPE)
lc_error("INIT_MAP: Invalid foreground 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.");
add_opvars(splev, "iiiiiiiio",
VA_PASS9(LVLINIT_MINES,filling,walled,lit,
joined,smoothed,bg,fg,
VA_PASS9(LVLINIT_MINES, filling, walled, lit,
joined, smoothed, bg, fg,
SPO_INITLEVEL));
max_x_map = COLNO-1;
max_y_map = ROWNO;
@@ -437,7 +448,8 @@ flags : /* nothing */
}
| 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
{
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))
lc_error("Trying to shuffle non-array variable '%s'", $3);
} else lc_error("Trying to shuffle undefined variable '%s'", $3);
lc_error("Trying to shuffle non-array variable '%s'",
$3);
} else
lc_error("Trying to shuffle undefined variable '%s'",
$3);
add_opvars(splev, "so", VA_PASS2($3, SPO_SHUFFLE_ARRAY));
Free($3);
}
@@ -558,104 +574,118 @@ shuffle_detail : SHUFFLE_ID ':' any_var_array
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));
Free($1);
}
| 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));
Free($1);
}
| 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));
Free($1);
}
| 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));
Free($1);
}
| 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));
Free($1);
}
| 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));
Free($1);
}
| 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));
Free($1);
}
| 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));
Free($1);
}
| any_var_or_arr '=' '{' integer_list '}'
{
long n_items = $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_INT|SPOVAR_ARRAY);
int n_items = (int) $4;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_INT | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
}
| any_var_or_arr '=' '{' encodecoord_list '}'
{
long n_items = $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_COORD|SPOVAR_ARRAY);
int n_items = (int) $4;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_COORD | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
}
| any_var_or_arr '=' '{' encoderegion_list '}'
{
long n_items = $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_REGION|SPOVAR_ARRAY);
int n_items = (int) $4;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_REGION | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
}
| any_var_or_arr '=' terrainid ':' '{' mapchar_list '}'
{
long n_items = $6;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR|SPOVAR_ARRAY);
int n_items = (int) $6;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_MAPCHAR | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
}
| any_var_or_arr '=' monsterid ':' '{' encodemonster_list '}'
{
long n_items = $6;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_MONST|SPOVAR_ARRAY);
int n_items = (int) $6;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_MONST | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
}
| any_var_or_arr '=' objectid ':' '{' encodeobj_list '}'
{
long n_items = $6;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_OBJ|SPOVAR_ARRAY);
int n_items = (int) $6;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_OBJ | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
}
| any_var_or_arr '=' '{' string_list '}'
{
long n_items = $4;
variable_definitions = add_vardef_type(variable_definitions, $1, SPOVAR_STRING|SPOVAR_ARRAY);
int n_items = (int) $4;
vardefs = add_vardef_type(vardefs, $1,
SPOVAR_STRING | SPOVAR_ARRAY);
add_opvars(splev, "iso",
VA_PASS3(n_items, $1, SPO_VAR_INIT));
Free($1);
@@ -759,8 +789,8 @@ function_define : FUNCTION_ID NQSTRING '('
splev = &(funcdef->code);
Free($2);
curr_function = funcdef;
function_tmp_var_defs = variable_definitions;
variable_definitions = NULL;
function_tmp_var_defs = vardefs;
vardefs = NULL;
}
func_params_list ')'
{
@@ -772,22 +802,26 @@ function_define : FUNCTION_ID NQSTRING '('
splev = function_splev_backup;
in_function_definition--;
curr_function = NULL;
vardef_free_all(variable_definitions);
variable_definitions = function_tmp_var_defs;
vardef_free_all(vardefs);
vardefs = function_tmp_var_defs;
}
;
function_call : NQSTRING '(' func_call_params_list ')'
{
struct lc_funcdefs *tmpfunc;
tmpfunc = funcdef_defined(function_definitions, $1, 1);
if (tmpfunc) {
long l;
long nparams = strlen( $3 );
int l;
int nparams = (int) strlen($3);
char *fparamstr = funcdef_paramtypes(tmpfunc);
if (strcmp($3, 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(fparamstr);
@@ -795,9 +829,11 @@ function_call : NQSTRING '(' func_call_params_list ')'
if (!(tmpfunc->n_called)) {
/* we haven't called the function yet, so insert it in the code */
struct opvar *jmp = New(struct opvar);
set_opvar_int(jmp, splev->n_opcodes+1);
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;
@@ -812,9 +848,10 @@ function_call : NQSTRING '(' func_call_params_list ')'
}
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",
VA_PASS3(nparams, l, SPO_CALL));
tmpfunc->n_called++;
@@ -845,7 +882,7 @@ comparestmt : PERCENT
{
/* val > rn2(100) */
add_opvars(splev, "iio",
VA_PASS3((long)$1, 100, SPO_RN2));
VA_PASS3((int) $1, 100, SPO_RN2));
$$ = SPO_JG;
}
| '[' math_expr_var COMPARE_TYPE math_expr_var ']'
@@ -867,6 +904,7 @@ switchstatement : SWITCH_ID
'[' integer_or_var ']'
{
struct opvar *chkjmp;
if (in_switch_statement > 0)
lc_error("Cannot nest switch-statements.");
@@ -935,6 +973,7 @@ switchcase : CASE_ID all_integers ':'
{
if (n_switch_case_list < MAX_SWITCH_CASES) {
struct opvar *tmppush = New(struct opvar);
set_opvar_int(tmppush, splev->n_opcodes);
switch_case_value[n_switch_case_list] = $2;
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) */
add_opvars(splev, "iso", VA_PASS3(0, buf, SPO_VAR_INIT));
variable_definitions = add_vardef_type(variable_definitions,
$2, SPOVAR_INT);
vardefs = add_vardef_type(vardefs, $2, SPOVAR_INT);
/* define the for-loop variable. value is in stack (1st math_expr) */
add_opvars(splev, "iso", VA_PASS3(0, $2, SPO_VAR_INIT));
@@ -1017,6 +1055,7 @@ forstatement : forstmt_start
}
stmt_block
{
int l;
char buf[256], buf2[256];
n_forloops--;
@@ -1035,10 +1074,9 @@ forstatement : forstmt_start
VA_PASS3(0, forloop_list[n_forloops].varname,
SPO_VAR_INIT));
/* jump back if compared values were not equal */
add_opvars(splev, "io",
VA_PASS2(
forloop_list[n_forloops].jmp_point - splev->n_opcodes - 1,
SPO_JNE));
l = (int) (forloop_list[n_forloops].jmp_point
- splev->n_opcodes - 1);
add_opvars(splev, "io", VA_PASS2(l, SPO_JNE));
Free(forloop_list[n_forloops].varname);
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));
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_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);
}
;
@@ -1097,8 +1136,10 @@ chancestatement : comparestmt ':'
{
if (n_if_list > 0) {
struct opvar *tmppush;
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?");
}
;
@@ -1133,8 +1174,10 @@ if_ending : stmt_block
{
if (n_if_list > 0) {
struct opvar *tmppush;
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?");
}
| stmt_block
@@ -1150,7 +1193,8 @@ if_ending : stmt_block
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;
} else lc_error("IF: Huh?! No else-part address?");
}
@@ -1363,21 +1407,21 @@ door_pos : INTEGER
map_definition : NOMAP_ID
{
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_y_map = ROWNO;
}
| GEOMETRY_ID ':' h_justif ',' v_justif roomfill MAP_ID
{
add_opvars(splev, "cii",
VA_PASS3(SP_COORD_PACK(($3),($5)),
1, (long)$6));
VA_PASS3(SP_COORD_PACK(($3), ($5)),
1, (int) $6));
scan_map($7, splev);
Free($7);
}
| 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);
Free($5);
}
@@ -1418,6 +1462,7 @@ monster_desc : monster_or_var ',' coord_or_var monster_infos
monster_infos : /* nothing */
{
struct opvar *stopit = New(struct opvar);
set_opvar_int(stopit, SP_M_V_END);
add_opcode(splev, SPO_PUSH, stopit);
$$ = 0x0000;
@@ -1438,25 +1483,25 @@ monster_info : string_expr
| MON_ATTITUDE
{
add_opvars(splev, "ii",
VA_PASS2((long)$<i>1, SP_M_V_PEACEFUL));
VA_PASS2((int) $<i>1, SP_M_V_PEACEFUL));
$$ = 0x0002;
}
| MON_ALERTNESS
{
add_opvars(splev, "ii",
VA_PASS2((long)$<i>1, SP_M_V_ASLEEP));
VA_PASS2((int) $<i>1, SP_M_V_ASLEEP));
$$ = 0x0004;
}
| alignment_prfx
{
add_opvars(splev, "ii",
VA_PASS2((long)$1, SP_M_V_ALIGN));
VA_PASS2((int) $1, SP_M_V_ALIGN));
$$ = 0x0008;
}
| MON_APPEARANCE string_expr
{
add_opvars(splev, "ii",
VA_PASS2((long)$<i>1, SP_M_V_APPEAR));
VA_PASS2((int) $<i>1, SP_M_V_APPEAR));
$$ = 0x0010;
}
| FEMALE_ID
@@ -1512,7 +1557,7 @@ monster_info : string_expr
| SEENTRAPS_ID ':' seen_trap_mask
{
add_opvars(splev, "ii",
VA_PASS2((long)$3, SP_M_V_SEENTRAPS));
VA_PASS2((int) $3, SP_M_V_SEENTRAPS));
$$ = 0x8000;
}
;
@@ -1520,6 +1565,7 @@ monster_info : string_expr
seen_trap_mask : STRING
{
int token = get_trap_type($1);
if (token == ERR || token == 0)
lc_error("Unknown trap type '%s'!", $1);
Free($1);
@@ -1544,14 +1590,18 @@ seen_trap_mask : STRING
object_detail : OBJECT_ID ':' object_desc
{
long cnt = 0;
if (in_container_obj) cnt |= SP_OBJ_CONTENT;
int cnt = 0;
if (in_container_obj)
cnt |= SP_OBJ_CONTENT;
add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT));
}
| COBJECT_ID ':' object_desc
{
long cnt = SP_OBJ_CONTAINER;
if (in_container_obj) cnt |= SP_OBJ_CONTENT;
int cnt = SP_OBJ_CONTAINER;
if (in_container_obj)
cnt |= SP_OBJ_CONTENT;
add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT));
in_container_obj++;
break_stmt_start();
@@ -1591,7 +1641,7 @@ object_infos : /* nothing */
object_info : CURSE_TYPE
{
add_opvars(splev, "ii",
VA_PASS2((long)$1, SP_O_V_CURSE));
VA_PASS2((int) $1, SP_O_V_CURSE));
$$ = 0x0001;
}
| MONTYPE_ID ':' monster_or_var
@@ -1621,7 +1671,7 @@ object_info : CURSE_TYPE
}
| 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;
}
| ERODED_ID ':' integer_or_var
@@ -1647,7 +1697,8 @@ object_info : CURSE_TYPE
}
| 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;
}
| RECHARGED_ID ':' integer_or_var
@@ -1674,7 +1725,7 @@ object_info : CURSE_TYPE
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
{
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
{
add_opvars(splev, "iiio",
VA_PASS4((long)$5, (long)$<i>7,
(long)$8, SPO_MAZEWALK));
VA_PASS4((int) $5, (int) $<i>7,
(int) $8, SPO_MAZEWALK));
}
;
@@ -1735,14 +1786,14 @@ wallify_detail : WALLIFY_ID
ladder_detail : LADDER_ID ':' coord_or_var ',' UP_OR_DOWN
{
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
{
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
{
check_vardef_type(variable_definitions, $1, SPOVAR_STRING);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_STRING);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
| VARSTRING_STRING_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions, $1, SPOVAR_STRING|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_STRING | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
@@ -2071,15 +2123,16 @@ coord_or_var : encodecoord
}
| VARSTRING_COORD
{
check_vardef_type(variable_definitions, $1, SPOVAR_COORD);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_COORD);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
| VARSTRING_COORD_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions, $1, SPOVAR_COORD|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_COORD | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
@@ -2088,7 +2141,8 @@ coord_or_var : encodecoord
encodecoord : '(' INTEGER ',' INTEGER ')'
{
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);
}
| RANDOM_TYPE
@@ -2097,7 +2151,7 @@ encodecoord : '(' INTEGER ',' INTEGER ')'
}
| 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
{
check_vardef_type(variable_definitions, $1, SPOVAR_REGION);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_REGION);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
| VARSTRING_REGION_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions, $1, SPOVAR_REGION|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_REGION | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
@@ -2136,8 +2191,10 @@ region_or_var : encoderegion
encoderegion : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'
{
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));
$$ = r;
@@ -2150,15 +2207,16 @@ mapchar_or_var : mapchar
}
| VARSTRING_MAPCHAR
{
check_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_MAPCHAR);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
| VARSTRING_MAPCHAR_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions, $1, SPOVAR_MAPCHAR|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_MAPCHAR | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
@@ -2190,15 +2248,16 @@ monster_or_var : encodemonster
}
| VARSTRING_MONST
{
check_vardef_type(variable_definitions, $1, SPOVAR_MONST);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_MONST);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
| VARSTRING_MONST_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions, $1, SPOVAR_MONST|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_MONST | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
@@ -2246,15 +2305,16 @@ object_or_var : encodeobj
}
| VARSTRING_OBJ
{
check_vardef_type(variable_definitions, $1, SPOVAR_OBJ);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_OBJ);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
| VARSTRING_OBJ_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions, $1, SPOVAR_OBJ|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_OBJ | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}
@@ -2267,7 +2327,8 @@ encodeobj : STRING
lc_error("Unknown object \"%s\"!", $1);
$$ = -1;
} 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);
}
| CHAR
@@ -2317,17 +2378,17 @@ math_expr_var : INTEGER
}
| VARSTRING_INT
{
check_vardef_type(variable_definitions, $1, SPOVAR_INT);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_INT);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
is_inconstant_number = 1;
}
| VARSTRING_INT_ARRAY '[' math_expr_var ']'
{
check_vardef_type(variable_definitions,
$1, SPOVAR_INT|SPOVAR_ARRAY);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1,
SPOVAR_INT | SPOVAR_ARRAY);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($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.");
break;
}
variable_definitions = add_vardef_type(
variable_definitions,
$1, vt);
vardefs = add_vardef_type( vardefs, $1, vt);
}
Free($1);
}
@@ -2531,8 +2590,8 @@ ter_selection_x : coord_or_var
}
| VARSTRING_SEL
{
check_vardef_type(variable_definitions, $1, SPOVAR_SEL);
vardef_used(variable_definitions, $1);
check_vardef_type(vardefs, $1, SPOVAR_SEL);
vardef_used(vardefs, $1);
add_opvars(splev, "v", VA_PASS1($1));
Free($1);
}

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 */
/* NetHack may be freely redistributed. See license for details. */
@@ -226,7 +226,7 @@ extern int nh_line_number;
extern int token_start_pos;
extern char curr_token[512];
struct lc_vardefs *variable_definitions = NULL;
struct lc_vardefs *vardefs = NULL;
struct lc_funcdefs *function_definitions = NULL;
extern int allow_break_statements;
@@ -641,9 +641,18 @@ VA_DECL2(sp_lev *, sp, const char *, fmt)
switch (*p) {
case ' ':
break;
case 'i': /* integer */
case 'i': /* integer (via plain 'int') */
{
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));
add_opcode(sp, SPO_PUSH, ov);
break;
@@ -1105,8 +1114,8 @@ char *ldfname;
(*splev)->n_opcodes = 0;
(*splev)->opcodes = NULL;
vardef_free_all(variable_definitions);
variable_definitions = NULL;
vardef_free_all(vardefs);
vardefs = NULL;
}
/*
@@ -1436,7 +1445,7 @@ sp_lev *sp;
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));
for (dy = 0; dy < max_hig; dy++)