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
24DPUNS 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
37UNSQR 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
52void  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
64void *ficlMalloc (size_t size)
65{
66    return malloc(size);
67}
68
69void *ficlRealloc (void *p, size_t size)
70{
71    return realloc(p, size);
72}
73
74void  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
93int ficlLockDictionary(short fLock)
94{
95	IGNORE(fLock);
96	return 0;
97}
98#endif /* FICL_MULTITHREAD */
99