1*ca987d46SWarner Losh /******************************************************************* 2*ca987d46SWarner Losh ** s y s d e p . c 3*ca987d46SWarner Losh ** Forth Inspired Command Language 4*ca987d46SWarner Losh ** Author: John Sadler (john_sadler@alum.mit.edu) 5*ca987d46SWarner Losh ** Created: 16 Oct 1997 6*ca987d46SWarner Losh ** Implementations of FICL external interface functions... 7*ca987d46SWarner Losh ** 8*ca987d46SWarner Losh *******************************************************************/ 9*ca987d46SWarner Losh 10*ca987d46SWarner Losh /* $FreeBSD$ */ 11*ca987d46SWarner Losh 12*ca987d46SWarner Losh #ifdef TESTMAIN 13*ca987d46SWarner Losh #include <stdio.h> 14*ca987d46SWarner Losh #include <stdlib.h> 15*ca987d46SWarner Losh #else 16*ca987d46SWarner Losh #include <stand.h> 17*ca987d46SWarner Losh #endif 18*ca987d46SWarner Losh #include "ficl.h" 19*ca987d46SWarner Losh 20*ca987d46SWarner Losh /* 21*ca987d46SWarner Losh ******************* FreeBSD P O R T B E G I N S H E R E ******************** Michael Smith 22*ca987d46SWarner Losh */ 23*ca987d46SWarner Losh 24*ca987d46SWarner Losh #if PORTABLE_LONGMULDIV == 0 25*ca987d46SWarner Losh DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y) 26*ca987d46SWarner Losh { 27*ca987d46SWarner Losh DPUNS q; 28*ca987d46SWarner Losh u_int64_t qx; 29*ca987d46SWarner Losh 30*ca987d46SWarner Losh qx = (u_int64_t)x * (u_int64_t) y; 31*ca987d46SWarner Losh 32*ca987d46SWarner Losh q.hi = (u_int32_t)( qx >> 32 ); 33*ca987d46SWarner Losh q.lo = (u_int32_t)( qx & 0xFFFFFFFFL); 34*ca987d46SWarner Losh 35*ca987d46SWarner Losh return q; 36*ca987d46SWarner Losh } 37*ca987d46SWarner Losh 38*ca987d46SWarner Losh UNSQR ficlLongDiv(DPUNS q, FICL_UNS y) 39*ca987d46SWarner Losh { 40*ca987d46SWarner Losh UNSQR result; 41*ca987d46SWarner Losh u_int64_t qx, qh; 42*ca987d46SWarner Losh 43*ca987d46SWarner Losh qh = q.hi; 44*ca987d46SWarner Losh qx = (qh << 32) | q.lo; 45*ca987d46SWarner Losh 46*ca987d46SWarner Losh result.quot = qx / y; 47*ca987d46SWarner Losh result.rem = qx % y; 48*ca987d46SWarner Losh 49*ca987d46SWarner Losh return result; 50*ca987d46SWarner Losh } 51*ca987d46SWarner Losh #endif 52*ca987d46SWarner Losh 53*ca987d46SWarner Losh void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline) 54*ca987d46SWarner Losh { 55*ca987d46SWarner Losh IGNORE(pVM); 56*ca987d46SWarner Losh 57*ca987d46SWarner Losh while(*msg != 0) 58*ca987d46SWarner Losh putchar(*(msg++)); 59*ca987d46SWarner Losh if (fNewline) 60*ca987d46SWarner Losh putchar('\n'); 61*ca987d46SWarner Losh 62*ca987d46SWarner Losh return; 63*ca987d46SWarner Losh } 64*ca987d46SWarner Losh 65*ca987d46SWarner Losh void *ficlMalloc (size_t size) 66*ca987d46SWarner Losh { 67*ca987d46SWarner Losh return malloc(size); 68*ca987d46SWarner Losh } 69*ca987d46SWarner Losh 70*ca987d46SWarner Losh void *ficlRealloc (void *p, size_t size) 71*ca987d46SWarner Losh { 72*ca987d46SWarner Losh return realloc(p, size); 73*ca987d46SWarner Losh } 74*ca987d46SWarner Losh 75*ca987d46SWarner Losh void ficlFree (void *p) 76*ca987d46SWarner Losh { 77*ca987d46SWarner Losh free(p); 78*ca987d46SWarner Losh } 79*ca987d46SWarner Losh 80*ca987d46SWarner Losh 81*ca987d46SWarner Losh /* 82*ca987d46SWarner Losh ** Stub function for dictionary access control - does nothing 83*ca987d46SWarner Losh ** by default, user can redefine to guarantee exclusive dict 84*ca987d46SWarner Losh ** access to a single thread for updates. All dict update code 85*ca987d46SWarner Losh ** is guaranteed to be bracketed as follows: 86*ca987d46SWarner Losh ** ficlLockDictionary(TRUE); 87*ca987d46SWarner Losh ** <code that updates dictionary> 88*ca987d46SWarner Losh ** ficlLockDictionary(FALSE); 89*ca987d46SWarner Losh ** 90*ca987d46SWarner Losh ** Returns zero if successful, nonzero if unable to acquire lock 91*ca987d46SWarner Losh ** befor timeout (optional - could also block forever) 92*ca987d46SWarner Losh */ 93*ca987d46SWarner Losh #if FICL_MULTITHREAD 94*ca987d46SWarner Losh int ficlLockDictionary(short fLock) 95*ca987d46SWarner Losh { 96*ca987d46SWarner Losh IGNORE(fLock); 97*ca987d46SWarner Losh return 0; 98*ca987d46SWarner Losh } 99*ca987d46SWarner Losh #endif /* FICL_MULTITHREAD */ 100