xref: /freebsd/stand/ficl/i386/sysdep.h (revision 2a63c3be)
1ca987d46SWarner Losh /*******************************************************************
2ca987d46SWarner Losh                     s y s d e p . h
3ca987d46SWarner Losh ** Forth Inspired Command Language
4ca987d46SWarner Losh ** Author: John Sadler (john_sadler@alum.mit.edu)
5ca987d46SWarner Losh ** Created: 16 Oct 1997
6ca987d46SWarner Losh ** Ficl system dependent types and prototypes...
7ca987d46SWarner Losh **
8ca987d46SWarner Losh ** Note: Ficl also depends on the use of "assert" when
9ca987d46SWarner Losh ** FICL_ROBUST is enabled. This may require some consideration
10ca987d46SWarner Losh ** in firmware systems since assert often
11ca987d46SWarner Losh ** assumes stderr/stdout.
12ca987d46SWarner Losh ** $Id: sysdep.h,v 1.11 2001/12/05 07:21:34 jsadler Exp $
13ca987d46SWarner Losh *******************************************************************/
14ca987d46SWarner Losh /*
15ca987d46SWarner Losh ** Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu)
16ca987d46SWarner Losh ** All rights reserved.
17ca987d46SWarner Losh **
18ca987d46SWarner Losh ** Get the latest Ficl release at http://ficl.sourceforge.net
19ca987d46SWarner Losh **
20ca987d46SWarner Losh ** I am interested in hearing from anyone who uses ficl. If you have
21ca987d46SWarner Losh ** a problem, a success story, a defect, an enhancement request, or
22ca987d46SWarner Losh ** if you would like to contribute to the ficl release, please
23ca987d46SWarner Losh ** contact me by email at the address above.
24ca987d46SWarner Losh **
25ca987d46SWarner Losh ** L I C E N S E  and  D I S C L A I M E R
26ca987d46SWarner Losh **
27ca987d46SWarner Losh ** Redistribution and use in source and binary forms, with or without
28ca987d46SWarner Losh ** modification, are permitted provided that the following conditions
29ca987d46SWarner Losh ** are met:
30ca987d46SWarner Losh ** 1. Redistributions of source code must retain the above copyright
31ca987d46SWarner Losh **    notice, this list of conditions and the following disclaimer.
32ca987d46SWarner Losh ** 2. Redistributions in binary form must reproduce the above copyright
33ca987d46SWarner Losh **    notice, this list of conditions and the following disclaimer in the
34ca987d46SWarner Losh **    documentation and/or other materials provided with the distribution.
35ca987d46SWarner Losh **
36ca987d46SWarner Losh ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
37ca987d46SWarner Losh ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38ca987d46SWarner Losh ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39ca987d46SWarner Losh ** ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
40ca987d46SWarner Losh ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41ca987d46SWarner Losh ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
42ca987d46SWarner Losh ** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43ca987d46SWarner Losh ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
44ca987d46SWarner Losh ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
45ca987d46SWarner Losh ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46ca987d46SWarner Losh ** SUCH DAMAGE.
47ca987d46SWarner Losh */
48ca987d46SWarner Losh 
49ca987d46SWarner Losh 
50ca987d46SWarner Losh #if !defined (__SYSDEP_H__)
51ca987d46SWarner Losh #define __SYSDEP_H__
52ca987d46SWarner Losh 
53ca987d46SWarner Losh #include <sys/types.h>
54ca987d46SWarner Losh 
55ca987d46SWarner Losh #include <stddef.h> /* size_t, NULL */
56ca987d46SWarner Losh #include <setjmp.h>
57ca987d46SWarner Losh #include <assert.h>
58ca987d46SWarner Losh 
59ca987d46SWarner Losh #if !defined IGNORE		/* Macro to silence unused param warnings */
60ca987d46SWarner Losh #define IGNORE(x) (void)x
61ca987d46SWarner Losh #endif
62ca987d46SWarner Losh 
63ca987d46SWarner Losh /*
64ca987d46SWarner Losh ** TRUE and FALSE for C boolean operations, and
65ca987d46SWarner Losh ** portable 32 bit types for CELLs
66ca987d46SWarner Losh **
67ca987d46SWarner Losh */
68ca987d46SWarner Losh #if !defined TRUE
69ca987d46SWarner Losh #define TRUE 1
70ca987d46SWarner Losh #endif
71ca987d46SWarner Losh #if !defined FALSE
72ca987d46SWarner Losh #define FALSE 0
73ca987d46SWarner Losh #endif
74ca987d46SWarner Losh 
75ca987d46SWarner Losh /*
76ca987d46SWarner Losh ** System dependent data type declarations...
77ca987d46SWarner Losh */
78ca987d46SWarner Losh #if !defined INT32
79ca987d46SWarner Losh #define INT32 long
80ca987d46SWarner Losh #endif
81ca987d46SWarner Losh 
82ca987d46SWarner Losh #if !defined UNS32
83ca987d46SWarner Losh #define UNS32 unsigned long
84ca987d46SWarner Losh #endif
85ca987d46SWarner Losh 
86ca987d46SWarner Losh #if !defined UNS16
87ca987d46SWarner Losh #define UNS16 unsigned short
88ca987d46SWarner Losh #endif
89ca987d46SWarner Losh 
90ca987d46SWarner Losh #if !defined UNS8
91ca987d46SWarner Losh #define UNS8 unsigned char
92ca987d46SWarner Losh #endif
93ca987d46SWarner Losh 
94ca987d46SWarner Losh #if !defined NULL
95ca987d46SWarner Losh #define NULL ((void *)0)
96ca987d46SWarner Losh #endif
97ca987d46SWarner Losh 
98ca987d46SWarner Losh /*
99ca987d46SWarner Losh ** FICL_UNS and FICL_INT must have the same size as a void* on
100ca987d46SWarner Losh ** the target system. A CELL is a union of void*, FICL_UNS, and
101ca987d46SWarner Losh ** FICL_INT.
102ca987d46SWarner Losh ** (11/2000: same for FICL_FLOAT)
103ca987d46SWarner Losh */
104ca987d46SWarner Losh #if !defined FICL_INT
105ca987d46SWarner Losh #define FICL_INT INT32
106ca987d46SWarner Losh #endif
107ca987d46SWarner Losh 
108ca987d46SWarner Losh #if !defined FICL_UNS
109ca987d46SWarner Losh #define FICL_UNS UNS32
110ca987d46SWarner Losh #endif
111ca987d46SWarner Losh 
112ca987d46SWarner Losh #if !defined FICL_FLOAT
113ca987d46SWarner Losh #define FICL_FLOAT float
114ca987d46SWarner Losh #endif
115ca987d46SWarner Losh 
116ca987d46SWarner Losh /*
117ca987d46SWarner Losh ** Ficl presently supports values of 32 and 64 for BITS_PER_CELL
118ca987d46SWarner Losh */
119ca987d46SWarner Losh #if !defined BITS_PER_CELL
120ca987d46SWarner Losh #define BITS_PER_CELL 32
121ca987d46SWarner Losh #endif
122ca987d46SWarner Losh 
123ca987d46SWarner Losh #if ((BITS_PER_CELL != 32) && (BITS_PER_CELL != 64))
124ca987d46SWarner Losh     Error!
125ca987d46SWarner Losh #endif
126ca987d46SWarner Losh 
127ca987d46SWarner Losh typedef struct
128ca987d46SWarner Losh {
129ca987d46SWarner Losh     FICL_UNS hi;
130ca987d46SWarner Losh     FICL_UNS lo;
131ca987d46SWarner Losh } DPUNS;
132ca987d46SWarner Losh 
133ca987d46SWarner Losh typedef struct
134ca987d46SWarner Losh {
135ca987d46SWarner Losh     FICL_UNS quot;
136ca987d46SWarner Losh     FICL_UNS rem;
137ca987d46SWarner Losh } UNSQR;
138ca987d46SWarner Losh 
139ca987d46SWarner Losh typedef struct
140ca987d46SWarner Losh {
141ca987d46SWarner Losh     FICL_INT hi;
142ca987d46SWarner Losh     FICL_INT lo;
143ca987d46SWarner Losh } DPINT;
144ca987d46SWarner Losh 
145ca987d46SWarner Losh typedef struct
146ca987d46SWarner Losh {
147ca987d46SWarner Losh     FICL_INT quot;
148ca987d46SWarner Losh     FICL_INT rem;
149ca987d46SWarner Losh } INTQR;
150ca987d46SWarner Losh 
151ca987d46SWarner Losh 
152ca987d46SWarner Losh /*
153ca987d46SWarner Losh ** B U I L D   C O N T R O L S
154ca987d46SWarner Losh */
155ca987d46SWarner Losh 
156ca987d46SWarner Losh #if !defined (FICL_MINIMAL)
157ca987d46SWarner Losh #define FICL_MINIMAL 0
158ca987d46SWarner Losh #endif
159ca987d46SWarner Losh #if (FICL_MINIMAL)
160ca987d46SWarner Losh #define FICL_WANT_SOFTWORDS  0
161ca987d46SWarner Losh #define FICL_WANT_FILE       0
162ca987d46SWarner Losh #define FICL_WANT_FLOAT      0
163ca987d46SWarner Losh #define FICL_WANT_USER       0
164ca987d46SWarner Losh #define FICL_WANT_LOCALS     0
165ca987d46SWarner Losh #define FICL_WANT_DEBUGGER   0
166ca987d46SWarner Losh #define FICL_WANT_OOP        0
167ca987d46SWarner Losh #define FICL_PLATFORM_EXTEND 0
168ca987d46SWarner Losh #define FICL_MULTITHREAD     0
169ca987d46SWarner Losh #define FICL_ROBUST          0
170ca987d46SWarner Losh #define FICL_EXTENDED_PREFIX 0
171ca987d46SWarner Losh #endif
172ca987d46SWarner Losh 
173ca987d46SWarner Losh /*
174ca987d46SWarner Losh ** FICL_PLATFORM_EXTEND
175ca987d46SWarner Losh ** Includes words defined in ficlCompilePlatform
176ca987d46SWarner Losh */
177ca987d46SWarner Losh #if !defined (FICL_PLATFORM_EXTEND)
178ca987d46SWarner Losh #define FICL_PLATFORM_EXTEND 1
179ca987d46SWarner Losh #endif
180ca987d46SWarner Losh 
181ca987d46SWarner Losh 
182ca987d46SWarner Losh /*
183ca987d46SWarner Losh ** FICL_WANT_FILE
184ca987d46SWarner Losh ** Includes the FILE and FILE-EXT wordset and associated code. Turn this off if you do not
185ca987d46SWarner Losh ** have a filesystem!
186ca987d46SWarner Losh ** Contributed by Larry Hastings
187ca987d46SWarner Losh */
188ca987d46SWarner Losh #if !defined (FICL_WANT_FILE)
189ca987d46SWarner Losh #define FICL_WANT_FILE 0
190ca987d46SWarner Losh #endif
191ca987d46SWarner Losh 
192ca987d46SWarner Losh /*
193ca987d46SWarner Losh ** FICL_WANT_FLOAT
194ca987d46SWarner Losh ** Includes a floating point stack for the VM, and words to do float operations.
195ca987d46SWarner Losh ** Contributed by Guy Carver
196ca987d46SWarner Losh */
197ca987d46SWarner Losh #if !defined (FICL_WANT_FLOAT)
198ca987d46SWarner Losh #define FICL_WANT_FLOAT 0
199ca987d46SWarner Losh #endif
200ca987d46SWarner Losh 
201ca987d46SWarner Losh /*
202ca987d46SWarner Losh ** FICL_WANT_DEBUGGER
203ca987d46SWarner Losh ** Inludes a simple source level debugger
204ca987d46SWarner Losh */
205ca987d46SWarner Losh #if !defined (FICL_WANT_DEBUGGER)
206ca987d46SWarner Losh #define FICL_WANT_DEBUGGER 1
207ca987d46SWarner Losh #endif
208ca987d46SWarner Losh 
209ca987d46SWarner Losh /*
210ca987d46SWarner Losh ** FICL_EXTENDED_PREFIX enables a bunch of extra prefixes in prefix.c and prefix.fr (if
211ca987d46SWarner Losh ** included as part of softcore.c)
212ca987d46SWarner Losh */
213ca987d46SWarner Losh #if !defined FICL_EXTENDED_PREFIX
214ca987d46SWarner Losh #define FICL_EXTENDED_PREFIX 0
215ca987d46SWarner Losh #endif
216ca987d46SWarner Losh 
217ca987d46SWarner Losh /*
218ca987d46SWarner Losh ** User variables: per-instance variables bound to the VM.
219ca987d46SWarner Losh ** Kinda like thread-local storage. Could be implemented in a
220ca987d46SWarner Losh ** VM private dictionary, but I've chosen the lower overhead
221ca987d46SWarner Losh ** approach of an array of CELLs instead.
222ca987d46SWarner Losh */
223ca987d46SWarner Losh #if !defined FICL_WANT_USER
224ca987d46SWarner Losh #define FICL_WANT_USER 1
225ca987d46SWarner Losh #endif
226ca987d46SWarner Losh 
227ca987d46SWarner Losh #if !defined FICL_USER_CELLS
228ca987d46SWarner Losh #define FICL_USER_CELLS 16
229ca987d46SWarner Losh #endif
230ca987d46SWarner Losh 
231ca987d46SWarner Losh /*
232ca987d46SWarner Losh ** FICL_WANT_LOCALS controls the creation of the LOCALS wordset and
233ca987d46SWarner Losh ** a private dictionary for local variable compilation.
234ca987d46SWarner Losh */
235ca987d46SWarner Losh #if !defined FICL_WANT_LOCALS
236ca987d46SWarner Losh #define FICL_WANT_LOCALS 1
237ca987d46SWarner Losh #endif
238ca987d46SWarner Losh 
239ca987d46SWarner Losh /* Max number of local variables per definition */
240ca987d46SWarner Losh #if !defined FICL_MAX_LOCALS
241ca987d46SWarner Losh #define FICL_MAX_LOCALS 16
242ca987d46SWarner Losh #endif
243ca987d46SWarner Losh 
244ca987d46SWarner Losh /*
245ca987d46SWarner Losh ** FICL_WANT_OOP
246ca987d46SWarner Losh ** Inludes object oriented programming support (in softwords)
247ca987d46SWarner Losh ** OOP support requires locals and user variables!
248ca987d46SWarner Losh */
249ca987d46SWarner Losh #if !(FICL_WANT_LOCALS) || !(FICL_WANT_USER)
250ca987d46SWarner Losh #if !defined (FICL_WANT_OOP)
251ca987d46SWarner Losh #define FICL_WANT_OOP 0
252ca987d46SWarner Losh #endif
253ca987d46SWarner Losh #endif
254ca987d46SWarner Losh 
255ca987d46SWarner Losh #if !defined (FICL_WANT_OOP)
256ca987d46SWarner Losh #define FICL_WANT_OOP 1
257ca987d46SWarner Losh #endif
258ca987d46SWarner Losh 
259ca987d46SWarner Losh /*
260ca987d46SWarner Losh ** FICL_WANT_SOFTWORDS
261ca987d46SWarner Losh ** Controls inclusion of all softwords in softcore.c
262ca987d46SWarner Losh */
263ca987d46SWarner Losh #if !defined (FICL_WANT_SOFTWORDS)
264ca987d46SWarner Losh #define FICL_WANT_SOFTWORDS 1
265ca987d46SWarner Losh #endif
266ca987d46SWarner Losh 
267ca987d46SWarner Losh /*
268ca987d46SWarner Losh ** FICL_MULTITHREAD enables dictionary mutual exclusion
269ca987d46SWarner Losh ** wia the ficlLockDictionary system dependent function.
270ca987d46SWarner Losh ** Note: this implementation is experimental and poorly
271ca987d46SWarner Losh ** tested. Further, it's unnecessary unless you really
272ca987d46SWarner Losh ** intend to have multiple SESSIONS (poor choice of name
273ca987d46SWarner Losh ** on my part) - that is, threads that modify the dictionary
274ca987d46SWarner Losh ** at the same time.
275ca987d46SWarner Losh */
276ca987d46SWarner Losh #if !defined FICL_MULTITHREAD
277ca987d46SWarner Losh #define FICL_MULTITHREAD 0
278ca987d46SWarner Losh #endif
279ca987d46SWarner Losh 
280ca987d46SWarner Losh /*
281ca987d46SWarner Losh ** PORTABLE_LONGMULDIV causes ficlLongMul and ficlLongDiv to be
282ca987d46SWarner Losh ** defined in C in sysdep.c. Use this if you cannot easily
283ca987d46SWarner Losh ** generate an inline asm definition
284ca987d46SWarner Losh */
285ca987d46SWarner Losh #if !defined (PORTABLE_LONGMULDIV)
286ca987d46SWarner Losh #define PORTABLE_LONGMULDIV 0
287ca987d46SWarner Losh #endif
288ca987d46SWarner Losh 
289ca987d46SWarner Losh /*
290ca987d46SWarner Losh ** INLINE_INNER_LOOP causes the inner interpreter to be inline code
291ca987d46SWarner Losh ** instead of a function call. This is mainly because MS VC++ 5
292ca987d46SWarner Losh ** chokes with an internal compiler error on the function version.
293ca987d46SWarner Losh ** in release mode. Sheesh.
294ca987d46SWarner Losh */
295ca987d46SWarner Losh #if !defined INLINE_INNER_LOOP
296ca987d46SWarner Losh #if defined _DEBUG
297ca987d46SWarner Losh #define INLINE_INNER_LOOP 0
298ca987d46SWarner Losh #else
299ca987d46SWarner Losh #define INLINE_INNER_LOOP 1
300ca987d46SWarner Losh #endif
301ca987d46SWarner Losh #endif
302ca987d46SWarner Losh 
303ca987d46SWarner Losh /*
304ca987d46SWarner Losh ** FICL_ROBUST enables bounds checking of stacks and the dictionary.
305ca987d46SWarner Losh ** This will detect stack over and underflows and dictionary overflows.
306ca987d46SWarner Losh ** Any exceptional condition will result in an assertion failure.
307ca987d46SWarner Losh ** (As generated by the ANSI assert macro)
308ca987d46SWarner Losh ** FICL_ROBUST == 1 --> stack checking in the outer interpreter
309ca987d46SWarner Losh ** FICL_ROBUST == 2 also enables checking in many primitives
310ca987d46SWarner Losh */
311ca987d46SWarner Losh 
312ca987d46SWarner Losh #if !defined FICL_ROBUST
313ca987d46SWarner Losh #define FICL_ROBUST 2
314ca987d46SWarner Losh #endif
315ca987d46SWarner Losh 
316ca987d46SWarner Losh /*
317ca987d46SWarner Losh ** FICL_DEFAULT_STACK Specifies the default size (in CELLs) of
318ca987d46SWarner Losh ** a new virtual machine's stacks, unless overridden at
319ca987d46SWarner Losh ** create time.
320ca987d46SWarner Losh */
321ca987d46SWarner Losh #if !defined FICL_DEFAULT_STACK
322ca987d46SWarner Losh #define FICL_DEFAULT_STACK 128
323ca987d46SWarner Losh #endif
324ca987d46SWarner Losh 
325ca987d46SWarner Losh /*
326ca987d46SWarner Losh ** FICL_DEFAULT_DICT specifies the number of CELLs to allocate
327ca987d46SWarner Losh ** for the system dictionary by default. The value
328ca987d46SWarner Losh ** can be overridden at startup time as well.
329ca987d46SWarner Losh ** FICL_DEFAULT_ENV specifies the number of cells to allot
330ca987d46SWarner Losh ** for the environment-query dictionary.
331ca987d46SWarner Losh */
332ca987d46SWarner Losh #if !defined FICL_DEFAULT_DICT
333ca987d46SWarner Losh #define FICL_DEFAULT_DICT 12288
334ca987d46SWarner Losh #endif
335ca987d46SWarner Losh 
336ca987d46SWarner Losh #if !defined FICL_DEFAULT_ENV
337ca987d46SWarner Losh #define FICL_DEFAULT_ENV 260
338ca987d46SWarner Losh #endif
339ca987d46SWarner Losh 
340ca987d46SWarner Losh /*
341ca987d46SWarner Losh ** FICL_DEFAULT_VOCS specifies the maximum number of wordlists in
342ca987d46SWarner Losh ** the dictionary search order. See Forth DPANS sec 16.3.3
343ca987d46SWarner Losh ** (file://dpans16.htm#16.3.3)
344ca987d46SWarner Losh */
345ca987d46SWarner Losh #if !defined FICL_DEFAULT_VOCS
346ca987d46SWarner Losh #define FICL_DEFAULT_VOCS 16
347ca987d46SWarner Losh #endif
348ca987d46SWarner Losh 
349ca987d46SWarner Losh /*
350ca987d46SWarner Losh ** FICL_MAX_PARSE_STEPS controls the size of an array in the FICL_SYSTEM structure
351ca987d46SWarner Losh ** that stores pointers to parser extension functions. I would never expect to have
352ca987d46SWarner Losh ** more than 8 of these, so that's the default limit. Too many of these functions
353ca987d46SWarner Losh ** will probably exact a nasty performance penalty.
354ca987d46SWarner Losh */
355ca987d46SWarner Losh #if !defined FICL_MAX_PARSE_STEPS
356ca987d46SWarner Losh #define FICL_MAX_PARSE_STEPS 8
357ca987d46SWarner Losh #endif
358ca987d46SWarner Losh 
359ca987d46SWarner Losh /*
360ca987d46SWarner Losh ** FICL_ALIGN is the power of two to which the dictionary
361ca987d46SWarner Losh ** pointer address must be aligned. This value is usually
362ca987d46SWarner Losh ** either 1 or 2, depending on the memory architecture
363ca987d46SWarner Losh ** of the target system; 2 is safe on any 16 or 32 bit
364ca987d46SWarner Losh ** machine. 3 would be appropriate for a 64 bit machine.
365ca987d46SWarner Losh */
366ca987d46SWarner Losh #if !defined FICL_ALIGN
367ca987d46SWarner Losh #define FICL_ALIGN 2
368ca987d46SWarner Losh #define FICL_ALIGN_ADD ((1 << FICL_ALIGN) - 1)
369ca987d46SWarner Losh #endif
370ca987d46SWarner Losh 
371ca987d46SWarner Losh /*
372ca987d46SWarner Losh ** System dependent routines --
373ca987d46SWarner Losh ** edit the implementations in sysdep.c to be compatible
374ca987d46SWarner Losh ** with your runtime environment...
375ca987d46SWarner Losh ** ficlTextOut sends a NULL terminated string to the
376ca987d46SWarner Losh **   default output device - used for system error messages
377ca987d46SWarner Losh ** ficlMalloc and ficlFree have the same semantics as malloc and free
378ca987d46SWarner Losh **   in standard C
379ca987d46SWarner Losh ** ficlLongMul multiplies two UNS32s and returns a 64 bit unsigned
380ca987d46SWarner Losh **   product
381ca987d46SWarner Losh ** ficlLongDiv divides an UNS64 by an UNS32 and returns UNS32 quotient
382ca987d46SWarner Losh **   and remainder
383ca987d46SWarner Losh */
384ca987d46SWarner Losh struct vm;
385ca987d46SWarner Losh void  ficlTextOut(struct vm *pVM, char *msg, int fNewline);
386ca987d46SWarner Losh void *ficlMalloc (size_t size);
387ca987d46SWarner Losh void  ficlFree   (void *p);
388ca987d46SWarner Losh void *ficlRealloc(void *p, size_t size);
389ca987d46SWarner Losh /*
390ca987d46SWarner Losh ** Stub function for dictionary access control - does nothing
391ca987d46SWarner Losh ** by default, user can redefine to guarantee exclusive dict
392ca987d46SWarner Losh ** access to a single thread for updates. All dict update code
393ca987d46SWarner Losh ** must be bracketed as follows:
394ca987d46SWarner Losh ** ficlLockDictionary(TRUE);
395ca987d46SWarner Losh ** <code that updates dictionary>
396ca987d46SWarner Losh ** ficlLockDictionary(FALSE);
397ca987d46SWarner Losh **
398ca987d46SWarner Losh ** Returns zero if successful, nonzero if unable to acquire lock
399ca987d46SWarner Losh ** before timeout (optional - could also block forever)
400ca987d46SWarner Losh **
401ca987d46SWarner Losh ** NOTE: this function must be implemented with lock counting
402ca987d46SWarner Losh ** semantics: nested calls must behave properly.
403ca987d46SWarner Losh */
404ca987d46SWarner Losh #if FICL_MULTITHREAD
405ca987d46SWarner Losh int ficlLockDictionary(short fLock);
406ca987d46SWarner Losh #else
407ca987d46SWarner Losh #define ficlLockDictionary(x) /* ignore */
408ca987d46SWarner Losh #endif
409ca987d46SWarner Losh 
410ca987d46SWarner Losh /*
411ca987d46SWarner Losh ** 64 bit integer math support routines: multiply two UNS32s
412ca987d46SWarner Losh ** to get a 64 bit product, & divide the product by an UNS32
413ca987d46SWarner Losh ** to get an UNS32 quotient and remainder. Much easier in asm
414ca987d46SWarner Losh ** on a 32 bit CPU than in C, which usually doesn't support
415ca987d46SWarner Losh ** the double length result (but it should).
416ca987d46SWarner Losh */
417ca987d46SWarner Losh DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y);
418ca987d46SWarner Losh UNSQR ficlLongDiv(DPUNS    q, FICL_UNS y);
419ca987d46SWarner Losh 
420ca987d46SWarner Losh 
421ca987d46SWarner Losh /*
422ca987d46SWarner Losh ** FICL_HAVE_FTRUNCATE indicates whether the current OS supports
423ca987d46SWarner Losh ** the ftruncate() function (available on most UNIXes).  This
424ca987d46SWarner Losh ** function is necessary to provide the complete File-Access wordset.
425ca987d46SWarner Losh */
426ca987d46SWarner Losh #if !defined (FICL_HAVE_FTRUNCATE)
427ca987d46SWarner Losh #define FICL_HAVE_FTRUNCATE 0
428ca987d46SWarner Losh #endif
429ca987d46SWarner Losh 
430ca987d46SWarner Losh 
431ca987d46SWarner Losh #endif /*__SYSDEP_H__*/
432