/* ------------------------------------------------------------------------- */
/*   Header file for Inform:  Infocom game ("Z-code") compiler               */
/*   (should be #included in the others)                                     */
/*                                                                           */
/*   Inform 5   Revision 5.5                                                 */
/*                                                                           */
/*   This header file and the others making up the Inform source code are    */
/*   copyright (c) Graham Nelson 1993, 1994, 1995                            */
/*                                                                           */
/*   Manuals for this language are available from the if-archive at          */
/*   ftp.gmd.de.                                                             */
/*   For notes on how this program may legally be used, see the Designer's   */
/*   Manual introduction.  (Any recreational use is fine, and so is some     */
/*   commercial use.)  There is also a Technical Manual which may be of      */
/*   interest to porters and hackers but probably not Inform programmers.    */
/* ------------------------------------------------------------------------- */

#define RELEASE_STRING "Release 5.5 (July 3rd 1995)"
#define RELEASE_NUMBER 1502

/* ------------------------------------------------------------------------- */
/*   Our machine for today is...                                             */
/*                                                                           */
/*   [ Inform should compile (possibly with warnings) and work safely        */
/*     if you just:                                                          */
/*                                                                           */
/*     #define AMIGA       -  for the Commodore Amiga under SAS/C            */
/*     #define ARCHIMEDES  -  for the Acorn Archimedes under Norcroft C      */
/*     #define ATARIST     -  for the Atari ST                               */
/*     #define LINUX       -  for Linux under gcc (essentially as Unix)      */
/*     #define MACINTOSH   -  for the Apple Mac under Think C or Codewarrior */
/*     #define MAC_68K     -  for 68K Macs, under Think C or Codewarrior     */
/*     #define MAC_MPW     -  for MPW under Codewarrior (and maybe Think C)  */
/*     #define OS2         -  for OS/2 32-bit mode under IBM's C Set++       */
/*     #define PC          -  for 386+ IBM PCs, eg. Microsoft Visual C/C++   */
/*     #define PC_QUICKC   -  for small IBM PCs under QuickC                 */
/*     #define UNIX        -  for Unix under gcc (or big IBM PC under djgpp) */
/*     #define VMS         -  for VAX or ALPHA under DEC C, but not VAX C    */
/*                                                                           */
/*     See the notes below.  Executables may already be available by ftp.]   */
/*                                                                           */
/*   (If no machine is defined, then cautious #defines will be made.)        */
/* ------------------------------------------------------------------------- */

#define GRAHAM

