1123372Sgrehan/*******************************************************************
2123372Sgrehan** s y s d e p . c
3123372Sgrehan** Forth Inspired Command Language
4123372Sgrehan** Author: John Sadler (john_sadler@alum.mit.edu)
5123372Sgrehan** Created: 16 Oct 1997
6123372Sgrehan** Implementations of FICL external interface functions...
7123372Sgrehan**
8123372Sgrehan*******************************************************************/
9123372Sgrehan
10123372Sgrehan/* $FreeBSD$ */
11123372Sgrehan
12123372Sgrehan#ifdef TESTMAIN
13123372Sgrehan#include <stdio.h>
14123372Sgrehan#include <stdlib.h>
15123372Sgrehan#else
16123372Sgrehan#include <stand.h>
17123372Sgrehan#endif
18123372Sgrehan#include "ficl.h"
19123372Sgrehan
20123372Sgrehan/*
21123372Sgrehan*******************  FreeBSD  P O R T   B E G I N S   H E R E ******************** Michael Smith
22123372Sgrehan*/
23123372Sgrehan
24123372Sgrehan#if PORTABLE_LONGMULDIV == 0
25123372SgrehanDPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
26123372Sgrehan{
27123372Sgrehan    DPUNS q;
28123372Sgrehan    u_int64_t qx;
29123372Sgrehan
30123372Sgrehan    qx = (u_int64_t)x * (u_int64_t) y;
31123372Sgrehan
32123372Sgrehan    q.hi = (u_int32_t)( qx >> 32 );
33123372Sgrehan    q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
34123372Sgrehan
35123372Sgrehan    return q;
36123372Sgrehan}
37123372Sgrehan
38123372SgrehanUNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
39123372Sgrehan{
40123372Sgrehan    UNSQR result;
41123372Sgrehan    u_int64_t qx, qh;
42123372Sgrehan
43123372Sgrehan    qh = q.hi;
44123372Sgrehan    qx = (qh << 32) | q.lo;
45123372Sgrehan
46123372Sgrehan    result.quot = qx / y;
47123372Sgrehan    result.rem  = qx % y;
48123372Sgrehan
49123372Sgrehan    return result;
50123372Sgrehan}
51123372Sgrehan#endif
52123372Sgrehan
53123372Sgrehanvoid  ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
54123372Sgrehan{
55123372Sgrehan    IGNORE(pVM);
56123372Sgrehan
57123372Sgrehan    while(*msg != 0)
58123372Sgrehan	putchar(*(msg++));
59123372Sgrehan    if (fNewline)
60123372Sgrehan	putchar('\n');
61123372Sgrehan
62123372Sgrehan   return;
63123372Sgrehan}
64123372Sgrehan
65123372Sgrehanvoid *ficlMalloc (size_t size)
66123372Sgrehan{
67123372Sgrehan    return malloc(size);
68123372Sgrehan}
69123372Sgrehan
70123372Sgrehanvoid *ficlRealloc (void *p, size_t size)
71123372Sgrehan{
72123372Sgrehan    return realloc(p, size);
73123372Sgrehan}
74123372Sgrehan
75123372Sgrehanvoid  ficlFree   (void *p)
76123372Sgrehan{
77123372Sgrehan    free(p);
78123372Sgrehan}
79123372Sgrehan
80123372Sgrehan
81123372Sgrehan/*
82123372Sgrehan** Stub function for dictionary access control - does nothing
83123372Sgrehan** by default, user can redefine to guarantee exclusive dict
84123372Sgrehan** access to a single thread for updates. All dict update code
85123372Sgrehan** is guaranteed to be bracketed as follows:
86123372Sgrehan** ficlLockDictionary(TRUE);
87123372Sgrehan** <code that updates dictionary>
88123372Sgrehan** ficlLockDictionary(FALSE);
89123372Sgrehan**
90123372Sgrehan** Returns zero if successful, nonzero if unable to acquire lock
91123372Sgrehan** befor timeout (optional - could also block forever)
92123372Sgrehan*/
93123372Sgrehan#if FICL_MULTITHREAD
94123372Sgrehanint ficlLockDictionary(short fLock)
95123372Sgrehan{
96123372Sgrehan	IGNORE(fLock);
97123372Sgrehan	return 0;
98123372Sgrehan}
99123372Sgrehan#endif /* FICL_MULTITHREAD */
100123372Sgrehan
101123372Sgrehan
102