another example
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Sun, 13 Jun 2021 05:08:13 +0000 (15:08 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Sun, 13 Jun 2021 05:08:13 +0000 (15:08 +1000)
examples/shell.f [new file with mode: 0755]

diff --git a/examples/shell.f b/examples/shell.f
new file mode 100755 (executable)
index 0000000..6d90531
--- /dev/null
@@ -0,0 +1,39 @@
+#!/home/ralph/src/devuan/rrqforth/rrqforth
+#
+# Run shell commands.
+
+: VARIABLE ( "word" -- ; create a variable )
+  INPUT @ READ-WORD CREATE DROP ;
+
+: CONSTANT ( v "word" -- ; create a cell constant )
+  INPUT @ READ-WORD CREATE TFA>CFA
+  [ SYSTEM DEFINITIONS ] doVALUE [ FORTH DEFINITIONS ]
+  SWAP ! , ;
+
+: Z, ( char n -- ; Put string on the heap with terminating NUL )
+  HERE @ SWAP DUP ALLOT STRNCPY 0 C, ;
+
+VARIABLE SHELLZ " /bin/bash" Z,
+VARIABLE -c " -c" Z,
+VARIABLE ARGS SHELLZ , -c , 0 , 0 ,
+VARIABLE ENV MAIN-ARGS DUP @ 8 * 8 + + ,
+1 CONSTANT P_PID
+4 CONSTANT WEXITED
+
+: $ ( "rest of line" -- ; pass rest of line to a sub shell )
+  [ SYSTEM DEFINITIONS ]
+  INPUT @ READ-STREAM-LINE DROP
+  SYS_FORK DUP 0=
+  IF
+    DROP PAD ARGS 16 + ! SHELLZ ARGS ENV SYS_EXECVE 0 EXIT
+  THEN
+  P_PID SWAP PAD WEXITED SYS_WAITID
+  DUP IF S" **Wait error: " TELL . NL EMIT ELSE DROP THEN
+  [ FORTH DEFINITIONS ]
+;
+
+: commands
+  STDIN INPUT ! BEGIN S" $ " TELL $ AGAIN ;
+
+" Type your commands...." TELL NL EMIT
+commands