/* ------------------------------------------------------------------------- */
/*   The other #definable options (some of them set by the above) are:       */
/*                                                                           */
/*   USE_TEMPORARY_FILES - use scratch files for workspace, not memory       */
/*   PROMPT_INPUT        - prompt input (don't use Unix-style command line)  */
/*   TIME_UNAVAILABLE    - don't use ANSI time routines to work out today's  */
/*                         date                                              */
/*   US_POINTERS         - make some of the checksum routine pointers        */
/*                         unsigned char *'s, not char *'s: this should be   */
/*                         used if your compiler does un-ANSI things with    */
/*                         casts between these types                         */
/* ------------------------------------------------------------------------- */
/*   Hello, Porter!                                                          */
/*   For notes on making a new port of Inform, see the Technical Manual.     */
/* ------------------------------------------------------------------------- */
/*   ARCHIMEDES "port" (the original)                                        */
/*     ...incorporates three Archimedes-only #define'able options:           */
/*                                                                           */
/*   ARC_PROFILING       - do clumsy profiling                               */
/*   ARC_THROWBACK       - compile to be useful under the DDE as well as the */
/*                         command line, including throwback of errors into  */
/*                         !SrcEdit (code donated by Robin Watts)            */
/*   GRAHAM              - for Graham's machine only                         */
/*                                                                           */
/*   (link with ansilib only, not RISC_OSlib)                                */
/* ------------------------------------------------------------------------- */
/*   UNIX port (by Dilip Sequeira):  A "vanilla" makefile for gcc is:        */
/*                                                                           */
/*     OBJECTS = files.o asm.o inputs.o symbols.o zcode.o tables.o inform.o  */
/*               express.o                                                   */
/*     CC = gcc                                                              */
/*     CFLAGS = -O2 -finline-functions -fomit-frame-pointer                  */
/*                                                                           */
/*     inform: $(OBJECTS)                                                    */
/*      $(CC) -o inform $(OBJECTS)                                           */
/*                                                                           */
/*     $(OBJECTS): header.h Makefile                                         */
/*                                                                           */
/*   (making an executable of size about 100K on a SparcStation II).         */
/*   The temporary files option is not on by default, but if it is used,     */
/*     file names are used which contain the process ID.                     */
/* ------------------------------------------------------------------------- */
/*   AMIGA port (by Christopher A. Wichura)                                  */
/*                                                                           */
/*     (Because of the way this compiler handles unsigned char *'s the       */
/*        #define AMIGA option forces #define US_POINTERS.)                  */
/*                                                                           */
/*     "I am compiling with SAS/C v6.51.  To support building a GST file     */
/*     (essentially a pre-compiled header file), I had to add the file       */
/*     amiheadermaker.c, which I have also included.  Finally, I am also     */
/*     including a copy of the SCOPTIONS file."                              */
/*                                                                           */
/*      --- BEGIN smakefile ---                                              */
/*      # smake file for Inform, the Infocom compiler                        */
/*      # created 1/24/94 by Christopher A. Wichura ([email protected])    */
/*                                                                           */
/*      PROGNAME = Inform                                                    */
/*                                                                           */
/*      CFLAGS = nostkchk strmerge parms=reg utillib optimize                */
/*      LFLAGS = smallcode smalldata stripdebug                              */
/*                                                                           */
/*      HDR = $(PROGNAME).gst                                                */
/*                                                                           */
/*      OBJS = asm.o files.o inform.o inputs.o symbols.o tables.o zcode.o    */
/*             express.o                                                     */
/*      LIBS = LIB:sc.lib LIB:debug.lib LIB:amiga.lib                        */
/*                                                                           */
/*      .c.o                                                                 */
/*       sc $(CFLAGS) gst=$(HDR) $*                                          */
/*                                                                           */
/*      $(PROGNAME): $(OBJS)                                                 */
/*       slink with lib:utillib.with <WITH < (withfile.lnk)                  */
/*      FROM LIB:cres.o $(OBJS)                                              */
/*      TO $(PROGNAME)                                                       */
/*      LIB $(LIBS)                                                          */
/*      $(LFLAGS)                                                            */
/*      MAP $(PROGNAME).map fhlsx plain                                      */
/*      <                                                                    */
/*                                                                           */
/*      # clean target                                                       */
/*      clean:                                                               */
/*       delete \#?.o $(PROGNAME).gst $(PROGNAME).map                        */
/*                                                                           */
/*      # dependancies of various modules                                    */
/*      $(HDR): header.h                                                     */
/*       sc $(CFLAGS) noobjname makegst=$(HDR) amiheadermaker.c              */
/*                                                                           */
/*      asm.o: asm.c $(HDR)                                                  */
/*                                                                           */
/*      files.o: files.c $(HDR)                                              */
/*                                                                           */
/*      inform.o: inform.c $(HDR)                                            */
/*                                                                           */
/*      express.o: express.c $(HDR)                                          */
/*                                                                           */
/*      inputs.o: inputs.c $(HDR)                                            */
/*                                                                           */
/*      symbols.o: symbols.c $(HDR)                                          */
/*                                                                           */
/*      tables.o: tables.c $(HDR)                                            */
/*                                                                           */
/*      zcode.o: zcode.c $(HDR)                                              */
/*                                                                           */
/*      --- END smakefile ---                                                */
/*                                                                           */
/*      --- BEGIN amiheadermaker.c ---                                       */
/*      // file used to build the Amiga GST file.                            */
/*      #include "header.h"                                                  */
/*                                                                           */
/*      --- END amiheadermaker.c ---                                         */
/*                                                                           */
/*      --- BEGIN SCOPTIONS                                                  */
/*      MemorySize=HUGE                                                      */
/*      IncludeDir=SINCLUDE:                                                 */
/*      OptimizerComplexity=15                                               */
/*      OptimizerDepth=5                                                     */
/*      OptimizerRecurDepth=15                                               */
/*      OptimizerSchedule                                                    */
/*      OptimizerInLocal                                                     */
/*      Verbose                                                              */
/*      --- END SCOPTIONS                                                    */
/*                                                                           */
/* ------------------------------------------------------------------------- */
/*   Microsoft Visual C/C++ port (for the PC) (by Toby Nelson)               */
/*                                                                           */
/*  "The following makefile is for the "Microsoft Visual C++ V1.00"          */
/*  development environment, of which the important bit is the "Microsoft    */
/*  C/C++ Optimizing Compiler Version 8.00". It may well work for previous   */
/*  versions of the compiler too.                                            */
/*                                                                           */
/*        CFLAGS = /nologo /Ox /W0 /AL                                       */
/*        goal: inform.exe                                                   */
/*                                                                           */
/*        .obj: .c                                                           */
/*        cl *.c                                                             */
/*                                                                           */
/*        inform.exe: asm.obj files.obj inform.obj inputs.obj symbols.obj \  */
/*            tables.obj zcode.obj express.obj                               */
/*        link /STACK:16384 asm files inform inputs symbols tables \         */
/*            zcode express, inform.exe,,llibce.lib,,                        */
/*                                                                           */
/*  (NB: The compiler options used here are:                                 */
/*                                                                           */
/*        /nologo = no copyright message,                                    */
/*        /Ox = optimize for speed,                                          */
/*        /W0 = turn off all compiler warnings, and                          */
/*        /AL = compile for the large memory model.)"                        */
/*                                                                           */
/* ------------------------------------------------------------------------- */
/*   Quick C port (for the PC) (by Bob Newell): Makefile...                  */
/*                                                                           */
/*        CFLAGS =   /DPC_QUICKC /AL  /DJ                                    */
/*        CC = qcl                                                           */
/*                                                                           */
/*        inform.exe:  asm.obj files.obj inform.obj inputs.obj symbols.obj \ */
/*            tables.obj zcode.obj express.obj                               */
/*            qlink /STACK:16384 asm.obj files.obj inform.obj inputs.obj \   */
/*             symbols.obj tables.obj zcode.obj express.obj, inform.exe,, \  */
/*             llibce.lib,,                                                  */
/* ------------------------------------------------------------------------- */
/*   Atari ST port (by Charles Briscoe-Smith): Makefile...                   */
/*                                                                           */
/*        OBJS = files.o asm.o inputs.o symbols.o zcode.o tables.o inform.o  */
/*               express.o                                                   */
/*                                                                           */
/*        CC = gcc                                                           */
/*                                                                           */
/*        # I didn't use the optimisation flags, because of memory shortage. */
/*        # If you have enough memory, try uncommenting the "CFLAGS=" line.  */
/*                                                                           */
/*        #CFLAGS = -O2 -finline-functions -fomit-frame-pointer              */
/*                                                                           */
/*        inform.ttp : $(OBJS)                                               */
/*              $(CC) $(CFLAGS) -o inform.ttp $(OBJS)                        */
/*                                                                           */
/*        $(OBJS): header.h                                                  */
/*                                                                           */
/*   This port contains a TOSFS option: if defined, then temporary files are */
/*   named in DOS style, and if not then in Unix style (in any case, this    */
/*   only matters if USE_TEMPORARY_FILES is set).                            */
/* ------------------------------------------------------------------------- */
/*   OS/2 port (by John W. Kennedy):                                         */
/*                                                                           */
/*   "The program compiles and runs correctly as-is... I found it convenient */
/*   to create a dummy h.version file, to prevent problems with makemake.    */
/*   Since the file is not actually used, the contents don't matter...       */
/*   ...it can be assumed that later this year it [Inform] will port         */
/*   successfully to WorkPlace OS on the PowerPC, as well."                  */
/* ------------------------------------------------------------------------- */
/*   Makefile for Linux (by Spedge, aka Dark Mage)                           */
/*                                                                           */
/*    CC      = gcc                                                          */
/*    CFLAGS  = -Dlinux                                                      */
/*    LDFLAGS =                                                              */
/*    LIBS    =                                                              */
/*                                                                           */
/*    PROG    = inform                                                       */
/*    SUBDIRS = data                                                         */
/*    BINDIR  = /usr/local/games/infocom                                     */
/*    DATADIR = /usr/local/games/infocom/data                                */
/*    MANDIR  = /usr/local/man/man1                                          */
/*    INSTALL = install                                                      */
/*    RM      = rm                                                           */
/*    CD      = cd                                                           */
/*    CP      = cp                                                           */
/*                                                                           */
/*    INC     = header.h                                                     */
/*    OBJS    = inform.o asm.o inputs.o files.o symbols.o tables.o zcode.o   */
/*              express.o                                                    */
/*                                                                           */
/*    all: $(PROG)                                                           */
/*                                                                           */
/*    inform : $(OBJS)                                                       */
/*            $(CC) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIBS)                    */
/*                                                                           */
/*    $(OBJS) : $(INC)                                                       */
/*                                                                           */
/*    install: $(PROG)                                                       */
/*            $(INSTALL) $(PROG) $(BINDIR)                                   */
/*      @for d in $(SUBDIRS); do (cd $$d && $(MAKE) install) || exit; done   */
/*                                                                           */
/*    install.man:                                                           */
/*            $(CP) $(PROG).1 $(MANDIR)                                      */
/*                                                                           */
/*    clean :                                                                */
/*            $(RM) -f *.o $(PROG)                                           */
/*                                                                           */
/* ------------------------------------------------------------------------- */
/*   Apple Macintosh port (by Robert Pelak):                                 */
/*                                                                           */
/*      A working version of Inform can be produced using either THINK C     */
/*      or Codewarrior.  Inform will need to use a console package (the      */
/*      THINK C console or Sioux are adequate) for input and output, but     */
/*      these are usually added automatically.  In older versions of THINK   */
/*      C, FAR DATA needs to be selected before compilation.  Also, I've     */
/*      experienced some difficulty with one set of pointers when working    */
/*      under THINK C; you can correct for this by issuing a                 */
/*                                                                           */
/*               #define MAC_68K                                             */
/*                                                                           */
/*      just after #define MACINTOSH.                                        */
/*                                                                           */
/*      (Defining the MAC_FACE option as well provides compatibility with    */
/*      Robert's Inform front-end - GN.)                                     */
/*                                                                           */
/*   For support for the Macintosh Programmer's Workshop (added by Robert    */
/*   Stone), #define MAC_MPW.                                                */
/*                                                                           */
/* ------------------------------------------------------------------------- */
/*   VMS port (VAX or ALPHA, DEC C only) (by David Wagner):                  */
/*                                                                           */
/*      Compile all the .c files, and link.                                  */
/*      To run, define a foreign symbol:                                     */
/*                                                                           */
/*         $ INFORM :== $disk:[directory]INFORM.EXE                          */
/*                                                                           */
/*      then, e.g.,                                                          */
/*                                                                           */
/*         $ INFORM -dx shell                                                */
/*                                                                           */
/*      (Enclose the options in quotes if some are in upper case)            */
/* ------------------------------------------------------------------------- */
/*                                                                           */
/*   The modification history and source code map have been moved to the     */
/*   Technical Manual.                                                       */
/*                                                                           */
/* ------------------------------------------------------------------------- */

