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