/* simpler form of the same thing. */
/* */
/* 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 */
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;
/* 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;
finish_array(i, is_static);
if (debugfile_switch)
- { debug_file_printf("<array>");
+ {
+ int32 new_area_size;
+ debug_file_printf("<array>");
debug_file_printf("<identifier>%s</identifier>", global_name);
debug_file_printf("<value>");
write_debug_array_backpatch(svals[global_symbol]);
debug_file_printf("</value>");
- 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
("<byte-count>%d</byte-count>",
new_area_size - array_base);
/* "asm" : The Inform assembler */
/* */
/* 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 */
/* correcting symbol values not known at compilation time */
/* */
/* 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 */
/* "chars" : Character set mappings and the Z-machine alphabet table */
/* */
/* 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 */
/* "directs" : Directives (# commands) */
/* */
/* 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 */
if ((token_type == SEP_TT) && (token_value == SEMICOLON_SEP))
return FALSE;
- /* Z-code has a 64-abbrev limit; Glulx doesn't. */
- if (!glulx_mode && no_abbreviations==64)
- { error("All 64 abbreviations already declared");
+ if (!glulx_mode && no_abbreviations==96)
+ { error("All 96 Z-machine abbreviations already declared");
panic_mode_error_recovery(); return FALSE;
}
if (no_abbreviations==MAX_ABBREVS)
{ error("'LowString' cannot be used in -M (Module) mode");
panic_mode_error_recovery(); return FALSE;
}
+ if (glulx_mode) {
+ error("The LowString directive has no meaning in Glulx.");
+ panic_mode_error_recovery(); return FALSE;
+ }
get_next_token(); i = token_value;
if (token_type != SYMBOL_TT)
return ebf_error_recover("new low string name", token_text);
/* (with error throwback code for RISC OS machines) */
/* */
/* 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 */
static char *location_text(brief_location report_line)
{
+ int j;
+ char *p;
+ int len;
+
/* Convert the location to a brief string.
(Some error messages need to report a secondary location.)
This uses the static buffer other_pos_buff. */
errpos.main_flag = 0;
errpos.orig_source = NULL;
export_brief_location(report_line, &errpos);
-
- int j;
- char *p;
j = errpos.file_number;
if (j <= 0 || j > total_files) p = errpos.source;
if (!p) p = "";
- int len = 0;
+ len = 0;
if (!(errpos.main_flag)) {
snprintf(other_pos_buff+len, ERROR_BUFLEN-len,
/* "expressc" : The expression code generator */
/* */
/* 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 */
/* "expressp" : The expression parser */
/* */
/* 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 */
/* settings and are very host OS-dependent. */
/* */
/* 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 */
extern int register_orig_sourcefile(char *filename)
{
int ix;
+ char *name;
/* If the filename has already been used as an origsource filename,
return that entry. We check the most-recently-used file first, and
/* This filename has never been used before. Allocate a new InputFiles
entry. */
- char *name = filename; /* no translation */
+ name = filename; /* no translation */
if (total_files == MAX_SOURCE_FILES)
memoryerror("MAX_SOURCE_FILES", MAX_SOURCE_FILES);
/* Inform 6.35 */
/* */
/* This header file and the others making up the Inform source code are */
-/* copyright (c) Graham Nelson 1993 - 2020 */
+/* copyright (c) Graham Nelson 1993 - 2021 */
/* */
/* This file is part of Inform. */
/* */
MAX_EXPRESSION_NODES, MAX_LABELS, MAX_LINESPACE,
MAX_LOW_STRINGS, MAX_CLASSES, MAX_VERBS,
MAX_VERBSPACE, MAX_ARRAYS, MAX_INCLUSION_DEPTH,
- MAX_SOURCE_FILES;
+ MAX_SOURCE_FILES, MAX_DYNAMIC_STRINGS;
extern int32 MAX_STATIC_STRINGS, MAX_ZCODE_SIZE, MAX_LINK_DATA_SIZE,
MAX_TRANSCRIPT_SIZE, MAX_INDIV_PROP_TABLE_SIZE,
extern int32 no_strings, no_dynamic_strings;
extern int no_unicode_chars;
-#define MAX_DYNAMIC_STRINGS (64)
-
typedef struct unicode_usage_s unicode_usage_t;
struct unicode_usage_s {
int32 ch;
/* conventions, ICL (Inform Command Line) files, main */
/* */
/* 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 */
DICT_ENTRY_FLAG_POS = (4+DICT_WORD_BYTES);
}
}
+
+ if (!targ) {
+ /* Z-machine */
+ /* The Z-machine's 96 abbreviations are used for these two purposes.
+ Make sure they are set consistently. If exactly one has been
+ set non-default, set the other to match. */
+ if (MAX_DYNAMIC_STRINGS == 32 && MAX_ABBREVS != 64) {
+ MAX_DYNAMIC_STRINGS = 96 - MAX_ABBREVS;
+ }
+ if (MAX_ABBREVS == 64 && MAX_DYNAMIC_STRINGS != 32) {
+ MAX_ABBREVS = 96 - MAX_DYNAMIC_STRINGS;
+ }
+ if (MAX_ABBREVS + MAX_DYNAMIC_STRINGS != 96
+ || MAX_ABBREVS < 0
+ || MAX_DYNAMIC_STRINGS < 0) {
+ warning("MAX_ABBREVS plus MAX_DYNAMIC_STRINGS must be 96 in Z-code; resetting both");
+ MAX_DYNAMIC_STRINGS = 32;
+ MAX_ABBREVS = 64;
+ }
+ }
+ else {
+ if (MAX_DYNAMIC_STRINGS > 100) {
+ MAX_DYNAMIC_STRINGS = 100;
+ warning("MAX_DYNAMIC_STRINGS cannot exceed 100; resetting to 100");
+ /* This is because they are specified in text literals like "@00",
+ with two digits. */
+ }
+ }
}
/* ------------------------------------------------------------------------- */
printf(
"\nThis program is a compiler of Infocom format (also called \"Z-machine\")\n\
story files, as well as \"Glulx\" story files:\n\
-Copyright (c) Graham Nelson 1993 - 2020.\n\n");
+Copyright (c) Graham Nelson 1993 - 2021.\n\n");
/* For people typing just "inform", a summary only: */
for (i=1, cli_files_specified=0; i<argc; i++)
if (argv[i][0] == '-' && argv[i][1] == '-') {
char *nextarg = NULL;
+ int consumed2;
if (i+1 < argc) nextarg = argv[i+1];
- int consumed2 = execute_dashdash_command(argv[i]+2, nextarg);
+ consumed2 = execute_dashdash_command(argv[i]+2, nextarg);
if (consumed2 && i+1 < argc) {
i++;
}
/* "lexer" : Lexical analyser */
/* */
/* 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 */
extern void set_origsource_location(char *source, int32 line, int32 charnum)
{
+ int file_no;
+
if (!source) {
/* Clear the Origsource declaration. */
CurrentLB->orig_file = 0;
}
/* Get the file number for a new or existing InputFiles entry. */
- int file_no = register_orig_sourcefile(source);
+ file_no = register_orig_sourcefile(source);
CurrentLB->orig_file = file_no;
CurrentLB->orig_source = InputFiles[file_no-1].filename;
/* "linker" : For compiling and linking modules */
/* */
/* 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 */
/* (For "memoryerror", see "errors.c") */
/* */
/* 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 */
int MAX_STATIC_DATA;
int MAX_PROP_TABLE_SIZE;
int MAX_ABBREVS;
+int MAX_DYNAMIC_STRINGS;
int MAX_EXPRESSION_NODES;
int MAX_VERBS;
int MAX_VERBSPACE;
static int DICT_WORD_SIZE_z, DICT_WORD_SIZE_g;
static int NUM_ATTR_BYTES_z, NUM_ATTR_BYTES_g;
static int ALLOC_CHUNK_SIZE_z, ALLOC_CHUNK_SIZE_g;
+static int MAX_DYNAMIC_STRINGS_z, MAX_DYNAMIC_STRINGS_g;
/* ------------------------------------------------------------------------- */
/* Memory control from the command line */
printf("| %25s = %-7d |\n","DICT_WORD_SIZE",DICT_WORD_SIZE);
if (glulx_mode)
printf("| %25s = %-7d |\n","DICT_CHAR_SIZE",DICT_CHAR_SIZE);
+ printf("| %25s = %-7d |\n","MAX_DYNAMIC_STRINGS",MAX_DYNAMIC_STRINGS);
printf("| %25s = %-7d |\n","MAX_EXPRESSION_NODES",MAX_EXPRESSION_NODES);
printf("| %25s = %-7d |\n","MAX_GLOBAL_VARIABLES",MAX_GLOBAL_VARIABLES);
printf("| %25s = %-7d |\n","HASH_TAB_SIZE",HASH_TAB_SIZE);
MAX_PROP_TABLE_SIZE_z = 30000;
MAX_PROP_TABLE_SIZE_g = 60000;
- MAX_ABBREVS = 64;
-
MAX_EXPRESSION_NODES = 100;
MAX_VERBS = 200;
MAX_VERBSPACE = 4096;
MAX_PROP_TABLE_SIZE_z = 15000;
MAX_PROP_TABLE_SIZE_g = 30000;
- MAX_ABBREVS = 64;
-
MAX_EXPRESSION_NODES = 100;
MAX_VERBS = 140;
MAX_VERBSPACE = 4096;
MAX_PROP_TABLE_SIZE_z = 8000;
MAX_PROP_TABLE_SIZE_g = 16000;
- MAX_ABBREVS = 64;
-
MAX_EXPRESSION_NODES = 40;
MAX_VERBS = 110;
MAX_VERBSPACE = 2048;
DICT_WORD_SIZE_g = 9;
NUM_ATTR_BYTES_z = 6;
NUM_ATTR_BYTES_g = 7;
+ MAX_ABBREVS = 64;
+ MAX_DYNAMIC_STRINGS_z = 32;
+ MAX_DYNAMIC_STRINGS_g = 64;
/* Backwards-compatible behavior: allow for a unicode table
whether we need one or not. The user can set this to zero if
there's no unicode table. */
DICT_WORD_SIZE = DICT_WORD_SIZE_z;
NUM_ATTR_BYTES = NUM_ATTR_BYTES_z;
ALLOC_CHUNK_SIZE = ALLOC_CHUNK_SIZE_z;
+ MAX_DYNAMIC_STRINGS = MAX_DYNAMIC_STRINGS_z;
INDIV_PROP_START = 64;
}
else {
DICT_WORD_SIZE = DICT_WORD_SIZE_g;
NUM_ATTR_BYTES = NUM_ATTR_BYTES_g;
ALLOC_CHUNK_SIZE = ALLOC_CHUNK_SIZE_g;
+ MAX_DYNAMIC_STRINGS = MAX_DYNAMIC_STRINGS_g;
INDIV_PROP_START = 256;
}
}
if (strcmp(command,"MAX_ABBREVS")==0)
{ printf(
" MAX_ABBREVS is the maximum number of declared abbreviations. It is not \n\
- allowed to exceed 64.\n");
+ allowed to exceed 96 in Z-code.\n");
+ return;
+ }
+ if (strcmp(command,"MAX_DYNAMIC_STRINGS")==0)
+ { printf(
+" MAX_DYNAMIC_STRINGS is the maximum number of string substitution variables\n\
+ (\"@00\"). It is not allowed to exceed 96 in Z-code or 100 in Glulx.\n");
return;
}
if (strcmp(command,"MAX_ARRAYS")==0)
flag=2;
if (strcmp(command,"MAX_ABBREVS")==0)
MAX_ABBREVS=j, flag=1;
+ if (strcmp(command,"MAX_DYNAMIC_STRINGS")==0)
+ { MAX_DYNAMIC_STRINGS=j, flag=1;
+ MAX_DYNAMIC_STRINGS_g=MAX_DYNAMIC_STRINGS_z=j;
+ }
if (strcmp(command,"MAX_ARRAYS")==0)
MAX_ARRAYS=j, flag=1;
if (strcmp(command,"MAX_EXPRESSION_NODES")==0)
/* specifications for the object-maker. */
/* */
/* 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 */
if (token_type == SEGMENT_MARKER_TT) { put_token_back(); break; }
if ((!individual_property) && (property_number==1)
- && (token_type != SQ_TT) && (token_type != DQ_TT)
+ && ((token_type != SQ_TT) || (strlen(token_text) <2 ))
+ && (token_type != DQ_TT)
)
warning ("'name' property should only contain dictionary words");
/* "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 */
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)
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);
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)
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);
/* "symbols" : The symbols table; creating stock of reserved words */
/* */
/* 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 */
{
df_function_t *func;
int count;
+ int beg;
+ int end;
if (!track_unused_routines)
compiler_error("DF: df_stripped_offset_for_code_offset called, but function references have not been mapped");
/* Do a binary search. Maintain beg <= res < end, where res is the
function containing the desired address. */
- int beg = 0;
- int end = df_functions_sorted_count;
+ beg = 0;
+ end = df_functions_sorted_count;
/* Set stripped flag until we decide on a non-stripped function. */
*stripped = TRUE;
while (1) {
+ int new;
if (beg >= end) {
error("DF: offset_for_code_offset: Could not locate address.");
return 0;
*stripped = FALSE;
return func->newaddress + (offset - func->address);
}
- int new = (beg + end) / 2;
+ new = (beg + end) / 2;
if (new <= beg || new >= end)
compiler_error("DF: binary search went off the rails");
/* "syntax" : Syntax analyser and compiler */
/* */
/* 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 */
/* tables. */
/* */
/* 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 */
p[0x42+i]=low_strings[i];
abbrevs_at = mark;
- for (i=0; i<3*32; i++) /* Initially all 96 entries */
- { p[mark++]=0; p[mark++]=0x20; /* are set to " " */
+
+ if (MAX_ABBREVS + MAX_DYNAMIC_STRINGS != 96)
+ fatalerror("MAX_ABBREVS + MAX_DYNAMIC_STRINGS is not 96");
+
+ /* Initially all 96 entries are set to " ". (We store half of 0x40,
+ the address of the " " we wrote above.) */
+ for (i=0; i<3*32; i++)
+ { p[mark++]=0; p[mark++]=0x20;
}
- for (i=0; i<no_abbreviations; i++) /* Write any abbreviations */
- { j=abbrev_values[i]; /* into banks 2 and 3 */
- p[abbrevs_at+64+2*i]=j/256; /* (bank 1 is reserved for */
- p[abbrevs_at+65+2*i]=j%256; /* "variable strings") */
+
+ /* Entries from 0 to MAX_DYNAMIC_STRINGS (default 32) are "variable
+ strings". Write the abbreviations after these. */
+ k = abbrevs_at+2*MAX_DYNAMIC_STRINGS;
+ for (i=0; i<no_abbreviations; i++)
+ { j=abbrev_values[i];
+ p[k++]=j/256;
+ p[k++]=j%256;
}
/* ------------------- Header extension table ------------------------- */
/* "text" : Text translation, the abbreviations optimiser, the dictionary */
/* */
/* 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 */
text buffer holding the entire text
of the game, when it is being
recorded */
-int put_strings_in_low_memory, /* When TRUE, put static strings in
- the low strings pool at 0x100 rather
- than in the static strings area */
- is_abbreviation, /* When TRUE, the string being trans
+int is_abbreviation, /* When TRUE, the string being trans
is itself an abbreviation string
so can't make use of abbreviations */
abbrevs_lookup_table_made, /* The abbreviations lookup table is
if ((economy_switch) && (!is_abbreviation)
&& ((k=abbrevs_lookup[text_in[i]])!=-1))
{ if ((j=try_abbreviations_from(text_in, i, k))!=-1)
- { if (j<32) { write_z_char_z(2); write_z_char_z(j); }
- else { write_z_char_z(3); write_z_char_z(j-32); }
+ { /* abbreviations run from MAX_DYNAMIC_STRINGS to 96 */
+ j += MAX_DYNAMIC_STRINGS;
+ write_z_char_z(j/32+1); write_z_char_z(j%32);
}
}
else if (isdigit(text_in[i+1])!=0)
{ int d1, d2;
- /* @.. */
+ /* @.. (dynamic string) */
d1 = character_digit_value[text_in[i+1]];
d2 = character_digit_value[text_in[i+2]];
if ((d1 == 127) || (d1 >= 10) || (d2 == 127) || (d2 >= 10))
error("'@..' must have two decimal digits");
else
- { i+=2;
- write_z_char_z(1); write_z_char_z(d1*10 + d2);
+ {
+ j = d1*10 + d2;
+ if (!glulx_mode && j >= 96)
+ { error("Z-machine dynamic strings are limited to 96");
+ j = 0;
+ }
+ if (j >= MAX_DYNAMIC_STRINGS) {
+ memoryerror("MAX_DYNAMIC_STRINGS", MAX_DYNAMIC_STRINGS);
+ j = 0;
+ }
+ i+=2;
+ write_z_char_z(j/32+1); write_z_char_z(j%32);
}
}
else
grandflags = NULL;
no_chars_transcribed = 0;
is_abbreviation = FALSE;
- put_strings_in_low_memory = FALSE;
for (j=0; j<256; j++) abbrevs_lookup[j] = -1;
/* provide */
/* */
/* 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 */
/* Verb and Extend. */
/* */
/* 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 */