#define ALLOCATE_BIG_ARRAYS

#define LARGE_SIZE   1
#define SMALL_SIZE   2
#define HUGE_SIZE    3

/* ------------------------------------------------------------------------- */
/*   By setting up the prefixes and extensions in the definitions below, you */
/*   should be able to get something sensible for your filing system.        */
/*   In the last resort, the clumsy "z3", "z5" etc prefixes below are chosen */
/*   to cause least offense to different filing systems.                     */
/*   Note that if both Code_Prefix and Code_Extension are empty, then Inform */
/*   may overwrite its source code with the object code... so don't allow    */
/*   this.                                                                   */
/*   (For Unix and PCs the extension is ".z3" or ".z5" rather than ".zip"    */
/*   to avoid looking like the file compression trailer...)                  */
/*                                                                           */
/* ------------------------------------------------------------------------- */

#ifdef GRAHAM
#define ARCHIMEDES
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#define ARC_THROWBACK
#endif

#define VNUMBER RELEASE_NUMBER

#ifdef ARCHIMEDES
#define MACHINE_STRING   "Archimedes"
#define Source_Prefix    "inform."
#define Source_Extension ""
#define Include_Prefix   "library."
#define Code_Prefix      "games."
#define Code_Extension   ""
#define Transcript_Name  "Game_Text"
#define Debugging_Name   "Game_Debug"
#define USE_TEMPORARY_FILES
#define Temp1_Name temporary_name(1)
#define Temp2_Name temporary_name(2)
#ifdef ARC_PROFILING
    extern int _fmapstore(char *);
