94ca84f467ecb1e09f0fb9fe8108f23f34ce093b
[inform.git] / header.h
1 /* ------------------------------------------------------------------------- */
2 /*   Header file for Inform:  Z-machine ("Infocom" format) compiler          */
3 /*                                                                           */
4 /* Copyright (c) Graham Nelson 1993 - 2016                                   */
5 /*                                                                           */
6 /* This file is part of Inform.                                              */
7 /*                                                                           */
8 /* Inform is free software: you can redistribute it and/or modify            */
9 /* it under the terms of the GNU General Public License as published by      */
10 /* the Free Software Foundation, either version 3 of the License, or         */
11 /* (at your option) any later version.                                       */
12 /*                                                                           */
13 /* Inform is distributed in the hope that it will be useful,                 */
14 /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
15 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the              */
16 /* GNU General Public License for more details.                              */
17 /*                                                                           */
18 /* You should have received a copy of the GNU General Public License         */
19 /* along with Inform. If not, see https://gnu.org/licenses/                  */
20 /*                                                                           */
21 /*   *** To compile this program in one of the existing ports, you must      */
22 /*       at least change the machine definition (on the next page).          */
23 /*       In most cases no other work will be needed. ***                     */
24 /*                                                                           */
25 /*   Contents:                                                               */
26 /*                                                                           */
27 /*       Machine/host OS definitions (in alphabetical order)                 */
28 /*       Default definitions                                                 */
29 /*       Standard ANSI inclusions, macro definitions, structures             */
30 /*       Definitions of internal code numbers                                */
31 /*       Extern declarations for linkage (in alphabetical order of file)     */
32 /*                                                                           */
33 /* ------------------------------------------------------------------------- */
34
35 #define RELEASE_DATE "5th March 2016"
36 #define RELEASE_NUMBER 1634
37 #define GLULX_RELEASE_NUMBER 38
38 #define MODULE_VERSION_NUMBER 1
39 #define VNUMBER RELEASE_NUMBER
40
41 /* N indicates an intermediate release for Inform 7 */
42 /*#define RELEASE_SUFFIX "N"*/
43
44 /* ------------------------------------------------------------------------- */
45 /*   Our host machine or OS for today is...                                  */
46 /*                                                                           */
47 /*   [ Inform should compile (possibly with warnings) and work safely        */
48 /*     if you just:                                                          */
49 /*                                                                           */
50 /*     #define AMIGA       -  for the Commodore Amiga under SAS/C            */
51 /*     #define ARCHIMEDES  -  for Acorn RISC OS machines under Norcroft C    */
52 /*     #define ATARIST     -  for the Atari ST                               */
53 /*     #define BEOS        -  for the BeBox                                  */
54 /*     #define LINUX       -  for Linux under gcc (essentially as Unix)      */
55 /*     #define MACINTOSH   -  for the Apple Mac under Think C or Codewarrior */
56 /*     #define MAC_MPW     -  for MPW under Codewarrior (and maybe Think C)  */
57 /*     #define OS2         -  for OS/2 32-bit mode under IBM's C Set++       */
58 /*     #define OSX         -  for the Apple Mac with OS X (another Unix)     */
59 /*     #define PC          -  for 386+ IBM PCs, eg. Microsoft Visual C/C++   */
60 /*     #define PC_QUICKC   -  for small IBM PCs under QuickC                 */
61 /*     #define PC_WIN32    -  for Borland C++ or Microsoft Visual C++        */
62 /*     #define UNIX        -  for Unix under gcc (or big IBM PC under djgpp) */
63 /*     #define UNIX64      -  for 64-bit Unix under gcc                      */
64 /*     #define VMS         -  for VAX or ALPHA under DEC C, but not VAX C    */
65 /*                                                                           */
66 /*     In most cases executables are already available at                    */
67 /*     http://www.ifarchive.org/, and these are sometimes enhanced with      */
68 /*     e.g. windowed interfaces whose source is not archived with the        */
69 /*     main Inform source.]                                                  */
70 /*                                                                           */
71 /*   (If no machine is defined, then cautious #defines will be made.  In     */
72 /*   most cases, porting to a new machine is a matter of carefully filling   */
73 /*   out a block of definitions like those below.)                           */
74 /* ------------------------------------------------------------------------- */
75
76 /* #define UNIX */
77
78 /* ------------------------------------------------------------------------- */
79 /*   The first task is to include the ANSI header files, and typedef         */
80 /*   suitable 32-bit integer types.                                          */
81 /* ------------------------------------------------------------------------- */
82
83 #include <stdio.h>
84 #include <stdlib.h>
85 #include <stdarg.h>
86 #include <ctype.h>
87 #include <string.h>
88 #include <time.h>
89 #include <limits.h>
90 #include <math.h>
91
92 #ifndef VAX
93 #if   SCHAR_MAX >= 0x7FFFFFFFL && SCHAR_MIN <= -0x7FFFFFFFL
94       typedef signed char       int32;
95       typedef unsigned char     uint32;
96 #elif SHRT_MAX >= 0x7FFFFFFFL  && SHRT_MIN <= -0x7FFFFFFFL
97       typedef signed short int  int32;
98       typedef unsigned short int uint32;
99 #elif INT_MAX >= 0x7FFFFFFFL   && INT_MIN <= -0x7FFFFFFFL
100       typedef signed int        int32;
101       typedef unsigned int      uint32;
102 #elif LONG_MAX >= 0x7FFFFFFFL  && LONG_MIN <= -0x7FFFFFFFL
103       typedef signed long int   int32;
104       typedef unsigned long int uint32;
105 #else
106 #error No type large enough to support 32-bit integers.
107 #endif
108 #else
109       /*  VAX C does not provide these limit constants, contrary to ANSI  */
110       typedef int int32;
111       typedef unsigned int uint32;
112 #endif
113
114 /* ------------------------------------------------------------------------- */
115 /*   The next part of this file contains blocks of definitions, one for      */
116 /*   each port, of machine or OS-dependent constants needed by Inform.       */
117 /*                                                                           */
118 /*   1. MACHINE_STRING should be set to the name of the machine or OS.       */
119 /*                                                                           */
120 /*   2. Some miscellaneous #define options (set if the constant is           */
121 /*   defined, otherwise not set):                                            */
122 /*                                                                           */
123 /*   USE_TEMPORARY_FILES - use scratch files for workspace, not memory,      */
124 /*                         by default                                        */
125 /*   PROMPT_INPUT        - prompt input (don't use Unix-style command line)  */
126 /*   TIME_UNAVAILABLE    - don't use ANSI time routines to work out today's  */
127 /*                         date                                              */
128 /*   CHAR_IS_UNSIGNED    - if on your compiler the type "char" is unsigned   */
129 /*                         by default, you should define this                */
130 /*   HAS_REALPATH        - the POSIX realpath() function is available to     */
131 /*                         find the absolute path to a file                  */
132 /*                                                                           */
133 /*   3. An estimate of the typical amount of memory likely to be free        */
134 /*   should be given in DEFAULT_MEMORY_SIZE.                                 */
135 /*   For most modern machines, HUGE_SIZE is the appropriate setting, but     */
136 /*   some older micros may benefit from SMALL_SIZE.                          */
137 /* ------------------------------------------------------------------------- */
138
139 #define LARGE_SIZE   1
140 #define SMALL_SIZE   2
141 #define HUGE_SIZE    3
142
143 /* ------------------------------------------------------------------------- */
144 /*   4. Filenaming definitions:                                              */
145 /*                                                                           */
146 /*   It's assumed that the host OS has the concept of subdirectories and     */
147 /*   has "pathnames", that is, filenames giving a chain of subdirectories    */
148 /*   divided by the FN_SEP (filename separator) character: e.g. for Unix     */
149 /*   FN_SEP is defined below as '/' and a typical name is                    */
150 /*                         "users/graham/jigsaw.z5".                         */
151 /*   White space is not allowed in filenames, and nor is the special         */
152 /*   character FN_ALT, which unless defined here will be a comma and will    */
153 /*   be used to separate alternative locations in a path variable.           */
154 /*                                                                           */
155 /*   If NO_FILE_EXTENSIONS is undefined then the OS allows "file extensions" */
156 /*   of 1 to 3 alphanumeric characters like ".txt" (for text files), ".z5"   */
157 /*   (for game files), etc., to indicate the file's type (and, crucially,    */
158 /*   regards the same filename but with different extensions -- e.g.,        */
159 /*   "frog.amp" and "frog.lil" -- as being different names).                 */
160 /*   (The file extensions defined below are widely accepted, so please use   */
161 /*   them unless there's a good reason why not.)                             */
162 /*                                                                           */
163 /*   You should then define STANDARD_DIRECTORIES (you can define it anyway)  */
164 /*   in which case Inform will expect by default that files are sorted out   */
165 /*   by being put into suitable directories (e.g., a "games" directory for   */
166 /*   story files).                                                           */
167 /*                                                                           */
168 /*   If it's convenient for your port you can alter the detailed definitions */
169 /*   which these broad settings make.  Be careful if NO_FILE_EXTENSIONS      */
170 /*   is set without STANDARD_DIRECTORIES, as then Inform may                 */
171 /*   overwrite its source with object code.                                  */
172 /*                                                                           */
173 /*   5. Filenames (or code related to filenames) for the three temporary     */
174 /*   files.  These only exist during compilation (and only if -F1 is set).   */
175 /*   Temporary_Name is the body of a filename to use                         */
176 /*   (if you don't set this, it becomes "Inftemp") and Temporary_Directory   */
177 /*   is the directory path for the files to go in (which can be altered on   */
178 /*   the command line).  On some multi-tasking OSs these filenames ought to  */
179 /*   include a number uniquely identifying the process: to indicate this,    */
180 /*   define INCLUDE_TASK_ID and provide some code...                         */
181 /*                                                                           */
182 /*       #define INCLUDE_TASK_ID                                             */
183 /*       #ifdef INFORM_FILE                                                  */
184 /*       static int32 unique_task_id(void)                                   */
185 /*       {   ...some code returning your task ID...                          */
186 /*       }                                                                   */
187 /*       #endif                                                              */
188 /*                                                                           */
189 /*   6. Any other definitions specific to the OS or machine.                 */
190 /*   (In particular DEFAULT_ERROR_FORMAT is 0 on most machines and 1 on PCs; */
191 /*   it controls the style of error messages, which is important for some    */
192 /*   error-throwback debugging tools.)                                       */
193 /* ------------------------------------------------------------------------- */
194
195 /* ========================================================================= */
196 /*   The blocks now follow in alphabetical order.                            */
197 /* ------------------------------------------------------------------------- */
198 /*   AMIGA block                                                             */
199 /* ------------------------------------------------------------------------- */
200 #ifdef AMIGA
201 /* 1 */
202 #define MACHINE_STRING   "Amiga"
203 /* 3 */
204 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
205 /* 4 */
206 #define FN_SEP '/'
207 /* 5 */
208 #define __USE_SYSBASE
209 #include <proto/exec.h>
210 #define INCLUDE_TASK_ID
211 #define Temporary_Directory "T:"
212 #ifdef MAIN_INFORM_FILE
213 static int32 unique_task_id(void)
214 {   return (int32)FindTask(NULL);
215 }
216 #endif
217 #endif
218 /* ------------------------------------------------------------------------- */
219 /*   ARCHIMEDES block: Acorn/RISC OS settings                                */
220 /* ------------------------------------------------------------------------- */
221 #ifdef ARCHIMEDES
222 /* 1 */
223 #define MACHINE_STRING   "RISC OS"
224 /* 2 */
225 #define CHAR_IS_UNSIGNED
226 /* 3 */
227 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
228 /* 4 */
229 #define FN_SEP '.'
230 #define STANDARD_DIRECTORIES
231 #define NO_FILE_EXTENSIONS
232 #define Source_Directory "inform"
233 #define ICL_Directory "ICL"
234 /* 5 */
235 #define ENABLE_TEMPORARY_PATH
236 #define Temporary_Directory "ram:"
237 /* 6 */
238 #define ARC_THROWBACK
239 #endif
240 /* ------------------------------------------------------------------------- */
241 /*   Atari ST block                                                          */
242 /* ------------------------------------------------------------------------- */
243 #ifdef ATARIST
244 /* 1 */
245 #define MACHINE_STRING   "Atari ST"
246 /* 3 */
247 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
248 /* 4 */
249 #define FN_SEP '/'
250 /* 5 */
251 #ifndef TOSFS
252 #define Temporary_Directory "/tmp"
253 #define INCLUDE_TASK_ID
254 #ifdef MAIN_INFORM_FILE
255 static int32 unique_task_id(void)
256 {   return (int32)getpid();
257 }
258 #endif
259 #endif
260 #endif
261 /* ------------------------------------------------------------------------- */
262 /*   BEOS block                                                              */
263 /* ------------------------------------------------------------------------- */
264 #ifdef BEOS
265 /* 1 */
266 #define MACHINE_STRING   "BeOS"
267 /* 3 */
268 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
269 /* 4 */
270 #define FN_SEP '/'
271 #define FILE_EXTENSIONS
272 /* 5 */
273 #define Temporary_Directory "/tmp"
274 #endif
275 /* ------------------------------------------------------------------------- */
276 /*   LINUX block                                                             */
277 /* ------------------------------------------------------------------------- */
278 #ifdef LINUX
279 /* 1 */
280 #define MACHINE_STRING   "Linux"
281 /* 2 */
282 #define HAS_REALPATH
283 /* 3 */
284 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
285 /* 4 */
286 #define FN_SEP '/'
287 /* 5 */
288 #define Temporary_Directory "/tmp"
289 /* 6 */
290 #define PATHLEN 8192
291 #endif
292 /* ------------------------------------------------------------------------- */
293 /*   Macintosh block                                                         */
294 /* ------------------------------------------------------------------------- */
295 #ifdef MAC_MPW
296 #define MACINTOSH
297 #endif
298
299 #ifdef MACINTOSH
300 /* 1 */
301 #ifdef MAC_MPW
302 #define MACHINE_STRING   "Macintosh Programmer's Workshop"
303 #else
304 #define MACHINE_STRING   "Macintosh"
305 #endif
306 /* 2 */
307 #ifdef MAC_FACE
308 #define EXTERNAL_SHELL
309 #endif
310 #ifndef MAC_FACE
311 #ifndef MAC_MPW
312 #define PROMPT_INPUT
313 #endif
314 #endif
315 /* 3 */
316 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
317 /* 4 */
318 #define FN_SEP           ':'
319 #ifdef MAC_MPW
320 #define Include_Extension ".h"
321 #endif
322 /* 6 */
323 #ifdef MAC_FACE
324 #include "TB Inform.h"
325 #endif
326 #ifdef MAC_MPW
327 #include <CursorCtl.h>
328 #define DEFAULT_ERROR_FORMAT 2
329 #endif
330 #endif
331 /* ------------------------------------------------------------------------- */
332 /*   OS/2 block                                                              */
333 /* ------------------------------------------------------------------------- */
334 #ifdef OS2
335 /* 1 */
336 #define MACHINE_STRING   "OS/2"
337 /* 2 */
338 #define CHAR_IS_UNSIGNED
339 /* 3 */
340 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
341 /* 4 */
342 #define FN_SEP '/'
343 #endif
344 /* ------------------------------------------------------------------------- */
345 /*   OSX block                                                              */
346 /* ------------------------------------------------------------------------- */
347 #ifdef OSX
348 /* 1 */
349 #define MACHINE_STRING   "Mac OS X"
350 /* 2 */
351 #define HAS_REALPATH
352 /* 3 */
353 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
354 /* 4 */
355 #define FN_SEP '/'
356 /* 5 */
357 #define Temporary_Directory "/tmp"
358 #define INCLUDE_TASK_ID
359 #define _POSIX_C_SOURCE 199506L
360 #define _XOPEN_SOURCE 500
361 #ifdef MAIN_INFORM_FILE
362 #include <sys/types.h>
363 #include <unistd.h>
364 static int32 unique_task_id(void)
365 {   return (int32)getpid();
366 }
367 #endif
368 /* 6 */
369 #define PATHLEN 8192
370 #endif
371 /* ------------------------------------------------------------------------- */
372 /*   PC and PC_QUICKC block                                                  */
373 /* ------------------------------------------------------------------------- */
374 #ifdef PC_QUICKC
375 #define PC
376 #endif
377
378 #ifdef PC
379 /* 1 */
380 #define MACHINE_STRING   "PC"
381 /* 2 */
382 #define USE_TEMPORARY_FILES
383 /* 3 */
384 #ifdef PC_QUICKC
385 #define DEFAULT_MEMORY_SIZE SMALL_SIZE
386 #else
387 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
388 #endif
389 /* 4 */
390 #define FN_SEP '\\'
391 /* 6 */
392 #define DEFAULT_ERROR_FORMAT 1
393 #endif
394 /* ------------------------------------------------------------------------- */
395 /*   PC_WIN32 block                                                          */
396 /* ------------------------------------------------------------------------- */
397 #ifdef PC_WIN32
398 /* 1 */
399 #define MACHINE_STRING   "Win32"
400 /* 2 */
401 #define HAS_REALPATH
402 /* 3 */
403 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
404 /* 4 */
405 #define FN_SEP '\\'
406 /* 6 */
407 #define DEFAULT_ERROR_FORMAT 1
408 #define PATHLEN 512
409 #ifdef _MSC_VER /* Microsoft Visual C++ */
410 #define snprintf _snprintf
411 #define isnan _isnan
412 #define isinf(x) (!_isnan(x) && !_finite(x))
413 #endif
414 #endif
415 /* ------------------------------------------------------------------------- */
416 /*   UNIX block                                                              */
417 /* ------------------------------------------------------------------------- */
418 #ifdef UNIX
419 /* 1 */
420 #define MACHINE_STRING   "Unix"
421 /* 2 */
422 #define USE_TEMPORARY_FILES
423 #define HAS_REALPATH
424 /* 3 */
425 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
426 /* 4 */
427 #define FN_SEP '/'
428 /* 5 */
429 #define PATHLEN 512
430 #define Temporary_Directory "/tmp"
431 #define INCLUDE_TASK_ID
432 #ifdef MAIN_INFORM_FILE
433 static int32 unique_task_id(void)
434 {   return (int32)getpid();
435 }
436 #endif
437 #endif
438 /* ------------------------------------------------------------------------- */
439 /*   UNIX64 block                                                            */
440 /* ------------------------------------------------------------------------- */
441 #ifdef UNIX64
442 /* 1 */
443 #ifndef MACHINE_STRING
444 #define MACHINE_STRING   "Unix"
445 #endif
446 /* 2 */
447 #define USE_TEMPORARY_FILES
448 #define HAS_REALPATH
449 /* 3 */
450 #define DEFAULT_MEMORY_SIZE HUGE_SIZE
451 /* 4 */
452 #define FN_SEP '/'
453 /* 5 */
454 #define Temporary_Directory "/tmp"
455 #define PATHLEN 512
456 #define INCLUDE_TASK_ID
457 #ifdef MAIN_INFORM_FILE
458 static int32 unique_task_id(void)
459 {   return (int32)getpid();
460 }
461 #endif
462 #endif
463 /* ------------------------------------------------------------------------- */
464 /*   VMS (Dec VAX and Alpha) block                                           */
465 /* ------------------------------------------------------------------------- */
466 #ifdef __VMS
467 #define VMS
468 #endif
469
470 #ifdef VMS
471 /* 1 */
472 #ifdef __ALPHA
473 #define MACHINE_STRING   "Alpha/VMS"
474 #else
475 #define MACHINE_STRING   "VAX/VMS"
476 #endif
477 /* 2 */
478 #define CHAR_IS_UNSIGNED
479 /* 3 */
480 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
481 /* 4 */
482 #define FN_SEP '/'
483 #define Code_Extension   ".zip"
484 #define V4Code_Extension ".zip"
485 #define V5Code_Extension ".zip"
486 #define V6Code_Extension ".zip"
487 #define V7Code_Extension ".zip"
488 #define V8Code_Extension ".zip"
489 #endif
490 /* ========================================================================= */
491 /* Default settings:                                                         */
492 /* ------------------------------------------------------------------------- */
493
494 #ifndef NO_FILE_EXTENSIONS
495 #define FILE_EXTENSIONS
496 #endif
497
498 #ifndef Transcript_File
499 #ifdef FILE_EXTENSIONS
500 #define Transcript_File "gametext.txt"
501 #else
502 #define Transcript_File "gametext"
503 #endif
504 #endif
505 #ifndef Debugging_File
506 #ifdef FILE_EXTENSIONS
507 #define Debugging_File "gameinfo.dbg"
508 #else
509 #define Debugging_File "gamedebug"
510 #endif
511 #endif
512
513 #ifdef FILE_EXTENSIONS
514 #ifndef Source_Extension
515 #define Source_Extension  ".inf"
516 #endif
517 #ifndef Include_Extension
518 #define Include_Extension ".h"
519 #endif
520 #ifndef Code_Extension
521 #define Code_Extension    ".z3"
522 #endif
523 #ifndef V4Code_Extension
524 #define V4Code_Extension  ".z4"
525 #endif
526 #ifndef V5Code_Extension
527 #define V5Code_Extension  ".z5"
528 #endif
529 #ifndef V6Code_Extension
530 #define V6Code_Extension  ".z6"
531 #endif
532 #ifndef V7Code_Extension
533 #define V7Code_Extension  ".z7"
534 #endif
535 #ifndef V8Code_Extension
536 #define V8Code_Extension  ".z8"
537 #endif
538 #ifndef GlulxCode_Extension
539 #define GlulxCode_Extension  ".ulx"
540 #endif
541 #ifndef Module_Extension
542 #define Module_Extension  ".m5"
543 #endif
544 #ifndef ICL_Extension
545 #define ICL_Extension     ".icl"
546 #endif
547
548 #else
549
550 #define Source_Extension  ""
551 #define Include_Extension ""
552 #define Code_Extension    ""
553 #define V4Code_Extension  ""
554 #define V5Code_Extension  ""
555 #define V6Code_Extension  ""
556 #define V7Code_Extension  ""
557 #define V8Code_Extension  ""
558 #define GlulxCode_Extension  ""
559 #define Module_Extension  ""
560 #define ICL_Extension     ""
561 #endif
562
563 #ifdef STANDARD_DIRECTORIES
564 #ifndef Source_Directory
565 #define Source_Directory  "source"
566 #endif
567 #ifndef Include_Directory
568 #define Include_Directory "library"
569 #endif
570 #ifndef Code_Directory
571 #define Code_Directory    "games"
572 #endif
573 #ifndef Module_Directory
574 #define Module_Directory  "modules"
575 #endif
576 #ifndef Temporary_Directory
577 #define Temporary_Directory ""
578 #endif
579 #ifndef ICL_Directory
580 #define ICL_Directory     ""
581 #endif
582
583 #else
584
585 #ifndef Source_Directory
586 #define Source_Directory  ""
587 #endif
588 #ifndef Include_Directory
589 #define Include_Directory ""
590 #endif
591 #ifndef Code_Directory
592 #define Code_Directory    ""
593 #endif
594 #ifndef Module_Directory
595 #define Module_Directory  ""
596 #endif
597 #ifndef Temporary_Directory
598 #define Temporary_Directory ""
599 #endif
600 #ifndef ICL_Directory
601 #define ICL_Directory     ""
602 #endif
603 #endif
604
605 #ifndef FN_SEP
606 #define FN_SEP '/'
607 #endif
608
609 #ifndef FN_ALT
610 #define FN_ALT ','
611 #endif
612
613 #ifndef PATHLEN
614 #define PATHLEN 128
615 #endif
616
617 #ifndef Temporary_File
618 #define Temporary_File "Inftemp"
619 #endif
620
621 #ifndef DEFAULT_ERROR_FORMAT
622 #define DEFAULT_ERROR_FORMAT 0
623 #endif
624
625 #ifndef DEFAULT_MEMORY_SIZE
626 #define DEFAULT_MEMORY_SIZE LARGE_SIZE
627 #endif
628
629 #ifndef CHAR_IS_UNSIGNED
630     typedef unsigned char uchar;
631 #else
632     typedef char uchar;
633 #endif
634
635 #if defined(__GNUC__) || defined(__clang__)
636 #define NORETURN __attribute__((__noreturn__))
637 #endif /* defined(__GNUC__) || defined(__clang__) */
638
639 #ifndef NORETURN
640 #define NORETURN
641 #endif
642
643 /* ------------------------------------------------------------------------- */
644 /*   A macro (rather than constant) definition:                              */
645 /* ------------------------------------------------------------------------- */
646
647 #ifdef PC_QUICKC
648     void _huge * halloc(long, size_t);
649     void hfree(void *);
650 #define subtract_pointers(p1,p2) (long)((char _huge *)p1-(char _huge *)p2)
651 #else
652 #define subtract_pointers(p1,p2) (((char *) p1)-((char *) p2))
653 #endif
654
655 /* ------------------------------------------------------------------------- */
656 /*   SEEK_SET is a constant which should be defined in the ANSI header files */
657 /*   but which is not present in some implementations: it's used as a        */
658 /*   parameter for "fseek", defined in "stdio".  In pre-ANSI C, the value    */
659 /*   0 was used as a parameter instead, hence the definition below.          */
660 /* ------------------------------------------------------------------------- */
661
662 #ifndef SEEK_SET
663 #define SEEK_SET 0
664 #endif
665
666 /* ------------------------------------------------------------------------- */
667 /*   A large block of #define'd constant values follows.                     */
668 /* ------------------------------------------------------------------------- */
669
670 #define TRUE -1
671 #define FALSE 0
672
673 /* These checked the glulx_mode global during development, but are no
674    longer needed. */
675 #define ASSERT_ZCODE() (0)
676 #define ASSERT_GLULX() (0)
677
678
679 #define ReadInt32(ptr)                               \
680   (   (((int32)(((uchar *)(ptr))[0])) << 24)         \
681     | (((int32)(((uchar *)(ptr))[1])) << 16)         \
682     | (((int32)(((uchar *)(ptr))[2])) <<  8)         \
683     | (((int32)(((uchar *)(ptr))[3]))      ) )
684
685 #define ReadInt16(ptr)                               \
686   (   (((int32)(((uchar *)(ptr))[0])) << 8)          \
687     | (((int32)(((uchar *)(ptr))[1]))     ) )
688
689 #define WriteInt32(ptr, val)                         \
690   ((ptr)[0] = (uchar)(((int32)(val)) >> 24),         \
691    (ptr)[1] = (uchar)(((int32)(val)) >> 16),         \
692    (ptr)[2] = (uchar)(((int32)(val)) >>  8),         \
693    (ptr)[3] = (uchar)(((int32)(val))      ) )
694
695 #define WriteInt16(ptr, val)                         \
696   ((ptr)[0] = (uchar)(((int32)(val)) >> 8),          \
697    (ptr)[1] = (uchar)(((int32)(val))     ) )
698
699 /* ------------------------------------------------------------------------- */
700 /*   If your compiler doesn't recognise \t, and you use ASCII, you could     */
701 /*   define T_C as (char) 9; failing that, it _must_ be defined as ' '       */
702 /*   (space) and is _not_ allowed to be 0 or any recognisable character.     */
703 /* ------------------------------------------------------------------------- */
704
705 #define TAB_CHARACTER '\t'
706
707 /* ------------------------------------------------------------------------- */
708 /*   Maxima.                                                                 */
709 /* ------------------------------------------------------------------------- */
710
711 #define  MAX_ERRORS            100
712 #define  MAX_IDENTIFIER_LENGTH  32
713 #define  MAX_ABBREV_LENGTH      64
714 #define  MAX_DICT_WORD_SIZE     40
715 #define  MAX_DICT_WORD_BYTES    (40*4)
716 #define  MAX_NUM_ATTR_BYTES     39
717
718 #define  VENEER_CONSTRAINT_ON_CLASSES_Z       256
719 #define  VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_Z 128
720 #define  VENEER_CONSTRAINT_ON_CLASSES_G       32768
721 #define  VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_G 32768
722 #define  VENEER_CONSTRAINT_ON_CLASSES  \
723   (glulx_mode ? VENEER_CONSTRAINT_ON_CLASSES_G  \
724               : VENEER_CONSTRAINT_ON_CLASSES_Z)
725 #define  VENEER_CONSTRAINT_ON_IP_TABLE_SIZE  \
726   (glulx_mode ? VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_G  \
727               : VENEER_CONSTRAINT_ON_IP_TABLE_SIZE_Z)
728
729 #define  GLULX_HEADER_SIZE 36
730 /* Number of bytes in the header. */
731 #define  GLULX_STATIC_ROM_SIZE 24
732 /* Number of bytes in the Inform-specific block right after the header. */
733 #define  GPAGESIZE 256
734 /* All Glulx memory boundaries must be multiples of GPAGESIZE. */
735
736 /* In many places the compiler encodes a source-code location (file and
737    line number) into an int32 value. The encoded value looks like
738    file_number + FILE_LINE_SCALE_FACTOR*line_number. This will go
739    badly if a source file has more than FILE_LINE_SCALE_FACTOR lines,
740    of course. But this value is roughly eight million, which is a lot
741    of lines. 
742
743    There is also potential trouble if we have more than 512 source files;
744    perhaps 256, depending on signedness issues. However, there are other
745    spots in the compiler that assume no more than 255 source files, so
746    we'll stick with this for now.
747 */
748 #define  FILE_LINE_SCALE_FACTOR  (0x800000L)
749
750 /* ------------------------------------------------------------------------- */
751 /*   Structure definitions (there are a few others local to files)           */
752 /* ------------------------------------------------------------------------- */
753
754 typedef struct assembly_operand_t
755 {   int   type;
756     int32 value;
757     int   symtype;   /* 6.30 */
758     int   symflags;  /* 6.30 */
759     int   marker;
760 } assembly_operand;
761
762 #define INITAOTV(aop, typ, val) ((aop)->type=(typ), (aop)->value=(val), (aop)->marker=0, (aop)->symtype=0, (aop)->symflags=0)
763 #define INITAOT(aop, typ) INITAOTV(aop, typ, 0)
764 #define INITAO(aop) INITAOTV(aop, 0, 0)
765
766 #define  MAX_LINES_PER_VERB 32
767 typedef struct verbt {
768     int lines;
769     int l[MAX_LINES_PER_VERB];
770 } verbt;
771
772 typedef struct prop {
773     uchar l, num;
774     assembly_operand ao[32];
775 } prop;
776
777 /* Only one of this object. */
778 typedef struct fpropt {
779     uchar atts[6];
780     int l;
781     prop pp[64];
782 } fpropt;
783
784 typedef struct objecttz {
785     uchar atts[6];
786     int parent, next, child;
787     int propsize;
788 } objecttz;
789
790 typedef struct propg {
791     int num;
792     int continuation; 
793     int flags;
794     int32 datastart;
795     int32 datalen;
796 } propg;
797
798 /* Only one of this object. */
799 typedef struct fproptg {
800     uchar atts[MAX_NUM_ATTR_BYTES]; 
801     int numprops;
802     propg *props;
803     int propdatasize;
804     assembly_operand *propdata;
805     int32 finalpropaddr;
806 } fproptg;
807
808 typedef struct objecttg {
809     /* attributes are stored in a separate array */
810     int32 shortname;
811     int32 parent, next, child;
812     int32 propaddr;
813     int32 propsize;
814 } objecttg;
815
816 typedef struct maybe_file_position_S
817 {   int valid;
818     fpos_t position;
819 } maybe_file_position;
820
821 typedef struct debug_location_s
822 {   int32 file_index;
823     int32 beginning_byte_index;
824     int32 end_byte_index;
825     int32 beginning_line_number;
826     int32 end_line_number;
827     int32 beginning_character_number;
828     int32 end_character_number;
829 } debug_location;
830
831 typedef struct debug_locations_s
832 {   debug_location location;
833     struct debug_locations_s *next;
834     int reference_count;
835 } debug_locations;
836
837 typedef struct debug_location_beginning_s
838 {   debug_locations *head;
839     int32 beginning_byte_index;
840     int32 beginning_line_number;
841     int32 beginning_character_number;
842 } debug_location_beginning;
843
844 typedef struct keyword_group_s
845 {   char *keywords[120];
846     int change_token_type;
847     int enabled;
848     int case_sensitive;
849 } keyword_group;
850
851 typedef struct token_data_s
852 {   char *text;
853     int32 value; /* ###-long */
854     int type;
855     int symtype;  /* 6.30 */
856     int symflags;   /* 6.30 */
857     int marker;
858     debug_location location;
859 } token_data;
860
861 typedef struct FileId_s                 /*  Source code file identifier:     */
862 {   char *filename;                     /*  The filename (after translation) */
863     FILE *handle;                       /*  Handle of file (when open), or
864                                             NULL when closed                 */
865 } FileId;
866
867 typedef struct ErrorPosition_s
868 {   int  file_number;
869     char *source;
870     int  line_number;
871     int  main_flag;
872 } ErrorPosition;
873
874 /*  A memory block can hold at most ALLOC_CHUNK_SIZE * 72:  */
875
876 extern int ALLOC_CHUNK_SIZE;
877
878 typedef struct memory_block_s
879 {   int chunks;
880     int extent_of_last;
881     uchar *chunk[72];
882     int write_pos;
883 } memory_block;
884
885 /* This serves for both Z-code and Glulx instructions. Glulx doesn't use
886    the text, store_variable_number, branch_label_number, or branch_flag
887    fields. */
888 typedef struct assembly_instruction_t
889 {   int internal_number;
890     int store_variable_number;
891     int32 branch_label_number;
892     int branch_flag;
893     char *text;
894     int operand_count;
895     assembly_operand operand[8];
896 } assembly_instruction;
897
898 typedef struct expression_tree_node_s
899 {
900     /*  Data used in tree construction                                       */
901
902     int up, down, right;
903     int operator_number;         /* Only meaningful for non-leaves           */
904     assembly_operand value;      /* Only meaningful for leaves               */
905
906     /*  Attributes synthesised during code generation                        */
907
908     int must_produce_value;      /* e.g. FALSE in a void context             */
909
910     int label_after;             /* -1, or "put this label after code"       */
911     int to_expression;           /* TRUE if a condition used as numeric val  */
912     int true_label;              /* On condition "true", jump to this (or keep
913                                     going if -1)                             */
914     int false_label;             /* Likewise if the condition is "false".    */
915
916 } expression_tree_node;
917
918 typedef struct operator_s
919 {   int precedence;                     /*  Level 0 to 13 (13 is highest)  */
920     int token_type;                     /*  Lexical token type  */
921     int token_value;                    /*  Lexical token value  */
922     int usage;                          /*  Infix (IN_U), prefix or postfix */
923     int associativity;                  /*  Left (L_A), right (R_A)
924                                             or 0 for "it is an error to
925                                             implicitly associate this"  */
926     int requires_lvalue;                /*  TRUE if the first operand must
927                                             be an "lvalue" (the name of some
928                                             storage object, such as a variable
929                                             or an array entry)  */
930     int opcode_number_z;                /*  Translation number (see below)  */
931     int opcode_number_g;                /*  Translation number (see below)  */
932     int side_effect;                    /*  TRUE if evaluating the operator
933                                             has potential side-effects in
934                                             terms of changing the Z-machine  */
935     int negation;                       /*  0 for an unconditional operator,
936                                             otherwise the negation operator  */
937     char *description;                  /*  Text describing the operator
938                                             for error messages and tracing  */
939 } operator;
940
941 /*  The translation number of an operator is as follows:
942
943     Z-code:
944         an internal opcode number if the operator can be translated
945             directly to a single Z-machine opcode;
946         400+n if it can be translated to branch opcode n;
947         800+n if to the negated form of branch opcode n;
948             (using n = 200, 201 for two conditions requiring special
949             translation)
950         -1 otherwise
951     Glulx:
952         an internal opcode number if the operator can be translated
953             directly to a single Glulx opcode;
954         FIRST_CC to LAST_CC if it is a condition;
955         -1 otherwise                                                         */
956
957 /* ------------------------------------------------------------------------- */
958 /*   Assembly operand types.                                                 */
959 /* ------------------------------------------------------------------------- */
960
961 /* For Z-machine... */
962
963 #define LONG_CONSTANT_OT   0    /* General constant */
964 #define SHORT_CONSTANT_OT  1    /* Constant in range 0 to 255 */
965 #define VARIABLE_OT        2    /* Variable (global, local or sp) */
966 #define OMITTED_OT         3    /* Value used in type field to indicate
967                                    that no operand is supplied */
968 #define EXPRESSION_OT      4    /* Meaning: to determine this value, run code
969                                    equivalent to the expression tree whose
970                                    root node-number is the value given       */
971
972 /* For Glulx... */
973
974 /* #define OMITTED_OT      3 */ /* Same as above */
975 /* #define EXPRESSION_OT   4 */ /* Same as above */
976 #define CONSTANT_OT        5    /* Four-byte constant */
977 #define HALFCONSTANT_OT    6    /* Two-byte constant */
978 #define BYTECONSTANT_OT    7    /* One-byte constant */
979 #define ZEROCONSTANT_OT    8    /* Constant zero (no bytes of data) */
980 #define SYSFUN_OT          9    /* System function value */
981 #define DEREFERENCE_OT     10   /* Value at this address */
982 #define GLOBALVAR_OT       11   /* Global variable */
983 #define LOCALVAR_OT        12   /* Local variable or sp */
984
985 /* ------------------------------------------------------------------------- */
986 /*   Internal numbers representing assemble-able Z-opcodes                   */
987 /* ------------------------------------------------------------------------- */
988
989 #define je_zc 0
990 #define jl_zc 1
991 #define jg_zc 2
992 #define dec_chk_zc 3
993 #define inc_chk_zc 4
994 #define jin_zc 5
995 #define test_zc 6
996 #define or_zc 7
997 #define and_zc 8
998 #define test_attr_zc 9
999 #define set_attr_zc 10
1000 #define clear_attr_zc 11
1001 #define store_zc 12
1002 #define insert_obj_zc 13
1003 #define loadw_zc 14
1004 #define loadb_zc 15
1005 #define get_prop_zc 16
1006 #define get_prop_addr_zc 17
1007 #define get_next_prop_zc 18
1008 #define add_zc 19
1009 #define sub_zc 20
1010 #define mul_zc 21
1011 #define div_zc 22
1012 #define mod_zc 23
1013 #define call_zc 24
1014 #define storew_zc 25
1015 #define storeb_zc 26
1016 #define put_prop_zc 27
1017 #define sread_zc 28
1018 #define print_char_zc 29
1019 #define print_num_zc 30
1020 #define random_zc 31
1021 #define push_zc 32
1022 #define pull_zc 33
1023 #define split_window_zc 34
1024 #define set_window_zc 35
1025 #define output_stream_zc 36
1026 #define input_stream_zc 37
1027 #define sound_effect_zc 38
1028 #define jz_zc 39
1029 #define get_sibling_zc 40
1030 #define get_child_zc 41
1031 #define get_parent_zc 42
1032 #define get_prop_len_zc 43
1033 #define inc_zc 44
1034 #define dec_zc 45
1035 #define print_addr_zc 46
1036 #define remove_obj_zc 47
1037 #define print_obj_zc 48
1038 #define ret_zc 49
1039 #define jump_zc 50
1040 #define print_paddr_zc 51
1041 #define load_zc 52
1042 #define not_zc 53
1043 #define rtrue_zc 54
1044 #define rfalse_zc 55
1045 #define print_zc 56
1046 #define print_ret_zc 57
1047 #define nop_zc 58
1048 #define save_zc 59
1049 #define restore_zc 60
1050 #define restart_zc 61
1051 #define ret_popped_zc 62
1052 #define pop_zc 63
1053 #define quit_zc 64
1054 #define new_line_zc 65
1055 #define show_status_zc 66
1056 #define verify_zc 67
1057 #define call_2s_zc 68
1058 #define call_vs_zc 69
1059 #define aread_zc 70
1060 #define call_vs2_zc 71
1061 #define erase_window_zc 72
1062 #define erase_line_zc 73
1063 #define set_cursor_zc 74
1064 #define get_cursor_zc 75
1065 #define set_text_style_zc 76
1066 #define buffer_mode_zc 77
1067 #define read_char_zc 78
1068 #define scan_table_zc 79
1069 #define call_1s_zc 80
1070 #define call_2n_zc 81
1071 #define set_colour_zc 82
1072 #define throw_zc 83
1073 #define call_vn_zc 84
1074 #define call_vn2_zc 85
1075 #define tokenise_zc 86
1076 #define encode_text_zc 87
1077 #define copy_table_zc 88
1078 #define print_table_zc 89
1079 #define check_arg_count_zc 90
1080 #define call_1n_zc 91
1081 #define catch_zc 92
1082 #define piracy_zc 93
1083 #define log_shift_zc 94
1084 #define art_shift_zc 95
1085 #define set_font_zc 96
1086 #define save_undo_zc 97
1087 #define restore_undo_zc 98
1088 #define draw_picture_zc 99
1089 #define picture_data_zc 100
1090 #define erase_picture_zc 101
1091 #define set_margins_zc 102
1092 #define move_window_zc 103
1093 #define window_size_zc 104
1094 #define window_style_zc 105
1095 #define get_wind_prop_zc 106
1096 #define scroll_window_zc 107
1097 #define pop_stack_zc 108
1098 #define read_mouse_zc 109
1099 #define mouse_window_zc 110
1100 #define push_stack_zc 111
1101 #define put_wind_prop_zc 112
1102 #define print_form_zc 113
1103 #define make_menu_zc 114
1104 #define picture_table_zc 115
1105 #define print_unicode_zc 116
1106 #define check_unicode_zc 117
1107
1108
1109 /* ------------------------------------------------------------------------- */
1110 /*   Internal numbers representing assemble-able Glulx opcodes               */
1111 /* ------------------------------------------------------------------------- */
1112
1113 #define nop_gc 0
1114 #define add_gc 1
1115 #define sub_gc 2
1116 #define mul_gc 3
1117 #define div_gc 4
1118 #define mod_gc 5
1119 #define neg_gc 6
1120 #define bitand_gc 7
1121 #define bitor_gc 8
1122 #define bitxor_gc 9
1123 #define bitnot_gc 10
1124 #define shiftl_gc 11
1125 #define sshiftr_gc 12
1126 #define ushiftr_gc 13
1127 #define jump_gc 14
1128 #define jz_gc 15
1129 #define jnz_gc 16
1130 #define jeq_gc 17
1131 #define jne_gc 18
1132 #define jlt_gc 19
1133 #define jge_gc 20
1134 #define jgt_gc 21
1135 #define jle_gc 22
1136 #define jltu_gc 23
1137 #define jgeu_gc 24
1138 #define jgtu_gc 25
1139 #define jleu_gc 26
1140 #define call_gc 27
1141 #define return_gc 28
1142 #define catch_gc 29
1143 #define throw_gc 30
1144 #define tailcall_gc 31
1145 #define copy_gc 32
1146 #define copys_gc 33
1147 #define copyb_gc 34
1148 #define sexs_gc 35
1149 #define sexb_gc 36
1150 #define aload_gc 37
1151 #define aloads_gc 38
1152 #define aloadb_gc 39
1153 #define aloadbit_gc 40
1154 #define astore_gc 41
1155 #define astores_gc 42
1156 #define astoreb_gc 43
1157 #define astorebit_gc 44
1158 #define stkcount_gc 45
1159 #define stkpeek_gc 46
1160 #define stkswap_gc 47
1161 #define stkroll_gc 48
1162 #define stkcopy_gc 49
1163 #define streamchar_gc 50
1164 #define streamnum_gc 51
1165 #define streamstr_gc 52
1166 #define gestalt_gc 53
1167 #define debugtrap_gc 54
1168 #define getmemsize_gc 55
1169 #define setmemsize_gc 56
1170 #define jumpabs_gc 57
1171 #define random_gc 58
1172 #define setrandom_gc 59
1173 #define quit_gc 60
1174 #define verify_gc 61
1175 #define restart_gc 62
1176 #define save_gc 63
1177 #define restore_gc 64
1178 #define saveundo_gc 65
1179 #define restoreundo_gc 66
1180 #define protect_gc 67
1181 #define glk_gc 68
1182 #define getstringtbl_gc 69
1183 #define setstringtbl_gc 70
1184 #define getiosys_gc 71
1185 #define setiosys_gc 72
1186 #define linearsearch_gc 73
1187 #define binarysearch_gc 74
1188 #define linkedsearch_gc 75
1189 #define callf_gc 76
1190 #define callfi_gc 77
1191 #define callfii_gc 78
1192 #define callfiii_gc 79
1193 #define streamunichar_gc 80
1194 #define mzero_gc 81
1195 #define mcopy_gc 82
1196 #define malloc_gc 83
1197 #define mfree_gc 84
1198 #define accelfunc_gc 85
1199 #define accelparam_gc 86
1200 #define numtof_gc 87
1201 #define ftonumz_gc 88
1202 #define ftonumn_gc 89
1203 #define ceil_gc 90
1204 #define floor_gc 91
1205 #define fadd_gc 92
1206 #define fsub_gc 93
1207 #define fmul_gc 94
1208 #define fdiv_gc 95
1209 #define fmod_gc 96
1210 #define sqrt_gc 97
1211 #define exp_gc 98
1212 #define log_gc 99
1213 #define pow_gc 100
1214 #define sin_gc 101
1215 #define cos_gc 102
1216 #define tan_gc 103
1217 #define asin_gc 104
1218 #define acos_gc 105
1219 #define atan_gc 106
1220 #define atan2_gc 107
1221 #define jfeq_gc 108
1222 #define jfne_gc 109
1223 #define jflt_gc 110
1224 #define jfle_gc 111
1225 #define jfgt_gc 112
1226 #define jfge_gc 113
1227 #define jisnan_gc 114
1228 #define jisinf_gc 115
1229
1230 /* ------------------------------------------------------------------------- */
1231 /*   Index numbers into the keyword group "opcode_macros_g" (see "lexer.c")  */
1232 /* ------------------------------------------------------------------------- */
1233
1234 #define pull_gm   0
1235 #define push_gm   1
1236
1237
1238 #define SYMBOL_TT    0                      /* value = index in symbol table */
1239 #define NUMBER_TT    1                      /* value = the number            */
1240 #define DQ_TT        2                      /* no value                      */
1241 #define SQ_TT        3                      /* no value                      */
1242 #define SEP_TT       4                      /* value = the _SEP code         */
1243 #define EOF_TT       5                      /* no value                      */
1244
1245 #define STATEMENT_TT      100               /* a statement keyword           */
1246 #define SEGMENT_MARKER_TT 101               /* with/has/class etc.           */
1247 #define DIRECTIVE_TT      102               /* a directive keyword           */
1248 #define CND_TT            103               /* in/has/etc.                   */
1249 #define SYSFUN_TT         105               /* built-in function             */
1250 #define LOCAL_VARIABLE_TT 106               /* local variable                */
1251 #define OPCODE_NAME_TT    107               /* opcode name                   */
1252 #define MISC_KEYWORD_TT   108               /* keyword like "char" used in
1253                                                syntax for a statement        */
1254 #define DIR_KEYWORD_TT    109               /* keyword like "meta" used in
1255                                                syntax for a directive        */
1256 #define TRACE_KEYWORD_TT  110               /* keyword used in debugging     */
1257 #define SYSTEM_CONSTANT_TT 111              /* such as "code_offset"         */
1258 #define OPCODE_MACRO_TT   112               /* fake opcode for compatibility */
1259
1260 #define OP_TT        200                    /* value = operator no           */
1261 #define ENDEXP_TT    201                    /* no value                      */
1262 #define SUBOPEN_TT   202                    /* ( used for subexpr            */
1263 #define SUBCLOSE_TT  203                    /* ) used to close subexp        */
1264 #define LARGE_NUMBER_TT 204                 /* constant not in range 0-255   */
1265 #define SMALL_NUMBER_TT 205                 /* constant in range 0-255       */
1266 /* In Glulx, that's the range -0x8000 to 0x7fff instead. */
1267 #define VARIABLE_TT  206                    /* variable name                 */
1268 #define DICTWORD_TT  207                    /* literal 'word'                */
1269 #define ACTION_TT    208                    /* action name                   */
1270
1271 #define VOID_CONTEXT       1
1272 #define CONDITION_CONTEXT  2
1273 #define CONSTANT_CONTEXT   3
1274 #define QUANTITY_CONTEXT   4
1275 #define ACTION_Q_CONTEXT   5
1276 #define ASSEMBLY_CONTEXT   6
1277 #define ARRAY_CONTEXT      7
1278 #define FORINIT_CONTEXT    8
1279 #define RETURN_Q_CONTEXT   9
1280
1281 #define LOWEST_SYSTEM_VAR_NUMBER 249        /* globals 249 to 255 are used
1282                                                in compiled code (Z-code 
1283                                                only; in Glulx, the range can
1284                                                change) */
1285
1286 /* ------------------------------------------------------------------------- */
1287 /*   Symbol flag definitions (in no significant order)                       */
1288 /* ------------------------------------------------------------------------- */
1289
1290 #define UNKNOWN_SFLAG  1
1291 #define REPLACE_SFLAG  2
1292 #define USED_SFLAG     4
1293 #define DEFCON_SFLAG   8
1294 #define STUB_SFLAG     16
1295 #define IMPORT_SFLAG   32
1296 #define EXPORT_SFLAG   64
1297 #define ALIASED_SFLAG  128
1298
1299 #define CHANGE_SFLAG   256
1300 #define SYSTEM_SFLAG   512
1301 #define INSF_SFLAG     1024
1302 #define UERROR_SFLAG   2048
1303 #define ACTION_SFLAG   4096
1304 #define REDEFINABLE_SFLAG  8192
1305 #define STAR_SFLAG    16384
1306
1307 /* ------------------------------------------------------------------------- */
1308 /*   Symbol type definitions                                                 */
1309 /* ------------------------------------------------------------------------- */
1310
1311 #define ROUTINE_T             1
1312 #define LABEL_T               2
1313 #define GLOBAL_VARIABLE_T     3
1314 #define ARRAY_T               4
1315 #define CONSTANT_T            5
1316 #define ATTRIBUTE_T           6
1317 #define PROPERTY_T            7
1318 #define INDIVIDUAL_PROPERTY_T 8
1319 #define OBJECT_T              9
1320 #define CLASS_T               10
1321 #define FAKE_ACTION_T         11
1322
1323 /* ------------------------------------------------------------------------- */
1324 /*   Statusline_flag values                                                  */
1325 /* ------------------------------------------------------------------------- */
1326
1327 #define SCORE_STYLE          0
1328 #define TIME_STYLE           1
1329
1330 /* ------------------------------------------------------------------------- */
1331 /*   Inform keyword definitions                                              */
1332 /* ------------------------------------------------------------------------- */
1333
1334 /*  Index numbers into the keyword group "directives" (see "lexer.c")  */
1335
1336 #define ABBREVIATE_CODE  0
1337 #define ARRAY_CODE       1
1338 #define ATTRIBUTE_CODE   2
1339 #define CLASS_CODE       3
1340 #define CONSTANT_CODE    4
1341 #define DEFAULT_CODE     5
1342 #define DICTIONARY_CODE  6
1343 #define END_CODE         7
1344 #define ENDIF_CODE       8
1345 #define EXTEND_CODE      9
1346 #define FAKE_ACTION_CODE 10
1347 #define GLOBAL_CODE      11
1348 #define IFDEF_CODE       12
1349 #define IFNDEF_CODE      13
1350 #define IFNOT_CODE       14
1351 #define IFV3_CODE        15
1352 #define IFV5_CODE        16
1353 #define IFTRUE_CODE      17
1354 #define IFFALSE_CODE     18
1355 #define IMPORT_CODE      19
1356 #define INCLUDE_CODE     20
1357 #define LINK_CODE        21
1358 #define LOWSTRING_CODE   22
1359 #define MESSAGE_CODE     23
1360 #define NEARBY_CODE      24
1361 #define OBJECT_CODE      25
1362 #define PROPERTY_CODE    26
1363 #define RELEASE_CODE     27
1364 #define REPLACE_CODE     28
1365 #define SERIAL_CODE      29
1366 #define SWITCHES_CODE    30
1367 #define STATUSLINE_CODE  31
1368 #define STUB_CODE        32
1369 #define SYSTEM_CODE      33
1370 #define TRACE_CODE       34
1371 #define UNDEF_CODE       35
1372 #define VERB_CODE        36
1373 #define VERSION_CODE     37
1374 #define ZCHARACTER_CODE  38
1375
1376 #define OPENBLOCK_CODE   100
1377 #define CLOSEBLOCK_CODE  101
1378
1379 /*  Index numbers into the keyword group "statements" (see "lexer.c")  */
1380
1381 #define BOX_CODE         0
1382 #define BREAK_CODE       1
1383 #define CONTINUE_CODE    2
1384 #define SDEFAULT_CODE    3
1385 #define DO_CODE          4
1386 #define ELSE_CODE        5
1387 #define FONT_CODE        6
1388 #define FOR_CODE         7
1389 #define GIVE_CODE        8
1390 #define IF_CODE          9
1391 #define INVERSION_CODE   10
1392 #define JUMP_CODE        11
1393 #define MOVE_CODE        12
1394 #define NEW_LINE_CODE    13
1395 #define OBJECTLOOP_CODE  14
1396 #define PRINT_CODE       15
1397 #define PRINT_RET_CODE   16
1398 #define QUIT_CODE        17
1399 #define READ_CODE        18
1400 #define REMOVE_CODE      19
1401 #define RESTORE_CODE     20
1402 #define RETURN_CODE      21
1403 #define RFALSE_CODE      22
1404 #define RTRUE_CODE       23
1405 #define SAVE_CODE        24
1406 #define SPACES_CODE      25
1407 #define STRING_CODE      26
1408 #define STYLE_CODE       27
1409 #define SWITCH_CODE      28
1410 #define UNTIL_CODE       29
1411 #define WHILE_CODE       30
1412
1413 #define ASSIGNMENT_CODE  100
1414 #define FUNCTION_CODE    101
1415
1416 /*  Index numbers into the keyword group "conditions" (see "lexer.c")  */
1417
1418 #define HAS_COND         0
1419 #define HASNT_COND       1
1420 #define IN_COND          2
1421 #define NOTIN_COND       3
1422 #define OFCLASS_COND     4
1423 #define OR_COND          5
1424 #define PROVIDES_COND    6
1425
1426 /*  Index numbers into the keyword group "segment_markers" (see "lexer.c")  */
1427
1428 #define CLASS_SEGMENT    0
1429 #define HAS_SEGMENT      1
1430 #define PRIVATE_SEGMENT  2
1431 #define WITH_SEGMENT     3
1432
1433 /*  Index numbers into the keyword group "misc_keywords" (see "lexer.c")  */
1434
1435 #define CHAR_MK          0
1436 #define NAME_MK          1
1437 #define THE_MK           2
1438 #define A_MK             3
1439 #define AN_MK            4
1440 #define CAP_THE_MK       5
1441 #define NUMBER_MK        6
1442 #define ROMAN_MK         7
1443 #define REVERSE_MK       8
1444 #define BOLD_MK          9
1445 #define UNDERLINE_MK    10
1446 #define FIXED_MK        11
1447 #define ON_MK           12
1448 #define OFF_MK          13
1449 #define TO_MK           14
1450 #define ADDRESS_MK      15
1451 #define STRING_MK       16
1452 #define OBJECT_MK       17
1453 #define NEAR_MK         18
1454 #define FROM_MK         19
1455 #define PROPERTY_MK     20
1456 #define CAP_A_MK        21
1457
1458 /*  Index numbers into the keyword group "directive_keywords" (see "lexer.c")  */
1459
1460 #define ALIAS_DK         0
1461 #define LONG_DK          1
1462 #define ADDITIVE_DK      2
1463 #define SCORE_DK         3
1464 #define TIME_DK          4
1465 #define NOUN_DK          5
1466 #define HELD_DK          6
1467 #define MULTI_DK         7
1468 #define MULTIHELD_DK     8
1469 #define MULTIEXCEPT_DK   9
1470 #define MULTIINSIDE_DK  10
1471 #define CREATURE_DK     11
1472 #define SPECIAL_DK      12
1473 #define NUMBER_DK       13
1474 #define SCOPE_DK        14
1475 #define TOPIC_DK        15
1476 #define REVERSE_DK      16
1477 #define META_DK         17
1478 #define ONLY_DK         18
1479 #define REPLACE_DK      19
1480 #define FIRST_DK        20
1481 #define LAST_DK         21
1482 #define STRING_DK       22
1483 #define TABLE_DK        23
1484 #define BUFFER_DK       24
1485 #define DATA_DK         25
1486 #define INITIAL_DK      26
1487 #define INITSTR_DK      27
1488 #define WITH_DK         28
1489 #define PRIVATE_DK      29
1490 #define HAS_DK          30
1491 #define CLASS_DK        31
1492 #define ERROR_DK        32
1493 #define FATALERROR_DK   33
1494 #define WARNING_DK      34
1495 #define TERMINATING_DK  35
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 /* Z-code only */
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
1889 #define ARRAY_ZA              17 /* Glulx only */
1890 #define GLOBALVAR_ZA          18 /* Glulx only */
1891
1892 /* ------------------------------------------------------------------------- */
1893 /*   "Marker values", used for backpatching and linkage                      */
1894 /* ------------------------------------------------------------------------- */
1895
1896 #define NULL_MV                0     /* Null */
1897
1898 /* Marker values used in backpatch areas: */
1899
1900 #define DWORD_MV               1     /* Dictionary word address */
1901 #define STRING_MV              2     /* Static string */
1902 #define INCON_MV               3     /* "Hardware" constant (table address) */
1903 #define IROUTINE_MV            4     /* Call to internal routine */
1904 #define VROUTINE_MV            5     /* Call to veneer routine */
1905 #define ARRAY_MV               6     /* Ref to internal array address */
1906 #define NO_OBJS_MV             7     /* Ref to number of game objects */
1907 #define INHERIT_MV             8     /* Inherited property value */
1908 #define INHERIT_INDIV_MV       9     /* Inherited indiv property value */
1909 #define MAIN_MV               10     /* "Main" routine */
1910 #define SYMBOL_MV             11     /* Forward ref to unassigned symbol */
1911
1912 /* Additional marker values used in module backpatch areas: */
1913 /* (In Glulx, OBJECT_MV and VARIABLE_MV are used in backpatching, even
1914    without modules.) */
1915
1916 #define VARIABLE_MV           12     /* Global variable */
1917 #define IDENT_MV              13     /* Property identifier number */
1918 #define INDIVPT_MV            14     /* Individual prop table address */
1919 #define ACTION_MV             15     /* Action number */
1920 #define OBJECT_MV             16     /* Ref to internal object number */
1921
1922 #define LARGEST_BPATCH_MV     16     /* 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 int32 *global_initial_value;
2078 extern int32 *array_symbols;
2079 extern int  *array_sizes, *array_types;
2080
2081 extern void make_global(int array_flag, int name_only);
2082 extern void set_variable_value(int i, int32 v);
2083 extern void check_globals(void);
2084 extern int32 begin_table_array(void);
2085 extern int32 begin_word_array(void);
2086 extern void array_entry(int32 i, assembly_operand VAL);
2087 extern void finish_array(int32 i);
2088
2089 /* ------------------------------------------------------------------------- */
2090 /*   Extern definitions for "asm"                                            */
2091 /* ------------------------------------------------------------------------- */
2092
2093 extern memory_block zcode_area;
2094 extern int32 zmachine_pc;
2095
2096 extern int32 no_instructions;
2097 extern int   sequence_point_follows;
2098 extern int   uses_unicode_features, uses_memheap_features, 
2099     uses_acceleration_features, uses_float_features;
2100 extern debug_location statement_debug_location;
2101 extern int   execution_never_reaches_here;
2102 extern int   *variable_usage;
2103 extern int   next_label, no_sequence_points;
2104 extern int32 *variable_tokens;
2105 extern assembly_instruction AI;
2106 extern int32 *named_routine_symbols;
2107
2108 extern void print_operand(assembly_operand o);
2109 extern char *variable_name(int32 i);
2110 extern void set_constant_ot(assembly_operand *AO);
2111 extern int  is_constant_ot(int otval);
2112 extern int  is_variable_ot(int otval);
2113 extern void assemblez_instruction(assembly_instruction *a);
2114 extern void assembleg_instruction(assembly_instruction *a);
2115 extern void assemble_label_no(int n);
2116 extern void assemble_jump(int n);
2117 extern void define_symbol_label(int symbol);
2118 extern int32 assemble_routine_header(int no_locals, int debug_flag,
2119     char *name, int embedded_flag, int the_symbol);
2120 extern void assemble_routine_end(int embedded_flag, debug_locations locations);
2121
2122 extern void assemblez_0(int internal_number);
2123 extern void assemblez_0_to(int internal_number, assembly_operand o1);
2124 extern void assemblez_0_branch(int internal_number, int label, int flag);
2125 extern void assemblez_1(int internal_number, assembly_operand o1);
2126 extern void assemblez_1_to(int internal_number,
2127                        assembly_operand o1, assembly_operand st);
2128 extern void assemblez_1_branch(int internal_number,
2129                        assembly_operand o1, int label, int flag);
2130 extern void assemblez_objcode(int internal_number,
2131                        assembly_operand o1, assembly_operand st,
2132                        int label, int flag);
2133 extern void assemblez_2(int internal_number,
2134                        assembly_operand o1, assembly_operand o2);
2135 extern void assemblez_2_to(int internal_number,
2136                        assembly_operand o1, assembly_operand o2,
2137                        assembly_operand st);
2138 extern void assemblez_2_branch(int internal_number,
2139                        assembly_operand o1, assembly_operand o2,
2140                        int label, int flag);
2141 extern void assemblez_3(int internal_number,
2142                        assembly_operand o1, assembly_operand o2,
2143                        assembly_operand o3);
2144 extern void assemblez_3_branch(int internal_number,
2145                        assembly_operand o1, assembly_operand o2,
2146                        assembly_operand o3, int label, int flag);
2147 extern void assemblez_3_to(int internal_number,
2148                        assembly_operand o1, assembly_operand o2,
2149                        assembly_operand o3, assembly_operand st);
2150 extern void assemblez_4(int internal_number,
2151                        assembly_operand o1, assembly_operand o2,
2152                        assembly_operand o3, assembly_operand o4);
2153 extern void assemblez_5(int internal_number,
2154                        assembly_operand o1, assembly_operand o2,
2155                        assembly_operand o3, assembly_operand o4,
2156                        assembly_operand o5);
2157 extern void assemblez_6(int internal_number,
2158                        assembly_operand o1, assembly_operand o2,
2159                        assembly_operand o3, assembly_operand o4,
2160                        assembly_operand o5, assembly_operand o6);
2161 extern void assemblez_4_branch(int internal_number,
2162                        assembly_operand o1, assembly_operand o2,
2163                        assembly_operand o3, assembly_operand o4,
2164                        int label, int flag);
2165 extern void assemblez_4_to(int internal_number,
2166                        assembly_operand o1, assembly_operand o2,
2167                        assembly_operand o3, assembly_operand o4,
2168                        assembly_operand st);
2169 extern void assemblez_5_to(int internal_number,
2170                        assembly_operand o1, assembly_operand o2,
2171                        assembly_operand o3, assembly_operand o4,
2172                        assembly_operand o5, assembly_operand st);
2173
2174 extern void assemblez_inc(assembly_operand o1);
2175 extern void assemblez_dec(assembly_operand o1);
2176 extern void assemblez_store(assembly_operand o1, assembly_operand o2);
2177 extern void assemblez_jump(int n);
2178
2179 extern void assembleg_0(int internal_number);
2180 extern void assembleg_1(int internal_number, assembly_operand o1);
2181 extern void assembleg_2(int internal_number, assembly_operand o1,
2182   assembly_operand o2);
2183 extern void assembleg_3(int internal_number, assembly_operand o1,
2184   assembly_operand o2, assembly_operand o3);
2185 extern void assembleg_4(int internal_number, assembly_operand o1,
2186   assembly_operand o2, assembly_operand o3, assembly_operand o4);
2187 extern void assembleg_5(int internal_number, assembly_operand o1,
2188   assembly_operand o2, assembly_operand o3, assembly_operand o4,
2189   assembly_operand o5);
2190 extern void assembleg_0_branch(int internal_number,
2191   int label);
2192 extern void assembleg_1_branch(int internal_number,
2193   assembly_operand o1, int label);
2194 extern void assembleg_2_branch(int internal_number,
2195   assembly_operand o1, assembly_operand o2, int label);
2196 extern void assembleg_call_1(assembly_operand oaddr, assembly_operand o1, 
2197   assembly_operand odest);
2198 extern void assembleg_call_2(assembly_operand oaddr, assembly_operand o1, 
2199   assembly_operand o2, assembly_operand odest);
2200 extern void assembleg_call_3(assembly_operand oaddr, assembly_operand o1, 
2201   assembly_operand o2, assembly_operand o3, assembly_operand odest);
2202 extern void assembleg_inc(assembly_operand o1);
2203 extern void assembleg_dec(assembly_operand o1);
2204 extern void assembleg_store(assembly_operand o1, assembly_operand o2);
2205 extern void assembleg_jump(int n);
2206
2207 extern void parse_assembly(void);
2208
2209 /* ------------------------------------------------------------------------- */
2210 /*   Extern definitions for "bpatch"                                         */
2211 /* ------------------------------------------------------------------------- */
2212
2213 extern memory_block zcode_backpatch_table, zmachine_backpatch_table;
2214 extern int32 zcode_backpatch_size, zmachine_backpatch_size;
2215 extern int   backpatch_marker, backpatch_error_flag;
2216
2217 extern int32 backpatch_value(int32 value);
2218 extern void  backpatch_zmachine_image_z(void);
2219 extern void  backpatch_zmachine_image_g(void);
2220 extern void  backpatch_zmachine(int mv, int zmachine_area, int32 offset);
2221
2222 /* ------------------------------------------------------------------------- */
2223 /*   Extern definitions for "chars"                                          */
2224 /* ------------------------------------------------------------------------- */
2225
2226 extern uchar source_to_iso_grid[];
2227 extern int32 iso_to_unicode_grid[];
2228 extern int   character_digit_value[];
2229 extern uchar alphabet[3][27];
2230 extern int   alphabet_modified;
2231 extern int   zscii_defn_modified;
2232 extern int   zscii_high_water_mark;
2233 extern char  alphabet_used[];
2234 extern int   iso_to_alphabet_grid[];
2235 extern int   zscii_to_alphabet_grid[];
2236 extern int   textual_form_length;
2237
2238 extern int   iso_to_unicode(int iso);
2239 extern int   unicode_to_zscii(int32 u);
2240 extern int32 zscii_to_unicode(int z);
2241 extern int32 text_to_unicode(char *text);
2242 extern void  zscii_to_text(char *text, int zscii);
2243 extern char *name_of_iso_set(int s);
2244 extern void  change_character_set(void);
2245 extern void  new_alphabet(char *text, int alphabet);
2246 extern void  new_zscii_character(int32 unicode, int plus_flag);
2247 extern void  new_zscii_finished(void);
2248 extern void  map_new_zchar(int32 unicode);
2249 extern void  make_lower_case(char *str);
2250 extern void  make_upper_case(char *str);
2251
2252 /* ------------------------------------------------------------------------- */
2253 /*   Extern definitions for "directs"                                        */
2254 /* ------------------------------------------------------------------------- */
2255
2256 extern int32 routine_starts_line;
2257
2258 extern int  no_routines, no_named_routines, no_locals, no_termcs;
2259 extern int  terminating_characters[];
2260
2261 extern int  parse_given_directive(int internal_flag);
2262
2263 /* ------------------------------------------------------------------------- */
2264 /*   Extern definitions for "errors"                                         */
2265 /* ------------------------------------------------------------------------- */
2266
2267 extern char *forerrors_buff;
2268 extern int  forerrors_pointer;
2269 extern int  no_errors, no_warnings, no_suppressed_warnings,
2270             no_link_errors, no_compiler_errors;
2271
2272 extern ErrorPosition ErrorReport;
2273
2274 extern void fatalerror(char *s) NORETURN;
2275 extern void fatalerror_named(char *s1, char *s2) NORETURN;
2276 extern void memory_out_error(int32 size, int32 howmany, char *name) NORETURN;
2277 extern void memoryerror(char *s, int32 size) NORETURN;
2278 extern void error(char *s);
2279 extern void error_named(char *s1, char *s2);
2280 extern void error_numbered(char *s1, int val);
2281 extern void error_named_at(char *s1, char *s2, int32 report_line);
2282 extern void ebf_error(char *s1, char *s2);
2283 extern void char_error(char *s, int ch);
2284 extern void unicode_char_error(char *s, int32 uni);
2285 extern void no_such_label(char *lname);
2286 extern void warning(char *s);
2287 extern void warning_numbered(char *s1, int val);
2288 extern void warning_named(char *s1, char *s2);
2289 extern void dbnu_warning(char *type, char *name, int32 report_line);
2290 extern void uncalled_routine_warning(char *type, char *name, int32 report_line);
2291 extern void obsolete_warning(char *s1);
2292 extern void link_error(char *s);
2293 extern void link_error_named(char *s1, char *s2);
2294 extern int  compiler_error(char *s);
2295 extern int  compiler_error_named(char *s1, char *s2);
2296 extern void print_sorry_message(void);
2297
2298 #ifdef ARC_THROWBACK
2299 extern int  throwback_switch;
2300
2301 extern void throwback(int severity, char * error);
2302 extern void throwback_start(void);
2303 extern void throwback_end(void);
2304 #endif
2305
2306 /* ------------------------------------------------------------------------- */
2307 /*   Extern definitions for "expressc"                                       */
2308 /* ------------------------------------------------------------------------- */
2309
2310 extern int vivc_flag;
2311 extern operator operators[];
2312
2313 extern assembly_operand stack_pointer, temp_var1, temp_var2, temp_var3, 
2314     temp_var4, zero_operand, one_operand, two_operand, three_operand,
2315     four_operand, valueless_operand;
2316
2317 assembly_operand code_generate(assembly_operand AO, int context, int label);
2318 assembly_operand check_nonzero_at_runtime(assembly_operand AO1, int label,
2319        int rte_number);
2320
2321 /* ------------------------------------------------------------------------- */
2322 /*   Extern definitions for "expressp"                                       */
2323 /* ------------------------------------------------------------------------- */
2324
2325 extern int system_function_usage[];
2326 extern expression_tree_node *ET;
2327
2328 extern int z_system_constant_list[];
2329 extern int glulx_system_constant_list[];
2330
2331 extern int32 value_of_system_constant(int t);
2332 extern void clear_expression_space(void);
2333 extern void show_tree(assembly_operand AO, int annotate);
2334 extern assembly_operand parse_expression(int context);
2335 extern int test_for_incdec(assembly_operand AO);
2336
2337 /* ------------------------------------------------------------------------- */
2338 /*   Extern definitions for "files"                                          */
2339 /* ------------------------------------------------------------------------- */
2340
2341 extern int  input_file;
2342 extern FileId *InputFiles;
2343
2344 extern FILE *Temp1_fp, *Temp2_fp, *Temp3_fp;
2345 extern char Temp1_Name[], Temp2_Name[], Temp3_Name[];
2346 extern int32 total_chars_read;
2347
2348 extern void open_temporary_files(void);
2349 extern void check_temp_files(void);
2350 extern void remove_temp_files(void);
2351
2352 extern void open_transcript_file(char *what_of);
2353 extern void write_to_transcript_file(char *text);
2354 extern void close_transcript_file(void);
2355 extern void abort_transcript_file(void);
2356
2357 extern void nullify_debug_file_position(maybe_file_position *position);
2358
2359 extern void begin_debug_file(void);
2360
2361 extern void debug_file_printf(const char*format, ...);
2362 extern void debug_file_print_with_entities(const char*string);
2363 extern void debug_file_print_base_64_triple
2364     (uchar first, uchar second, uchar third);
2365 extern void debug_file_print_base_64_pair(uchar first, uchar second);
2366 extern void debug_file_print_base_64_single(uchar first);
2367
2368 extern void write_debug_location(debug_location location);
2369 extern void write_debug_locations(debug_locations locations);
2370 extern void write_debug_optional_identifier(int32 symbol_index);
2371 extern void write_debug_symbol_backpatch(int32 symbol_index);
2372 extern void write_debug_symbol_optional_backpatch(int32 symbol_index);
2373 extern void write_debug_object_backpatch(int32 object_number);
2374 extern void write_debug_packed_code_backpatch(int32 offset);
2375 extern void write_debug_code_backpatch(int32 offset);
2376 extern void write_debug_global_backpatch(int32 offset);
2377 extern void write_debug_array_backpatch(int32 offset);
2378 extern void write_debug_grammar_backpatch(int32 offset);
2379
2380 extern void begin_writing_debug_sections(void);
2381 extern void write_debug_section(const char*name, int32 beginning_address);
2382 extern void end_writing_debug_sections(int32 end_address);
2383
2384 extern void write_debug_undef(int32 symbol_index);
2385
2386 extern void end_debug_file(void);
2387
2388 extern void add_to_checksum(void *address);
2389
2390 extern void load_sourcefile(char *story_name, int style);
2391 extern int file_load_chars(int file_number, char *buffer, int length);
2392 extern void close_all_source(void);
2393
2394 extern void output_file(void);
2395
2396 /* ------------------------------------------------------------------------- */
2397 /*   Extern definitions for "inform"                                         */
2398 /* ------------------------------------------------------------------------- */
2399
2400 extern char Code_Name[];
2401 extern int endofpass_flag;
2402
2403 extern int version_number,  instruction_set_number, extend_memory_map;
2404 extern int32 scale_factor,  length_scale_factor;
2405
2406 extern int WORDSIZE, INDIV_PROP_START, 
2407     OBJECT_BYTE_LENGTH, DICT_ENTRY_BYTE_LENGTH, DICT_ENTRY_FLAG_POS;
2408 extern int32 MAXINTWORD;
2409
2410 extern int asm_trace_level, line_trace_level,     expr_trace_level,
2411     linker_trace_level,     tokens_trace_level;
2412
2413 extern int
2414     bothpasses_switch,      concise_switch,
2415     economy_switch,         frequencies_switch,
2416     ignore_switches_switch, listobjects_switch,   debugfile_switch,
2417     listing_switch,         memout_switch,        printprops_switch,
2418     offsets_switch,         percentages_switch,   obsolete_switch,
2419     transcript_switch,      statistics_switch,    optimise_switch,
2420     version_set_switch,     nowarnings_switch,    hash_switch,
2421     memory_map_switch,      module_switch,        temporary_files_switch,
2422     define_DEBUG_switch,    define_USE_MODULES_switch, define_INFIX_switch,
2423     runtime_error_checking_switch;
2424
2425 extern int oddeven_packing_switch;
2426
2427 extern int glulx_mode, compression_switch;
2428 extern int32 requested_glulx_version;
2429
2430 extern int error_format,    store_the_text,       asm_trace_setting,
2431     double_space_setting,   trace_fns_setting,    character_set_setting,
2432     character_set_unicode;
2433
2434 extern char Debugging_Name[];
2435 extern char Transcript_Name[];
2436 extern char Language_Name[];
2437 extern char Charset_Map[];
2438
2439 extern char banner_line[];
2440
2441 extern void select_version(int vn);
2442 extern void switches(char *, int);
2443 extern int translate_in_filename(int last_value, char *new_name, char *old_name,
2444     int same_directory_flag, int command_line_flag);
2445 extern void translate_out_filename(char *new_name, char *old_name);
2446 extern int translate_link_filename(int last_value,
2447     char *new_name, char *old_name);
2448 extern void translate_temp_filename(int i);
2449
2450 #ifdef ARCHIMEDES
2451 extern char *riscos_file_type(void);
2452 #endif
2453
2454 /* For the benefit of the MAC_FACE port these are declared extern, though
2455    unused outside "inform" in the compiler itself */
2456
2457 extern void allocate_arrays(void);
2458 extern void free_arrays(void);
2459
2460 /* ------------------------------------------------------------------------- */
2461 /*   Extern definitions for "lexer"                                          */
2462 /* ------------------------------------------------------------------------- */
2463
2464 extern int  hash_printed_since_newline;
2465 extern int  total_source_line_count;
2466 extern int  dont_enter_into_symbol_table;
2467 extern int  return_sp_as_variable;
2468 extern int  next_token_begins_syntax_line;
2469 extern char **local_variable_texts;
2470
2471 extern int32 token_value;
2472 extern int   token_type;
2473 extern char *token_text;
2474
2475 extern debug_location get_token_location(void);
2476 extern debug_locations get_token_locations(void);
2477 extern debug_location_beginning get_token_location_beginning(void);
2478 extern void discard_token_location(debug_location_beginning beginning);
2479 extern debug_locations get_token_location_end(debug_location_beginning beginning);
2480
2481 extern void describe_token(token_data t);
2482
2483 extern void construct_local_variable_tables(void);
2484 extern void declare_systemfile(void);
2485 extern int  is_systemfile(void);
2486 extern void report_errors_at_current_line(void);
2487 extern debug_location get_current_debug_location(void);
2488 extern debug_location get_error_report_debug_location(void);
2489 extern int32 get_current_line_start(void);
2490
2491 extern void put_token_back(void);
2492 extern void get_next_token(void);
2493 extern void restart_lexer(char *lexical_source, char *name);
2494
2495 extern keyword_group directives, statements, segment_markers,
2496        conditions, system_functions, local_variables, opcode_names,
2497        misc_keywords, directive_keywords, trace_keywords, system_constants,
2498        opcode_macros;
2499
2500 /* ------------------------------------------------------------------------- */
2501 /*   Extern definitions for "linker"                                         */
2502 /* ------------------------------------------------------------------------- */
2503
2504 extern memory_block link_data_area;
2505 extern int32 link_data_size;
2506 extern char  current_module_filename[];
2507
2508 extern char *describe_mv(int mval);
2509 extern void  write_link_marker(int zmachine_area, int32 offset,
2510                  assembly_operand op);
2511 extern void  flush_link_data(void);
2512 extern void  import_symbol(int32 symbol_number);
2513 extern void  export_symbol(int32 symbol_number);
2514 extern void  export_symbol_name(int32 i);
2515 extern void  link_module(char *filename);
2516
2517 /* ------------------------------------------------------------------------- */
2518 /*   Extern definitions for "memory"                                         */
2519 /* ------------------------------------------------------------------------- */
2520
2521 extern int32 malloced_bytes;
2522
2523 extern int MAX_QTEXT_SIZE,  MAX_SYMBOLS,    HASH_TAB_SIZE,   MAX_DICT_ENTRIES,
2524            MAX_OBJECTS,     MAX_ACTIONS,    MAX_ADJECTIVES,   MAX_ABBREVS,
2525            MAX_STATIC_DATA,      MAX_PROP_TABLE_SIZE,   SYMBOLS_CHUNK_SIZE,
2526            MAX_EXPRESSION_NODES, MAX_LABELS,            MAX_LINESPACE,
2527            MAX_LOW_STRINGS,      MAX_CLASSES,           MAX_VERBS,
2528            MAX_VERBSPACE,        MAX_ARRAYS,            MAX_INCLUSION_DEPTH,
2529            MAX_SOURCE_FILES;
2530
2531 extern int32 MAX_STATIC_STRINGS, MAX_ZCODE_SIZE, MAX_LINK_DATA_SIZE,
2532            MAX_TRANSCRIPT_SIZE,  MAX_INDIV_PROP_TABLE_SIZE,
2533            MAX_NUM_STATIC_STRINGS, MAX_UNICODE_CHARS,
2534            MAX_STACK_SIZE, MEMORY_MAP_EXTENSION;
2535
2536 extern int32 MAX_OBJ_PROP_COUNT, MAX_OBJ_PROP_TABLE_SIZE;
2537 extern int MAX_LOCAL_VARIABLES, MAX_GLOBAL_VARIABLES;
2538 extern int DICT_WORD_SIZE, DICT_CHAR_SIZE, DICT_WORD_BYTES;
2539 extern int ZCODE_HEADER_EXT_WORDS, ZCODE_HEADER_FLAGS_3;
2540 extern int NUM_ATTR_BYTES, GLULX_OBJECT_EXT_BYTES;
2541 extern int WARN_UNUSED_ROUTINES, OMIT_UNUSED_ROUTINES;
2542
2543 /* These macros define offsets that depend on the value of NUM_ATTR_BYTES.
2544    (Meaningful only for Glulx.) */
2545 /* GOBJFIELD: word offsets of various elements in the object structure. */
2546 #define GOBJFIELD_CHAIN()    (1+((NUM_ATTR_BYTES)/4))
2547 #define GOBJFIELD_NAME()     (2+((NUM_ATTR_BYTES)/4))
2548 #define GOBJFIELD_PROPTAB()  (3+((NUM_ATTR_BYTES)/4))
2549 #define GOBJFIELD_PARENT()   (4+((NUM_ATTR_BYTES)/4))
2550 #define GOBJFIELD_SIBLING()  (5+((NUM_ATTR_BYTES)/4))
2551 #define GOBJFIELD_CHILD()    (6+((NUM_ATTR_BYTES)/4))
2552
2553 extern void *my_malloc(int32 size, char *whatfor);
2554 extern void my_realloc(void *pointer, int32 oldsize, int32 size, 
2555     char *whatfor);
2556 extern void *my_calloc(int32 size, int32 howmany, char *whatfor);
2557 extern void my_recalloc(void *pointer, int32 size, int32 oldhowmany, 
2558     int32 howmany, char *whatfor);
2559 extern void my_free(void *pointer, char *whatitwas);
2560
2561 extern void set_memory_sizes(int size_flag);
2562 extern void adjust_memory_sizes(void);
2563 extern void memory_command(char *command);
2564 extern void print_memory_usage(void);
2565
2566 extern void initialise_memory_block(memory_block *MB);
2567 extern void deallocate_memory_block(memory_block *MB);
2568 extern int  read_byte_from_memory_block(memory_block *MB, int32 index);
2569 extern void write_byte_to_memory_block(memory_block *MB,
2570     int32 index, int value);
2571
2572 /* ------------------------------------------------------------------------- */
2573 /*   Extern definitions for "objects"                                        */
2574 /* ------------------------------------------------------------------------- */
2575
2576 extern int no_attributes, no_properties;
2577 extern int no_individual_properties;
2578 extern int individuals_length;
2579 extern uchar *individuals_table;
2580 extern int no_classes, no_objects;
2581 extern objecttz *objectsz;
2582 extern objecttg *objectsg;
2583 extern uchar *objectatts;
2584 extern int *class_object_numbers;
2585 extern int32 *class_begins_at;
2586
2587 extern int32 *prop_default_value;
2588 extern int *prop_is_long;
2589 extern int *prop_is_additive;
2590 extern char *properties_table;
2591 extern int properties_table_size;
2592
2593 extern void make_attribute(void);
2594 extern void make_property(void);
2595 extern void make_object(int nearby_flag,
2596     char *textual_name, int specified_parent, int specified_class,
2597     int instance_of);
2598 extern void make_class(char *metaclass_name);
2599 extern int  object_provides(int obj, int id);
2600 extern void list_object_tree(void);
2601 extern void write_the_identifier_names(void);
2602
2603 /* ------------------------------------------------------------------------- */
2604 /*   Extern definitions for "symbols"                                        */
2605 /* ------------------------------------------------------------------------- */
2606
2607 extern int no_named_constants;
2608 extern int no_symbols;
2609 extern int32 **symbs;
2610 extern int32 *svals;
2611 extern int   *smarks;
2612 extern int32 *slines;
2613 extern int   *sflags;
2614 #ifdef VAX
2615   extern char *stypes;
2616 #else
2617   extern signed char *stypes;
2618 #endif
2619 extern maybe_file_position *symbol_debug_backpatch_positions;
2620 extern maybe_file_position *replacement_debug_backpatch_positions;
2621 extern int32 *individual_name_strings;
2622 extern int32 *attribute_name_strings;
2623 extern int32 *action_name_strings;
2624 extern int32 *array_name_strings;
2625 extern int track_unused_routines;
2626 extern int df_dont_note_global_symbols;
2627 extern uint32 df_total_size_before_stripping;
2628 extern uint32 df_total_size_after_stripping;
2629
2630 extern char *typename(int type);
2631 extern int hash_code_from_string(char *p);
2632 extern int strcmpcis(char *p, char *q);
2633 extern int symbol_index(char *lexeme_text, int hashcode);
2634 extern void end_symbol_scope(int k);
2635 extern void describe_symbol(int k);
2636 extern void list_symbols(int level);
2637 extern void assign_marked_symbol(int index, int marker, int32 value, int type);
2638 extern void assign_symbol(int index, int32 value, int type);
2639 extern void issue_unused_warnings(void);
2640 extern void add_symbol_replacement_mapping(int original, int renamed);
2641 extern int find_symbol_replacement(int *value);
2642 extern void df_note_function_start(char *name, uint32 address, 
2643     int embedded_flag, int32 source_line);
2644 extern void df_note_function_end(uint32 endaddress);
2645 extern void df_note_function_symbol(int symbol);
2646 extern void locate_dead_functions(void);
2647 extern uint32 df_stripped_address_for_address(uint32);
2648 extern uint32 df_stripped_offset_for_code_offset(uint32, int *);
2649 extern void df_prepare_function_iterate(void);
2650 extern uint32 df_next_function_iterate(int *);
2651
2652 /* ------------------------------------------------------------------------- */
2653 /*   Extern definitions for "syntax"                                         */
2654 /* ------------------------------------------------------------------------- */
2655
2656 extern int   no_syntax_lines;
2657
2658 extern void  panic_mode_error_recovery(void);
2659 extern void  get_next_token_with_directives(void);
2660 extern int   parse_directive(int internal_flag);
2661 extern void  parse_program(char *source);
2662 extern int32 parse_routine(char *source, int embedded_flag, char *name,
2663                  int veneer_flag, int r_symbol);
2664 extern void  parse_code_block(int break_label, int continue_label,
2665                  int switch_rule);
2666
2667 /* ------------------------------------------------------------------------- */
2668 /*   Extern definitions for "states"                                         */
2669 /* ------------------------------------------------------------------------- */
2670
2671 extern void  match_close_bracket(void);
2672 extern void  parse_statement(int break_label, int continue_label);
2673 extern int   parse_label(void);
2674
2675 /* ------------------------------------------------------------------------- */
2676 /*   Extern definitions for "tables"                                         */
2677 /* ------------------------------------------------------------------------- */
2678
2679 extern uchar *zmachine_paged_memory;
2680 extern int32
2681     code_offset,            actions_offset,       preactions_offset,
2682     dictionary_offset,      strings_offset,       adjectives_offset,
2683     variables_offset,       class_numbers_offset, individuals_offset,
2684    identifier_names_offset, prop_defaults_offset, prop_values_offset,
2685     static_memory_offset,   array_names_offset,   attribute_names_offset,
2686     action_names_offset,    fake_action_names_offset,
2687     routine_names_offset,   routines_array_offset, routine_flags_array_offset,
2688     global_names_offset,    global_flags_array_offset,
2689     array_flags_array_offset, constant_names_offset, constants_array_offset;
2690 extern int32
2691     arrays_offset, object_tree_offset, grammar_table_offset,
2692     abbreviations_offset;    /* For Glulx */
2693
2694 extern int32 Out_Size,      Write_Code_At,        Write_Strings_At;
2695 extern int32 RAM_Size,      Write_RAM_At;    /* For Glulx */
2696
2697 extern int release_number, statusline_flag;
2698 extern int flags2_requirements[];
2699 extern int serial_code_given_in_program;
2700 extern char serial_code_buffer[];
2701
2702 extern void construct_storyfile(void);
2703 extern void write_serial_number(char *buffer);
2704
2705 /* ------------------------------------------------------------------------- */
2706 /*   Extern definitions for "text"                                           */
2707 /* ------------------------------------------------------------------------- */
2708
2709 extern uchar *low_strings, *low_strings_top;
2710 extern char  *all_text,    *all_text_top;
2711
2712 extern int   no_abbreviations;
2713 extern int   abbrevs_lookup_table_made, is_abbreviation;
2714 extern uchar *abbreviations_at;
2715 extern int  *abbrev_values;
2716 extern int  *abbrev_quality;
2717 extern int  *abbrev_freqs;
2718
2719 extern int32 total_chars_trans, total_bytes_trans,
2720              zchars_trans_in_last_string;
2721 extern int   put_strings_in_low_memory;
2722 extern int   dict_entries;
2723 extern uchar *dictionary, *dictionary_top;
2724 extern int   *final_dict_order;
2725
2726 extern memory_block static_strings_area;
2727 extern int32 static_strings_extent;
2728
2729 /* And now, a great many declarations for dealing with Glulx string
2730    compression. */
2731
2732 extern int32 no_strings, no_dynamic_strings;
2733 extern int no_unicode_chars;
2734
2735 #define MAX_DYNAMIC_STRINGS (64)
2736
2737 typedef struct unicode_usage_s unicode_usage_t;
2738 struct unicode_usage_s {
2739   int32 ch;
2740   unicode_usage_t *next;  
2741 };
2742
2743 extern unicode_usage_t *unicode_usage_entries;
2744
2745 /* This is the maximum number of (8-bit) bytes that can encode a single
2746    Huffman entity. Four should be plenty, unless someone starts encoding
2747    an ideographic language. */
2748 #define MAXHUFFBYTES (4)
2749
2750 typedef struct huffbitlist_struct {
2751   uchar b[MAXHUFFBYTES];
2752 } huffbitlist_t;
2753 typedef struct huffentity_struct {
2754   int count;
2755   int type;
2756   union {
2757     int branch[2];
2758     unsigned char ch;
2759     int val;
2760   } u;
2761   int depth;
2762   int32 addr;
2763   huffbitlist_t bits;
2764 } huffentity_t;
2765
2766 extern huffentity_t *huff_entities;
2767
2768 extern int32 compression_table_size, compression_string_size;
2769 extern int32 *compressed_offsets;
2770 extern int no_huff_entities;
2771 extern int huff_abbrev_start, huff_dynam_start, huff_unicode_start;
2772 extern int huff_entity_root;
2773
2774 extern void  compress_game_text(void);
2775
2776 /* end of the Glulx string compression stuff */
2777
2778 extern void  ao_free_arrays(void);
2779 extern int32 compile_string(char *b, int in_low_memory, int is_abbrev);
2780 extern uchar *translate_text(uchar *p, uchar *p_limit, char *s_text);
2781 extern void  optimise_abbreviations(void);
2782 extern void  make_abbreviation(char *text);
2783 extern void  show_dictionary(void);
2784 extern void  word_to_ascii(uchar *p, char *result);
2785 extern void  write_dictionary_to_transcript(void);
2786 extern void  sort_dictionary(void);
2787 extern void  dictionary_prepare(char *dword, uchar *optresult);
2788 extern int   dictionary_add(char *dword, int x, int y, int z);
2789 extern void  dictionary_set_verb_number(char *dword, int to);
2790 extern int   compare_sorts(uchar *d1, uchar *d2);
2791 extern void  copy_sorts(uchar *d1, uchar *d2);
2792
2793 /* ------------------------------------------------------------------------- */
2794 /*   Extern definitions for "veneer"                                         */
2795 /* ------------------------------------------------------------------------- */
2796
2797 extern int  veneer_mode;
2798 extern int32 veneer_routine_address[];
2799
2800 extern void compile_initial_routine(void);
2801 extern assembly_operand veneer_routine(int code);
2802 extern void compile_veneer(void);
2803
2804 /* ------------------------------------------------------------------------- */
2805 /*   Extern definitions for "verbs"                                          */
2806 /* ------------------------------------------------------------------------- */
2807
2808 extern int no_adjectives, no_Inform_verbs, no_grammar_token_routines,
2809            no_fake_actions, no_actions, no_grammar_lines, no_grammar_tokens,
2810            grammar_version_number;
2811 extern int32 grammar_version_symbol;
2812 extern verbt *Inform_verbs;
2813 extern uchar *grammar_lines;
2814 extern int32 grammar_lines_top;
2815 extern int32 *action_byte_offset,
2816              *grammar_token_routine,
2817              *adjectives;
2818
2819 extern void find_the_actions(void);
2820 extern void make_fake_action(void);
2821 extern assembly_operand action_of_name(char *name);
2822 extern void make_verb(void);
2823 extern void extend_verb(void);
2824 extern void list_verb_table(void);
2825
2826 /* ========================================================================= */