From 70e18997625b283a60c356067a60e8a9d76024ca Mon Sep 17 00:00:00 2001 From: "Daniel C. Sobral" Date: Mon, 12 Jun 2000 16:46:28 +0000 Subject: [PATCH] Fix REFILL. It must throw RESTART instead of OUTOFTEXT so that execution can take place at the point where it stopped after the input buffer has been refilled. Add ANS Forth CORE EXT and FILE word SOURCE-ID. --- sys/boot/ficl/words.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/sys/boot/ficl/words.c b/sys/boot/ficl/words.c index 8c235db7216..621a3f7ffaa 100644 --- a/sys/boot/ficl/words.c +++ b/sys/boot/ficl/words.c @@ -4155,6 +4155,24 @@ static void compareString(FICL_VM *pVM) } +/************************************************************************** + s o u r c e - i d +** CORE EXT, FILE ( -- 0 | -1 | fileid ) +** Identifies the input source as follows: +** +** SOURCE-ID Input source +** --------- ------------ +** fileid Text file fileid +** -1 String (via EVALUATE) +** 0 User input device +**************************************************************************/ +static void sourceid(FICL_VM *pVM) +{ + stackPushINT(pVM->pStack, pVM->sourceID.i); + return; +} + + /************************************************************************** r e f i l l ** CORE EXT ( -- flag ) @@ -4170,10 +4188,16 @@ static void compareString(FICL_VM *pVM) **************************************************************************/ static void refill(FICL_VM *pVM) { + static int tries = 0; + FICL_INT ret = (pVM->sourceID.i == -1) ? FICL_FALSE : FICL_TRUE; + if (ret && tries == 0) { + tries = 1; + vmThrow(pVM, VM_RESTART); + } + if (tries == 1) + tries = 0; stackPushINT(pVM->pStack, ret); - if (ret) - vmThrow(pVM, VM_OUTOFTEXT); return; } @@ -4775,6 +4799,7 @@ void ficlCompileCore(FICL_DICT *dp) dictAppendWord(dp, "pick", pick, FW_DEFAULT); dictAppendWord(dp, "roll", roll, FW_DEFAULT); dictAppendWord(dp, "refill", refill, FW_DEFAULT); + dictAppendWord(dp, "source-id", sourceid, FW_DEFAULT); dictAppendWord(dp, "to", toValue, FW_IMMEDIATE); dictAppendWord(dp, "value", constant, FW_DEFAULT); dictAppendWord(dp, "\\", commentLine, FW_IMMEDIATE);