#endif
#endif

#ifdef UNIX
#define MACHINE_STRING   "Unix"
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".z3"
#define V4Code_Extension ".z4"
#define V5Code_Extension ".z5"
#define V6Code_Extension ".z6"
#define V7Code_Extension ".z7"
#define V8Code_Extension ".z8"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
extern char Temp1_Name[], Temp2_Name[];
#define Temp1_Hdr "/tmp/InformTemp1"
#define Temp2_Hdr "/tmp/InformTemp2"
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#define US_POINTERS
#endif

#ifdef LINUX

/* Added on advice of Brendon Wyber: */
#define US_POINTERS

#define MACHINE_STRING   "Linux"
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".z3"
#define V4Code_Extension ".z4"
#define V5Code_Extension ".z5"
#define V6Code_Extension ".z6"
#define V7Code_Extension ".z7"
#define V8Code_Extension ".z8"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
extern char *Temp1_Name, *Temp2_Name;
#define Temp1_Hdr "/tmp/InformTemp1"
#define Temp2_Hdr "/tmp/InformTemp2"
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#endif

#ifdef PC_QUICKC
#define PC
#endif

#ifdef PC
#define MACHINE_STRING   "PC"
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".z3"
#define V4Code_Extension ".z4"
#define V5Code_Extension ".z5"
#define V6Code_Extension ".z6"
#define V7Code_Extension ".z7"
#define V8Code_Extension ".z8"
#define Temp1_Name "Inftmp1.tmp"
#define Temp2_Name "Inftmp2.tmp"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
#define USE_TEMPORARY_FILES
#define US_POINTERS
#define DEFAULT_ERROR_FORMAT 1
#endif

#ifdef __VMS
#define VMS
#endif
#ifdef VMS
#ifdef __ALPHA
#define MACHINE_STRING "Alpha/VMS"
#else
#define MACHINE_STRING "VAX/VMS"
#endif
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".zip"
#define V4Code_Extension ".zip"
#define V5Code_Extension ".zip"
#define V6Code_Extension ".zip"
#define V7Code_Extension ".zip"
#define V8Code_Extension ".zip"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
#define Temp1_Name "Inftmp1.tmp"
#define Temp2_Name "Inftmp2.tmp"
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#endif

#ifdef AMIGA
#define MACHINE_STRING   "Amiga"
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".z3"
#define V4Code_Extension ".z4"
#define V5Code_Extension ".z5"
#define V6Code_Extension ".z6"
#define V7Code_Extension ".z7"
#define V8Code_Extension ".z8"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
extern char Temp1_Name[], Temp2_Name[];
#define Temp1_Hdr "T:InformTemp1"
#define Temp2_Hdr "T:InformTemp2"
#define __USE_SYSBASE
#include <proto/exec.h>
#define US_POINTERS
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#endif

#ifdef ATARIST
#define MACHINE_STRING   "Atari ST"
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".z3"
#define V4Code_Extension ".z4"
#define V5Code_Extension ".z5"
#define V6Code_Extension ".z6"
#define V7Code_Extension ".z7"
#define V8Code_Extension ".z8"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
#ifdef TOSFS
#define Temp1_Name "Inftmp1.tmp"
#define Temp2_Name "Inftmp2.tmp"
#else
char Temp1_Name[50], Temp2_Name[50];
#define Temp1_Hdr "/tmp/InformTemp1"
#define Temp2_Hdr "/tmp/InformTemp2"
#endif
#endif /* ATARIST */

#ifdef OS2
#define MACHINE_STRING   "OS/2"
#define Source_Prefix    ""
#define Source_Extension ".inf"
#define Include_Extension ".h"
#define Code_Prefix      ""
#define Code_Extension   ".z3"
#define V4Code_Extension ".z4"
#define V5Code_Extension ".z5"
#define V6Code_Extension ".z6"
#define V7Code_Extension ".z7"
#define V8Code_Extension ".z8"
#define Temp1_Name "Inftemp1"
#define Temp2_Name "Inftemp2"
#define Transcript_Name "game.txt"
#define Debugging_Name  "game.dbg"
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#endif

#ifdef MAC_MPW
#define MACINTOSH
#endif

#ifdef MACINTOSH
#ifdef MAC_MPW
#define MACHINE_STRING   "Macintosh Programmer's Workshop"
#define Include_Extension ".h"
#else
#define MACHINE_STRING   "Macintosh"
#define Include_Extension ""
#endif
#define Source_Prefix    ""
#define Code_Prefix      ""
#define Temp1_Name "Inftemp1"
#define Temp2_Name "Inftemp2"
#define US_POINTERS
#define DEFAULT_MEMORY_SIZE LARGE_SIZE
#ifndef MAC_FACE
#ifndef MAC_MPW
#define PROMPT_INPUT
#endif
#define Transcript_Name "game.text"
#define Debugging_Name  "game.debug"
#define Source_Extension ".inf"
#define Code_Extension   ".z"
#define V4Code_Extension ".z"
#define V5Code_Extension ".z"
#define V6Code_Extension ".z"
#define V7Code_Extension ".z"
#define V8Code_Extension ".z"
#endif
#ifdef MAC_FACE
#define Source_Extension ""
#define Code_Prefix      ""
#define V5Code_Extension ""
#define V6Code_Extension ""
#define V7Code_Extension ""
#define V8Code_Extension ""
extern char *Transcript_Name;
extern char *Debugging_Name;
#endif
#endif

