/* "memory" : Memory management and ICL memory setting commands */
/* (For "memoryerror", see "errors.c") */
/* */
-/* Copyright (c) Graham Nelson 1993 - 2018 */
-/* */
-/* 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 */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
-/* along with Inform. If not, see https://gnu.org/licenses/ */
+/* along with Inform. If not, see https://gnu.org/licenses/ *
/* */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* Extensible blocks of memory, providing a kind of RAM disc as an */
/* alternative to the temporary files option */
+/* */
+/* The allocation is slightly confusing. A block can store up to 72 */
+/* chunks, which are allocated as needed when data is written. (Data does */
+/* not have to be written in order, but you should not try to read a byte */
+/* before writing it.) The size of a chunk is defined by ALLOC_CHUNK_SIZE. */
+/* So any block can store any amount of data, but you increase the limit */
+/* (for all blocks) by increasing ALLOC_CHUNK_SIZE, not the number of */
+/* chunks. */
/* ------------------------------------------------------------------------- */
static char chunk_name_buffer[60];
if (MB == &zcode_area) p = "Z-code area";
if (MB == &link_data_area) p = "link data area";
if (MB == &zcode_backpatch_table) p = "Z-code backpatch table";
+ if (MB == &staticarray_backpatch_table) p = "Static array backpatch table";
if (MB == &zmachine_backpatch_table) p = "Z-machine backpatch table";
sprintf(chunk_name_buffer, "%s chunk %d", p, no);
return(chunk_name_buffer);
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)