X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Farrays.c;h=4c8f56feac5672331da185a4c0b9110eebd30991;hb=c881aa3386c00d7021ffabf2f66275d6c110c1c1;hp=fc4f7af2c5e6abb7f1f951920138bf7dbdfd991a;hpb=e536ce9e39cc1bfa82ecd1d6d73f874af655f9db;p=inform.git diff --git a/src/arrays.c b/src/arrays.c index fc4f7af..4c8f56f 100644 --- a/src/arrays.c +++ b/src/arrays.c @@ -3,9 +3,8 @@ /* likewise global variables, which are in some ways a */ /* simpler form of the same thing. */ /* */ -/* Copyright (c) Graham Nelson 1993 - 2020 */ -/* */ -/* This file is part of Inform. */ +/* Part of Inform 6.35 */ +/* copyright (c) Graham Nelson 1993 - 2021 */ /* */ /* Inform is free software: you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ @@ -95,6 +94,10 @@ extern void finish_array(int32 i, int is_static) area = static_array_area; area_size = static_array_area_size; } + + if (i == 0) { + error("An array must have at least one entry"); + } /* Write the array size into the 0th byte/word of the array, if it's a "table" or "string" array */ @@ -259,7 +262,7 @@ extern void array_entry(int32 i, int is_static, assembly_operand VAL) /* */ /* | -> | */ /* | --> | ... */ -/* | string | [ [,] [;] ... ]; */ +/* | string | [ [;] ... ]; */ /* | table */ /* | buffer */ /* */ @@ -289,6 +292,9 @@ extern void make_global(int array_flag, int name_only) int array_type, data_type; int is_static = FALSE; assembly_operand AO; + + int extraspace; + int orig_area_size; int32 global_symbol; const char *global_name; @@ -311,7 +317,7 @@ extern void make_global(int array_flag, int name_only) goto RedefinitionOfSystemVar; } - if ((token_type != SYMBOL_TT) || (!(sflags[i] & UNKNOWN_SFLAG))) + if (token_type != SYMBOL_TT) { discard_token_location(beginning_debug_location); if (array_flag) ebf_error("new array name", token_text); @@ -319,6 +325,14 @@ extern void make_global(int array_flag, int name_only) panic_mode_error_recovery(); return; } + if (!(sflags[i] & UNKNOWN_SFLAG)) + { discard_token_location(beginning_debug_location); + if (array_flag) + ebf_symbol_error("new array name", token_text, typename(stypes[i]), slines[i]); + else ebf_symbol_error("new global variable name", token_text, typename(stypes[i]), slines[i]); + panic_mode_error_recovery(); return; + } + if ((!array_flag) && (sflags[i] & USED_SFLAG)) error_named("Variable must be defined before use:", token_text); @@ -514,13 +528,11 @@ extern void make_global(int array_flag, int name_only) /* Leave room to write the array size in later, if string/table array */ - int extraspace = 0; + extraspace = 0; if ((array_type==STRING_ARRAY) || (array_type==TABLE_ARRAY)) extraspace += array_entry_size; if (array_type==BUFFER_ARRAY) extraspace += WORDSIZE; - - int orig_area_size; if (!is_static) { orig_area_size = dynamic_array_area_size; @@ -544,8 +556,8 @@ extern void make_global(int array_flag, int name_only) CalculatedArraySize: - if (module_switch && (AO.marker != 0)) - { error("Array sizes must be known now, not externally defined"); + if (AO.marker != 0) + { error("Array sizes must be known now, not defined later"); break; } @@ -682,12 +694,14 @@ advance as part of 'Zcharacter table':", unicode); finish_array(i, is_static); if (debugfile_switch) - { debug_file_printf(""); + { + int32 new_area_size; + debug_file_printf(""); debug_file_printf("%s", global_name); debug_file_printf(""); write_debug_array_backpatch(svals[global_symbol]); debug_file_printf(""); - int32 new_area_size = (!is_static ? dynamic_array_area_size : static_array_area_size); + new_area_size = (!is_static ? dynamic_array_area_size : static_array_area_size); debug_file_printf ("%d", new_area_size - array_base);