Update to commit e2647ad952b4d7afc9a186429c181efbc4958786
[inform.git] / src / header.h
1 /* ------------------------------------------------------------------------- */
2 /*   Header file for Inform:  Z-machine ("Infocom" format) compiler          */
3 /*                                                                           */
4 /*                              Inform 6.35                                  */
5 /*                                                                           */
6 /*   This header file and the others making up the Inform source code are    */
7 /*   copyright (c) Graham Nelson 1993 - 2020                                 */
8 /*                                                                           */
9 /* This file is part of Inform.                                              */
10 /*                                                                           */
11 /* Inform is free software: you can redistribute it and/or modify            */
12 /* it under the terms of the GNU General Public License as published by      */
13 /* the Free Software Foundation, either version 3 of the License, or         */
14 /* (at your option) any later version.                                       */
15 /*                                                                           */
16 /* Inform is distributed in the hope that it will be useful,                 */
17 /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
18 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the              */
19 /* GNU General Public License for more details.                              */
20 /*                                                                           */
21 /* You should have received a copy of the GNU General Public License         */
22 /* along with Inform. If not, see https://gnu.org/licenses/                  */
23 /*                                                                           */
24 /*   For detailed documentation on how this program internally works, and    */
25 /*   how to port it to a new environment, see the Technical Manual.          */
26 /*                                                                           */
27 /*   *** To compile this program in one of the existing ports, you must      */
28 /*       at least change the machine definition (on the next page).          */
29 /*       In most cases no other work will be needed. ***                     */
30 /*                                                                           */
31 /*   Contents:                                                               */
32 /*                                                                           */
33 /*       Machine/host OS definitions (in alphabetical order)                 */
34 /*       Default definitions                                                 */
35 /*       Standard ANSI inclusions, macro definitions, structures             */
36 /*       Definitions of internal code numbers                                */
37 /*       Extern declarations for linkage (in alphabetical order of file)     */
38 /*                                                                           */
39 /* ------------------------------------------------------------------------- */
40
41 /* For releases, set to the release date in the form "1st January 2000" */
42 #define RELEASE_DATE "in development"
43 #define RELEASE_NUMBER 1635
44 #define GLULX_RELEASE_NUMBER 38
45 #define MODULE_VERSION_NUMBER 1
46 #define VNUMBER RELEASE_NUMBER
47
48 /* N indicates an intermediate release for Inform 7 */
49 /*#define RELEASE_SUFFIX "N"*/
50
51 /* ------------------------------------------------------------------------- */
52 /*   Our host machine or OS for today is...                                  */
53 /*                                                                           */
54 /*   [ Inform should compile (possibly with warnings) and work safely        */
55 /*     if you just:                                                          */
56 /*                                                                           */
57 /*     #define AMIGA       -  for the Commodore Amiga under SAS/C            */
58 /*     #define ARCHIMEDES  -  for Acorn RISC OS machines under Norcroft C    */
59 /*     #define ATARIST     -  for the Atari ST                               */
60 /*     #define BEOS        -  for the BeBox                                  */
61 /*     #define LINUX       -  for Linux under gcc (essentially as Unix)      */
62 /*     #define MACOS       -  for the Apple Mac with OS X (another Unix)     */
63 /*     #define MAC_CLASSIC -  for the Apple Mac under Think C or Codewarrior */
64 /*     #define MAC_MPW     -  for MPW under Codewarrior (and maybe Think C)  */
65 /*     #define OS2         -  for OS/2 32-bit mode under IBM's C Set++       */
66 /*     #define PC          -  for 386+ IBM PCs, eg. Microsoft Visual C/C++   */
67 /*     #define PC_QUICKC   -  for small IBM PCs under QuickC                 */
68 /*     #define PC_WIN32    -  for Borland C++ or Microsoft Visual C++        */
69 /*     #define UNIX        -  for Unix under gcc (or big IBM PC under djgpp) */
70 /*     #define VMS         -  for VAX or ALPHA under DEC C, but not VAX C    */
71 /*                                                                           */
72 /*     In most cases executables are already available at                    */
73 /*     http://www.ifarchive.org/, and these are sometimes enhanced with      */
74 /*     e.g. windowed interfaces whose source is not archived with the        */
75 /*     main Inform source.]                                                  */
76 /*                                                                           */
77 /*   (If no machine is defined, then cautious #defines will be made.  In     */
78 /*   most cases, porting to a new machine is a matter of carefully filling   */
79 /*   out a block of definitions like those below.)                           */
80 /* ------------------------------------------------------------------------- */
81
82 /* #define UNIX */
83
84 /* ------------------------------------------------------------------------- */
85 /*   The first task is to include the ANSI header files, and typedef         */
86 /*   suitable 32-bit integer types.                                          */
87 /* ------------------------------------------------------------------------- */
88
89 #include <stdio.h>
90 #include <stdlib.h>
91 #include <stdarg.h>
92 #include <ctype.h>
93 #include <string.h>
94 #include <time.h>
95 #include <limits.h>
96 #include <math.h>
97
98 #ifndef VAX
99 #if   SCHAR_MAX >= 0x7FFFFFFFL && SCHAR_MIN <= -0x7FFFFFFFL
100       typedef signed char       int32;
101       typedef unsigned char     uint32;
102 #elif SHRT_MAX >= 0x7FFFFFFFL  && SHRT_MIN <= -0x7FFFFFFFL
103       typedef signed short int  int32;
104       typedef unsigned short int uint32;
105 #elif INT_MAX >= 0x7FFFFFFFL   && INT_MIN <= -0x7FFFFFFFL
106       typedef signed int        int32;
107       typedef unsigned int      uint32;
108 #elif LONG_MAX >= 0x7FFFFFFFL  && LONG_MIN <= -0x7FFFFFFFL
109       typedef signed long int   int32;
110       typedef unsigned long int uint32;
111 #else
112 #error No type large enough to support 32-bit integers.
113 #endif
114 #else
115       /*  VAX C does not provide these limit constants, contrary to ANSI  */
116       typedef int int32;
117       typedef unsigned int uint32;
118 #endif
119
120 /* ------------------------------------------------------------------------- */
121 /*   The next part of this file contains blocks of definitions, one for      */
122 /*   each port, of machine or OS-dependent constants needed by Inform.       */
123 /*                                                                           */
124 /*   1. MACHINE_STRING should be set to the name of the machine or OS.       */
125 /*                                                                           */
126 /*   2. Some miscellaneous #define options (set if the constant is           */
127 /*   defined, otherwise not set):                                            */
128 /*                                                                           */
129 /*   USE_TEMPORARY_FILES - use scratch files for workspace, not memory,      */
130 /*                         by default                                        */
131 /*   PROMPT_INPUT        - prompt input (don't use Unix-style command line)  */
132 /*   TIME_UNAVAILABLE    - don't use ANSI time routines to work out today's  */
133 /*                         date                                              */
134 /*   CHAR_IS_UNSIGNED    - if on your compiler the type "char" is unsigned   */
135 /*                         by default, you should define this                */
136 /*   HAS_REALPATH        - the POSIX realpath() function is available to     */
137 /*                         find the absolute path to a file                  */
138 /*                                                                           */
139 /*   3. An estimate of the typical amount of memory likely to be free        */
140 /*   should be given in DEFAULT_MEMORY_SIZE.                                 */
141 /*   For most modern machines, HUGE_SIZE is the appropriate setting, but     */
142 /*   some older micros may benefit from SMALL_SIZE.                          */
143 /* ------------------------------------------------------------------------- */
144
145 #define LARGE_SIZE   1
146 #define SMALL_SIZE   2
147 #define HUGE_SIZE    3
148
149 /* ------------------------------------------------------------------------- */
150 /*   4. Filenaming definitions:                                              */
151 /*                                                                           */
152 /*   It's assumed that the host OS has the concept of subdirectories and     */
153 /*   has "pathnames", that is, filenames giving a chain of subdirectories    */
154 /*   divided by the FN_SEP (filename separator) character: e.g. for Unix     */
155 /*   FN_SEP is defined below as '/' and a typical name is                    */
156 /*                         "users/graham/jigsaw.z5".                         */
157 /*   White space is not allowed in filenames, and nor is the special         */
158 /*   character FN_ALT, which unless defined here will be a comma and will    */
159 /*   be used to separate alternative locations in a path variable.           */
160 /*                                                                           */
161 /*   If NO_FILE_EXTENSIONS is undefined then the OS allows "file extensions" */
162 /*   of 1 to 3 alphanumeric characters like ".txt" (for text files), ".z5"   */
163 /*   (for game files), etc., to indicate the file's type (and, crucially,    */
164 /*   regards the same filename but with different extensions -- e.g.,        */
165 /*   "frog.amp" and "frog.lil" -- as being different names).                 */
166 /*   (The file extensions defined below are widely accepted, so please use   */
167 /*   them unless there's a good reason why not.)                             */
168 /*                                                                           */
169 /*   You should then define STANDARD_DIRECTORIES (you can define it anyway)  */
170 /*   in which case Inform will expect by default that files are sorted out   */
171 /*   by being put into suitable directories (e.g., a "games" directory for   */
172 /*   story files).                                                           */
173 /*                                                                           */
174 /*   If it's convenient for your port you can alter the detailed definitions */
175 /*   which these broad settings make.  Be careful if NO_FILE_EXTENSIONS      */
176 /*   is set without STANDARD_DIRECTORIES, as then Inform may                 */
177 /*   overwrite its source with object code.                                  */
178 /*                                                                           */
179 /*   5. Filenames (or code related to filenames) for the three temporary     */
180 /*   files.  These only exist during compilation (and only if -F1 is set).   */
181 /*   Temporary_Name is the body of a filename to use                         */
182 /*   (if you don't set this, it becomes "Inftemp") and Temporary_Directory   */
183 /*   is the directory path for the files to go in (which can be altered on   */
184 /*   the command line).  On some multi-tasking OSs these filenames ought to  */
185 /*   include a number uniquely identifying the process: to indicate this,    */
186 /*   define INCLUDE_TASK_ID and provide some code...                         */
187 /*                                                                           */
188 /*       #define INCLUDE_TASK_ID                                             */
189 /*       #ifdef INFORM_FILE                                                  */
190 /*       static int32 unique_task_id(void)                                   */
191 /*       {   ...some code returning your task ID...                          */
192 /*       }                                                                   */
193 /*       #endif                                                              */
194 /*                                                                           */
195 /*   6. Any other definitions specific to the OS or machine.                 */
196 /*   (In particular DEFAULT_ERROR_FORMAT is 0 on most machines and 1 on PCs; */
197 /*   it controls the style of error messages, which is important for some    */
198 /*   error-throwback debugging tools.)                                       */
199 /* ------------------------------------------------------------------------- */
200
201 /* ========================================================================= */
202 /*   The blocks now follow in alphabetical order.                            */
203 /* ------------------------------------------------------------------------- */
204 /*   AMIGA block                                                             */
205 /* ------------------------------------------------------------------------- */
206 #ifdef AMIGA
207 /* 1 */
208 #define MACHINE_STRING   "Amiga"
209 /* 3 */
210 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
211 /* 4 */
212 #define FN_SEP '/'
213 /* 5 */
214 #define __USE_SYSBASE
215 #include <proto/exec.h>
216 #define INCLUDE_TASK_ID
217 #define Temporary_Directory "T:"
218 #ifdef MAIN_INFORM_FILE
219 static int32 unique_task_id(void)
220 {   return (int32)FindTask(NULL);
221 }
222 #endif
223 #endif
224 /* ------------------------------------------------------------------------- */
225 /*   ARCHIMEDES block: Acorn/RISC OS settings                                */
226 /* ------------------------------------------------------------------------- */
227 #ifdef ARCHIMEDES
228 /* 1 */
229 #define MACHINE_STRING   "RISC OS"
230 /* 2 */
231 #define CHAR_IS_UNSIGNED
232 /* 3 */
233 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
234 /* 4 */
235 #define FN_SEP '.'
236 #define STANDARD_DIRECTORIES
237 #define NO_FILE_EXTENSIONS
238 #define Source_Directory "inform"
239 #define ICL_Directory "ICL"
240 /* 5 */
241 #define ENABLE_TEMPORARY_PATH
242 #define Temporary_Directory "ram:"
243 /* 6 */
244 #define ARC_THROWBACK
245 #endif
246 /* ------------------------------------------------------------------------- */
247 /*   Atari ST block                                                          */
248 /* ------------------------------------------------------------------------- */
249 #ifdef ATARIST
250 /* 1 */
251 #define MACHINE_STRING   "Atari ST"
252 /* 3 */
253 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
254 /* 4 */
255 #define FN_SEP '/'
256 /* 5 */
257 #ifndef TOSFS
258 #define Temporary_Directory "/tmp"
259 #define INCLUDE_TASK_ID
260 #ifdef MAIN_INFORM_FILE
261 static int32 unique_task_id(void)
262 {   return (int32)getpid();
263 }
264 #endif
265 #endif
266 #endif
267 /* ------------------------------------------------------------------------- */
268 /*   BEOS block                                                              */
269 /* ------------------------------------------------------------------------- */
270 #ifdef BEOS
271 /* 1 */
272 #define MACHINE_STRING   "BeOS"
273 /* 3 */
274 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
275 /* 4 */
276 #define FN_SEP '/'
277 #define FILE_EXTENSIONS
278 /* 5 */
279 #define Temporary_Directory "/tmp"
280 #endif
281 /* ------------------------------------------------------------------------- */
282 /*   LINUX block                                                             */
283 /* ------------------------------------------------------------------------- */
284 #ifdef LINUX
285 /* 1 */
286 #define MACHINE_STRING   "Linux"
287 /* 2 */
288 #define HAS_REALPATH
289 /* 3 */
290 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
291 /* 4 */
292 #define FN_SEP '/'
293 /* 5 */
294 #define Temporary_Directory "/tmp"
295 /* 6 */
296 #define PATHLEN 8192
297 #endif
298 /* ------------------------------------------------------------------------- */
299 /*   Macintosh block                                                         */
300 /* ------------------------------------------------------------------------- */
301 #ifdef MAC_MPW
302 #define MAC_CLASSIC
303 #endif
304
305 #ifdef MAC_CLASSIC
306 /* 1 */
307 #ifdef MAC_MPW
308 #define MACHINE_STRING   "Macintosh Programmer's Workshop"
309 #else
310 #define MACHINE_STRING   "Macintosh"
311 #endif
312 /* 2 */
313 #ifdef MAC_FACE
314 #define EXTERNAL_SHELL
315 #endif
316 #ifndef MAC_FACE
317 #ifndef MAC_MPW
318 #define PROMPT_INPUT
319 #endif
320 #endif
321 /* 3 */
322 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
323 /* 4 */
324 #define FN_SEP           ':'
325 #ifdef MAC_MPW
326 #define Include_Extension ".h"
327 #endif
328 /* 6 */
329 #ifdef MAC_FACE
330 #include "TB Inform.h"
331 #endif
332 #ifdef MAC_MPW
333 #include <CursorCtl.h>
334 #define DEFAULT_ERROR_FORMAT 2
335 #endif
336 #endif
337 /* ------------------------------------------------------------------------- */
338 /*   OS/2 block                                                              */
339 /* ------------------------------------------------------------------------- */
340 #ifdef OS2
341 /* 1 */
342 #define MACHINE_STRING   "OS/2"
343 /* 2 */
344 #define CHAR_IS_UNSIGNED
345 /* 3 */
346 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
347 /* 4 */
348 #define FN_SEP '/'
349 #endif
350 /* ------------------------------------------------------------------------- */
351 /*   MACOS block                                                              */
352 /* ------------------------------------------------------------------------- */
353 #ifdef MACOS
354 /* 1 */
355 #define MACHINE_STRING   "MacOS"
356 /* 2 */
357 #define HAS_REALPATH
358 /* 3 */
359 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
360 /* 4 */
361 #define FN_SEP '/'
362 /* 5 */
363 #define Temporary_Directory "/tmp"
364 #define INCLUDE_TASK_ID
365 #define _POSIX_C_SOURCE 199506L
366 #define _XOPEN_SOURCE 500
367 #ifdef MAIN_INFORM_FILE
368 #include <sys/types.h>
369 #include <unistd.h>
370 static int32 unique_task_id(void)
371 {   return (int32)getpid();
372 }
373 #endif
374 /* 6 */
375 #define PATHLEN 8192
376 #endif
377 /* ------------------------------------------------------------------------- */
378 /*   PC and PC_QUICKC block                                                  */
379 /* ------------------------------------------------------------------------- */
380 #ifdef PC_QUICKC
381 #define PC
382 #endif
383
384 #ifdef PC
385 /* 1 */
386 #define MACHINE_STRING   "PC"
387 /* 2 */
388 #define USE_TEMPORARY_FILES
389 /* 3 */
390 #ifdef PC_QUICKC
391 #define DEFAULT_MEMORY_SIZE SMALL_SIZE
392 #else
393 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
394 #endif
395 /* 4 */
396 #define FN_SEP '\\'
397 /* 6 */
398 #define DEFAULT_ERROR_FORMAT 1
399 #endif
400 /* ------------------------------------------------------------------------- */
401 /*   PC_WIN32 block                                                          */
402 /* ------------------------------------------------------------------------- */
403 #ifdef PC_WIN32
404 /* 1 */
405 #define MACHINE_STRING   "Win32"
406 /* 2 */
407 #define HAS_REALPATH
408 /* 3 */
409 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
410 /* 4 */
411 #define FN_SEP '\\'
412 /* 6 */
413 #define DEFAULT_ERROR_FORMAT 1
414 #define PATHLEN 512
415 #ifdef _MSC_VER /* Microsoft Visual C++ */
416 #define snprintf _snprintf
417 #define isnan _isnan
418 #define isinf(x) (!_isnan(x) && !_finite(x))
419 #endif
420 #endif
421 /* ------------------------------------------------------------------------- */
422 /*   UNIX block                                                              */
423 /* ------------------------------------------------------------------------- */
424 #ifdef UNIX
425 /* 1 */
426 #ifndef MACHINE_STRING
427 #define MACHINE_STRING   "Unix"
428 #endif
429 /* 2 */
430 #define HAS_REALPATH
431 /* 3 */
432 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
433 /* 4 */
434 #define FN_SEP '/'
435 /* 5 */
436 #define PATHLEN 512
437 #define Temporary_Directory "/tmp"
438 #define INCLUDE_TASK_ID
439 #ifdef MAIN_INFORM_FILE
440 #include <unistd.h>
441 static int32 unique_task_id(void)
442 {   return (int32)getpid();
443 }
444 #endif
445 #endif
446 /* ------------------------------------------------------------------------- */
447 /*   VMS (Dec VAX and Alpha) block                                           */
448 /* ------------------------------------------------------------------------- */
449 #ifdef __VMS
450 #define VMS
451 #endif
452
453 #ifdef VMS
454 /* 1 */
455 #ifdef __ALPHA
456 #define MACHINE_STRING   "Alpha/VMS"
457 #else
458 #define MACHINE_STRING   "VAX/VMS"
459 #endif
460 /* 2 */
461 #define CHAR_IS_UNSIGNED
462 /* 3 */
463 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
464 /* 4 */
465 #define FN_SEP '/'
466 #define Code_Extension   ".zip"
467 #define V4Code_Extension ".zip"
468 #define V5Code_Extension ".zip"
469 #define V6Code_Extension ".zip"
470 #define V7Code_Extension ".zip"
471 #define V8Code_Extension ".zip"
472 #endif
473 /* ========================================================================= */
474 /* Default settings:                                                         */
475 /* ------------------------------------------------------------------------- */
476
477 #ifndef NO_FILE_EXTENSIONS
478 #define FILE_EXTENSIONS
479 #endif
480
481 #ifndef Transcript_File
482 #ifdef FILE_EXTENSIONS
483 #define Transcript_File "gametext.txt"
484 #else
485 #define Transcript_File "gametext"
486 #endif
487 #endif
488
489 #ifndef Debugging_File
490 #ifdef FILE_EXTENSIONS
491 #define Debugging_File "gameinfo.dbg"
492 #else
493 #define Debugging_File "gamedebug"
494 #endif
495 #endif
496
497 #ifndef Default_Language
498 #define Default_Language "english"
499 #endif
500
501 #ifdef FILE_EXTENSIONS
502 #ifndef Source_Extension
503 #define Source_Extension  ".inf"
504 #endif
505 #ifndef Include_Extension
506 #define Include_Extension ".h"
507 #endif
508 #ifndef Code_Extension
509 #define Code_Extension    ".z3"
510 #endif
511 #ifndef V4Code_Extension
512 #define V4Code_Extension  ".z4"
513 #endif
514 #ifndef V5Code_Extension
515 #define V5Code_Extension  ".z5"
516 #endif
517 #ifndef V6Code_Extension
518 #define V6Code_Extension  ".z6"
519 #endif
520 #ifndef V7Code_Extension
521 #define V7Code_Extension  ".z7"
522 #endif
523 #ifndef V8Code_Extension
524 #define V8Code_Extension  ".z8"
525 #endif
526 #ifndef GlulxCode_Extension
527 #define GlulxCode_Extension  ".ulx"
528 #endif
529 #ifndef Module_Extension
530 #define Module_Extension  ".m5"
531 #endif
532 #ifndef ICL_Extension
533 #define ICL_Extension     ".icl"
534 #endif
535
536 #else
537
538 #define Source_Extension  ""
539 #define Include_Extension ""
540 #define Code_Extension    ""
541 #define V4Code_Extension  ""
542 #define V5Code_Extension  ""
543 #define V6Code_Extension  ""
544 #define V7Code_Extension  ""
545 #define V8Code_Extension  ""
546 #define GlulxCode_Extension  ""
547 #define Module_Extension  ""
548 #define ICL_Extension     ""
549 #endif
550
551 #ifdef STANDARD_DIRECTORIES
552 #ifndef Source_Directory
553 #define Source_Directory  "source"
554 #endif
555 #ifndef Include_Directory
556 #define Include_Directory "library"
557 #endif
558 #ifndef Code_Directory
559 #define Code_Directory    "games"
560 #endif
561 #ifndef Module_Directory
562 #define Module_Directory  "modules"
563 #endif
564 #ifndef Temporary_Directory
565 #define Temporary_Directory ""
566 #endif
567 #ifndef ICL_Directory
568 #define ICL_Directory     ""
569 #endif
570
571 #else
572
573 #ifndef Source_Directory
574 #define Source_Directory  ""
575 #endif
576 #ifndef Include_Directory
577 #define Include_Directory ""
578 #endif
579 #ifndef Code_Directory
580 #define Code_Directory    ""
581 #endif
582 #ifndef Module_Directory
583 #define Module_Directory  ""
584 #endif
585 #ifndef Temporary_Directory
586 #define Temporary_Directory ""
587 #endif
588 #ifndef ICL_Directory
589 #define ICL_Directory     ""
590 #endif
591 #endif
592
593 #ifndef FN_SEP
594 #define FN_SEP '/'
595 #endif
596
597 #ifndef FN_ALT
598 #define FN_ALT ','
599 #endif
600
601 #ifndef PATHLEN
602 #define PATHLEN 128
603 #endif
604
605 #ifndef Temporary_File
606 #define Temporary_File "Inftemp"
607 #endif
608
609 #ifndef DEFAULT_ERROR_FORMAT
610 #define DEFAULT_ERROR_FORMAT 0
611 #endif
612
613 #ifndef DEFAULT_MEMORY_SIZE
614 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
615 #endif
616
617 #ifndef CHAR_IS_UNSIGNED
618     typedef unsigned char uchar;
619 #else
620     typedef char uchar;
621 #endif
622
623 #if defined(__GNUC__) || defined(__clang__)
624 #define NORETURN __attribute__((__noreturn__))
625 #endif /* defined(__GNUC__) || defined(__clang__) */
626
627 #ifndef NORETURN
628 #define NORETURN
629 #endif
630
631 /* ------------------------------------------------------------------------- */
632 /*   A macro (rather than constant) definition:                              */
633 /* ------------------------------------------------------------------------- */
634
635 #ifdef PC_QUICKC
636     void _huge * halloc(long, size_t);
637     void hfree(void *);
638 #define subtract_pointers(p1,p2) (long)((char _huge *)p1-(char _huge *)p2)
639 #else
640 #define subtract_pointers(p1,p2) (((char *) p1)-((char *) p2))
641 #endif
642
643 /* ------------------------------------------------------------------------- */
644 /*   SEEK_SET is a constant which should be defined in the ANSI header files */
645 /*   but which is not present in some implementations: it's used as a        */
646 /*   parameter for "fseek", defined in "stdio".  In pre-ANSI C, the value    */
647 /*   0 was used as a parameter instead, hence the definition below.          */
648 /* ------------------------------------------------------------------------- */
649
650 #ifndef SEEK_SET
651 #define SEEK_SET 0
652 #endif
653
654 /* ------------------------------------------------------------------------- */
655 /*   A large block of #define'd constant values follows.                     */
656 /* ------------------------------------------------------------------------- */
657
658 #define TRUE -1
659 #define FALSE 0
660
661 /* These checked the glulx_mode global during development, but are no
662    longer needed. */
663 #define ASSERT_ZCODE() (0)
664 #define ASSERT_GLULX() (0)
665
666
667 #define ReadInt32(ptr)                               \
668   (   (((int32)(((uchar *)(ptr))[0])) << 24)         \
669     | (((int32)(((uchar *)(ptr))[1])) << 16)         \
670     | (((int32)(((uchar *)(ptr))[2])) <<  8)         \
671     | (((int32)(((uchar *)(ptr))[3]))      ) )
672
673 #define ReadInt16(ptr)                               \
674   (   (((int32)(((uchar *)(ptr))[0])) << 8)          \
675     | (((int32)(((uchar *)(ptr))[1]))     ) )
676
677 #define WriteInt32(ptr, val)                         \
678   ((ptr)[0] = (uchar)(((int32)(val)) >> 24),         \
679    (ptr)[1] = (uchar)(((int32)(val)) >> 16),         \
680    (ptr)[2] = (uchar)(((int32)(val)) >>  8),         \
681    (ptr)[3] = (uchar)(((int32)(val))      ) )
682
683 #define WriteInt16(ptr, val)                         \
684   ((ptr)[0] = (uchar)(((int32)(val)) >> 8),          \
685    (ptr)[1] = (uchar)(((int32)(val))     ) )
686
687 /* ------------------------------------------------------------------------- */
688 /*   If your compiler doesn't recognise \t, and you use ASCII, you could     */
689 /*   define T_C as (char) 9; failing that, it _must_ be defined as ' '       */
690 /*   (space) and is _not_ allowed to be 0 or any recognisable character.     */
691 /* ------------------------------------------------------------------------- */
692
693 #define TAB_CHARACTER '\t'
694
695 /* ------------------------------------------------------------------------- */
696 /*   Maxima.                                                                 */
697 /* ------------------------------------------------------------------------- */
698
699 #define  MAX_ERRORS            100
700 #define  MAX_IDENTIFIER_LENGTH  32
701 #define  MAX_ABBREV_LENGTH      64
702 #define  MAX_DICT_WORD_SIZE     40
703 #define  MAX_DICT_WORD_BYTES    (40*4)
704 #define  MAX_NUM_ATTR_BYTES     39
705 #define  MAX_VERB_WORD_SIZE    120
706
707 #define  VENEER_CONSTRAINT_ON_CLASSES_Z       256
708 #define  VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_Z 128
709 #define  VENEER_CONSTRAINT_ON_CLASSES_G       32768
710 #define  VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_G 32768
711 #define  VENEER_CONSTRAINT_ON_CLASSES  \
712   (glulx_mode ? VENEER_CONSTRAINT_ON_CLASSES_G  \
713               : VENEER_CONSTRAINT_ON_CLASSES_Z)
714 #define  VENEER_CONSTRAINT_ON_IP_TABLE_SIZE  \
715   (glulx_mode ? VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_G  \
716               : VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_Z)
717
718 #define  GLULX_HEADER_SIZE 36
719 /* Number of bytes in the header. */
720 #define  GLULX_STATIC_ROM_SIZE 24
721 /* Number of bytes in the Inform-specific block right after the header. */
722 #define  GPAGESIZE 256
723 /* All Glulx memory boundaries must be multiples of GPAGESIZE. */
724
725 /* ------------------------------------------------------------------------- */
726 /*   Structure definitions (there are a few others local to files)           */
727 /* ------------------------------------------------------------------------- */
728
729 typedef struct assembly_operand_t
730 {   int   type;
731     int32 value;
732     int   symtype;   /* 6.30 */
733     int   symflags;  /* 6.30 */
734     int   marker;
735 } assembly_operand;
736
737 #define INITAOTV(aop, typ, val) ((aop)->type=(typ), (aop)->value=(val), (aop)->marker=0, (aop)->symtype=0, (aop)->symflags=0)
738 #define INITAOT(aop, typ) INITAOTV(aop, typ, 0)
739 #define INITAO(aop) INITAOTV(aop, 0, 0)
740
741 #define  MAX_LINES_PER_VERB 32
742 typedef struct verbt {
743     int lines;
744     int l[MAX_LINES_PER_VERB];
745 } verbt;
746
747 typedef struct prop {
748     uchar l, num;
749     assembly_operand ao[32];
750 } prop;
751
752 /* Only one of this object. */
753 typedef struct fpropt {
754     uchar atts[6];
755     int l;
756     prop pp[64];
757 } fpropt;
758
759 typedef struct objecttz {
760     uchar atts[6];
761     int parent, next, child;
762     int propsize;
763 } objecttz;
764
765 typedef struct propg {
766     int num;
767     int continuation; 
768     int flags;
769     int32 datastart;
770     int32 datalen;
771 } propg;
772
773 /* Only one of this object. */
774 typedef struct fproptg {
775     uchar atts[MAX_NUM_ATTR_BYTES]; 
776     int numprops;
777     propg *props;
778     int propdatasize;
779     assembly_operand *propdata;
780     int32 finalpropaddr;
781 } fproptg;
782
783 typedef struct objecttg {
784     /* attributes are stored in a separate array */
785     int32 shortname;
786     int32 parent, next, child;
787     int32 propaddr;
788     int32 propsize;
789 } objecttg;
790
791 typedef struct maybe_file_position_S
792 {   int valid;
793     fpos_t position;
794 } maybe_file_position;
795
796 typedef struct debug_location_s
797 {   int32 file_index;
798     int32 beginning_byte_index;
799     int32 end_byte_index;
800     int32 beginning_line_number;
801     int32 end_line_number;
802     int32 beginning_character_number;
803     int32 end_character_number;
804     int32 orig_file_index;
805     int32 orig_beg_line_number;
806     int32 orig_beg_char_number;
807     /* We only track the beginning #origsource location, not the end. */
808 } debug_location;
809
810 typedef struct debug_locations_s
811 {   debug_location location;
812     struct debug_locations_s *next;
813     int reference_count;
814 } debug_locations;
815
816 typedef struct brief_location_s
817 {   int32 file_index;
818     int32 line_number;
819     int32 orig_file_index;
820     int32 orig_line_number;
821 } brief_location;
822
823 typedef struct debug_location_beginning_s
824 {   debug_locations *head;
825     int32 beginning_byte_index;
826     int32 beginning_line_number;
827     int32 beginning_character_number;
828     int32 orig_file_index;
829     int32 orig_beg_line_number;
830     int32 orig_beg_char_number;
831 } debug_location_beginning;
832
833 typedef struct keyword_group_s
834 {   char *keywords[120];
835     int change_token_type;
836     int enabled;
837     int case_sensitive;
838 } keyword_group;
839
840 typedef struct token_data_s
841 {   char *text;
842     int32 value; /* ###-long */
843     int type;
844     int symtype;  /* 6.30 */
845     int symflags;   /* 6.30 */
846     int marker;
847     debug_location location;
848 } token_data;
849
850 typedef struct FileId_s                 /*  Source code file identifier:     */
851 {   char *filename;                     /*  The filename (after translation) */
852     FILE *handle;                       /*  Handle of file (when open), or
853                                             NULL when closed                 */
854     int is_input;                       /*  Is this a source file that we are
855                                             parsing? If not, this is an
856                                             origsource filename (and handle
857                                             is NULL).                        */
858 } FileId;
859
860 typedef struct ErrorPosition_s
861 {   int  file_number;
862     char *source;
863     int  line_number;
864     int  main_flag;
865     int  orig_file;
866     char *orig_source;
867     int32 orig_line;
868     int32 orig_char;
869 } ErrorPosition;
870
871 /*  A memory block can hold at most ALLOC_CHUNK_SIZE * 72:  */
872
873 extern int ALLOC_CHUNK_SIZE;
874
875 typedef struct memory_block_s
876 {   int chunks;
877     int extent_of_last;
878     uchar *chunk[72];
879     int write_pos;
880 } memory_block;
881
882 /* This serves for both Z-code and Glulx instructions. Glulx doesn't use
883    the text, store_variable_number, branch_label_number, or branch_flag
884    fields. */
885 typedef struct assembly_instruction_t
886 {   int internal_number;
887     int store_variable_number;
888     int32 branch_label_number;
889     int branch_flag;
890     char *text;
891     int operand_count;
892     assembly_operand operand[8];
893 } assembly_instruction;
894
895 typedef struct expression_tree_node_s
896 {
897     /*  Data used in tree construction                                       */
898
899     int up, down, right;
900     int operator_number;         /* Only meaningful for non-leaves           */
901     assembly_operand value;      /* Only meaningful for leaves               */
902
903     /*  Attributes synthesised during code generation                        */
904
905     int must_produce_value;      /* e.g. FALSE in a void context             */
906
907     int label_after;             /* -1, or "put this label after code"       */
908     int to_expression;           /* TRUE if a condition used as numeric val  */
909     int true_label;              /* On condition "true", jump to this (or keep
910                                     going if -1)                             */
911     int false_label;             /* Likewise if the condition is "false".    */
912
913 } expression_tree_node;
914
915 typedef struct operator_s
916 {   int precedence;                     /*  Level 0 to 13 (13 is highest)  */
917     int token_type;                     /*  Lexical token type  */
918     int token_value;                    /*  Lexical token value  */
919     int usage;                          /*  Infix (IN_U), prefix or postfix */
920     int associativity;                  /*  Left (L_A), right (R_A)
921                                             or 0 for "it is an error to
922                                             implicitly associate this"  */
923     int requires_lvalue;                /*  TRUE if the first operand must
924                                             be an "lvalue" (the name of some
925                                             storage object, such as a variable
926                                             or an array entry)  */
927     int opcode_number_z;                /*  Translation number (see below)  */
928     int opcode_number_g;                /*  Translation number (see below)  */
929     int side_effect;                    /*  TRUE if evaluating the operator
930                                             has potential side-effects in
931                                             terms of changing the Z-machine  */
932     int negation;                       /*  0 for an unconditional operator,
933                                             otherwise the negation operator  */
934     char *description;                  /*  Text describing the operator
935                                             for error messages and tracing  */
936 } operator;
937
938 /*  The translation number of an operator is as follows:
939
940     Z-code:
941         an internal opcode number if the operator can be translated
942             directly to a single Z-machine opcode;
943         400+n if it can be translated to branch opcode n;
944         800+n if to the negated form of branch opcode n;
945             (using n = 200, 201 for two conditions requiring special
946             translation)
947         -1 otherwise
948     Glulx:
949         an internal opcode number if the operator can be translated
950             directly to a single Glulx opcode;
951         FIRST_CC to LAST_CC if it is a condition;
952         -1 otherwise                                                         */
953
954 /* ------------------------------------------------------------------------- */
955 /*   Assembly operand types.                                                 */
956 /* ------------------------------------------------------------------------- */
957
958 /* For Z-machine... */
959
960 #define LONG_CONSTANT_OT   0    /* General constant */
961 #define SHORT_CONSTANT_OT  1    /* Constant in range 0 to 255 */
962 #define VARIABLE_OT        2    /* Variable (global, local or sp) */
963 #define OMITTED_OT         3    /* Value used in type field to indicate
964                                    that no operand is supplied */
965 #define EXPRESSION_OT      4    /* Meaning: to determine this value, run code
966                                    equivalent to the expression tree whose
967                                    root node-number is the value given       */
968
969 /* For Glulx... */
970
971 /* #define OMITTED_OT      3 */ /* Same as above */
972 /* #define EXPRESSION_OT   4 */ /* Same as above */
973 #define CONSTANT_OT        5    /* Four-byte constant */
974 #define HALFCONSTANT_OT    6    /* Two-byte constant */
975 #define BYTECONSTANT_OT    7    /* One-byte constant */
976 #define ZEROCONSTANT_OT    8    /* Constant zero (no bytes of data) */
977 #define SYSFUN_OT          9    /* System function value */
978 #define DEREFERENCE_OT     10   /* Value at this address */
979 #define GLOBALVAR_OT       11   /* Global variable */
980 #define LOCALVAR_OT        12   /* Local variable or sp */
981
982 /* ------------------------------------------------------------------------- */
983 /*   Internal numbers representing assemble-able Z-opcodes                   */
984 /* ------------------------------------------------------------------------- */
985
986 #define je_zc 0
987 #define jl_zc 1
988 #define jg_zc 2
989 #define dec_chk_zc 3
990 #define inc_chk_zc 4
991 #define jin_zc 5
992 #define test_zc 6
993 #define or_zc 7
994 #define and_zc 8
995 #define test_attr_zc 9
996 #define set_attr_zc 10
997 #define clear_attr_zc 11
998 #define store_zc 12
999 #define insert_obj_zc 13
1000 #define loadw_zc 14
1001 #define loadb_zc 15
1002 #define get_prop_zc 16
1003 #define get_prop_addr_zc 17
1004 #define get_next_prop_zc 18
1005 #define add_zc 19
1006 #define sub_zc 20
1007 #define mul_zc 21
1008 #define div_zc 22
1009 #define mod_zc 23
1010 #define call_zc 24
1011 #define storew_zc 25
1012 #define storeb_zc 26
1013 #define put_prop_zc 27
1014 #define sread_zc 28
1015 #define print_char_zc 29
1016 #define print_num_zc 30
1017 #define random_zc 31
1018 #define push_zc 32
1019 #define pull_zc 33
1020 #define split_window_zc 34
1021 #define set_window_zc 35
1022 #define output_stream_zc 36
1023 #define input_stream_zc 37
1024 #define sound_effect_zc 38
1025 #define jz_zc 39
1026 #define get_sibling_zc 40
1027 #define get_child_zc 41
1028 #define get_parent_zc 42
1029 #define get_prop_len_zc 43
1030 #define inc_zc 44
1031 #define dec_zc 45
1032 #define print_addr_zc 46
1033 #define remove_obj_zc 47
1034 #define print_obj_zc 48
1035 #define ret_zc 49
1036 #define jump_zc 50
1037 #define print_paddr_zc 51
1038 #define load_zc 52
1039 #define not_zc 53
1040 #define rtrue_zc 54
1041 #define rfalse_zc 55
1042 #define print_zc 56
1043 #define print_ret_zc 57
1044 #define nop_zc 58
1045 #define save_zc 59
1046 #define restore_zc 60
1047 #define restart_zc 61
1048 #define ret_popped_zc 62
1049 #define pop_zc 63
1050 #define quit_zc 64
1051 #define new_line_zc 65
1052 #define show_status_zc 66
1053 #define verify_zc 67
1054 #define call_2s_zc 68
1055 #define call_vs_zc 69
1056 #define aread_zc 70
1057 #define call_vs2_zc 71
1058 #define erase_window_zc 72
1059 #define erase_line_zc 73
1060 #define set_cursor_zc 74
1061 #define get_cursor_zc 75
1062 #define set_text_style_zc 76
1063 #define buffer_mode_zc 77
1064 #define read_char_zc 78
1065 #define scan_table_zc 79
1066 #define call_1s_zc 80
1067 #define call_2n_zc 81
1068 #define set_colour_zc 82
1069 #define throw_zc 83
1070 #define call_vn_zc 84
1071 #define call_vn2_zc 85
1072 #define tokenise_zc 86
1073 #define encode_text_zc 87
1074 #define copy_table_zc 88
1075 #define print_table_zc 89
1076 #define check_arg_count_zc 90
1077 #define call_1n_zc 91
1078 #define catch_zc 92
1079 #define piracy_zc 93
1080 #define log_shift_zc 94
1081 #define art_shift_zc 95
1082 #define set_font_zc 96
1083 #define save_undo_zc 97
1084 #define restore_undo_zc 98
1085 #define draw_picture_zc 99
1086 #define picture_data_zc 100
1087 #define erase_picture_zc 101
1088 #define set_margins_zc 102
1089 #define move_window_zc 103
1090 #define window_size_zc 104
1091 #define window_style_zc 105
1092 #define get_wind_prop_zc 106
1093 #define scroll_window_zc 107
1094 #define pop_stack_zc 108
1095 #define read_mouse_zc 109
1096 #define mouse_window_zc 110
1097 #define push_stack_zc 111
1098 #define put_wind_prop_zc 112
1099 #define print_form_zc 113
1100 #define make_menu_zc 114
1101 #define picture_table_zc 115
1102 #define print_unicode_zc 116
1103 #define check_unicode_zc 117
1104
1105
1106 /* ------------------------------------------------------------------------- */
1107 /*   Internal numbers representing assemble-able Glulx opcodes               */
1108 /* ------------------------------------------------------------------------- */
1109
1110 #define nop_gc 0
1111 #define add_gc 1
1112 #define sub_gc 2
1113 #define mul_gc 3
1114 #define div_gc 4
1115 #define mod_gc 5
1116 #define neg_gc 6
1117 #define bitand_gc 7
1118 #define bitor_gc 8
1119 #define bitxor_gc 9
1120 #define bitnot_gc 10
1121 #define shiftl_gc 11
1122 #define sshiftr_gc 12
1123 #define ushiftr_gc 13
1124 #define jump_gc 14
1125 #define jz_gc 15
1126 #define jnz_gc 16
1127 #define jeq_gc 17
1128 #define jne_gc 18
1129 #define jlt_gc 19
1130 #define jge_gc 20
1131 #define jgt_gc 21
1132 #define jle_gc 22
1133 #define jltu_gc 23
1134 #define jgeu_gc 24
1135 #define jgtu_gc 25
1136 #define jleu_gc 26
1137 #define call_gc 27
1138 #define return_gc 28
1139 #define catch_gc 29
1140 #define throw_gc 30
1141 #define tailcall_gc 31
1142 #define copy_gc 32
1143 #define copys_gc 33
1144 #define copyb_gc 34
1145 #define sexs_gc 35
1146 #define sexb_gc 36
1147 #define aload_gc 37
1148 #define aloads_gc 38
1149 #define aloadb_gc 39
1150 #define aloadbit_gc 40
1151 #define astore_gc 41
1152 #define astores_gc 42
1153 #define astoreb_gc 43
1154 #define astorebit_gc 44
1155 #define stkcount_gc 45
1156 #define stkpeek_gc 46
1157 #define stkswap_gc 47
1158 #define stkroll_gc 48
1159 #define stkcopy_gc 49
1160 #define streamchar_gc 50
1161 #define streamnum_gc 51
1162 #define streamstr_gc 52
1163 #define gestalt_gc 53
1164 #define debugtrap_gc 54
1165 #define getmemsize_gc 55
1166 #define setmemsize_gc 56
1167 #define jumpabs_gc 57
1168 #define random_gc 58
1169 #define setrandom_gc 59
1170 #define quit_gc 60
1171 #define verify_gc 61
1172 #define restart_gc 62
1173 #define save_gc 63
1174 #define restore_gc 64
1175 #define saveundo_gc 65
1176 #define restoreundo_gc 66
1177 #define protect_gc 67
1178 #define glk_gc 68
1179 #define getstringtbl_gc 69
1180 #define setstringtbl_gc 70
1181 #define getiosys_gc 71
1182 #define setiosys_gc 72
1183 #define linearsearch_gc 73
1184 #define binarysearch_gc 74
1185 #define linkedsearch_gc 75
1186 #define callf_gc 76
1187 #define callfi_gc 77
1188 #define callfii_gc 78
1189 #define callfiii_gc 79
1190 #define streamunichar_gc 80
1191 #define mzero_gc 81
1192 #define mcopy_gc 82
1193 #define malloc_gc 83
1194 #define mfree_gc 84
1195 #define accelfunc_gc 85
1196 #define accelparam_gc 86
1197 #define numtof_gc 87
1198 #define ftonumz_gc 88
1199 #define ftonumn_gc 89
1200 #define ceil_gc 90
1201 #define floor_gc 91
1202 #define fadd_gc 92
1203 #define fsub_gc 93
1204 #define fmul_gc 94
1205 #define fdiv_gc 95
1206 #define fmod_gc 96
1207 #define sqrt_gc 97
1208 #define exp_gc 98
1209 #define log_gc 99
1210 #define pow_gc 100
1211 #define sin_gc 101
1212 #define cos_gc 102
1213 #define tan_gc 103
1214 #define asin_gc 104
1215 #define acos_gc 105
1216 #define atan_gc 106
1217 #define atan2_gc 107
1218 #define jfeq_gc 108
1219 #define jfne_gc 109
1220 #define jflt_gc 110
1221 #define jfle_gc 111
1222 #define jfgt_gc 112
1223 #define jfge_gc 113
1224 #define jisnan_gc 114
1225 #define jisinf_gc 115
1226
1227 /* ------------------------------------------------------------------------- */
1228 /*   Index numbers into the keyword group "opcode_macros_g" (see "lexer.c")  */
1229 /* ------------------------------------------------------------------------- */
1230
1231 #define pull_gm   0
1232 #define push_gm   1
1233
1234
1235 #define SYMBOL_TT    0                      /* value = index in symbol table */
1236 #define NUMBER_TT    1                      /* value = the number            */
1237 #define DQ_TT        2                      /* no value                      */
1238 #define SQ_TT        3                      /* no value                      */
1239 #define SEP_TT       4                      /* value = the _SEP code         */
1240 #define EOF_TT       5                      /* no value                      */
1241
1242 #define STATEMENT_TT      100               /* a statement keyword           */
1243 #define SEGMENT_MARKER_TT 101               /* with/has/class etc.           */
1244 #define DIRECTIVE_TT      102               /* a directive keyword           */
1245 #define CND_TT            103               /* in/has/etc.                   */
1246 #define SYSFUN_TT         105               /* built-in function             */
1247 #define LOCAL_VARIABLE_TT 106               /* local variable                */
1248 #define OPCODE_NAME_TT    107               /* opcode name                   */
1249 #define MISC_KEYWORD_TT   108               /* keyword like "char" used in
1250                                                syntax for a statement        */
1251 #define DIR_KEYWORD_TT    109               /* keyword like "meta" used in
1252                                                syntax for a directive        */
1253 #define TRACE_KEYWORD_TT  110               /* keyword used in debugging     */
1254 #define SYSTEM_CONSTANT_TT 111              /* such as "code_offset"         */
1255 #define OPCODE_MACRO_TT   112               /* fake opcode for compatibility */
1256
1257 #define OP_TT        200                    /* value = operator no           */
1258 #define ENDEXP_TT    201                    /* no value                      */
1259 #define SUBOPEN_TT   202                    /* ( used for subexpr            */
1260 #define SUBCLOSE_TT  203                    /* ) used to close subexp        */
1261 #define LARGE_NUMBER_TT 204                 /* constant not in range 0-255   */
1262 #define SMALL_NUMBER_TT 205                 /* constant in range 0-255       */
1263 /* In Glulx, that's the range -0x8000 to 0x7fff instead. */
1264 #define VARIABLE_TT  206                    /* variable name                 */
1265 #define DICTWORD_TT  207                    /* literal 'word'                */
1266 #define ACTION_TT    208                    /* action name                   */
1267
1268 #define VOID_CONTEXT       1
1269 #define CONDITION_CONTEXT  2
1270 #define CONSTANT_CONTEXT   3
1271 #define QUANTITY_CONTEXT   4
1272 #define ACTION_Q_CONTEXT   5
1273 #define ASSEMBLY_CONTEXT   6
1274 #define ARRAY_CONTEXT      7
1275 #define FORINIT_CONTEXT    8
1276 #define RETURN_Q_CONTEXT   9
1277
1278 #define LOWEST_SYSTEM_VAR_NUMBER 249        /* globals 249 to 255 are used
1279                                                in compiled code (Z-code 
1280                                                only; in Glulx, the range can
1281                                                change) */
1282
1283 /* ------------------------------------------------------------------------- */
1284 /*   Symbol flag definitions (in no significant order)                       */
1285 /* ------------------------------------------------------------------------- */
1286
1287 #define UNKNOWN_SFLAG  1
1288 #define REPLACE_SFLAG  2
1289 #define USED_SFLAG     4
1290 #define DEFCON_SFLAG   8
1291 #define STUB_SFLAG     16
1292 #define IMPORT_SFLAG   32
1293 #define EXPORT_SFLAG   64
1294 #define ALIASED_SFLAG  128
1295
1296 #define CHANGE_SFLAG   256
1297 #define SYSTEM_SFLAG   512
1298 #define INSF_SFLAG     1024
1299 #define UERROR_SFLAG   2048
1300 #define ACTION_SFLAG   4096
1301 #define REDEFINABLE_SFLAG  8192
1302 #define STAR_SFLAG    16384
1303
1304 /* ------------------------------------------------------------------------- */
1305 /*   Symbol type definitions                                                 */
1306 /* ------------------------------------------------------------------------- */
1307
1308 #define ROUTINE_T             1
1309 #define LABEL_T               2
1310 #define GLOBAL_VARIABLE_T     3
1311 #define ARRAY_T               4
1312 #define CONSTANT_T            5
1313 #define ATTRIBUTE_T           6
1314 #define PROPERTY_T            7
1315 #define INDIVIDUAL_PROPERTY_T 8
1316 #define OBJECT_T              9
1317 #define CLASS_T               10
1318 #define FAKE_ACTION_T         11
1319 #define STATIC_ARRAY_T        12
1320
1321 /* ------------------------------------------------------------------------- */
1322 /*   Statusline_flag values                                                  */
1323 /* ------------------------------------------------------------------------- */
1324
1325 #define SCORE_STYLE          0
1326 #define TIME_STYLE           1
1327
1328 /* ------------------------------------------------------------------------- */
1329 /*   Inform keyword definitions                                              */
1330 /* ------------------------------------------------------------------------- */
1331
1332 /*  Index numbers into the keyword group "directives" (see "lexer.c")  */
1333
1334 #define ABBREVIATE_CODE  0
1335 #define ARRAY_CODE       1
1336 #define ATTRIBUTE_CODE   2
1337 #define CLASS_CODE       3
1338 #define CONSTANT_CODE    4
1339 #define DEFAULT_CODE     5
1340 #define DICTIONARY_CODE  6
1341 #define END_CODE         7
1342 #define ENDIF_CODE       8
1343 #define EXTEND_CODE      9
1344 #define FAKE_ACTION_CODE 10
1345 #define GLOBAL_CODE      11
1346 #define IFDEF_CODE       12
1347 #define IFNDEF_CODE      13
1348 #define IFNOT_CODE       14
1349 #define IFV3_CODE        15
1350 #define IFV5_CODE        16
1351 #define IFTRUE_CODE      17
1352 #define IFFALSE_CODE     18
1353 #define IMPORT_CODE      19
1354 #define INCLUDE_CODE     20
1355 #define LINK_CODE        21
1356 #define LOWSTRING_CODE   22
1357 #define MESSAGE_CODE     23
1358 #define NEARBY_CODE      24
1359 #define OBJECT_CODE      25
1360 #define ORIGSOURCE_CODE  26
1361 #define PROPERTY_CODE    27
1362 #define RELEASE_CODE     28
1363 #define REPLACE_CODE     29
1364 #define SERIAL_CODE      30
1365 #define SWITCHES_CODE    31
1366 #define STATUSLINE_CODE  32
1367 #define STUB_CODE        33
1368 #define SYSTEM_CODE      34
1369 #define TRACE_CODE       35
1370 #define UNDEF_CODE       36
1371 #define VERB_CODE        37
1372 #define VERSION_CODE     38
1373 #define ZCHARACTER_CODE  39
1374
1375 #define OPENBLOCK_CODE   100
1376 #define CLOSEBLOCK_CODE  101
1377
1378 /*  Index numbers into the keyword group "statements" (see "lexer.c")  */
1379
1380 #define BOX_CODE         0
1381 #define BREAK_CODE       1
1382 #define CONTINUE_CODE    2
1383 #define SDEFAULT_CODE    3
1384 #define DO_CODE          4
1385 #define ELSE_CODE        5
1386 #define FONT_CODE        6
1387 #define FOR_CODE         7
1388 #define GIVE_CODE        8
1389 #define IF_CODE          9
1390 #define INVERSION_CODE   10
1391 #define JUMP_CODE        11
1392 #define MOVE_CODE        12
1393 #define NEW_LINE_CODE    13
1394 #define OBJECTLOOP_CODE  14
1395 #define PRINT_CODE       15
1396 #define PRINT_RET_CODE   16
1397 #define QUIT_CODE        17
1398 #define READ_CODE        18
1399 #define REMOVE_CODE      19
1400 #define RESTORE_CODE     20
1401 #define RETURN_CODE      21
1402 #define RFALSE_CODE      22
1403 #define RTRUE_CODE       23
1404 #define SAVE_CODE        24
1405 #define SPACES_CODE      25
1406 #define STRING_CODE      26
1407 #define STYLE_CODE       27
1408 #define SWITCH_CODE      28
1409 #define UNTIL_CODE       29
1410 #define WHILE_CODE       30
1411
1412 #define ASSIGNMENT_CODE  100
1413 #define FUNCTION_CODE    101
1414
1415 /*  Index numbers into the keyword group "conditions" (see "lexer.c")  */
1416
1417 #define HAS_COND         0
1418 #define HASNT_COND       1
1419 #define IN_COND          2
1420 #define NOTIN_COND       3
1421 #define OFCLASS_COND     4
1422 #define OR_COND          5
1423 #define PROVIDES_COND    6
1424
1425 /*  Index numbers into the keyword group "segment_markers" (see "lexer.c")  */
1426
1427 #define CLASS_SEGMENT    0
1428 #define HAS_SEGMENT      1
1429 #define PRIVATE_SEGMENT  2
1430 #define WITH_SEGMENT     3
1431
1432 /*  Index numbers into the keyword group "misc_keywords" (see "lexer.c")  */
1433
1434 #define CHAR_MK          0
1435 #define NAME_MK          1
1436 #define THE_MK           2
1437 #define A_MK             3
1438 #define AN_MK            4
1439 #define CAP_THE_MK       5
1440 #define NUMBER_MK        6
1441 #define ROMAN_MK         7
1442 #define REVERSE_MK       8
1443 #define BOLD_MK          9
1444 #define UNDERLINE_MK    10
1445 #define FIXED_MK        11
1446 #define ON_MK           12
1447 #define OFF_MK          13
1448 #define TO_MK           14
1449 #define ADDRESS_MK      15
1450 #define STRING_MK       16
1451 #define OBJECT_MK       17
1452 #define NEAR_MK         18
1453 #define FROM_MK         19
1454 #define PROPERTY_MK     20
1455 #define CAP_A_MK        21
1456
1457 /*  Index numbers into the keyword group "directive_keywords" (see "lexer.c")  */
1458
1459 #define ALIAS_DK         0
1460 #define LONG_DK          1
1461 #define ADDITIVE_DK      2
1462 #define SCORE_DK         3
1463 #define TIME_DK          4
1464 #define NOUN_DK          5
1465 #define HELD_DK          6
1466 #define MULTI_DK         7
1467 #define MULTIHELD_DK     8
1468 #define MULTIEXCEPT_DK   9
1469 #define MULTIINSIDE_DK  10
1470 #define CREATURE_DK     11
1471 #define SPECIAL_DK      12
1472 #define NUMBER_DK       13
1473 #define SCOPE_DK        14
1474 #define TOPIC_DK        15
1475 #define REVERSE_DK      16
1476 #define META_DK         17
1477 #define ONLY_DK         18
1478 #define REPLACE_DK      19
1479 #define FIRST_DK        20
1480 #define LAST_DK         21
1481 #define STRING_DK       22
1482 #define TABLE_DK        23
1483 #define BUFFER_DK       24
1484 #define DATA_DK         25
1485 #define INITIAL_DK      26
1486 #define INITSTR_DK      27
1487 #define WITH_DK         28
1488 #define PRIVATE_DK      29
1489 #define HAS_DK          30
1490 #define CLASS_DK        31
1491 #define ERROR_DK        32
1492 #define FATALERROR_DK   33
1493 #define WARNING_DK      34
1494 #define TERMINATING_DK  35
1495 #define STATIC_DK       36
1496
1497 /*  Index numbers into the keyword group "trace_keywords" (see "lexer.c")  */
1498
1499 #define DICTIONARY_TK    0
1500 #define SYMBOLS_TK       1
1501 #define OBJECTS_TK       2
1502 #define VERBS_TK         3
1503 #define ASSEMBLY_TK      4
1504 #define EXPRESSIONS_TK   5
1505 #define LINES_TK         6
1506 #define TOKENS_TK        7
1507 #define LINKER_TK        8
1508 #define ON_TK            9
1509 #define OFF_TK          10
1510
1511 /*  Index numbers into the keyword group "system_constants" (see "lexer.c")  */
1512
1513 #define NO_SYSTEM_CONSTANTS   62
1514
1515 #define adjectives_table_SC   0
1516 #define actions_table_SC      1
1517 #define classes_table_SC      2
1518 #define identifiers_table_SC  3
1519 #define preactions_table_SC   4
1520 #define version_number_SC     5
1521 #define largest_object_SC     6
1522 #define strings_offset_SC     7
1523 #define code_offset_SC        8
1524 #define dict_par1_SC          9
1525 #define dict_par2_SC         10
1526 #define dict_par3_SC         11
1527 #define actual_largest_object_SC 12
1528 #define static_memory_offset_SC 13
1529 #define array_names_offset_SC 14
1530 #define readable_memory_offset_SC 15
1531 #define cpv__start_SC        16
1532 #define cpv__end_SC          17
1533 #define ipv__start_SC        18
1534 #define ipv__end_SC          19
1535 #define array__start_SC      20
1536 #define array__end_SC        21
1537
1538 #define lowest_attribute_number_SC    22
1539 #define highest_attribute_number_SC   23
1540 #define attribute_names_array_SC      24
1541
1542 #define lowest_property_number_SC     25
1543 #define highest_property_number_SC    26
1544 #define property_names_array_SC       27
1545
1546 #define lowest_action_number_SC       28
1547 #define highest_action_number_SC      29
1548 #define action_names_array_SC         30
1549
1550 #define lowest_fake_action_number_SC  31
1551 #define highest_fake_action_number_SC 32
1552 #define fake_action_names_array_SC    33
1553
1554 #define lowest_routine_number_SC      34
1555 #define highest_routine_number_SC     35
1556 #define routines_array_SC             36
1557 #define routine_names_array_SC        37
1558 #define routine_flags_array_SC        38
1559
1560 #define lowest_global_number_SC       39
1561 #define highest_global_number_SC      40
1562 #define globals_array_SC              41
1563 #define global_names_array_SC         42
1564 #define global_flags_array_SC         43
1565
1566 #define lowest_array_number_SC        44
1567 #define highest_array_number_SC       45
1568 #define arrays_array_SC               46
1569 #define array_names_array_SC          47
1570 #define array_flags_array_SC          48
1571
1572 #define lowest_constant_number_SC     49
1573 #define highest_constant_number_SC    50
1574 #define constants_array_SC            51
1575 #define constant_names_array_SC       52
1576
1577 #define lowest_class_number_SC        53
1578 #define highest_class_number_SC       54
1579 #define class_objects_array_SC        55
1580
1581 #define lowest_object_number_SC       56
1582 #define highest_object_number_SC      57
1583
1584 #define oddeven_packing_SC            58
1585
1586 #define grammar_table_SC              59     /* Glulx-only */
1587 #define dictionary_table_SC           60     /* Glulx-only */
1588 #define dynam_string_table_SC         61     /* Glulx-only */
1589
1590
1591 /*  Index numbers into the keyword group "system_functions" (see "lexer.c")  */
1592
1593 #define NUMBER_SYSTEM_FUNCTIONS 12
1594
1595 #define CHILD_SYSF       0
1596 #define CHILDREN_SYSF    1
1597 #define ELDER_SYSF       2
1598 #define ELDEST_SYSF      3
1599 #define INDIRECT_SYSF    4
1600 #define PARENT_SYSF      5
1601 #define RANDOM_SYSF      6
1602 #define SIBLING_SYSF     7
1603 #define YOUNGER_SYSF     8
1604 #define YOUNGEST_SYSF    9
1605 #define METACLASS_SYSF  10
1606 #define GLK_SYSF        11     /* Glulx-only */
1607
1608 /*  Index numbers into the operators group "separators" (see "lexer.c")  */
1609
1610 #define NUMBER_SEPARATORS 49
1611
1612 #define ARROW_SEP        0
1613 #define DARROW_SEP       1
1614 #define DEC_SEP          2
1615 #define MINUS_SEP        3
1616 #define INC_SEP          4
1617 #define PLUS_SEP         5
1618 #define TIMES_SEP        6
1619 #define DIVIDE_SEP       7
1620 #define REMAINDER_SEP    8
1621 #define LOGOR_SEP        9
1622 #define ARTOR_SEP       10
1623 #define LOGAND_SEP      11
1624 #define ARTAND_SEP      12
1625 #define LOGNOT_SEP      13
1626 #define NOTEQUAL_SEP    14
1627 #define ARTNOT_SEP      15
1628 #define CONDEQUALS_SEP  16
1629 #define SETEQUALS_SEP   17
1630 #define GE_SEP          18
1631 #define GREATER_SEP     19
1632 #define LE_SEP          20
1633 #define LESS_SEP        21
1634 #define OPENB_SEP       22
1635 #define CLOSEB_SEP      23
1636 #define COMMA_SEP       24
1637 #define PROPADD_SEP     25
1638 #define PROPNUM_SEP     26
1639 #define MPROPADD_SEP    27
1640 #define MPROPNUM_SEP    28
1641 #define MESSAGE_SEP     29
1642 #define PROPERTY_SEP    30
1643 #define SUPERCLASS_SEP  31
1644 #define COLON_SEP       32
1645 #define AT_SEP          33
1646 #define SEMICOLON_SEP   34
1647 #define OPEN_SQUARE_SEP 35
1648 #define CLOSE_SQUARE_SEP 36
1649 #define OPEN_BRACE_SEP  37
1650 #define CLOSE_BRACE_SEP 38
1651 #define DOLLAR_SEP      39
1652 #define NBRANCH_SEP     40
1653 #define BRANCH_SEP      41
1654 #define HASHADOLLAR_SEP 42
1655 #define HASHGDOLLAR_SEP 43
1656 #define HASHNDOLLAR_SEP 44
1657 #define HASHRDOLLAR_SEP 45
1658 #define HASHWDOLLAR_SEP 46
1659 #define HASHHASH_SEP    47
1660 #define HASH_SEP        48
1661
1662 #define UNARY_MINUS_SEP 100
1663 #define POST_INC_SEP    101
1664 #define POST_DEC_SEP    102
1665
1666 /* ------------------------------------------------------------------------- */
1667 /*   Internal numbers used to refer to operators (in expressions)            */
1668 /*   (must correspond to entries in the operators table in "express.c")      */
1669 /* ------------------------------------------------------------------------- */
1670
1671 #define NUM_OPERATORS 68
1672
1673 #define PRE_U          1
1674 #define IN_U           2
1675 #define POST_U         3
1676
1677 #define R_A            1
1678 #define L_A            2
1679
1680 #define COMMA_OP       0
1681 #define SETEQUALS_OP   1
1682 #define LOGAND_OP      2
1683 #define LOGOR_OP       3
1684 #define LOGNOT_OP      4
1685
1686 #define ZERO_OP        5
1687 #define NONZERO_OP     6
1688 #define CONDEQUALS_OP  7
1689 #define NOTEQUAL_OP    8
1690 #define GE_OP          9
1691 #define GREATER_OP    10
1692 #define LE_OP         11
1693 #define LESS_OP       12
1694 #define HAS_OP        13
1695 #define HASNT_OP      14
1696 #define IN_OP         15
1697 #define NOTIN_OP      16
1698 #define OFCLASS_OP    17
1699 #define PROVIDES_OP   18
1700 #define NOTOFCLASS_OP  19
1701 #define NOTPROVIDES_OP 20
1702 #define OR_OP         21
1703
1704 #define PLUS_OP       22
1705 #define MINUS_OP      23
1706 #define TIMES_OP      24
1707 #define DIVIDE_OP     25
1708 #define REMAINDER_OP  26
1709 #define ARTAND_OP     27
1710 #define ARTOR_OP      28
1711 #define ARTNOT_OP     29
1712 #define ARROW_OP      30
1713 #define DARROW_OP     31
1714 #define UNARY_MINUS_OP 32
1715 #define INC_OP        33
1716 #define POST_INC_OP   34
1717 #define DEC_OP        35
1718 #define POST_DEC_OP   36
1719 #define PROP_ADD_OP   37
1720 #define PROP_NUM_OP   38
1721 #define MPROP_ADD_OP  39
1722 #define MPROP_NUM_OP  40
1723 #define FCALL_OP      41
1724 #define MESSAGE_OP    42
1725 #define PROPERTY_OP   43
1726 #define SUPERCLASS_OP 44
1727
1728 #define ARROW_SETEQUALS_OP   45
1729 #define DARROW_SETEQUALS_OP  46
1730 #define MESSAGE_SETEQUALS_OP 47
1731 #define PROPERTY_SETEQUALS_OP 48
1732
1733 #define ARROW_INC_OP   49
1734 #define DARROW_INC_OP  50
1735 #define MESSAGE_INC_OP 51
1736 #define PROPERTY_INC_OP 52
1737
1738 #define ARROW_DEC_OP   53
1739 #define DARROW_DEC_OP  54
1740 #define MESSAGE_DEC_OP 55
1741 #define PROPERTY_DEC_OP 56
1742
1743 #define ARROW_POST_INC_OP   57
1744 #define DARROW_POST_INC_OP  58
1745 #define MESSAGE_POST_INC_OP 59
1746 #define PROPERTY_POST_INC_OP 60
1747
1748 #define ARROW_POST_DEC_OP   61
1749 #define DARROW_POST_DEC_OP  62
1750 #define MESSAGE_POST_DEC_OP 63
1751 #define PROPERTY_POST_DEC_OP 64
1752
1753 #define PROP_CALL_OP 65
1754 #define MESSAGE_CALL_OP 66
1755
1756 #define PUSH_OP 67 /* Glulx only */
1757
1758 /* ------------------------------------------------------------------------- */
1759 /*   The five types of compiled array                                        */
1760 /* ------------------------------------------------------------------------- */
1761
1762 #define BYTE_ARRAY      0
1763 #define WORD_ARRAY      1
1764 #define STRING_ARRAY    2
1765 #define TABLE_ARRAY     3
1766 #define BUFFER_ARRAY    4
1767
1768 /* ------------------------------------------------------------------------- */
1769 /*   Internal numbers used to refer to veneer routines                       */
1770 /*   (must correspond to entries in the table in "veneer.c")                 */
1771 /* ------------------------------------------------------------------------- */
1772
1773 #define VENEER_ROUTINES 48
1774
1775 #define Box__Routine_VR    0
1776
1777 #define R_Process_VR       1
1778 #define DefArt_VR          2
1779 #define InDefArt_VR        3
1780 #define CDefArt_VR         4
1781 #define CInDefArt_VR       5
1782 #define PrintShortName_VR  6
1783 #define EnglishNumber_VR   7
1784 #define Print__Pname_VR    8
1785
1786 #define WV__Pr_VR          9
1787 #define RV__Pr_VR         10
1788 #define CA__Pr_VR         11
1789 #define IB__Pr_VR         12
1790 #define IA__Pr_VR         13
1791 #define DB__Pr_VR         14
1792 #define DA__Pr_VR         15
1793 #define RA__Pr_VR         16
1794 #define RL__Pr_VR         17
1795 #define RA__Sc_VR         18
1796 #define OP__Pr_VR         19
1797 #define OC__Cl_VR         20
1798
1799 #define Copy__Primitive_VR 21
1800 #define RT__Err_VR         22
1801 #define Z__Region_VR       23
1802 #define Unsigned__Compare_VR 24
1803 #define Metaclass_VR      25
1804 #define CP__Tab_VR        26
1805 #define Cl__Ms_VR         27
1806 #define RT__ChT_VR        28
1807 #define RT__ChR_VR        29
1808 #define RT__ChG_VR        30
1809 #define RT__ChGt_VR       31
1810 #define RT__ChPS_VR       32
1811 #define RT__ChPR_VR       33 
1812 #define RT__TrPS_VR       34
1813 #define RT__ChLDB_VR      35
1814 #define RT__ChLDW_VR      36
1815 #define RT__ChSTB_VR      37
1816 #define RT__ChSTW_VR      38
1817 #define RT__ChPrintC_VR   39
1818 #define RT__ChPrintA_VR   40
1819 #define RT__ChPrintS_VR   41
1820 #define RT__ChPrintO_VR   42
1821
1822 /* Glulx-only veneer routines */
1823 #define OB__Move_VR       43
1824 #define OB__Remove_VR     44
1825 #define Print__Addr_VR    45
1826 #define Glk__Wrap_VR      46
1827 #define Dynam__String_VR  47
1828
1829 /* ------------------------------------------------------------------------- */
1830 /*   Run-time-error numbers (must correspond with RT__Err code in veneer)    */
1831 /* ------------------------------------------------------------------------- */
1832
1833 #define IN_RTE             2
1834 #define HAS_RTE            3
1835 #define PARENT_RTE         4
1836 #define ELDEST_RTE         5
1837 #define CHILD_RTE          6
1838 #define YOUNGER_RTE        7
1839 #define SIBLING_RTE        8
1840 #define CHILDREN_RTE       9
1841 #define YOUNGEST_RTE      10
1842 #define ELDER_RTE         11
1843 #define OBJECTLOOP_RTE    12
1844 #define OBJECTLOOP2_RTE   13
1845 #define GIVE_RTE          14
1846 #define REMOVE_RTE        15
1847 #define MOVE1_RTE         16
1848 #define MOVE2_RTE         17
1849 /* 18 = creating a loop in object tree */
1850 /* 19 = giving a non-existent attribute */
1851 #define DBYZERO_RTE       20
1852 #define PROP_ADD_RTE      21
1853 #define PROP_NUM_RTE      22
1854 #define PROPERTY_RTE      23
1855 /* 24 = reading with -> out of range */
1856 /* 25 = reading with --> out of range */
1857 /* 26 = writing with -> out of range */
1858 /* 27 = writing with --> out of range */
1859 #define ABOUNDS_RTE       28
1860 /* similarly 29, 30, 31 */
1861 #define OBJECTLOOP_BROKEN_RTE 32
1862 /* 33 = print (char) out of range */
1863 /* 34 = print (address) out of range */
1864 /* 35 = print (string) out of range */
1865 /* 36 = print (object) out of range */
1866
1867 /* ------------------------------------------------------------------------- */
1868 /*   Z-region areas (used to refer to module positions in markers)           */
1869 /* ------------------------------------------------------------------------- */
1870
1871 #define LOW_STRINGS_ZA         1
1872 #define PROP_DEFAULTS_ZA       2
1873 #define OBJECT_TREE_ZA         3
1874 #define PROP_ZA                4
1875 #define CLASS_NUMBERS_ZA       5
1876 #define INDIVIDUAL_PROP_ZA     6
1877 #define DYNAMIC_ARRAY_ZA       7
1878 #define GRAMMAR_ZA             8
1879 #define ACTIONS_ZA             9
1880 #define PREACTIONS_ZA         10
1881 #define ADJECTIVES_ZA         11
1882 #define DICTIONARY_ZA         12
1883 #define ZCODE_ZA              13
1884 #define STATIC_STRINGS_ZA     14
1885 #define LINK_DATA_ZA          15
1886
1887 #define SYMBOLS_ZA            16
1888 #define STATIC_ARRAY_ZA       17 /* Z-code only */
1889 #define GLOBALVAR_ZA          18 /* Glulx only */
1890
1891 /* ------------------------------------------------------------------------- */
1892 /*   "Marker values", used for backpatching and linkage                      */
1893 /* ------------------------------------------------------------------------- */
1894
1895 #define NULL_MV                0     /* Null */
1896
1897 /* Marker values used in backpatch areas: */
1898
1899 #define DWORD_MV               1     /* Dictionary word address */
1900 #define STRING_MV              2     /* Static string */
1901 #define INCON_MV               3     /* "Hardware" constant (table address) */
1902 #define IROUTINE_MV            4     /* Call to internal routine */
1903 #define VROUTINE_MV            5     /* Call to veneer routine */
1904 #define ARRAY_MV               6     /* Ref to internal dynam array address */
1905 #define NO_OBJS_MV             7     /* Ref to number of game objects */
1906 #define INHERIT_MV             8     /* Inherited property value */
1907 #define INHERIT_INDIV_MV       9     /* Inherited indiv property value */
1908 #define MAIN_MV               10     /* "Main" routine */
1909 #define SYMBOL_MV             11     /* Forward ref to unassigned symbol */
1910
1911 /* Additional marker values used in module backpatch areas: */
1912 /* (In Glulx, OBJECT_MV and VARIABLE_MV are used in backpatching, even
1913    without modules.) */
1914
1915 #define VARIABLE_MV           12     /* Global variable */
1916 #define IDENT_MV              13     /* Property identifier number */
1917 #define INDIVPT_MV            14     /* Individual prop table address */
1918 #define ACTION_MV             15     /* Action number */
1919 #define OBJECT_MV             16     /* Ref to internal object number */
1920 #define STATIC_ARRAY_MV       17     /* Ref to internal static array address */
1921
1922 #define LARGEST_BPATCH_MV     17     /* Larger marker values are never written
1923                                         to backpatch tables */
1924
1925 /* Value indicating an imported symbol record: */
1926
1927 #define IMPORT_MV             32
1928
1929 /* Values indicating an exported symbol record: */
1930
1931 #define EXPORT_MV             33     /* Defined ordinarily */
1932 #define EXPORTSF_MV           34     /* Defined in a system file */
1933 #define EXPORTAC_MV           35     /* Action name */
1934
1935 /* Values used only in branch backpatching: */
1936 /* ###-I've rearranged these, so that BRANCH_MV can be last; Glulx uses the
1937    whole range from BRANCH_MV to BRANCHMAX_MV. */
1938
1939 #define LABEL_MV              36     /* Ditto: marks "jump" operands */
1940 #define DELETED_MV            37     /* Ditto: marks bytes deleted from code */
1941 #define BRANCH_MV             38     /* Used in "asm.c" for routine coding */
1942 #define BRANCHMAX_MV          58     /* In fact, the range BRANCH_MV to 
1943                                         BRANCHMAX_MV all means the same thing.
1944                                         The position within the range means
1945                                         how far back from the label to go
1946                                         to find the opmode byte to modify. */
1947
1948 /* ========================================================================= */
1949 /*   Initialisation extern definitions                                       */
1950 /*                                                                           */
1951 /*   Note that each subsystem in Inform provides four routines to keep       */
1952 /*   track of variables and data structures:                                 */
1953 /*                                                                           */
1954 /*       init_*_vars      should set variables to initial values (they must  */
1955 /*                        not be initialised directly in their declarations  */
1956 /*                        as Inform may need to compile several times in a   */
1957 /*                        row)                                               */
1958 /*                                                                           */
1959 /*       *_begin_pass     any variable/array initialisation that needs to    */
1960 /*                        happen at the start of the pass through the source */
1961 /*                                                                           */
1962 /*       *_allocate_arrays   should use my_malloc/my_calloc (see memory.c)   */
1963 /*                        to allocate any arrays or workspace needed         */
1964 /*                                                                           */
1965 /*       *_free_arrays    should use my_free to free all memory allocated    */
1966 /*                        (with one exception in "text.c")                   */
1967 /*                                                                           */
1968 /* ========================================================================= */
1969
1970                                       /* > READ INFORM SOURCE                */
1971
1972                                       /* My Source Book                      */
1973
1974 extern void init_arrays_vars(void);   /* arrays: construct tableaux          */
1975 extern void init_asm_vars(void);      /* asm: assemble even rare or v6 codes */
1976 extern void init_bpatch_vars(void);   /* bpatch: backpatches code            */
1977 extern void init_chars_vars(void);    /* chars: translate character sets     */
1978 extern void init_directs_vars(void);  /* directs: ponder directives          */
1979 extern void init_errors_vars(void);   /* errors: issue diagnostics           */
1980 extern void init_expressc_vars(void); /* expressc: compile expressions       */
1981 extern void init_expressp_vars(void); /* expressp: parse expressions         */
1982 extern void init_files_vars(void);    /* files: handle files                 */
1983     /* void init_vars(void);             inform: decide what to do           */
1984 extern void init_lexer_vars(void);    /* lexer: lexically analyse source     */
1985 extern void init_linker_vars(void);   /* linker: link in pre-compiled module */
1986 extern void init_memory_vars(void);   /* memory: manage memory settings      */
1987 extern void init_objects_vars(void);  /* objects: cultivate object tree      */
1988 extern void init_states_vars(void);   /* states: translate statements to code*/
1989 extern void init_symbols_vars(void);  /* symbols: construct symbols table    */
1990 extern void init_syntax_vars(void);   /* syntax: parse the program           */
1991 extern void init_tables_vars(void);   /* tables: glue tables into the output */
1992 extern void init_text_vars(void);     /* text: encode text and dictionary    */
1993 extern void init_veneer_vars(void);   /* veneer: compile a layer of code     */
1994 extern void init_verbs_vars(void);    /* verbs: lay out grammar              */
1995
1996 extern void files_begin_prepass(void);  /*  These routines initialise just   */
1997 extern void lexer_begin_prepass(void);  /*  enough to begin loading source   */
1998
1999 extern void arrays_begin_pass(void);
2000 extern void asm_begin_pass(void);
2001 extern void bpatch_begin_pass(void);
2002 extern void chars_begin_pass(void);
2003 extern void directs_begin_pass(void);
2004 extern void errors_begin_pass(void);
2005 extern void expressc_begin_pass(void);
2006 extern void expressp_begin_pass(void);
2007 extern void files_begin_pass(void);
2008     /* void begin_pass(void); */
2009 extern void lexer_begin_pass(void);
2010 extern void linker_begin_pass(void);
2011 extern void memory_begin_pass(void);
2012 extern void objects_begin_pass(void);
2013 extern void states_begin_pass(void);
2014 extern void symbols_begin_pass(void);
2015 extern void syntax_begin_pass(void);
2016 extern void tables_begin_pass(void);
2017 extern void text_begin_pass(void);
2018 extern void veneer_begin_pass(void);
2019 extern void verbs_begin_pass(void);
2020
2021 extern void lexer_endpass(void);
2022 extern void linker_endpass(void);
2023
2024 extern void arrays_allocate_arrays(void);
2025 extern void asm_allocate_arrays(void);
2026 extern void bpatch_allocate_arrays(void);
2027 extern void chars_allocate_arrays(void);
2028 extern void directs_allocate_arrays(void);
2029 extern void errors_allocate_arrays(void);
2030 extern void expressc_allocate_arrays(void);
2031 extern void expressp_allocate_arrays(void);
2032 extern void files_allocate_arrays(void);
2033     /* void allocate_arrays(void); */
2034 extern void lexer_allocate_arrays(void);
2035 extern void linker_allocate_arrays(void);
2036 extern void memory_allocate_arrays(void);
2037 extern void objects_allocate_arrays(void);
2038 extern void states_allocate_arrays(void);
2039 extern void symbols_allocate_arrays(void);
2040 extern void syntax_allocate_arrays(void);
2041 extern void tables_allocate_arrays(void);
2042 extern void text_allocate_arrays(void);
2043 extern void veneer_allocate_arrays(void);
2044 extern void verbs_allocate_arrays(void);
2045
2046 extern void arrays_free_arrays(void);
2047 extern void asm_free_arrays(void);
2048 extern void bpatch_free_arrays(void);
2049 extern void chars_free_arrays(void);
2050 extern void directs_free_arrays(void);
2051 extern void errors_free_arrays(void);
2052 extern void expressc_free_arrays(void);
2053 extern void expressp_free_arrays(void);
2054 extern void files_free_arrays(void);
2055     /* void free_arrays(void); */
2056 extern void lexer_free_arrays(void);
2057 extern void linker_free_arrays(void);
2058 extern void memory_free_arrays(void);
2059 extern void objects_free_arrays(void);
2060 extern void states_free_arrays(void);
2061 extern void symbols_free_arrays(void);
2062 extern void syntax_free_arrays(void);
2063 extern void tables_free_arrays(void);
2064 extern void text_free_arrays(void);
2065 extern void veneer_free_arrays(void);
2066 extern void verbs_free_arrays(void);
2067
2068 /* ========================================================================= */
2069 /*   Remaining extern definitions are given by file in alphabetical order    */
2070 /* ------------------------------------------------------------------------- */
2071 /*   Extern definitions for "arrays"                                         */
2072 /* ------------------------------------------------------------------------- */
2073
2074 extern int no_globals, no_arrays;
2075 extern int dynamic_array_area_size;
2076 extern int *dynamic_array_area;
2077 extern int static_array_area_size;
2078 extern int *static_array_area;
2079 extern int32 *global_initial_value;
2080 extern int32 *array_symbols;
2081 extern int  *array_sizes, *array_types, *array_locs;
2082
2083 extern void make_global(int array_flag, int name_only);
2084 extern void set_variable_value(int i, int32 v);
2085 extern void check_globals(void);
2086 extern int32 begin_table_array(void);
2087 extern int32 begin_word_array(void);
2088 extern void array_entry(int32 i, int is_static, assembly_operand VAL);
2089 extern void finish_array(int32 i, int is_static);
2090
2091 /* ------------------------------------------------------------------------- */
2092 /*   Extern definitions for "asm"                                            */
2093 /* ------------------------------------------------------------------------- */
2094
2095 extern memory_block zcode_area;
2096 extern int32 zmachine_pc;
2097
2098 extern int32 no_instructions;
2099 extern int   sequence_point_follows;
2100 extern int   uses_unicode_features, uses_memheap_features, 
2101     uses_acceleration_features, uses_float_features;
2102 extern debug_location statement_debug_location;
2103 extern int   execution_never_reaches_here;
2104 extern int   *variable_usage;
2105 extern int   next_label, no_sequence_points;
2106 extern int32 *variable_tokens;
2107 extern assembly_instruction AI;
2108 extern int32 *named_routine_symbols;
2109
2110 extern void print_operand(assembly_operand o);
2111 extern char *variable_name(int32 i);
2112 extern void set_constant_ot(assembly_operand *AO);
2113 extern int  is_constant_ot(int otval);
2114 extern int  is_variable_ot(int otval);
2115 extern void assemblez_instruction(assembly_instruction *a);
2116 extern void assembleg_instruction(assembly_instruction *a);
2117 extern void assemble_label_no(int n);
2118 extern void assemble_jump(int n);
2119 extern void define_symbol_label(int symbol);
2120 extern int32 assemble_routine_header(int no_locals, int debug_flag,
2121     char *name, int embedded_flag, int the_symbol);
2122 extern void assemble_routine_end(int embedded_flag, debug_locations locations);
2123
2124 extern void assemblez_0(int internal_number);
2125 extern void assemblez_0_to(int internal_number, assembly_operand o1);
2126 extern void assemblez_0_branch(int internal_number, int label, int flag);
2127 extern void assemblez_1(int internal_number, assembly_operand o1);
2128 extern void assemblez_1_to(int internal_number,
2129                        assembly_operand o1, assembly_operand st);
2130 extern void assemblez_1_branch(int internal_number,
2131                        assembly_operand o1, int label, int flag);
2132 extern void assemblez_objcode(int internal_number,
2133                        assembly_operand o1, assembly_operand st,
2134                        int label, int flag);
2135 extern void assemblez_2(int internal_number,
2136                        assembly_operand o1, assembly_operand o2);
2137 extern void assemblez_2_to(int internal_number,
2138                        assembly_operand o1, assembly_operand o2,
2139                        assembly_operand st);
2140 extern void assemblez_2_branch(int internal_number,
2141                        assembly_operand o1, assembly_operand o2,
2142                        int label, int flag);
2143 extern void assemblez_3(int internal_number,
2144                        assembly_operand o1, assembly_operand o2,
2145                        assembly_operand o3);
2146 extern void assemblez_3_branch(int internal_number,
2147                        assembly_operand o1, assembly_operand o2,
2148                        assembly_operand o3, int label, int flag);
2149 extern void assemblez_3_to(int internal_number,
2150                        assembly_operand o1, assembly_operand o2,
2151                        assembly_operand o3, assembly_operand st);
2152 extern void assemblez_4(int internal_number,
2153                        assembly_operand o1, assembly_operand o2,
2154                        assembly_operand o3, assembly_operand o4);
2155 extern void assemblez_5(int internal_number,
2156                        assembly_operand o1, assembly_operand o2,
2157                        assembly_operand o3, assembly_operand o4,
2158                        assembly_operand o5);
2159 extern void assemblez_6(int internal_number,
2160                        assembly_operand o1, assembly_operand o2,
2161                        assembly_operand o3, assembly_operand o4,
2162                        assembly_operand o5, assembly_operand o6);
2163 extern void assemblez_4_branch(int internal_number,
2164                        assembly_operand o1, assembly_operand o2,
2165                        assembly_operand o3, assembly_operand o4,
2166                        int label, int flag);
2167 extern void assemblez_4_to(int internal_number,
2168                        assembly_operand o1, assembly_operand o2,
2169                        assembly_operand o3, assembly_operand o4,
2170                        assembly_operand st);
2171 extern void assemblez_5_to(int internal_number,
2172                        assembly_operand o1, assembly_operand o2,
2173                        assembly_operand o3, assembly_operand o4,
2174                        assembly_operand o5, assembly_operand st);
2175
2176 extern void assemblez_inc(assembly_operand o1);
2177 extern void assemblez_dec(assembly_operand o1);
2178 extern void assemblez_store(assembly_operand o1, assembly_operand o2);
2179 extern void assemblez_jump(int n);
2180
2181 extern void assembleg_0(int internal_number);
2182 extern void assembleg_1(int internal_number, assembly_operand o1);
2183 extern void assembleg_2(int internal_number, assembly_operand o1,
2184   assembly_operand o2);
2185 extern void assembleg_3(int internal_number, assembly_operand o1,
2186   assembly_operand o2, assembly_operand o3);
2187 extern void assembleg_4(int internal_number, assembly_operand o1,
2188   assembly_operand o2, assembly_operand o3, assembly_operand o4);
2189 extern void assembleg_5(int internal_number, assembly_operand o1,
2190   assembly_operand o2, assembly_operand o3, assembly_operand o4,
2191   assembly_operand o5);
2192 extern void assembleg_0_branch(int internal_number,
2193   int label);
2194 extern void assembleg_1_branch(int internal_number,
2195   assembly_operand o1, int label);
2196 extern void assembleg_2_branch(int internal_number,
2197   assembly_operand o1, assembly_operand o2, int label);
2198 extern void assembleg_call_1(assembly_operand oaddr, assembly_operand o1, 
2199   assembly_operand odest);
2200 extern void assembleg_call_2(assembly_operand oaddr, assembly_operand o1, 
2201   assembly_operand o2, assembly_operand odest);
2202 extern void assembleg_call_3(assembly_operand oaddr, assembly_operand o1, 
2203   assembly_operand o2, assembly_operand o3, assembly_operand odest);
2204 extern void assembleg_inc(assembly_operand o1);
2205 extern void assembleg_dec(assembly_operand o1);
2206 extern void assembleg_store(assembly_operand o1, assembly_operand o2);
2207 extern void assembleg_jump(int n);
2208
2209 extern void parse_assembly(void);
2210
2211 /* ------------------------------------------------------------------------- */
2212 /*   Extern definitions for "bpatch"                                         */
2213 /* ------------------------------------------------------------------------- */
2214
2215 extern memory_block zcode_backpatch_table, staticarray_backpatch_table,
2216     zmachine_backpatch_table;
2217 extern int32 zcode_backpatch_size, staticarray_backpatch_size,
2218     zmachine_backpatch_size;
2219 extern int   backpatch_marker, backpatch_error_flag;
2220
2221 extern int32 backpatch_value(int32 value);
2222 extern void  backpatch_zmachine_image_z(void);
2223 extern void  backpatch_zmachine_image_g(void);
2224 extern void  backpatch_zmachine(int mv, int zmachine_area, int32 offset);
2225
2226 /* ------------------------------------------------------------------------- */
2227 /*   Extern definitions for "chars"                                          */
2228 /* ------------------------------------------------------------------------- */
2229
2230 extern uchar source_to_iso_grid[];
2231 extern int32 iso_to_unicode_grid[];
2232 extern int   character_digit_value[];
2233 extern uchar alphabet[3][27];
2234 extern int   alphabet_modified;
2235 extern int   zscii_defn_modified;
2236 extern int   zscii_high_water_mark;
2237 extern char  alphabet_used[];
2238 extern int   iso_to_alphabet_grid[];
2239 extern int   zscii_to_alphabet_grid[];
2240 extern int   textual_form_length;
2241
2242 extern int   iso_to_unicode(int iso);
2243 extern int   unicode_to_zscii(int32 u);
2244 extern int32 zscii_to_unicode(int z);
2245 extern int32 text_to_unicode(char *text);
2246 extern void  zscii_to_text(char *text, int zscii);
2247 extern char *name_of_iso_set(int s);
2248 extern void  change_character_set(void);
2249 extern void  new_alphabet(char *text, int alphabet);
2250 extern void  new_zscii_character(int32 unicode, int plus_flag);
2251 extern void  new_zscii_finished(void);
2252 extern void  map_new_zchar(int32 unicode);
2253 extern void  make_lower_case(char *str);
2254 extern void  make_upper_case(char *str);
2255
2256 /* ------------------------------------------------------------------------- */
2257 /*   Extern definitions for "directs"                                        */
2258 /* ------------------------------------------------------------------------- */
2259
2260 extern brief_location routine_starts_line;
2261
2262 extern int  no_routines, no_named_routines, no_locals, no_termcs;
2263 extern int  terminating_characters[];
2264
2265 extern int  parse_given_directive(int internal_flag);
2266
2267 /* ------------------------------------------------------------------------- */
2268 /*   Extern definitions for "errors"                                         */
2269 /* ------------------------------------------------------------------------- */
2270
2271 extern char *forerrors_buff;
2272 extern int  forerrors_pointer;
2273 extern int  no_errors, no_warnings, no_suppressed_warnings,
2274             no_link_errors, no_compiler_errors;
2275
2276 extern ErrorPosition ErrorReport;
2277
2278 extern void fatalerror(char *s) NORETURN;
2279 extern void fatalerror_named(char *s1, char *s2) NORETURN;
2280 extern void memory_out_error(int32 size, int32 howmany, char *name) NORETURN;
2281 extern void memoryerror(char *s, int32 size) NORETURN;
2282 extern void error(char *s);
2283 extern void error_named(char *s1, char *s2);
2284 extern void error_numbered(char *s1, int val);
2285 extern void error_named_at(char *s1, char *s2, brief_location report_line);
2286 extern void ebf_error(char *s1, char *s2);
2287 extern void ebf_symbol_error(char *s1, char *name, char *type, brief_location report_line);
2288 extern void char_error(char *s, int ch);
2289 extern void unicode_char_error(char *s, int32 uni);
2290 extern void no_such_label(char *lname);
2291 extern void warning(char *s);
2292 extern void warning_numbered(char *s1, int val);
2293 extern void warning_named(char *s1, char *s2);
2294 extern void dbnu_warning(char *type, char *name, brief_location report_line);
2295 extern void uncalled_routine_warning(char *type, char *name, brief_location report_line);
2296 extern void obsolete_warning(char *s1);
2297 extern void link_error(char *s);
2298 extern void link_error_named(char *s1, char *s2);
2299 extern int  compiler_error(char *s);
2300 extern int  compiler_error_named(char *s1, char *s2);
2301 extern void print_sorry_message(void);
2302
2303 #ifdef ARC_THROWBACK
2304 extern int  throwback_switch;
2305
2306 extern void throwback(int severity, char * error);
2307 extern void throwback_start(void);
2308 extern void throwback_end(void);
2309 #endif
2310
2311 /* ------------------------------------------------------------------------- */
2312 /*   Extern definitions for "expressc"                                       */
2313 /* ------------------------------------------------------------------------- */
2314
2315 extern int vivc_flag;
2316 extern operator operators[];
2317
2318 extern assembly_operand stack_pointer, temp_var1, temp_var2, temp_var3, 
2319     temp_var4, zero_operand, one_operand, two_operand, three_operand,
2320     four_operand, valueless_operand;
2321
2322 assembly_operand code_generate(assembly_operand AO, int context, int label);
2323 assembly_operand check_nonzero_at_runtime(assembly_operand AO1, int label,
2324        int rte_number);
2325
2326 /* ------------------------------------------------------------------------- */
2327 /*   Extern definitions for "expressp"                                       */
2328 /* ------------------------------------------------------------------------- */
2329
2330 extern int system_function_usage[];
2331 extern expression_tree_node *ET;
2332
2333 extern int z_system_constant_list[];
2334 extern int glulx_system_constant_list[];
2335
2336 extern int32 value_of_system_constant(int t);
2337 extern void clear_expression_space(void);
2338 extern void show_tree(assembly_operand AO, int annotate);
2339 extern assembly_operand parse_expression(int context);
2340 extern int test_for_incdec(assembly_operand AO);
2341
2342 /* ------------------------------------------------------------------------- */
2343 /*   Extern definitions for "files"                                          */
2344 /* ------------------------------------------------------------------------- */
2345
2346 extern int  total_files;
2347 extern int  current_input_file;
2348 extern int  total_input_files;
2349 extern FileId *InputFiles;
2350
2351 extern FILE *Temp1_fp, *Temp2_fp, *Temp3_fp;
2352 extern char Temp1_Name[], Temp2_Name[], Temp3_Name[];
2353 extern int32 total_chars_read;
2354
2355 extern void open_temporary_files(void);
2356 extern void check_temp_files(void);
2357 extern void remove_temp_files(void);
2358
2359 extern void open_transcript_file(char *what_of);
2360 extern void write_to_transcript_file(char *text);
2361 extern void close_transcript_file(void);
2362 extern void abort_transcript_file(void);
2363
2364 extern void nullify_debug_file_position(maybe_file_position *position);
2365
2366 extern void begin_debug_file(void);
2367
2368 extern void debug_file_printf(const char*format, ...);
2369 extern void debug_file_print_with_entities(const char*string);
2370 extern void debug_file_print_base_64_triple
2371     (uchar first, uchar second, uchar third);
2372 extern void debug_file_print_base_64_pair(uchar first, uchar second);
2373 extern void debug_file_print_base_64_single(uchar first);
2374
2375 extern void write_debug_location(debug_location location);
2376 extern void write_debug_locations(debug_locations locations);
2377 extern void write_debug_optional_identifier(int32 symbol_index);
2378 extern void write_debug_symbol_backpatch(int32 symbol_index);
2379 extern void write_debug_symbol_optional_backpatch(int32 symbol_index);
2380 extern void write_debug_object_backpatch(int32 object_number);
2381 extern void write_debug_packed_code_backpatch(int32 offset);
2382 extern void write_debug_code_backpatch(int32 offset);
2383 extern void write_debug_global_backpatch(int32 offset);
2384 extern void write_debug_array_backpatch(int32 offset);
2385 extern void write_debug_grammar_backpatch(int32 offset);
2386
2387 extern void begin_writing_debug_sections(void);
2388 extern void write_debug_section(const char*name, int32 beginning_address);
2389 extern void end_writing_debug_sections(int32 end_address);
2390
2391 extern void write_debug_undef(int32 symbol_index);
2392
2393 extern void end_debug_file(void);
2394
2395 extern void add_to_checksum(void *address);
2396
2397 extern void load_sourcefile(char *story_name, int style);
2398 extern int file_load_chars(int file_number, char *buffer, int length);
2399 extern void close_all_source(void);
2400 extern int register_orig_sourcefile(char *filename);
2401
2402 extern void output_file(void);
2403
2404 /* ------------------------------------------------------------------------- */
2405 /*   Extern definitions for "inform"                                         */
2406 /* ------------------------------------------------------------------------- */
2407
2408 extern char Code_Name[];
2409 extern int endofpass_flag;
2410
2411 extern int version_number,  instruction_set_number, extend_memory_map;
2412 extern int32 scale_factor,  length_scale_factor;
2413
2414 extern int WORDSIZE, INDIV_PROP_START, 
2415     OBJECT_BYTE_LENGTH, DICT_ENTRY_BYTE_LENGTH, DICT_ENTRY_FLAG_POS;
2416 extern int32 MAXINTWORD;
2417
2418 extern int asm_trace_level, line_trace_level,     expr_trace_level,
2419     linker_trace_level,     tokens_trace_level;
2420
2421 extern int
2422     bothpasses_switch,      concise_switch,
2423     economy_switch,         frequencies_switch,
2424     ignore_switches_switch, listobjects_switch,   debugfile_switch,
2425     listing_switch,         memout_switch,        printprops_switch,
2426     offsets_switch,         percentages_switch,   obsolete_switch,
2427     transcript_switch,      statistics_switch,    optimise_switch,
2428     version_set_switch,     nowarnings_switch,    hash_switch,
2429     memory_map_switch,      module_switch,        temporary_files_switch,
2430     define_DEBUG_switch,    define_USE_MODULES_switch, define_INFIX_switch,
2431     runtime_error_checking_switch;
2432
2433 extern int oddeven_packing_switch;
2434
2435 extern int glulx_mode, compression_switch;
2436 extern int32 requested_glulx_version;
2437
2438 extern int error_format,    store_the_text,       asm_trace_setting,
2439     double_space_setting,   trace_fns_setting,    character_set_setting,
2440     character_set_unicode;
2441
2442 extern char Debugging_Name[];
2443 extern char Transcript_Name[];
2444 extern char Language_Name[];
2445 extern char Charset_Map[];
2446
2447 extern char banner_line[];
2448
2449 extern void select_version(int vn);
2450 extern void switches(char *, int);
2451 extern int translate_in_filename(int last_value, char *new_name, char *old_name,
2452     int same_directory_flag, int command_line_flag);
2453 extern void translate_out_filename(char *new_name, char *old_name);
2454 extern int translate_link_filename(int last_value,
2455     char *new_name, char *old_name);
2456 extern void translate_temp_filename(int i);
2457
2458 #ifdef ARCHIMEDES
2459 extern char *riscos_file_type(void);
2460 #endif
2461
2462 /* For the benefit of the MAC_FACE port these are declared extern, though
2463    unused outside "inform" in the compiler itself */
2464
2465 extern void allocate_arrays(void);
2466 extern void free_arrays(void);
2467
2468 /* ------------------------------------------------------------------------- */
2469 /*   Extern definitions for "lexer"                                          */
2470 /* ------------------------------------------------------------------------- */
2471
2472 extern int  hash_printed_since_newline;
2473 extern int  total_source_line_count;
2474 extern int  dont_enter_into_symbol_table;
2475 extern int  return_sp_as_variable;
2476 extern int  next_token_begins_syntax_line;
2477 extern char **local_variable_texts;
2478
2479 extern int32 token_value;
2480 extern int   token_type;
2481 extern char *token_text;
2482
2483 extern debug_location get_token_location(void);
2484 extern debug_locations get_token_locations(void);
2485 extern debug_location_beginning get_token_location_beginning(void);
2486 extern void discard_token_location(debug_location_beginning beginning);
2487 extern debug_locations get_token_location_end(debug_location_beginning beginning);
2488
2489 extern void describe_token(token_data t);
2490
2491 extern void construct_local_variable_tables(void);
2492 extern void declare_systemfile(void);
2493 extern int  is_systemfile(void);
2494 extern void report_errors_at_current_line(void);
2495 extern debug_location get_current_debug_location(void);
2496 extern debug_location get_error_report_debug_location(void);
2497 extern int32 get_current_line_start(void);
2498 extern void set_origsource_location(char *source, int32 line, int32 charnum);
2499 extern brief_location get_brief_location(ErrorPosition *errpos);
2500 extern void export_brief_location(brief_location loc, ErrorPosition *errpos);
2501 extern brief_location blank_brief_location;
2502
2503 extern void put_token_back(void);
2504 extern void get_next_token(void);
2505 extern void restart_lexer(char *lexical_source, char *name);
2506
2507 extern keyword_group directives, statements, segment_markers,
2508        conditions, system_functions, local_variables, opcode_names,
2509        misc_keywords, directive_keywords, trace_keywords, system_constants,
2510        opcode_macros;
2511
2512 /* ------------------------------------------------------------------------- */
2513 /*   Extern definitions for "linker"                                         */
2514 /* ------------------------------------------------------------------------- */
2515
2516 extern memory_block link_data_area;
2517 extern int32 link_data_size;
2518 extern char  current_module_filename[];
2519
2520 extern char *describe_mv(int mval);
2521 extern void  write_link_marker(int zmachine_area, int32 offset,
2522                  assembly_operand op);
2523 extern void  flush_link_data(void);
2524 extern void  import_symbol(int32 symbol_number);
2525 extern void  export_symbol(int32 symbol_number);
2526 extern void  export_symbol_name(int32 i);
2527 extern void  link_module(char *filename);
2528
2529 /* ------------------------------------------------------------------------- */
2530 /*   Extern definitions for "memory"                                         */
2531 /* ------------------------------------------------------------------------- */
2532
2533 extern int32 malloced_bytes;
2534
2535 extern int MAX_QTEXT_SIZE,  MAX_SYMBOLS,    HASH_TAB_SIZE,   MAX_DICT_ENTRIES,
2536            MAX_OBJECTS,     MAX_ACTIONS,    MAX_ADJECTIVES,   MAX_ABBREVS,
2537            MAX_STATIC_DATA,      MAX_PROP_TABLE_SIZE,   SYMBOLS_CHUNK_SIZE,
2538            MAX_EXPRESSION_NODES, MAX_LABELS,            MAX_LINESPACE,
2539            MAX_LOW_STRINGS,      MAX_CLASSES,           MAX_VERBS,
2540            MAX_VERBSPACE,        MAX_ARRAYS,            MAX_INCLUSION_DEPTH,
2541            MAX_SOURCE_FILES;
2542
2543 extern int32 MAX_STATIC_STRINGS, MAX_ZCODE_SIZE, MAX_LINK_DATA_SIZE,
2544            MAX_TRANSCRIPT_SIZE,  MAX_INDIV_PROP_TABLE_SIZE,
2545            MAX_NUM_STATIC_STRINGS, MAX_UNICODE_CHARS,
2546            MAX_STACK_SIZE, MEMORY_MAP_EXTENSION;
2547
2548 extern int32 MAX_OBJ_PROP_COUNT, MAX_OBJ_PROP_TABLE_SIZE;
2549 extern int MAX_LOCAL_VARIABLES, MAX_GLOBAL_VARIABLES;
2550 extern int DICT_WORD_SIZE, DICT_CHAR_SIZE, DICT_WORD_BYTES;
2551 extern int ZCODE_HEADER_EXT_WORDS, ZCODE_HEADER_FLAGS_3;
2552 extern int NUM_ATTR_BYTES, GLULX_OBJECT_EXT_BYTES;
2553 extern int WARN_UNUSED_ROUTINES, OMIT_UNUSED_ROUTINES;
2554
2555 /* These macros define offsets that depend on the value of NUM_ATTR_BYTES.
2556    (Meaningful only for Glulx.) */
2557 /* GOBJFIELD: word offsets of various elements in the object structure. */
2558 #define GOBJFIELD_CHAIN()    (1+((NUM_ATTR_BYTES)/4))
2559 #define GOBJFIELD_NAME()     (2+((NUM_ATTR_BYTES)/4))
2560 #define GOBJFIELD_PROPTAB()  (3+((NUM_ATTR_BYTES)/4))
2561 #define GOBJFIELD_PARENT()   (4+((NUM_ATTR_BYTES)/4))
2562 #define GOBJFIELD_SIBLING()  (5+((NUM_ATTR_BYTES)/4))
2563 #define GOBJFIELD_CHILD()    (6+((NUM_ATTR_BYTES)/4))
2564
2565 extern void *my_malloc(int32 size, char *whatfor);
2566 extern void my_realloc(void *pointer, int32 oldsize, int32 size, 
2567     char *whatfor);
2568 extern void *my_calloc(int32 size, int32 howmany, char *whatfor);
2569 extern void my_recalloc(void *pointer, int32 size, int32 oldhowmany, 
2570     int32 howmany, char *whatfor);
2571 extern void my_free(void *pointer, char *whatitwas);
2572
2573 extern void set_memory_sizes(int size_flag);
2574 extern void adjust_memory_sizes(void);
2575 extern void memory_command(char *command);
2576 extern void print_memory_usage(void);
2577
2578 extern void initialise_memory_block(memory_block *MB);
2579 extern void deallocate_memory_block(memory_block *MB);
2580 extern int  read_byte_from_memory_block(memory_block *MB, int32 index);
2581 extern void write_byte_to_memory_block(memory_block *MB,
2582     int32 index, int value);
2583
2584 /* ------------------------------------------------------------------------- */
2585 /*   Extern definitions for "objects"                                        */
2586 /* ------------------------------------------------------------------------- */
2587
2588 extern int no_attributes, no_properties;
2589 extern int no_individual_properties;
2590 extern int individuals_length;
2591 extern uchar *individuals_table;
2592 extern int no_classes, no_objects;
2593 extern objecttz *objectsz;
2594 extern objecttg *objectsg;
2595 extern uchar *objectatts;
2596 extern int *class_object_numbers;
2597 extern int32 *class_begins_at;
2598
2599 extern int32 *prop_default_value;
2600 extern int *prop_is_long;
2601 extern int *prop_is_additive;
2602 extern char *properties_table;
2603 extern int properties_table_size;
2604
2605 extern void make_attribute(void);
2606 extern void make_property(void);
2607 extern void make_object(int nearby_flag,
2608     char *textual_name, int specified_parent, int specified_class,
2609     int instance_of);
2610 extern void make_class(char *metaclass_name);
2611 extern int  object_provides(int obj, int id);
2612 extern void list_object_tree(void);
2613 extern void write_the_identifier_names(void);
2614
2615 /* ------------------------------------------------------------------------- */
2616 /*   Extern definitions for "symbols"                                        */
2617 /* ------------------------------------------------------------------------- */
2618
2619 extern int no_named_constants;
2620 extern int no_symbols;
2621 extern int32 **symbs;
2622 extern int32 *svals;
2623 extern int   *smarks;
2624 extern brief_location *slines;
2625 extern int   *sflags;
2626 #ifdef VAX
2627   extern char *stypes;
2628 #else
2629   extern signed char *stypes;
2630 #endif
2631 extern maybe_file_position *symbol_debug_backpatch_positions;
2632 extern maybe_file_position *replacement_debug_backpatch_positions;
2633 extern int32 *individual_name_strings;
2634 extern int32 *attribute_name_strings;
2635 extern int32 *action_name_strings;
2636 extern int32 *array_name_strings;
2637 extern int track_unused_routines;
2638 extern int df_dont_note_global_symbols;
2639 extern uint32 df_total_size_before_stripping;
2640 extern uint32 df_total_size_after_stripping;
2641
2642 extern char *typename(int type);
2643 extern int hash_code_from_string(char *p);
2644 extern int strcmpcis(char *p, char *q);
2645 extern int symbol_index(char *lexeme_text, int hashcode);
2646 extern void end_symbol_scope(int k);
2647 extern void describe_symbol(int k);
2648 extern void list_symbols(int level);
2649 extern void assign_marked_symbol(int index, int marker, int32 value, int type);
2650 extern void assign_symbol(int index, int32 value, int type);
2651 extern void issue_unused_warnings(void);
2652 extern void add_symbol_replacement_mapping(int original, int renamed);
2653 extern int find_symbol_replacement(int *value);
2654 extern void df_note_function_start(char *name, uint32 address, 
2655     int embedded_flag, brief_location source_line);
2656 extern void df_note_function_end(uint32 endaddress);
2657 extern void df_note_function_symbol(int symbol);
2658 extern void locate_dead_functions(void);
2659 extern uint32 df_stripped_address_for_address(uint32);
2660 extern uint32 df_stripped_offset_for_code_offset(uint32, int *);
2661 extern void df_prepare_function_iterate(void);
2662 extern uint32 df_next_function_iterate(int *);
2663
2664 /* ------------------------------------------------------------------------- */
2665 /*   Extern definitions for "syntax"                                         */
2666 /* ------------------------------------------------------------------------- */
2667
2668 extern int   no_syntax_lines;
2669
2670 extern void  panic_mode_error_recovery(void);
2671 extern void  get_next_token_with_directives(void);
2672 extern int   parse_directive(int internal_flag);
2673 extern void  parse_program(char *source);
2674 extern int32 parse_routine(char *source, int embedded_flag, char *name,
2675                  int veneer_flag, int r_symbol);
2676 extern void  parse_code_block(int break_label, int continue_label,
2677                  int switch_rule);
2678
2679 /* ------------------------------------------------------------------------- */
2680 /*   Extern definitions for "states"                                         */
2681 /* ------------------------------------------------------------------------- */
2682
2683 extern void  match_close_bracket(void);
2684 extern void  parse_statement(int break_label, int continue_label);
2685 extern int   parse_label(void);
2686
2687 /* ------------------------------------------------------------------------- */
2688 /*   Extern definitions for "tables"                                         */
2689 /* ------------------------------------------------------------------------- */
2690
2691 extern uchar *zmachine_paged_memory;
2692 extern int32
2693     code_offset,            actions_offset,       preactions_offset,
2694     dictionary_offset,      strings_offset,       adjectives_offset,
2695     variables_offset,       class_numbers_offset, individuals_offset,
2696    identifier_names_offset, prop_defaults_offset, prop_values_offset,
2697     static_memory_offset,   array_names_offset,   attribute_names_offset,
2698     action_names_offset,    fake_action_names_offset,
2699     routine_names_offset,   routines_array_offset, routine_flags_array_offset,
2700     global_names_offset,    global_flags_array_offset,
2701     array_flags_array_offset, constant_names_offset, constants_array_offset,
2702     static_arrays_offset;
2703 extern int32
2704     arrays_offset, object_tree_offset, grammar_table_offset,
2705     abbreviations_offset;    /* For Glulx */
2706
2707 extern int32 Out_Size,      Write_Code_At,        Write_Strings_At;
2708 extern int32 RAM_Size,      Write_RAM_At;    /* For Glulx */
2709
2710 extern int release_number, statusline_flag;
2711 extern int flags2_requirements[];
2712 extern int serial_code_given_in_program;
2713 extern char serial_code_buffer[];
2714
2715 extern void construct_storyfile(void);
2716 extern void write_serial_number(char *buffer);
2717
2718 /* ------------------------------------------------------------------------- */
2719 /*   Extern definitions for "text"                                           */
2720 /* ------------------------------------------------------------------------- */
2721
2722 extern uchar *low_strings, *low_strings_top;
2723 extern char  *all_text,    *all_text_top;
2724
2725 extern int   no_abbreviations;
2726 extern int   abbrevs_lookup_table_made, is_abbreviation;
2727 extern uchar *abbreviations_at;
2728 extern int  *abbrev_values;
2729 extern int  *abbrev_quality;
2730 extern int  *abbrev_freqs;
2731
2732 extern int32 total_chars_trans, total_bytes_trans,
2733              zchars_trans_in_last_string;
2734 extern int   put_strings_in_low_memory;
2735 extern int   dict_entries;
2736 extern uchar *dictionary, *dictionary_top;
2737 extern int   *final_dict_order;
2738
2739 extern memory_block static_strings_area;
2740 extern int32 static_strings_extent;
2741
2742 /* And now, a great many declarations for dealing with Glulx string
2743    compression. */
2744
2745 extern int32 no_strings, no_dynamic_strings;
2746 extern int no_unicode_chars;
2747
2748 #define MAX_DYNAMIC_STRINGS (64)
2749
2750 typedef struct unicode_usage_s unicode_usage_t;
2751 struct unicode_usage_s {
2752   int32 ch;
2753   unicode_usage_t *next;  
2754 };
2755
2756 extern unicode_usage_t *unicode_usage_entries;
2757
2758 /* This is the maximum number of (8-bit) bytes that can encode a single
2759    Huffman entity. Four should be plenty, unless someone starts encoding
2760    an ideographic language. */
2761 #define MAXHUFFBYTES (4)
2762
2763 typedef struct huffbitlist_struct {
2764   uchar b[MAXHUFFBYTES];
2765 } huffbitlist_t;
2766 typedef struct huffentity_struct {
2767   int count;
2768   int type;
2769   union {
2770     int branch[2];
2771     unsigned char ch;
2772     int val;
2773   } u;
2774   int depth;
2775   int32 addr;
2776   huffbitlist_t bits;
2777 } huffentity_t;
2778
2779 extern huffentity_t *huff_entities;
2780
2781 extern int32 compression_table_size, compression_string_size;
2782 extern int32 *compressed_offsets;
2783 extern int no_huff_entities;
2784 extern int huff_abbrev_start, huff_dynam_start, huff_unicode_start;
2785 extern int huff_entity_root;
2786
2787 extern void  compress_game_text(void);
2788
2789 /* end of the Glulx string compression stuff */
2790
2791 extern void  ao_free_arrays(void);
2792 extern int32 compile_string(char *b, int in_low_memory, int is_abbrev);
2793 extern uchar *translate_text(uchar *p, uchar *p_limit, char *s_text);
2794 extern void  optimise_abbreviations(void);
2795 extern void  make_abbreviation(char *text);
2796 extern void  show_dictionary(void);
2797 extern void  word_to_ascii(uchar *p, char *result);
2798 extern void  write_dictionary_to_transcript(void);
2799 extern void  sort_dictionary(void);
2800 extern void  dictionary_prepare(char *dword, uchar *optresult);
2801 extern int   dictionary_add(char *dword, int x, int y, int z);
2802 extern void  dictionary_set_verb_number(char *dword, int to);
2803 extern int   compare_sorts(uchar *d1, uchar *d2);
2804 extern void  copy_sorts(uchar *d1, uchar *d2);
2805
2806 /* ------------------------------------------------------------------------- */
2807 /*   Extern definitions for "veneer"                                         */
2808 /* ------------------------------------------------------------------------- */
2809
2810 extern int  veneer_mode;
2811 extern int32 veneer_routine_address[];
2812
2813 extern void compile_initial_routine(void);
2814 extern assembly_operand veneer_routine(int code);
2815 extern void compile_veneer(void);
2816
2817 /* ------------------------------------------------------------------------- */
2818 /*   Extern definitions for "verbs"                                          */
2819 /* ------------------------------------------------------------------------- */
2820
2821 extern int no_adjectives, no_Inform_verbs, no_grammar_token_routines,
2822            no_fake_actions, no_actions, no_grammar_lines, no_grammar_tokens,
2823            grammar_version_number;
2824 extern int32 grammar_version_symbol;
2825 extern verbt *Inform_verbs;
2826 extern uchar *grammar_lines;
2827 extern int32 grammar_lines_top;
2828 extern int32 *action_byte_offset,
2829              *grammar_token_routine,
2830              *adjectives;
2831
2832 extern void find_the_actions(void);
2833 extern void make_fake_action(void);
2834 extern assembly_operand action_of_name(char *name);
2835 extern void make_verb(void);
2836 extern void extend_verb(void);
2837 extern void list_verb_table(void);
2838
2839 /* ========================================================================= */