diff --git a/sys/boot/ficl/words.c b/sys/boot/ficl/words.c index 8c235db72167..621a3f7ffaa1 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);