X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fmemory.c;h=6b817274161d7bacaa5f61a576bfd701155bb347;hb=c881aa3386c00d7021ffabf2f66275d6c110c1c1;hp=fc8a446f1c7d83219231d063054be2d2bd8b5024;hpb=81ffe9a7de1db0b3a318a053b38882d1b7ab304c;p=inform.git diff --git a/src/memory.c b/src/memory.c index fc8a446..6b81727 100644 --- a/src/memory.c +++ b/src/memory.c @@ -2,9 +2,8 @@ /* "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 */ @@ -17,7 +16,7 @@ /* 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/ * /* */ /* ------------------------------------------------------------------------- */ @@ -170,6 +169,14 @@ extern void my_free(void *pointer, char *whatitwas) /* ------------------------------------------------------------------------- */ /* 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]; @@ -179,6 +186,7 @@ static char *chunk_name(memory_block *MB, int no) 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); @@ -247,6 +255,7 @@ int MAX_DICT_ENTRIES; 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; @@ -291,6 +300,7 @@ static int MAX_LOCAL_VARIABLES_z, MAX_LOCAL_VARIABLES_g; 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 */ @@ -311,6 +321,7 @@ static void list_memory_sizes(void) 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); @@ -388,8 +399,6 @@ extern void set_memory_sizes(int size_flag) 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; @@ -438,8 +447,6 @@ extern void set_memory_sizes(int size_flag) 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; @@ -488,8 +495,6 @@ extern void set_memory_sizes(int size_flag) 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; @@ -531,6 +536,9 @@ extern void set_memory_sizes(int size_flag) 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. */ @@ -561,6 +569,7 @@ extern void adjust_memory_sizes() 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 { @@ -571,6 +580,7 @@ extern void adjust_memory_sizes() 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; } } @@ -688,7 +698,13 @@ static void explain_parameter(char *command) 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) @@ -1025,6 +1041,10 @@ extern void memory_command(char *command) 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)