/* Default settings: */

#ifndef Source_Prefix
#define Source_Prefix    ""
#define Source_Extension ""
#define Code_Prefix      "z3"
#define V5Code_Prefix    "z5"
#define Code_Extension   ""
#define Temp1_Name "Inftemp1"
#define Temp2_Name "Inftemp2"
#endif

#ifndef Include_Prefix
#define Include_Prefix Source_Prefix
#endif
#ifndef Include_Extension
#define Include_Extension Source_Extension
#endif

#ifndef V4Code_Prefix
#define V4Code_Prefix Code_Prefix
#endif
#ifndef V4Code_Extension
#define V4Code_Extension Code_Extension
#endif
#ifndef V5Code_Prefix
#define V5Code_Prefix Code_Prefix
#endif
#ifndef V5Code_Extension
#define V5Code_Extension Code_Extension
#endif
#ifndef V6Code_Prefix
#define V6Code_Prefix Code_Prefix
#endif
#ifndef V6Code_Extension
#define V6Code_Extension Code_Extension
#endif
#ifndef V7Code_Prefix
#define V7Code_Prefix Code_Prefix
#endif
#ifndef V7Code_Extension
#define V7Code_Extension Code_Extension
#endif
#ifndef V8Code_Prefix
#define V8Code_Prefix Code_Prefix
#endif
#ifndef V8Code_Extension
#define V8Code_Extension Code_Extension
#endif

#ifndef MAC_FACE
#ifndef Transcript_Name
#define Transcript_Name "thetext"
#endif

#ifndef Debugging_Name
#define Debugging_Name "debuginf"
#endif
#endif

#ifndef DEFAULT_MEMORY_SIZE
#define DEFAULT_MEMORY_SIZE SMALL_SIZE
#endif

#ifndef DEFAULT_ERROR_FORMAT
#define DEFAULT_ERROR_FORMAT 0
#endif

/* ------------------------------------------------------------------------- */
/*   Inclusions and some macro definitions...                                */
/*   (At this point in earlier releases, there were many #define's for       */
/*    memory limits and sizes of arrays: see "files" for the new code.)      */
/* ------------------------------------------------------------------------- */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <limits.h>
#ifdef MAC_FACE
#include <setjmp.h>
#endif
#ifdef MAC_MPW
#include <CursorCtl.h>
#endif

#define  MAX_ERRORS 100
#define  MAX_BLOCK_NESTING 32
#define  MAX_EXPRESSION_BRACKETS 32
#define  MAX_ARITY 9
#define  MAX_IFDEF_DEPTH 32
#define  MAX_IDENTIFIER_LENGTH 32
#define  MAX_ABBREV_LENGTH 64
#define  MAX_INCLUSION_DEPTH 4

/* ------------------------------------------------------------------------- */
/*   Twisting the C compiler's arm to get a convenient 32-bit integer type   */
/*   Warning: chars are presumed unsigned in this code, which I think is     */
/*   ANSI std; but they were presumed signed by K&R, so confusion reigns.    */
/*   Anyway a compiler ought to be able to cast either way as needed.        */
/*   Subtracting pointers is in a macro here for convenience: if even 32 bit */
/*   ints won't reliably hold pointers on your machine, rewrite properly     */
/*   using ptrdiff_t                                                         */
/* ------------------------------------------------------------------------- */

#ifndef VAX
#if   SCHAR_MAX >= 0x7FFFFFFFL && SCHAR_MIN <= -0x7FFFFFFFL
     typedef signed char       int32;
     typedef unsigned char     uint32;
#elif SHRT_MAX >= 0x7FFFFFFFL  && SHRT_MIN <= -0x7FFFFFFFL
     typedef signed short int  int32;
     typedef unsigned short int uint32;
#elif INT_MAX >= 0x7FFFFFFFL   && INT_MIN <= -0x7FFFFFFFL
     typedef signed int        int32;
     typedef unsigned int      uint32;
#elif LONG_MAX >= 0x7FFFFFFFL  && LONG_MIN <= -0x7FFFFFFFL
     typedef signed long int   int32;
     typedef unsigned long int uint32;
#else
     #error No type large enough to support 32-bit integers.
#endif
#else
     typedef int int32;
     typedef unsigned int uint32;
#endif

#ifdef PC_QUICKC
   void _huge * halloc(long, size_t);
   void hfree(void *);
#define subtract_pointers(p1,p2) (long)((char _huge *)p1-(char _huge *)p2)
#else
#define subtract_pointers(p1,p2) (((int32) p1)-((int32) p2))
#endif

#ifdef US_POINTERS
   typedef unsigned char zip;
#else
   typedef char zip;
#endif

extern int BUFFER_LENGTH;
extern int MAX_QTEXT_SIZE;
extern int MAX_SYMBOLS;
extern int MAX_BANK_SIZE;
extern int SYMBOLS_CHUNK_SIZE;
extern int BANK_CHUNK_SIZE;
extern int HASH_TAB_SIZE;

extern int MAX_OBJECTS;

extern int MAX_ACTIONS;
extern int MAX_ADJECTIVES;
extern int MAX_DICT_ENTRIES;
extern int MAX_STATIC_DATA;

extern int MAX_TOKENS;
extern int MAX_OLDEPTH;
extern int MAX_ROUTINES;
extern int MAX_GCONSTANTS;

extern int MAX_PROP_TABLE_SIZE;

extern int MAX_FORWARD_REFS;

extern int STACK_SIZE;
extern int STACK_LONG_SLOTS;
extern int STACK_SHORT_LENGTH;

extern int MAX_ABBREVS;

extern int MAX_EXPRESSION_NODES;
extern int MAX_VERBS;
extern int MAX_VERBSPACE;

