~ubuntu-branches/ubuntu/gutsy/inform/gutsy

« back to all changes in this revision

Viewing changes to src/header.h

  • Committer: Bazaar Package Importer
  • Author(s): Mark Baker
  • Date: 2004-03-29 23:52:44 UTC
  • Revision ID: james.westby@ubuntu.com-20040329235244-fox1z1yv7d6vojoo
Tags: upstream-6.30
ImportĀ upstreamĀ versionĀ 6.30

Show diffs side-by-side

added added

removed removed

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