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