diff options
author | jkh <jkh@FreeBSD.org> | 1998-11-07 17:38:40 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1998-11-07 17:38:40 +0000 |
commit | 94f344ce1c07c8377953d64c3497cdd280d3ba9f (patch) | |
tree | 651efb50589f3db36c082ea628f2d825686f1f41 /sys | |
parent | 7a53878d664beef7fe76ffe1e3ba282988b1fd09 (diff) | |
download | FreeBSD-src-94f344ce1c07c8377953d64c3497cdd280d3ba9f.zip FreeBSD-src-94f344ce1c07c8377953d64c3497cdd280d3ba9f.tar.gz |
o Add proper stack checking to all file words
o add fkey and fread
o eliminate fexists now that this can be expressed in HLL forth
( : fexists fopen dup -1 <> if fclose 1 else drop 0 then ; ) :-)
Once we get the ability to write files, it should be possible to do
stand-alone rescue work from the 3rd stage boot. :)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/boot/ficl/words.c | 76 |
1 files changed, 48 insertions, 28 deletions
diff --git a/sys/boot/ficl/words.c b/sys/boot/ficl/words.c index 4af3f0e..b92d691 100644 --- a/sys/boot/ficl/words.c +++ b/sys/boot/ficl/words.c @@ -4030,6 +4030,9 @@ static void pfopen(FICL_VM *pVM) int fd; char *p; +#if FICL_ROBUST > 1 + vmCheckStack(pVM, 2, 1); +#endif (void)stackPopINT32(pVM->pStack); /* don't need count value */ p = stackPopPtr(pVM->pStack); fd = open(p, O_RDONLY); @@ -4045,44 +4048,51 @@ static void pfclose(FICL_VM *pVM) { int fd; +#if FICL_ROBUST > 1 + vmCheckStack(pVM, 1, 0); +#endif fd = stackPopINT32(pVM->pStack); /* get fd */ if (fd != -1) close(fd); return; } -/* fload - interpret file contents +/* fread - read file contents * - * fload ( fd -- ) + * fread ( fd buf nbytes -- nread ) */ -static void pfload(FICL_VM *pVM) +static void pfread(FICL_VM *pVM) { - int fd; + int fd, len; + char *buf; +#if FICL_ROBUST > 1 + vmCheckStack(pVM, 3, 1); +#endif + len = stackPopINT32(pVM->pStack); /* get number of bytes to read */ + buf = stackPopPtr(pVM->pStack); /* get buffer */ fd = stackPopINT32(pVM->pStack); /* get fd */ - if (fd != -1) - ficlExecFD(pVM, fd); + if (len > 0 && buf && fd != -1) + stackPushINT32(pVM->pStack, read(fd, buf, len)); + else + stackPushINT32(pVM->pStack, -1); return; } -/* fexists - check to see if file exists, returning TRUE or FALSE +/* fload - interpret file contents * - * fexists ( count ptr -- bool ) + * fload ( fd -- ) */ -static void pfexists(FICL_VM *pVM) +static void pfload(FICL_VM *pVM) { - char *p; int fd; - (void)stackPopINT32(pVM->pStack); /* don't need count value */ - p = stackPopPtr(pVM->pStack); - fd = open(p, O_RDONLY); - if (fd > 0) { - stackPushINT32(pVM->pStack, TRUE); - close(fd); - } - else - stackPushINT32(pVM->pStack, FALSE); +#if FICL_ROBUST > 1 + vmCheckStack(pVM, 1, 0); +#endif + fd = stackPopINT32(pVM->pStack); /* get fd */ + if (fd != -1) + ficlExecFD(pVM, fd); return; } @@ -4092,23 +4102,32 @@ static void pfexists(FICL_VM *pVM) */ static void key(FICL_VM *pVM) { +#if FICL_ROBUST > 1 + vmCheckStack(pVM, 0, 1); +#endif stackPushINT32(pVM->pStack, getchar()); return; } -#if 0 -/************************************************************************** - -** -**************************************************************************/ -static void funcname(FICL_VM *pVM) +/* fkey - get a character from a file + * + * fkey ( file -- char ) + */ +static void fkey(FICL_VM *pVM) { - IGNORE(pVM); + int i, fd; + char ch; + +#if FICL_ROBUST > 1 + vmCheckStack(pVM, 1, 1); +#endif + fd = stackPopINT32(pVM->pStack); + i = read(fd, &ch, 1); + stackPushINT32(pVM->pStack, i > 0 ? ch : -1); return; } -#endif /************************************************************************** f i c l C o m p i l e C o r e ** Builds the primitive wordset and the environment-query namespace. @@ -4271,10 +4290,11 @@ void ficlCompileCore(FICL_DICT *dp) dictAppendWord(dp, "\\", commentLine, FW_IMMEDIATE); /* FreeBSD extention words */ - dictAppendWord(dp, "fexists", pfexists, FW_DEFAULT); dictAppendWord(dp, "fopen", pfopen, FW_DEFAULT); dictAppendWord(dp, "fclose", pfclose, FW_DEFAULT); + dictAppendWord(dp, "fread", pfread, FW_DEFAULT); dictAppendWord(dp, "fload", pfload, FW_DEFAULT); + dictAppendWord(dp, "fkey", fkey, FW_DEFAULT); dictAppendWord(dp, "key", key, FW_DEFAULT); /* |