header.h 100 KB

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