summaryrefslogtreecommitdiffstats
path: root/sys/boot/ficl/vm.c
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>1999-01-22 23:52:59 +0000
committermsmith <msmith@FreeBSD.org>1999-01-22 23:52:59 +0000
commit355b55c28227a3ff8450e881344606a04cd5ac34 (patch)
tree465d830f14fa2aa749e696c2a5d6aaf5f009df19 /sys/boot/ficl/vm.c
parent1ebf60a8063c2a182d47d4e952bb4c6b34389d27 (diff)
downloadFreeBSD-src-355b55c28227a3ff8450e881344606a04cd5ac34.zip
FreeBSD-src-355b55c28227a3ff8450e881344606a04cd5ac34.tar.gz
Add EXCEPTION word set.
Make TIB handling use buffer size to conform with ANS Forth. Add ANS MEMORY-ALLOC word set. See the PRs for extensive details. PR: kern/9412 kern/9442 kern/9514 Submitted by: PRs from Daniel Sobral <dcs@newsguy.com>
Diffstat (limited to 'sys/boot/ficl/vm.c')
-rw-r--r--sys/boot/ficl/vm.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/sys/boot/ficl/vm.c b/sys/boot/ficl/vm.c
index 6852c62..ebdf944 100644
--- a/sys/boot/ficl/vm.c
+++ b/sys/boot/ficl/vm.c
@@ -156,17 +156,17 @@ STRINGINFO vmGetWord0(FICL_VM *pVM)
UNS32 count = 0;
char ch;
- pSrc = skipSpace(pSrc);
+ pSrc = skipSpace(pSrc,pVM->tib.end);
SI_SETPTR(si, pSrc);
- for (ch = *pSrc; ch != '\0' && !isspace(ch); ch = *++pSrc)
+ for (ch = *pSrc; (pVM->tib.end != pSrc) && (ch != '\0') && !isspace(ch); ch = *++pSrc)
{
count++;
}
SI_SETLEN(si, count);
- if (isspace(ch)) /* skip one trailing delimiter */
+ if ((pVM->tib.end != pSrc) && isspace(ch)) /* skip one trailing delimiter */
pSrc++;
vmUpdateTib(pVM, pSrc);
@@ -210,14 +210,15 @@ STRINGINFO vmParseString(FICL_VM *pVM, char delim)
{
STRINGINFO si;
char *pSrc = vmGetInBuf(pVM);
- char ch;
+ char ch;
- while (*pSrc == delim) /* skip lead delimiters */
+ while ((pVM->tib.end != pSrc) && (*pSrc == delim)) /* skip lead delimiters */
pSrc++;
SI_SETPTR(si, pSrc); /* mark start of text */
- for (ch = *pSrc; (ch != delim)
+ for (ch = *pSrc; (pVM->tib.end != pSrc)
+ && (ch != delim)
&& (ch != '\0')
&& (ch != '\r')
&& (ch != '\n'); ch = *++pSrc)
@@ -228,7 +229,7 @@ STRINGINFO vmParseString(FICL_VM *pVM, char delim)
/* set length of result */
SI_SETLEN(si, pSrc - SI_PTR(si));
- if (*pSrc == delim) /* gobble trailing delimiter */
+ if ((pVM->tib.end != pSrc) && (*pSrc == delim)) /* gobble trailing delimiter */
pSrc++;
vmUpdateTib(pVM, pSrc);
@@ -263,7 +264,7 @@ void vmPushIP(FICL_VM *pVM, IPTYPE newIP)
v m P u s h T i b
** Binds the specified input string to the VM and clears >IN (the index)
**************************************************************************/
-void vmPushTib(FICL_VM *pVM, char *text, TIB *pSaveTib)
+void vmPushTib(FICL_VM *pVM, char *text, INT32 size, TIB *pSaveTib)
{
if (pSaveTib)
{
@@ -271,6 +272,7 @@ void vmPushTib(FICL_VM *pVM, char *text, TIB *pSaveTib)
}
pVM->tib.cp = text;
+ pVM->tib.end = text + size;
pVM->tib.index = 0;
}
@@ -302,6 +304,7 @@ void vmQuit(FICL_VM *pVM)
pVM->runningWord = pInterp;
pVM->state = INTERPRET;
pVM->tib.cp = NULL;
+ pVM->tib.end = NULL;
pVM->tib.index = 0;
pVM->pad[0] = '\0';
pVM->sourceID.i = 0;
@@ -551,12 +554,14 @@ int strincmp(char *cp1, char *cp2, FICL_COUNT count)
s k i p S p a c e
** Given a string pointer, returns a pointer to the first non-space
** char of the string, or to the NULL terminator if no such char found.
+** If the pointer reaches "end" first, stop there. If you don't want
+** that, pass NULL.
**************************************************************************/
-char *skipSpace(char *cp)
+char *skipSpace(char *cp, char *end)
{
assert(cp);
- while (isspace(*cp))
+ while ((cp != end) && isspace(*cp))
cp++;
return cp;
OpenPOWER on IntegriCloud