More fun with files & coroutines! (under Gforth 0.7.3)
\ futils.fs Experiment of coroutines on files.
include co.fs
VARIABLE FD0
VARIABLE FD1
VARIABLE READ#
VARIABLE QUIT?
4096 CONSTANT LBUF#
CREATE LBUF LBUF# ALLOT
CREATE CRLF 1 C, 10 C, ALIGN
: READ ( ca u -- )
R/O OPEN-FILE THROW FD0 !
CO: BEGIN
QUIT? @ 0=
WHILE
LBUF [ LBUF# CRLF C@ - ]L
FD0 @ READ-LINE THROW
WHILE
READ# ! CO
REPEAT DROP THEN
FD0 @ CLOSE-FILE THROW
QUIT? ON
;
: WRITE ( ca u -- )
W/O OPEN-FILE THROW FD1 !
CO: BEGIN
QUIT? @ 0=
WHILE
CRLF COUNT LBUF READ# @ + SWAP MOVE
LBUF READ# @ [ CRLF C@ ]L +
FD1 @ WRITE-FILE THROW
CO
REPEAT
FD1 @ CLOSE-FILE THROW
;
: DISPLAY ( -- )
CO: BEGIN
QUIT? @ 0=
WHILE
LBUF READ# @ TYPE CRLF COUNT TYPE
CO
REPEAT
;
VARIABLE CONTOR
: FIRST ( u -- )
CONTOR !
CO: BEGIN
QUIT? @ 0=
WHILE
CONTOR @
WHILE
-1 CONTOR +!
CO
REPEAT THEN
QUIT? ON
;
: KB ( "CHAR" -- )
CO: BEGIN
QUIT? @ 0=
WHILE
KEY DUP [CHAR] q <> SWAP [CHAR] Q <> AND
WHILE
CO
REPEAT THEN
QUIT? ON
;
Now some tests :)
~/src$ echo -n > temp.txt
~/src$ gforth futils.fs -e 's" ct.help" read 10 first display s" temp.txt" write GO .s cr bye'
USAGE:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COROUTINES
VARIABLE QUIT? QUIT? OFF
VARIABLE Cnt
: timer
QUIT? OFF 0 Cnt !
CO:
BEGIN
<0>
~/src$ cat temp.txt
USAGE:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COROUTINES
VARIABLE QUIT? QUIT? OFF
VARIABLE Cnt
: timer
QUIT? OFF 0 Cnt !
CO:
BEGIN
~/src$ echo -n > temp.txt
~/src$ gforth futils.fs -e 's" ct.help" read 10 first display s" temp.txt" write kb GO .s cr bye'
USAGE:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COROUTINES
VARIABLE QUIT? QUIT? OFF
<0>
~/src$ cat temp.txt
USAGE:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COROUTINES
VARIABLE QUIT? QUIT? OFF
bo@bo-lap:~/src$
second time, at sixth line pushed 'q' to exit :)