182940Sdfr/*******************************************************************
282940Sdfr** s y s d e p . c
382940Sdfr** Forth Inspired Command Language
482940Sdfr** Author: John Sadler (john_sadler@alum.mit.edu)
582940Sdfr** Created: 16 Oct 1997
682940Sdfr** Implementations of FICL external interface functions...
782940Sdfr**
882940Sdfr*******************************************************************/
982940Sdfr
1082940Sdfr/* $FreeBSD$ */
1182940Sdfr
1282940Sdfr#ifdef TESTMAIN
1382940Sdfr#include <stdio.h>
1482940Sdfr#include <stdlib.h>
1582940Sdfr#else
1682940Sdfr#include <stand.h>
1782940Sdfr#endif
1882940Sdfr#include "ficl.h"
1982940Sdfr
2082940Sdfr/*
2182940Sdfr*******************  FreeBSD  P O R T   B E G I N S   H E R E ******************** Michael Smith
2282940Sdfr*/
2382940Sdfr
2482940Sdfr#if PORTABLE_LONGMULDIV == 0
2582940SdfrDPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
2682940Sdfr{
2782940Sdfr    DPUNS q;
2882940Sdfr    u_int64_t qx;
2982940Sdfr
3082940Sdfr    qx = (u_int64_t)x * (u_int64_t) y;
3182940Sdfr
3282940Sdfr    q.hi = (u_int32_t)( qx >> 32 );
3382940Sdfr    q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
3482940Sdfr
3582940Sdfr    return q;
3682940Sdfr}
3782940Sdfr
3882940SdfrUNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
3982940Sdfr{
4082940Sdfr    UNSQR result;
4182940Sdfr    u_int64_t qx, qh;
4282940Sdfr
4382940Sdfr    qh = q.hi;
4482940Sdfr    qx = (qh << 32) | q.lo;
4582940Sdfr
4682940Sdfr    result.quot = qx / y;
4782940Sdfr    result.rem  = qx % y;
4882940Sdfr
4982940Sdfr    return result;
5082940Sdfr}
5182940Sdfr#endif
5282940Sdfr
5382940Sdfrvoid  ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
5482940Sdfr{
5582940Sdfr    IGNORE(pVM);
5682940Sdfr
5782940Sdfr    while(*msg != 0)
5882940Sdfr	putchar(*(msg++));
5982940Sdfr    if (fNewline)
6082940Sdfr	putchar('\n');
6182940Sdfr
6282940Sdfr   return;
6382940Sdfr}
6482940Sdfr
6582940Sdfrvoid *ficlMalloc (size_t size)
6682940Sdfr{
6782940Sdfr    return malloc(size);
6882940Sdfr}
6982940Sdfr
7082940Sdfrvoid *ficlRealloc (void *p, size_t size)
7182940Sdfr{
7282940Sdfr    return realloc(p, size);
7382940Sdfr}
7482940Sdfr
7582940Sdfrvoid  ficlFree   (void *p)
7682940Sdfr{
7782940Sdfr    free(p);
7882940Sdfr}
7982940Sdfr
8082940Sdfr
8182940Sdfr/*
8282940Sdfr** Stub function for dictionary access control - does nothing
8382940Sdfr** by default, user can redefine to guarantee exclusive dict
8482940Sdfr** access to a single thread for updates. All dict update code
8582940Sdfr** is guaranteed to be bracketed as follows:
8682940Sdfr** ficlLockDictionary(TRUE);
8782940Sdfr** <code that updates dictionary>
8882940Sdfr** ficlLockDictionary(FALSE);
8982940Sdfr**
9082940Sdfr** Returns zero if successful, nonzero if unable to acquire lock
9182940Sdfr** befor timeout (optional - could also block forever)
9282940Sdfr*/
9382940Sdfr#if FICL_MULTITHREAD
9482940Sdfrint ficlLockDictionary(short fLock)
9582940Sdfr{
9682940Sdfr	IGNORE(fLock);
9782940Sdfr	return 0;
9882940Sdfr}
9982940Sdfr#endif /* FICL_MULTITHREAD */
10082940Sdfr
10182940Sdfr
102