extern int32 MAX_STATIC_STRINGS;
extern int32 MAX_ZCODE_SIZE;

extern int MAX_LOW_STRINGS;

extern int32 MAX_TRANSCRIPT_SIZE;

extern int MAX_CLASSES;
extern int MAX_CLASS_TABLE_SIZE;

/* ------------------------------------------------------------------------- */
/*   If your compiler doesn't recognise \t, and you use ASCII, you could     */
/*   define T_C as (char) 9; failing that, it _must_ be defined as a space   */
/*   and is _not_ allowed to be 0 or any recognisable character.             */
/* ------------------------------------------------------------------------- */

#define TAB_CHARACTER '\t'

/* ------------------------------------------------------------------------- */
/*  This hideous line is here only for checking on my machine that Inform    */
/*  runs properly when int is 16-bit                                         */
/* ------------------------------------------------------------------------- */

/* #define int short int */

/* ------------------------------------------------------------------------- */
/*   Structure definitions (there are a few others local to files)           */
/* ------------------------------------------------------------------------- */

typedef struct sourcefile
{   FILE *handle;
   char filename[64];
   int  source_line;
   int  sys_flag;
   int  file_no;
   int32 chars_read;
   int32 line_start;
} Sourcefile;

typedef struct opcode
{   zip *name;
   int code;
   int32 offset;
   int type1, type2, no;
} opcode;

typedef struct operand_t
{   int32 value; int type;
} operand_t;

typedef struct verbl {
   unsigned char e[8];
} verbl;

#define MAX_LINES_PER_VERB 20

typedef struct verbt {
   int lines;
   verbl l[MAX_LINES_PER_VERB];
} verbt;

typedef struct prop {
   unsigned char l, num, p[64];
} prop;

typedef struct propt {
   char l;
   prop pp[32];
} propt;

typedef struct fpropt {
   unsigned char atts[6];
   char l;
   prop pp[32];
} fpropt;

typedef struct objectt {
   unsigned char atts[6];
   int parent, next, child;
   int propsize;
} objectt;

typedef struct dict_word {
   unsigned char b[6];
} dict_word;

typedef struct dbgl_s
{   int b1, b2, b3;
} dbgl;

/* ------------------------------------------------------------------------- */
/*   Opcode type definitions                                                 */
/* ------------------------------------------------------------------------- */

#define NONE    0
#define STORE   1
#define BRANCH  2
#define CALL    3
#define JUMP    4
#define RETURN  5
#define NCALL   6
#define PCHAR   7
#define VATTR   8
#define ILLEGAL 9
#define INDIR  10

#define VAR     1
#define TEXT    2
#define OBJECT  3

#define VARI   -1
#define ZERO    0
#define ONE     1
#define TWO     2
#define EXTD    3
#define MANY    4

#define INVALID 100

/* ------------------------------------------------------------------------- */
/*   Inform code definitions                                                 */
/* ------------------------------------------------------------------------- */

#define ABBREVIATE_CODE  0
#define ATTRIBUTE_CODE   1
#define CONSTANT_CODE    2
#define DICTIONARY_CODE  3
#define END_CODE         4
#define INCLUDE_CODE     5
#define GLOBAL_CODE      6
#define OBJECT_CODE      7
#define PROPERTY_CODE    8
#define RELEASE_CODE     9
#define SWITCHES_CODE    10
#define STATUSLINE_CODE  11
#define VERB_CODE        12
#define TRACE_CODE       13
#define NOTRACE_CODE     14
#define ETRACE_CODE      15
#define NOETRACE_CODE    16
#define BTRACE_CODE      17
#define NOBTRACE_CODE    18
#define LTRACE_CODE      19
#define NOLTRACE_CODE    20
#define ATRACE_CODE      21
#define NOATRACE_CODE    22
#define LISTSYMBOLS_CODE 23
#define LISTOBJECTS_CODE 24
#define LISTVERBS_CODE   25
#define LISTDICT_CODE    26
#define OPENBLOCK_CODE   27
#define CLOSEBLOCK_CODE  28
#define SERIAL_CODE      29
#define DEFAULT_CODE     30
#define STUB_CODE        31
#define VERSION_CODE     32
#define IFV3_CODE        33
#define IFV5_CODE        34
#define IFDEF_CODE       35
#define IFNDEF_CODE      36
#define ENDIF_CODE       37
#define IFNOT_CODE       38
#define LOWSTRING_CODE   39
#define CLASS_CODE       40
#define FAKE_ACTION_CODE 41
#define NEARBY_CODE      42
#define SYSTEM_CODE      43
#define REPLACE_CODE     44
#define EXTEND_CODE      45
#define ARRAY_CODE       46

#define PRINT_ADDR_CODE  0
#define PRINT_CHAR_CODE  1
#define PRINT_PADDR_CODE 2
#define PRINT_OBJ_CODE   3
#define PRINT_NUM_CODE   4
#define REMOVE_CODE      5
#define RETURN_CODE      6
#define DO_CODE          7
#define FOR_CODE         8
#define IF_CODE          9
#define OBJECTLOOP_CODE  10
#define UNTIL_CODE       11
#define WHILE_CODE       12
#define BREAK_CODE       13
#define ELSE_CODE        14
#define GIVE_CODE        15
#define INVERSION_CODE   16
#define MOVE_CODE        17
#define PUT_CODE         18
#define WRITE_CODE       19
#define STRING_CODE      20
#define FONT_CODE        21
#define READ_CODE        22
#define STYLE_CODE       23
#define RESTORE_CODE     24
#define SAVE_CODE        25
#define PRINT_CODE       26
#define SPACES_CODE      27
#define PRINT_RET_CODE   28
#define BOX_CODE         29
#define SWITCH_CODE      30
#define JUMP_CODE        31

