From: PatR Date: Wed, 28 Nov 2018 02:21:58 +0000 (-0800) Subject: lev_comp int vs long X-Git-Tag: nmake-explicit-path~139 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5d2686e7c150377c6dffd89483969ad80b196339;p=nethack 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. --- diff --git a/doc/fixes36.2 b/doc/fixes36.2 index 9c54cd357..b840669b2 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -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 diff --git a/include/sp_lev.h b/include/sp_lev.h index 7d5b7bf0d..804fbc632 100644 --- a/include/sp_lev.h +++ b/include/sp_lev.h @@ -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 diff --git a/include/tradstdc.h b/include/tradstdc.h index 5e5cbd7c2..d1b1f250c 100644 --- a/include/tradstdc.h +++ b/include/tradstdc.h @@ -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); \ } diff --git a/util/lev_comp.l b/util/lev_comp.l index d6ae1472e..8866e3f6f 100644 --- a/util/lev_comp.l +++ b/util/lev_comp.l @@ -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); diff --git a/util/lev_comp.y b/util/lev_comp.y index 9122ca5d5..494f694d8 100644 --- a/util/lev_comp.y +++ b/util/lev_comp.y @@ -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 MSG_OUTPUT_TYPE %token COMPARE_TYPE %token UNKNOWN_TYPE -%token rect_ID fillrect_ID line_ID randline_ID grow_ID selection_ID flood_ID +%token rect_ID fillrect_ID line_ID randline_ID grow_ID +%token selection_ID flood_ID %token rndcoord_ID circle_ID ellipse_ID filter_ID complement_ID %token gradient_ID GRADIENT_TYPE LIMITED HUMIDITY_TYPE %token ',' ':' '(' ')' '[' ']' '{' '}' @@ -247,12 +249,14 @@ extern char curr_token[512]; %type dir_list teleprt_detail %type object_infos object_info monster_infos monster_info %type levstatements stmt_block region_detail_end -%type engraving_type flag_list roomregionflag roomregionflags optroomregionflags +%type engraving_type flag_list roomregionflag roomregionflags +%type optroomregionflags %type humidity_flags %type comparestmt encodecoord encoderegion mapchar %type seen_trap_mask %type encodemonster encodeobj encodeobj_list -%type integer_list string_list encodecoord_list encoderegion_list mapchar_list encodemonster_list +%type integer_list string_list encodecoord_list encoderegion_list +%type mapchar_list encodemonster_list %type opt_percent opt_fillchar %type all_integers %type 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)$1, SP_M_V_PEACEFUL)); + VA_PASS2((int) $1, SP_M_V_PEACEFUL)); $$ = 0x0002; } | MON_ALERTNESS { add_opvars(splev, "ii", - VA_PASS2((long)$1, SP_M_V_ASLEEP)); + VA_PASS2((int) $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)$1, SP_M_V_APPEAR)); + VA_PASS2((int) $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)$7, - (long)$8, SPO_MAZEWALK)); + VA_PASS4((int) $5, (int) $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)$5, SPO_LADDER)); + VA_PASS2((int) $5, SPO_LADDER)); } ; stair_detail : STAIR_ID ':' coord_or_var ',' UP_OR_DOWN { add_opvars(splev, "io", - VA_PASS2((long)$5, SPO_STAIR)); + VA_PASS2((int) $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); } diff --git a/util/lev_main.c b/util/lev_main.c index ecf7a444c..8bcfc8365 100644 --- a/util/lev_main.c +++ b/util/lev_main.c @@ -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++)