X-Git-Url: https://jxself.org/git/?p=inform.git;a=blobdiff_plain;f=src%2Fstates.c;fp=src%2Fstates.c;h=3f0e8740a09a85b90266f8d603a2e1a74fc816e4;hp=8feb6a765148e61c1c0c4f8c9021a3994f7146e7;hb=c881aa3386c00d7021ffabf2f66275d6c110c1c1;hpb=8760c1ba6442153afe76bcac742e086f90c59fe8 diff --git a/src/states.c b/src/states.c index 8feb6a7..3f0e874 100644 --- a/src/states.c +++ b/src/states.c @@ -2,7 +2,7 @@ /* "states" : Statement translator */ /* */ /* Part of Inform 6.35 */ -/* copyright (c) Graham Nelson 1993 - 2020 */ +/* 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 */ @@ -1191,6 +1191,14 @@ static void parse_statement_z(int break_label, int continue_label) statements.enabled = TRUE; get_next_token(); + + /* An #if directive around the ELSE clause is legal. */ + while ((token_type == SEP_TT) && (token_value == HASH_SEP)) + { parse_directive(TRUE); + statements.enabled = TRUE; + get_next_token(); + } + if ((token_type == STATEMENT_TT) && (token_value == ELSE_CODE)) { flag = TRUE; if (ln >= 0) @@ -1589,6 +1597,15 @@ static void parse_statement_z(int break_label, int continue_label) assemblez_2_to(loadw_zc, AO, AO2, AO3); AO2 = code_generate(parse_expression(QUANTITY_CONTEXT), QUANTITY_CONTEXT, -1); + if (is_constant_ot(AO2.type) && AO2.marker == 0) { + if (AO2.value >= 96) + { error("Z-machine dynamic strings are limited to 96"); + AO2.value = 0; + } + if (AO2.value < 0 || AO2.value >= MAX_DYNAMIC_STRINGS) { + memoryerror("MAX_DYNAMIC_STRINGS", MAX_DYNAMIC_STRINGS); + } + } get_next_token(); if (token_type == DQ_TT) { INITAOT(&AO4, LONG_CONSTANT_OT); @@ -2165,6 +2182,14 @@ static void parse_statement_g(int break_label, int continue_label) statements.enabled = TRUE; get_next_token(); + + /* An #if directive around the ELSE clause is legal. */ + while ((token_type == SEP_TT) && (token_value == HASH_SEP)) + { parse_directive(TRUE); + statements.enabled = TRUE; + get_next_token(); + } + if ((token_type == STATEMENT_TT) && (token_value == ELSE_CODE)) { flag = TRUE; if (ln >= 0) @@ -2513,6 +2538,11 @@ static void parse_statement_g(int break_label, int continue_label) case STRING_CODE: AO2 = code_generate(parse_expression(QUANTITY_CONTEXT), QUANTITY_CONTEXT, -1); + if (is_constant_ot(AO2.type) && AO2.marker == 0) { + if (AO2.value < 0 || AO2.value >= MAX_DYNAMIC_STRINGS) { + memoryerror("MAX_DYNAMIC_STRINGS", MAX_DYNAMIC_STRINGS); + } + } get_next_token(); if (token_type == DQ_TT) { INITAOT(&AO4, CONSTANT_OT);