Fix REPOSITION-FILE, HISTORY, locked file handle and other problems.
[pforth] / csrc / pf_guts.h
CommitLineData
bb6b2dcd 1/* @(#) pf_guts.h 98/01/28 1.4 */\r
2#ifndef _pf_guts_h\r
3#define _pf_guts_h\r
4\r
5/***************************************************************\r
6** Include file for PForth, a Forth based on 'C'\r
7**\r
8** Author: Phil Burk\r
9** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom\r
10**\r
11** The pForth software code is dedicated to the public domain,\r
12** and any third party may reproduce, distribute and modify\r
13** the pForth software code or any derivative works thereof\r
14** without any compensation or license. The pForth software\r
15** code is provided on an "as is" basis without any warranty\r
16** of any kind, including, without limitation, the implied\r
17** warranties of merchantability and fitness for a particular\r
18** purpose and their equivalents under the laws of any jurisdiction.\r
19**\r
20***************************************************************/\r
21\r
22/*\r
23** PFORTH_VERSION changes when PForth is modified and released.\r
24** See README file for version info.\r
25*/\r
90975d26 26#define PFORTH_VERSION "27"\r
bb6b2dcd 27\r
28/*\r
29** PFORTH_FILE_VERSION changes when incompatible changes are made\r
30** in the ".dic" file format.\r
31**\r
32** FV3 - 950225 - Use ABS_TO_CODEREL for CodePtr. See file "pf_save.c".\r
33** FV4 - 950309 - Added NameSize and CodeSize to pfSaveForth().\r
34** FV5 - 950316 - Added Floats and reserved words.\r
35** FV6 - 961213 - Added ID_LOCAL_PLUSSTORE, ID_COLON_P, etc.\r
36** FV7 - 971203 - Added ID_FILL, (1LOCAL@), etc., ran out of reserved, resorted.\r
37** FV8 - 980818 - Added Endian flag.\r
1cb310e6 38** FV9 - 20100503 - Added support for 64-bit CELL.\r
bb6b2dcd 39*/\r
1cb310e6 40#define PF_FILE_VERSION (9) /* Bump this whenever primitives added. */\r
41#define PF_EARLIEST_FILE_VERSION (9) /* earliest one still compatible */\r
bb6b2dcd 42\r
43/***************************************************************\r
44** Sizes and other constants\r
45***************************************************************/\r
46\r
47#define TIB_SIZE (256)\r
48\r
49#ifndef FALSE\r
50 #define FALSE (0)\r
51#endif\r
52#ifndef TRUE\r
53 #define TRUE (1)\r
54#endif\r
55\r
56#define FFALSE (0)\r
57#define FTRUE (-1)\r
58#define BLANK (' ')\r
59\r
60#define FLAG_PRECEDENCE (0x80)\r
61#define FLAG_IMMEDIATE (0x40)\r
62#define FLAG_SMUDGE (0x20)\r
63#define MASK_NAME_SIZE (0x1F)\r
64\r
65/* Debug TRACE flags */\r
66#define TRACE_INNER (0x0002)\r
67#define TRACE_COMPILE (0x0004)\r
68#define TRACE_SPECIAL (0x0008)\r
69\r
70/* Numeric types returned by NUMBER? */\r
71#define NUM_TYPE_BAD (0)\r
72#define NUM_TYPE_SINGLE (1)\r
73#define NUM_TYPE_DOUBLE (2)\r
74#define NUM_TYPE_FLOAT (3)\r
75\r
1cb310e6 76#define CREATE_BODY_OFFSET (3*sizeof(cell_t))\r
bb6b2dcd 77\r
78/***************************************************************\r
79** Primitive Token IDS\r
80** Do NOT change the order of these IDs or dictionary files will break!\r
81***************************************************************/\r
82enum cforth_primitive_ids\r
83{\r
84 ID_EXIT = 0, /* ID_EXIT must always be zero. */\r
85/* Do NOT change the order of these IDs or dictionary files will break! */\r
86 ID_1MINUS,\r
87 ID_1PLUS,\r
88 ID_2DUP,\r
89 ID_2LITERAL,\r
90 ID_2LITERAL_P,\r
91 ID_2MINUS,\r
92 ID_2OVER,\r
93 ID_2PLUS,\r
94 ID_2SWAP,\r
95 ID_2_R_FETCH,\r
96 ID_2_R_FROM,\r
97 ID_2_TO_R,\r
98 ID_ACCEPT_P,\r
99 ID_ALITERAL,\r
100 ID_ALITERAL_P,\r
101 ID_ALLOCATE,\r
102 ID_AND,\r
103 ID_ARSHIFT,\r
104 ID_BAIL,\r
105 ID_BODY_OFFSET,\r
106 ID_BRANCH,\r
107 ID_BYE,\r
108 ID_CALL_C,\r
109 ID_CFETCH,\r
110 ID_CMOVE,\r
111 ID_CMOVE_UP,\r
112 ID_COLON,\r
113 ID_COLON_P,\r
114 ID_COMPARE,\r
115 ID_COMP_EQUAL,\r
116 ID_COMP_GREATERTHAN,\r
117 ID_COMP_LESSTHAN,\r
118 ID_COMP_NOT_EQUAL,\r
119 ID_COMP_U_GREATERTHAN,\r
120 ID_COMP_U_LESSTHAN,\r
121 ID_COMP_ZERO_EQUAL,\r
122 ID_COMP_ZERO_GREATERTHAN,\r
123 ID_COMP_ZERO_LESSTHAN,\r
124 ID_COMP_ZERO_NOT_EQUAL,\r
125 ID_CR,\r
126 ID_CREATE,\r
127 ID_CREATE_P,\r
128 ID_CSTORE,\r
129 ID_DEFER,\r
130 ID_DEFER_P,\r
131 ID_DEPTH,\r
132 ID_DIVIDE,\r
133 ID_DOT,\r
134 ID_DOTS,\r
135 ID_DO_P,\r
136 ID_DROP,\r
137 ID_DUMP,\r
138 ID_DUP,\r
139 ID_D_MINUS,\r
140 ID_D_MTIMES,\r
141 ID_D_MUSMOD,\r
142 ID_D_PLUS,\r
143 ID_D_UMSMOD,\r
144 ID_D_UMTIMES,\r
145 ID_EMIT,\r
146 ID_EMIT_P,\r
147 ID_EOL,\r
148 ID_ERRORQ_P,\r
149 ID_EXECUTE,\r
150 ID_FETCH,\r
151 ID_FILE_CLOSE,\r
152 ID_FILE_CREATE,\r
153 ID_FILE_OPEN,\r
154 ID_FILE_POSITION,\r
155 ID_FILE_READ,\r
156 ID_FILE_REPOSITION,\r
157 ID_FILE_RO,\r
158 ID_FILE_RW,\r
159 ID_FILE_SIZE,\r
160 ID_FILE_WRITE,\r
161 ID_FILL,\r
162 ID_FIND,\r
163 ID_FINDNFA,\r
164 ID_FLUSHEMIT,\r
165 ID_FREE,\r
166 ID_HERE,\r
167 ID_NUMBERQ_P,\r
168 ID_I,\r
169 ID_INCLUDE_FILE,\r
170 ID_J,\r
171 ID_KEY,\r
172 ID_LEAVE_P,\r
173 ID_LITERAL,\r
174 ID_LITERAL_P,\r
175 ID_LOADSYS,\r
176 ID_LOCAL_COMPILER,\r
177 ID_LOCAL_ENTRY,\r
178 ID_LOCAL_EXIT,\r
179 ID_LOCAL_FETCH,\r
180 ID_LOCAL_FETCH_1,\r
181 ID_LOCAL_FETCH_2,\r
182 ID_LOCAL_FETCH_3,\r
183 ID_LOCAL_FETCH_4,\r
184 ID_LOCAL_FETCH_5,\r
185 ID_LOCAL_FETCH_6,\r
186 ID_LOCAL_FETCH_7,\r
187 ID_LOCAL_FETCH_8,\r
188 ID_LOCAL_PLUSSTORE,\r
189 ID_LOCAL_STORE,\r
190 ID_LOCAL_STORE_1,\r
191 ID_LOCAL_STORE_2,\r
192 ID_LOCAL_STORE_3,\r
193 ID_LOCAL_STORE_4,\r
194 ID_LOCAL_STORE_5,\r
195 ID_LOCAL_STORE_6,\r
196 ID_LOCAL_STORE_7,\r
197 ID_LOCAL_STORE_8,\r
198 ID_LOOP_P,\r
199 ID_LSHIFT,\r
200 ID_MAX,\r
201 ID_MIN,\r
202 ID_MINUS,\r
203 ID_NAME_TO_PREVIOUS,\r
204 ID_NAME_TO_TOKEN,\r
205 ID_NOOP,\r
206 ID_NUMBERQ,\r
207 ID_OR,\r
208 ID_OVER,\r
209 ID_PICK,\r
210 ID_PLUS,\r
211 ID_PLUSLOOP_P,\r
212 ID_PLUS_STORE,\r
213 ID_QDO_P,\r
214 ID_QDUP,\r
215 ID_QTERMINAL,\r
216 ID_QUIT_P,\r
217 ID_REFILL,\r
218 ID_RESIZE,\r
219 ID_RESTORE_INPUT,\r
220 ID_ROLL,\r
221 ID_ROT,\r
222 ID_RP_FETCH,\r
223 ID_RP_STORE,\r
224 ID_RSHIFT,\r
225 ID_R_DROP,\r
226 ID_R_FETCH,\r
227 ID_R_FROM,\r
228 ID_SAVE_FORTH_P,\r
229 ID_SAVE_INPUT,\r
230 ID_SCAN,\r
231 ID_SEMICOLON,\r
232 ID_SKIP,\r
233 ID_SOURCE,\r
234 ID_SOURCE_ID,\r
235 ID_SOURCE_ID_POP,\r
236 ID_SOURCE_ID_PUSH,\r
237 ID_SOURCE_SET,\r
238 ID_SP_FETCH,\r
239 ID_SP_STORE,\r
240 ID_STORE,\r
241 ID_SWAP,\r
242 ID_TEST1,\r
243 ID_TEST2,\r
244 ID_TEST3,\r
245 ID_TICK,\r
246 ID_TIMES,\r
247 ID_TO_R,\r
248 ID_TYPE,\r
249 ID_TYPE_P,\r
250 ID_VAR_BASE,\r
251 ID_VAR_CODE_BASE,\r
252 ID_VAR_CODE_LIMIT,\r
253 ID_VAR_CONTEXT,\r
254 ID_VAR_DP,\r
255 ID_VAR_ECHO,\r
256 ID_VAR_HEADERS_BASE,\r
257 ID_VAR_HEADERS_LIMIT,\r
258 ID_VAR_HEADERS_PTR,\r
259 ID_VAR_NUM_TIB,\r
260 ID_VAR_OUT,\r
261 ID_VAR_RETURN_CODE,\r
262 ID_VAR_SOURCE_ID,\r
263 ID_VAR_STATE,\r
264 ID_VAR_TO_IN,\r
265 ID_VAR_TRACE_FLAGS,\r
266 ID_VAR_TRACE_LEVEL,\r
267 ID_VAR_TRACE_STACK,\r
268 ID_VLIST,\r
269 ID_WORD,\r
270 ID_WORD_FETCH,\r
271 ID_WORD_STORE,\r
272 ID_XOR,\r
273 ID_ZERO_BRANCH,\r
274 ID_CATCH,\r
275 ID_THROW,\r
276 ID_INTERPRET,\r
277 ID_FILE_WO,\r
278 ID_FILE_BIN,\r
1cb310e6 279 /* Added to support 64 bit operation. */\r
280 ID_CELL,\r
281 ID_CELLS,\r
81dfa5e0 282 /* DELETE-FILE */\r
283 ID_FILE_DELETE,\r
bb6b2dcd 284/* If you add a word here, take away one reserved word below. */\r
285#ifdef PF_SUPPORT_FP\r
286/* Only reserve space if we are adding FP so that we can detect\r
287** unsupported primitives when loading dictionary.\r
288*/\r
289 ID_RESERVED01,\r
290 ID_RESERVED02,\r
291 ID_RESERVED03,\r
292 ID_RESERVED04,\r
293 ID_RESERVED05,\r
294 ID_RESERVED06,\r
295 ID_RESERVED07,\r
296 ID_RESERVED08,\r
297 ID_RESERVED09,\r
298 ID_RESERVED10,\r
299 ID_RESERVED11,\r
300 ID_RESERVED12,\r
301 ID_RESERVED13,\r
bb6b2dcd 302 ID_FP_D_TO_F,\r
303 ID_FP_FSTORE,\r
304 ID_FP_FTIMES,\r
305 ID_FP_FPLUS,\r
306 ID_FP_FMINUS,\r
307 ID_FP_FSLASH,\r
308 ID_FP_F_ZERO_LESS_THAN,\r
309 ID_FP_F_ZERO_EQUALS,\r
310 ID_FP_F_LESS_THAN,\r
311 ID_FP_F_TO_D,\r
312 ID_FP_FFETCH,\r
313 ID_FP_FDEPTH,\r
314 ID_FP_FDROP,\r
315 ID_FP_FDUP,\r
316 ID_FP_FLITERAL,\r
317 ID_FP_FLITERAL_P,\r
318 ID_FP_FLOAT_PLUS,\r
319 ID_FP_FLOATS,\r
320 ID_FP_FLOOR,\r
321 ID_FP_FMAX,\r
322 ID_FP_FMIN,\r
323 ID_FP_FNEGATE,\r
324 ID_FP_FOVER,\r
325 ID_FP_FROT,\r
326 ID_FP_FROUND,\r
327 ID_FP_FSWAP,\r
328 ID_FP_FSTAR_STAR,\r
329 ID_FP_FABS,\r
330 ID_FP_FACOS,\r
331 ID_FP_FACOSH,\r
332 ID_FP_FALOG,\r
333 ID_FP_FASIN,\r
334 ID_FP_FASINH,\r
335 ID_FP_FATAN,\r
336 ID_FP_FATAN2,\r
337 ID_FP_FATANH,\r
338 ID_FP_FCOS,\r
339 ID_FP_FCOSH,\r
340 ID_FP_FLN,\r
341 ID_FP_FLNP1,\r
342 ID_FP_FLOG,\r
343 ID_FP_FSIN,\r
344 ID_FP_FSINCOS,\r
345 ID_FP_FSINH,\r
346 ID_FP_FSQRT,\r
347 ID_FP_FTAN,\r
348 ID_FP_FTANH,\r
349 ID_FP_FPICK,\r
350#endif\r
351/* Add new IDs by replacing reserved IDs or extending FP routines. */\r
352/* Do NOT change the order of these IDs or dictionary files will break! */\r
353 NUM_PRIMITIVES /* This must always be LAST */\r
354};\r
355\r
356\r
357\r
358/***************************************************************\r
359** THROW Codes\r
360***************************************************************/\r
361/* ANSI standard definitions needed by pForth */\r
362#define THROW_ABORT (-1)\r
363#define THROW_ABORT_QUOTE (-2)\r
364#define THROW_STACK_OVERFLOW (-3)\r
365#define THROW_STACK_UNDERFLOW (-4)\r
366#define THROW_UNDEFINED_WORD (-13)\r
367#define THROW_EXECUTING (-14)\r
368#define THROW_PAIRS (-22)\r
369#define THROW_FLOAT_STACK_UNDERFLOW ( -45)\r
370#define THROW_QUIT (-56)\r
371\r
372/* THROW codes unique to pForth */\r
373#define THROW_BYE (-256) /* Exit program. */\r
374#define THROW_SEMICOLON (-257) /* Error detected at ; */\r
375#define THROW_DEFERRED (-258) /* Not a deferred word. Used in system.fth */\r
376\r
377/***************************************************************\r
378** Structures\r
379***************************************************************/\r
380\r
381typedef struct pfTaskData_s\r
382{\r
1cb310e6 383 cell_t *td_StackPtr; /* Primary data stack */\r
384 cell_t *td_StackBase;\r
385 cell_t *td_StackLimit;\r
386 cell_t *td_ReturnPtr; /* Return stack */\r
387 cell_t *td_ReturnBase;\r
388 cell_t *td_ReturnLimit;\r
bb6b2dcd 389#ifdef PF_SUPPORT_FP\r
390 PF_FLOAT *td_FloatStackPtr;\r
391 PF_FLOAT *td_FloatStackBase;\r
392 PF_FLOAT *td_FloatStackLimit;\r
393#endif\r
1cb310e6 394 cell_t *td_InsPtr; /* Instruction pointer, "PC" */\r
bb6b2dcd 395 FileStream *td_InputStream;\r
396/* Terminal. */\r
397 char td_TIB[TIB_SIZE]; /* Buffer for terminal input. */\r
1cb310e6 398 cell_t td_IN; /* Index into Source */\r
399 cell_t td_SourceNum; /* #TIB after REFILL */\r
bb6b2dcd 400 char *td_SourcePtr; /* Pointer to TIB or other source. */\r
1cb310e6 401 cell_t td_LineNumber; /* Incremented on every refill. */\r
402 cell_t td_OUT; /* Current output column. */\r
bb6b2dcd 403} pfTaskData_t;\r
404\r
405typedef struct pfNode\r
406{\r
407 struct pfNode *n_Next;\r
408 struct pfNode *n_Prev;\r
409} pfNode;\r
410\r
411/* Structure of header entry in dictionary. These will be stored in dictionary specific endian format*/\r
412typedef struct cfNameLinks\r
413{\r
1cb310e6 414 cell_t cfnl_PreviousName; /* name relative address of previous */\r
bb6b2dcd 415 ExecToken cfnl_ExecToken; /* Execution token for word. */\r
416/* Followed by variable length name field. */\r
417} cfNameLinks;\r
418\r
419#define PF_DICF_ALLOCATED_SEGMENTS ( 0x0001)\r
420typedef struct pfDictionary_s\r
421{\r
422 pfNode dic_Node;\r
1cb310e6 423 ucell_t dic_Flags;\r
bb6b2dcd 424/* Headers contain pointers to names and dictionary. */\r
425\r
b3ad2602 426 ucell_t dic_HeaderBaseUnaligned;\r
bb6b2dcd 427\r
b3ad2602 428 ucell_t dic_HeaderBase;\r
429 ucell_t dic_HeaderPtr;\r
430 ucell_t dic_HeaderLimit;\r
bb6b2dcd 431/* Code segment contains tokenized code and data. */\r
432\r
b3ad2602 433 ucell_t dic_CodeBaseUnaligned;\r
bb6b2dcd 434\r
b3ad2602 435 ucell_t dic_CodeBase;\r
bb6b2dcd 436 union\r
437 {\r
1cb310e6 438 cell_t *Cell;\r
439 uint8_t *Byte;\r
bb6b2dcd 440 } dic_CodePtr;\r
b3ad2602 441 ucell_t dic_CodeLimit;\r
bb6b2dcd 442} pfDictionary_t;\r
443\r
444/* Save state of include when nesting files. */\r
445typedef struct IncludeFrame\r
446{\r
447 FileStream *inf_FileID;\r
1cb310e6 448 cell_t inf_LineNumber;\r
449 cell_t inf_SourceNum;\r
450 cell_t inf_IN;\r
bb6b2dcd 451 char inf_SaveTIB[TIB_SIZE];\r
452} IncludeFrame;\r
453\r
454#define MAX_INCLUDE_DEPTH (16)\r
455\r
456/***************************************************************\r
457** Prototypes\r
458***************************************************************/\r
459\r
460#ifdef __cplusplus\r
461extern "C" {\r
462#endif\r
463\r
464int pfCatch( ExecToken XT );\r
465\r
466#ifdef __cplusplus\r
467}\r
468#endif\r
469\r
470/***************************************************************\r
471** External Globals\r
472***************************************************************/\r
473extern pfTaskData_t *gCurrentTask;\r
474extern pfDictionary_t *gCurrentDictionary;\r
475extern char gScratch[TIB_SIZE];\r
1cb310e6 476extern cell_t gNumPrimitives;\r
bb6b2dcd 477\r
478extern ExecToken gLocalCompiler_XT; /* CFA of (LOCAL) compiler. */\r
479extern ExecToken gNumberQ_XT; /* XT of NUMBER? */\r
480extern ExecToken gQuitP_XT; /* XT of (QUIT) */\r
481extern ExecToken gAcceptP_XT; /* XT of ACCEPT */\r
482\r
483#define DEPTH_AT_COLON_INVALID (-100)\r
1cb310e6 484extern cell_t gDepthAtColon;\r
bb6b2dcd 485\r
486/* Global variables. */\r
b3ad2602 487extern cell_t gVarContext; /* Points to last name field. */\r
1cb310e6 488extern cell_t gVarState; /* 1 if compiling. */\r
489extern cell_t gVarBase; /* Numeric Base. */\r
490extern cell_t gVarEcho; /* Echo input from file. */\r
491extern cell_t gVarEchoAccept; /* Echo input from ACCEPT. */\r
492extern cell_t gVarTraceLevel;\r
493extern cell_t gVarTraceStack;\r
494extern cell_t gVarTraceFlags;\r
495extern cell_t gVarQuiet; /* Suppress unnecessary messages, OK, etc. */\r
496extern cell_t gVarReturnCode; /* Returned to caller of Forth, eg. UNIX shell. */\r
bb6b2dcd 497\r
498extern IncludeFrame gIncludeStack[MAX_INCLUDE_DEPTH];\r
1cb310e6 499extern cell_t gIncludeIndex;\r
bb6b2dcd 500/***************************************************************\r
501** Macros\r
502***************************************************************/\r
503\r
504\r
505/* Endian specific macros for creating target dictionaries for machines with\r
506\r
507** different endian-ness.\r
508\r
509*/\r
510\r
511#if defined(PF_BIG_ENDIAN_DIC)\r
512\r
513#define WRITE_FLOAT_DIC WriteFloatBigEndian\r
1cb310e6 514#define WRITE_CELL_DIC(addr,data) WriteCellBigEndian((uint8_t *)(addr),(ucell_t)(data))\r
515#define WRITE_SHORT_DIC(addr,data) Write16BigEndian((uint8_t *)(addr),(uint16_t)(data))\r
bb6b2dcd 516#define READ_FLOAT_DIC ReadFloatBigEndian\r
1cb310e6 517#define READ_CELL_DIC(addr) ReadCellBigEndian((const uint8_t *)(addr))\r
518#define READ_SHORT_DIC(addr) Read16BigEndian((const uint8_t *)(addr))\r
bb6b2dcd 519\r
520#elif defined(PF_LITTLE_ENDIAN_DIC)\r
521\r
522#define WRITE_FLOAT_DIC WriteFloatLittleEndian\r
1cb310e6 523#define WRITE_CELL_DIC(addr,data) WriteCellLittleEndian((uint8_t *)(addr),(ucell_t)(data))\r
524#define WRITE_SHORT_DIC(addr,data) Write16LittleEndian((uint8_t *)(addr),(uint16_t)(data))\r
bb6b2dcd 525#define READ_FLOAT_DIC ReadFloatLittleEndian\r
1cb310e6 526#define READ_CELL_DIC(addr) ReadCellLittleEndian((const uint8_t *)(addr))\r
527#define READ_SHORT_DIC(addr) Read16LittleEndian((const uint8_t *)(addr))\r
bb6b2dcd 528\r
529#else\r
530\r
531#define WRITE_FLOAT_DIC(addr,data) { *((PF_FLOAT *)(addr)) = (PF_FLOAT)(data); }\r
1cb310e6 532#define WRITE_CELL_DIC(addr,data) { *((cell_t *)(addr)) = (cell_t)(data); }\r
533#define WRITE_SHORT_DIC(addr,data) { *((int16_t *)(addr)) = (int16_t)(data); }\r
bb6b2dcd 534#define READ_FLOAT_DIC(addr) ( *((PF_FLOAT *)(addr)) )\r
1cb310e6 535#define READ_CELL_DIC(addr) ( *((const ucell_t *)(addr)) )\r
536#define READ_SHORT_DIC(addr) ( *((const uint16_t *)(addr)) )\r
bb6b2dcd 537\r
538#endif\r
539\r
540\r
541#define HEADER_HERE (gCurrentDictionary->dic_HeaderPtr.Cell)\r
542#define CODE_HERE (gCurrentDictionary->dic_CodePtr.Cell)\r
1cb310e6 543#define CODE_COMMA( N ) WRITE_CELL_DIC(CODE_HERE++,(N))\r
bb6b2dcd 544#define NAME_BASE (gCurrentDictionary->dic_HeaderBase)\r
545#define CODE_BASE (gCurrentDictionary->dic_CodeBase)\r
546#define NAME_SIZE (gCurrentDictionary->dic_HeaderLimit - gCurrentDictionary->dic_HeaderBase)\r
547#define CODE_SIZE (gCurrentDictionary->dic_CodeLimit - gCurrentDictionary->dic_CodeBase)\r
548\r
1cb310e6 549#define IN_CODE_DIC(addr) ( ( ((uint8_t *)(addr)) >= gCurrentDictionary->dic_CodeBase) && ( ((uint8_t *)(addr)) < gCurrentDictionary->dic_CodeLimit) )\r
bb6b2dcd 550\r
1cb310e6 551#define IN_NAME_DIC(addr) ( ( ((uint8_t *)(addr)) >= gCurrentDictionary->dic_HeaderBase) && ( ((uint8_t *)(addr)) < gCurrentDictionary->dic_HeaderLimit) )\r
bb6b2dcd 552#define IN_DICS(addr) (IN_CODE_DIC(addr) || IN_NAME_DIC(addr))\r
553\r
554/* Address conversion */\r
1cb310e6 555#define ABS_TO_NAMEREL( a ) ((cell_t) (((uint8_t *) a) - NAME_BASE ))\r
556#define ABS_TO_CODEREL( a ) ((cell_t) (((uint8_t *) a) - CODE_BASE ))\r
557#define NAMEREL_TO_ABS( a ) ((char *) (((cell_t) a) + NAME_BASE))\r
558#define CODEREL_TO_ABS( a ) ((cell_t *) (((cell_t) a) + CODE_BASE))\r
bb6b2dcd 559\r
560/* The check for >0 is only needed for CLONE testing. !!! */\r
561#define IsTokenPrimitive(xt) ((xt<gNumPrimitives) && (xt>=0))\r
562\r
563#define FREE_VAR(v) { if (v) { pfFreeMem(v); v = NULL; } }\r
564\r
565#define DATA_STACK_DEPTH (gCurrentTask->td_StackBase - gCurrentTask->td_StackPtr)\r
566#define DROP_DATA_STACK (gCurrentTask->td_StackPtr++)\r
567#define POP_DATA_STACK (*gCurrentTask->td_StackPtr++)\r
1cb310e6 568#define PUSH_DATA_STACK(x) {*(--(gCurrentTask->td_StackPtr)) = (cell_t) x; }\r
bb6b2dcd 569\r
570/* Force Quad alignment. */\r
571#define QUADUP(x) (((x)+3)&~3)\r
572\r
573#define MIN(a,b) ( ((a)<(b)) ? (a) : (b) )\r
574#define MAX(a,b) ( ((a)>(b)) ? (a) : (b) )\r
575\r
576\r
577#ifndef TOUCH\r
578 #define TOUCH(argument) ((void)argument)\r
579#endif\r
580\r
581/***************************************************************\r
582** I/O related macros\r
583***************************************************************/\r
584\r
585#define EMIT(c) ioEmit(c)\r
586#define EMIT_CR EMIT('\n');\r
587\r
588#define MSG(cs) pfMessage(cs)\r
589#define ERR(x) MSG(x)\r
590\r
591#define DBUG(x) /* PRT(x) */\r
592#define DBUGX(x) /* DBUG(x) */\r
593\r
1cb310e6 594#define MSG_NUM_D(msg,num) { MSG(msg); ffDot((cell_t) num); EMIT_CR; }\r
595#define MSG_NUM_H(msg,num) { MSG(msg); ffDotHex((cell_t) num); EMIT_CR; }\r
bb6b2dcd 596\r
1cb310e6 597#define DBUG_NUM_D(msg,num) { pfDebugMessage(msg); pfDebugPrintDecimalNumber((cell_t) num); pfDebugMessage("\n"); }\r
bb6b2dcd 598\r
599#endif /* _pf_guts_h */\r