#define ASSIGNMENT_CODE  100
#define FUNCTION_CODE    101

#define ARROW_SEP        0
#define DARROW_SEP       1
#define DEC_SEP          2
#define MINUS_SEP        3
#define INC_SEP          4
#define PLUS_SEP         5
#define TIMES_SEP        6
#define DIVIDE_SEP       7
#define REMAINDER_SEP    8
#define LOGOR_SEP        9
#define ARTOR_SEP       10
#define LOGAND_SEP      11
#define ARTAND_SEP      12
#define CONDEQUALS_SEP  13
#define SETEQUALS_SEP   14
#define NOTEQUAL_SEP    15
#define GE_SEP          16
#define GREATER_SEP     17
#define LE_SEP          18
#define LESS_SEP        19
#define OPENB_SEP       20
#define CLOSEB_SEP      21
#define COMMA_SEP       22
#define PROPADD_SEP     23
#define PROPNUM_SEP     24
#define PROPERTY_SEP    25
#define COLON_SEP       26

/* ------------------------------------------------------------------------- */
/*   Useful macros                                                           */
/* ------------------------------------------------------------------------- */

#define On_(x)   if (strcmp(b,x)==0)
#define OnS_(x)  if (strcmp(sub_buffer,x)==0)
#define IfPass2  if (pass_number==2)

#define InV3     if (version_number==3)
#define InV5     if (version_number==5)

/* ------------------------------------------------------------------------- */
/*   Initialisation extern definitions                                       */
/* ------------------------------------------------------------------------- */

extern void init_inform_vars(void);
extern void init_express_vars(void);
extern void init_zcode_vars(void);
extern void zcode_free_arrays(void);
extern void init_files_vars(void);
extern void init_symbols_vars(void);
extern void init_inputs_vars(void);
extern void init_tables_vars(void);
extern void init_asm_vars(void);

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "inform"                                         */
/* ------------------------------------------------------------------------- */

#ifdef ALLOCATE_BIG_ARRAYS
   extern int  *abbrev_values;
   extern int  *abbrev_quality;
   extern int  *abbrev_freqs;
#else
   extern int  abbrev_values[];
   extern int  abbrev_quality[];
   extern int  abbrev_freqs[];
#endif

extern int
   version_number,      override_version,
   no_abbrevs,          no_routines,      no_symbols,
   no_errors,           no_warnings,      endofpass_flag,
   no_dummy_labels,
   pass_number,         brace_sp,         no_locals,
   process_filename_flag,                 actual_version;
extern int32 scale_factor;
extern int
   statistics_mode,     offsets_mode,     tracing_mode,
   ignoreswitches_mode, bothpasses_mode,  hash_mode,
   percentages_mode,    trace_mode,       ltrace_mode,
   etrace_mode,         listing_mode,     concise_mode,
   nowarnings_mode,     frequencies_mode, ignoring_mode,
   double_spaced,       economy_mode,     memout_mode,
   transcript_mode,     optimise_mode,    store_the_text,
   abbrev_mode,         memory_map_mode,  withdebug_mode,
   listobjects_mode,    printprops_mode,  debugging_file,
   obsolete_mode,       extend_memory_map;
extern int error_format;
extern zip
   *zcode,      *zcode_p,     *utf_zcode_p,
   *symbols_p,  *symbols_top,
   *strings,    *strings_p,
   *low_strings, *low_strings_p,
   *dictionary, *dict_p,
   *output_p,   *abbreviations_at;

   extern char *all_text, *all_text_p;

#ifdef ALLOCATE_BIG_ARRAYS
   extern char *buffer, *sub_buffer, *parse_buffer, *rewrite;
#else
   extern char buffer[], sub_buffer[], parse_buffer[], rewrite[];
#endif

extern int32 Write_Code_At, Write_Strings_At;

extern int32
   code_offset,
   actions_offset,
   preactions_offset,
   dictionary_offset,
   adjectives_offset,
   variables_offset,
   strings_offset;

extern int32 Out_Size;

extern void make_lower_case(char *str);
extern void make_upper_case(char *str);
extern void free_remaining_arrays(void);
extern void switches(char *, int);

extern int call_for_br_flag;
extern void compile_box_routine(void);

#ifdef MAC_FACE
extern int inform_main(char *, char *, char *, char *);
extern jmp_buf mac_env;
#endif

/* ------------------------------------------------------------------------- */
/*   Extern definitions for Archimedes DDE throwback (see above)             */
/* ------------------------------------------------------------------------- */

#ifdef ARC_THROWBACK
extern void throwback(int severity, char * error);
extern void throwback_start(void);
extern void throwback_end(void);
extern int throwbackflag;
#endif

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "express"                                        */
/* ------------------------------------------------------------------------- */

extern int  next_token, void_context, condition_context,
           assign_context, lines_compiled;
extern char condition_label[];

extern int replace_sf(char *b);
extern void express_allocate_arrays(void);
extern void express_free_arrays(void);
extern int expression(int fromword);
extern void assignment(int from, int flag);

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "zcode"                                          */
/* ------------------------------------------------------------------------- */

extern int  almade_flag;
extern int32 total_chars_trans, total_bytes_trans, trans_length;
extern const char *alphabet[];
extern int  chars_lookup[];

extern int  translate_to_ascii(char c);
extern void make_lookup(void);
extern void make_abbrevs_lookup(void);
extern zip *translate_text(zip *p, char *s_text);
extern opcode opcs(int32 i);
extern void stockup_symbols(void);
extern void optimise_abbreviations(void);

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "files"                                          */
/* ------------------------------------------------------------------------- */

