1 /*******************************************************************
2 ** s y s d e p . c
3 ** Forth Inspired Command Language
4 ** Author: John Sadler (john_sadler@alum.mit.edu)
5 ** Created: 16 Oct 1997
6 ** Implementations of FICL external interface functions...
7 **
8 *******************************************************************/
9
10
11 #ifdef TESTMAIN
12 #include <stdio.h>
13 #include <stdlib.h>
14 #else
15 #include <stand.h>
16 #endif
17 #include "ficl.h"
18
19 /*
20 ******************* FreeBSD P O R T B E G I N S H E R E ******************** Michael Smith
21 */
22
23 #if PORTABLE_LONGMULDIV == 0
ficlLongMul(FICL_UNS x,FICL_UNS y)24 DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
25 {
26 DPUNS q;
27 uint64_t qx;
28
29 qx = (uint64_t)x * (uint64_t) y;
30
31 q.hi = (uint32_t)( qx >> 32 );
32 q.lo = (uint32_t)( qx & 0xFFFFFFFFL);
33
34 return q;
35 }
36
ficlLongDiv(DPUNS q,FICL_UNS y)37 UNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
38 {
39 UNSQR result;
40 uint64_t qx, qh;
41
42 qh = q.hi;
43 qx = (qh << 32) | q.lo;
44
45 result.quot = qx / y;
46 result.rem = qx % y;
47
48 return result;
49 }
50 #endif
51
ficlTextOut(FICL_VM * pVM,char * msg,int fNewline)52 void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
53 {
54 IGNORE(pVM);
55
56 while(*msg != 0)
57 putchar(*(msg++));
58 if (fNewline)
59 putchar('\n');
60
61 return;
62 }
63
ficlMalloc(size_t size)64 void *ficlMalloc (size_t size)
65 {
66 return malloc(size);
67 }
68
ficlRealloc(void * p,size_t size)69 void *ficlRealloc (void *p, size_t size)
70 {
71 return realloc(p, size);
72 }
73
ficlFree(void * p)74 void ficlFree (void *p)
75 {
76 free(p);
77 }
78
79
80 /*
81 ** Stub function for dictionary access control - does nothing
82 ** by default, user can redefine to guarantee exclusive dict
83 ** access to a single thread for updates. All dict update code
84 ** is guaranteed to be bracketed as follows:
85 ** ficlLockDictionary(TRUE);
86 ** <code that updates dictionary>
87 ** ficlLockDictionary(FALSE);
88 **
89 ** Returns zero if successful, nonzero if unable to acquire lock
90 ** befor timeout (optional - could also block forever)
91 */
92 #if FICL_MULTITHREAD
ficlLockDictionary(short fLock)93 int ficlLockDictionary(short fLock)
94 {
95 IGNORE(fLock);
96 return 0;
97 }
98 #endif /* FICL_MULTITHREAD */
99