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