1223695Sdfr/*******************************************************************
2223695Sdfr** s y s d e p . c
3223695Sdfr** Forth Inspired Command Language
4223695Sdfr** Author: John Sadler (john_sadler@alum.mit.edu)
5223695Sdfr** Created: 16 Oct 1997
6223695Sdfr** Implementations of FICL external interface functions...
7223695Sdfr**
8223695Sdfr*******************************************************************/
9223695Sdfr
10223695Sdfr/* $FreeBSD$ */
11223695Sdfr
12223695Sdfr#ifdef TESTMAIN
13223695Sdfr#include <stdio.h>
14223695Sdfr#include <stdlib.h>
15223695Sdfr#else
16223695Sdfr#include <stand.h>
17223695Sdfr#endif
18223695Sdfr#include "ficl.h"
19223695Sdfr
20223695Sdfr/*
21223695Sdfr*******************  FreeBSD  P O R T   B E G I N S   H E R E ******************** Michael Smith
22223695Sdfr*/
23223695Sdfr
24223695Sdfr#if PORTABLE_LONGMULDIV == 0
25223695SdfrDPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
26223695Sdfr{
27223695Sdfr    DPUNS q;
28223695Sdfr    u_int64_t qx;
29223695Sdfr
30223695Sdfr    qx = (u_int64_t)x * (u_int64_t) y;
31223695Sdfr
32223695Sdfr    q.hi = (u_int32_t)( qx >> 32 );
33223695Sdfr    q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
34223695Sdfr
35223695Sdfr    return q;
36223695Sdfr}
37223695Sdfr
38223695SdfrUNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
39223695Sdfr{
40223695Sdfr    UNSQR result;
41223695Sdfr    u_int64_t qx, qh;
42223695Sdfr
43223695Sdfr    qh = q.hi;
44223695Sdfr    qx = (qh << 32) | q.lo;
45223695Sdfr
46223695Sdfr    result.quot = qx / y;
47223695Sdfr    result.rem  = qx % y;
48223695Sdfr
49223695Sdfr    return result;
50223695Sdfr}
51223695Sdfr#endif
52223695Sdfr
53223695Sdfrvoid  ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
54223695Sdfr{
55223695Sdfr    IGNORE(pVM);
56223695Sdfr
57223695Sdfr    while(*msg != 0)
58223695Sdfr	putchar(*(msg++));
59223695Sdfr    if (fNewline)
60223695Sdfr	putchar('\n');
61223695Sdfr
62223695Sdfr   return;
63223695Sdfr}
64223695Sdfr
65223695Sdfrvoid *ficlMalloc (size_t size)
66223695Sdfr{
67223695Sdfr    return malloc(size);
68223695Sdfr}
69223695Sdfr
70223695Sdfrvoid *ficlRealloc (void *p, size_t size)
71223695Sdfr{
72223695Sdfr    return realloc(p, size);
73223695Sdfr}
74223695Sdfr
75223695Sdfrvoid  ficlFree   (void *p)
76223695Sdfr{
77223695Sdfr    free(p);
78223695Sdfr}
79223695Sdfr
80223695Sdfr
81223695Sdfr/*
82223695Sdfr** Stub function for dictionary access control - does nothing
83223695Sdfr** by default, user can redefine to guarantee exclusive dict
84223695Sdfr** access to a single thread for updates. All dict update code
85223695Sdfr** is guaranteed to be bracketed as follows:
86223695Sdfr** ficlLockDictionary(TRUE);
87223695Sdfr** <code that updates dictionary>
88223695Sdfr** ficlLockDictionary(FALSE);
89223695Sdfr**
90223695Sdfr** Returns zero if successful, nonzero if unable to acquire lock
91223695Sdfr** befor timeout (optional - could also block forever)
92223695Sdfr*/
93223695Sdfr#if FICL_MULTITHREAD
94223695Sdfrint ficlLockDictionary(short fLock)
95223695Sdfr{
96223695Sdfr	IGNORE(fLock);
97223695Sdfr	return 0;
98223695Sdfr}
99223695Sdfr#endif /* FICL_MULTITHREAD */
100223695Sdfr
101223695Sdfr
102