add INPUT variable for current eval stream
[rrq/rrqforth.git] / compile.asm
index fe19b203620ee3dab25f407657704c588641fe20..bcffaef4f02fda5c44ffd3cc0b48e2f281a1f636 100644 (file)
@@ -49,7 +49,7 @@ p_create_COPY:
        ;; ( "word" -- cfa )
        ;; Find the following word and push its cfa, or 0
        pushr rsi
-       DOFORTH p_stdin, p_read_word, p_find
+       DOFORTH p_input, p_get, p_read_word, p_find
        cmp qword[rsp],0
        jne p_quote_tfa
        add rsp,16
@@ -241,6 +241,10 @@ p_numper_POSITIVE:
        popr rsi
        next
 
+       WORD p_input,'INPUT',dovariable
+       ;; The current input stream for evaluate-stream
+       dq 0
+
        WORD p_this_word,'THIS-WORD',dovariable
        dq 0,0                  ; ( n chars* )
 
@@ -248,26 +252,23 @@ p_numper_POSITIVE:
        ;; ( stream* -- *?* flag )
        ;; Execute the words from the given stream
        ;; returns 1 if stream ends and 0 if an unknown word is found
-       dq p_gtR                ; Keep the stream on the return stack.
+       dq p_input, p_get, p_gtR ; save old stream on R-stack
+       dq p_input, p_put
 p_evaluate_stream_PROMPT:
-       dq p_verboseQ
-       dq p_get
+       dq p_verboseQ, p_get
        BRANCH 0,p_evaluate_stream_LOOP
-       dq p_depth
-       dq p_dot
+       dq p_depth, p_dot
        dq p_literal_string
        STRING '> '
        dq p_tell
-       dq p_Rget
+       dq p_input, p_get
        dq p_clear_stream
 p_evaluate_stream_LOOP:
-       dq p_Rget
+       dq p_input, p_get
        dq p_read_word
        dq p_dup
        BRANCH 0,p_evaluate_stream_END ; branch if 0 on TOP
-       dq p_2dup
-       dq p_this_word
-       dq p_2put
+       dq p_2dup, p_this_word, p_2put
        dq p_find
        dq p_dup
        BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP
@@ -293,13 +294,12 @@ p_evaluate_stream_NOTWORD:
        dq p_dup
        BRANCH 0,p_evaluate_stream_BAD ; branch if 0
        dq p_drop
-       dq p_state
-       dq p_get
+       dq p_state, p_get
        BRANCH 0,p_evaluate_stream_AFTER ; branch if 0
        dq p_literal, p_literal
        dq p_comma, p_comma
 p_evaluate_stream_AFTER:
-       dq p_Rget
+       dq p_input, p_get
        dq p_stream_nchars
        BRANCH 0,p_evaluate_stream_PROMPT
        BRANCH ,p_evaluate_stream_LOOP
@@ -307,8 +307,7 @@ p_evaluate_stream_END:
        dq p_2drop
        dq p_literal, 1
 p_evaluate_stream_BAD:
-       dq p_Rgt
-       dq p_drop
+       dq p_Rgt, p_input, p_put ; restore previous stream
        dq p_exit
 
        WORD p_colon,':'
@@ -316,7 +315,7 @@ p_evaluate_stream_BAD:
        ;; Read next word as a new word into current wordlist, set it
        ;; to be a doforth word, and set compiling mode.
        dq p_literal, doforth
-       dq p_stdin
+       dq p_input, p_get
        dq p_read_word
        dq p_create
        dq p_tfa2cfa