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