extern int  override_error_line, total_files_read, input_file;
extern int32 malloced_bytes;
extern char Code_Name[];
extern FILE *Temp1_fp, *Temp2_fp;
extern int  debug_pass;
extern int  total_sl_count;
extern int  include_path_set;
extern char include_path[];

extern void *my_malloc(int32 size, char *whatfor);
extern void *my_calloc(int32 size, int32 howmany, char *whatfor);
extern void my_free(void *pointer, char *whatitwas);
extern void fatalerror(char *s);
extern void memoryerror(char *s, int32 size);
extern void open_temporary_files(void);
extern void check_temp_files(void);
extern void remove_temp_files(void);
extern void open_debug_file(void);
extern void write_debug_byte(int i);
extern void keep_chars_read(void);
extern void write_chars_read(void);
extern void make_debug_linenum(void);
extern void keep_debug_linenum(void);
extern void write_debug_linenum(void);
extern void write_kept_linenum(void);
extern void keep_routine_linenum(void);
extern void write_routine_linenum(void);
extern void keep_re_linenum(void);
extern void write_re_linenum(void);
extern void write_debug_address(int32 i);
extern void write_present_linenum(void);
extern void write_dbgl(dbgl x);
extern void write_debug_string(char *s);
extern void close_debug_file(void);
extern void print_error_line(void);
extern int  file_end(int32 marker);
extern int  file_char(int32 marker);
extern void add_to_checksum(void *address);
extern int  current_source_line(void);
extern void load_sourcefile(char *story_name, int style);
extern void close_all_source(void);
extern void advance_line(void);
extern void output_file(void);
extern void declare_systemfile(void);
extern int  is_systemfile(void);

extern void set_memory_sizes(int size_flag);
extern void memory_command(char *command);

#ifdef ARCHIMEDES
extern char tname_pre[];
#endif

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "symbols"                                        */
/* ------------------------------------------------------------------------- */

extern int routine_starts_line, used_local_variable[];
extern zip *local_varname[];

#ifndef ALLOCATE_BIG_ARRAYS
 extern int32 svals[];
#ifdef VAX
   extern char stypes[];
#else
   extern signed char stypes[];
#endif
#else
 extern int32 *svals;
#ifdef VAX
   extern char *stypes;
#else
   extern signed char *stypes;
#endif
#endif

extern void symbols_allocate_arrays(void);
extern void symbols_free_arrays(void);
extern void init_symbol_banks(void);
extern void prim_new_symbol(char *p, int32 value, int type, int bank);
extern void new_symbol(char *p, int32 value, int type);
extern int prim_find_symbol(char *q, int bank);
extern int find_symbol(char *q);
extern int local_find_symbol(char *q);
extern void new_symbol(char *p, int32 value, int type);
extern void list_symbols(void);
extern void lose_local_symbols(void);

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "inputs"                                         */
/* ------------------------------------------------------------------------- */

extern char *tokens;
extern char *forerrors_buff;
extern int  forerrors_line;
extern int  total_source_line, internal_line;
extern int32 marker_in_file;

extern void inputs_allocate_arrays(void);
extern void inputs_free_arrays(void);
extern void input_begin_pass(void);
extern void dequote_text(char *b1);
extern void word(char *b1, int32 w);
extern int word_token(int w);
extern void textword(char *b1, int w);
extern void no_such_label(char *lname);
extern void warning(char *s);
extern void warning_named(char *s1, char *s2);
extern void obsolete_warning(char *s1);
extern void error(char *s);
extern void error_named(char *s1, char *s2);
extern void stack_create(void);
extern void stack_line(char *p);
extern int  get_next_line(void);
extern void tokenise_line(void);
extern void make_s_grid(void);

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "tables"                                         */
/* ------------------------------------------------------------------------- */

extern int no_attributes, no_properties, no_globals, max_no_objects,
          no_fake_actions;
extern int dict_entries;
extern int release_number, statusline_flag;
extern int time_set;
extern int resobj_flag;
extern char time_given[];
extern int globals_size, properties_size;
extern int32 prop_defaults[];
extern int prop_longflag[];
extern int prop_additive[];
extern char *properties_table;
extern int doing_table_mode;

extern void tables_allocate_arrays(void);
extern void tables_free_arrays(void);
extern void tables_begin_pass(void);
extern int  dictionary_find(char *dword, int scope);
extern int  dictionary_add(char *dword, int x, int y, int z);
extern int  find_action(int32 addr);
extern void new_action(char *name, int code);
extern void make_global(char *b, int array_flag);
extern void assemble_table(char *b, int word_from);
extern void check_globals(void);
extern void make_object(char *b, int flag);
extern void make_class(char *b);
extern void resume_object(char *b, int j);
extern void finish_object(void);
extern void make_verb(char *b);
extern void extend_verb(char *b);
extern void list_object_tree(void);
extern void list_verb_table(void);
extern void show_dictionary(void);
extern void construct_storyfile(void);

/* ------------------------------------------------------------------------- */
/*   Extern definitions for "asm"                                            */
/* ------------------------------------------------------------------------- */

extern int  no_stubbed;
extern int  in_routine_flag;
extern int  ignoring_routine;
extern int  a_from_one;
extern int  line_done_flag;
extern int  return_flag;

extern void asm_allocate_arrays(void);
extern void asm_free_arrays(void);
extern int32 constant_value(char *b);
extern void args_begin_pass(void);
extern int  assemble_opcode(char *b, int32 offset, int internal_code);
extern void assemble_label(int32 offset, char *b);
extern void assemble_directive(char *b, int32 offset, int32 code);