another example
[rrq/rrqforth.git] / examples / shell.f
1 #!/home/ralph/src/devuan/rrqforth/rrqforth
2 #
3 # Run shell commands.
4
5 : VARIABLE ( "word" -- ; create a variable )
6   INPUT @ READ-WORD CREATE DROP ;
7
8 : CONSTANT ( v "word" -- ; create a cell constant )
9   INPUT @ READ-WORD CREATE TFA>CFA
10   [ SYSTEM DEFINITIONS ] doVALUE [ FORTH DEFINITIONS ]
11   SWAP ! , ;
12
13 : Z, ( char n -- ; Put string on the heap with terminating NUL )
14   HERE @ SWAP DUP ALLOT STRNCPY 0 C, ;
15
16 VARIABLE SHELLZ " /bin/bash" Z,
17 VARIABLE -c " -c" Z,
18 VARIABLE ARGS SHELLZ , -c , 0 , 0 ,
19 VARIABLE ENV MAIN-ARGS DUP @ 8 * 8 + + ,
20 1 CONSTANT P_PID
21 4 CONSTANT WEXITED
22
23 : $ ( "rest of line" -- ; pass rest of line to a sub shell )
24   [ SYSTEM DEFINITIONS ]
25   INPUT @ READ-STREAM-LINE DROP
26   SYS_FORK DUP 0=
27   IF
28     DROP PAD ARGS 16 + ! SHELLZ ARGS ENV SYS_EXECVE 0 EXIT
29   THEN
30   P_PID SWAP PAD WEXITED SYS_WAITID
31   DUP IF S" **Wait error: " TELL . NL EMIT ELSE DROP THEN
32   [ FORTH DEFINITIONS ]
33 ;
34
35 : commands
36   STDIN INPUT ! BEGIN S" $ " TELL $ AGAIN ;
37
38 " Type your commands...." TELL NL EMIT
39 commands