Merge branch 'master' into build64
[pforth] / fth / save-input.fth
diff --git a/fth/save-input.fth b/fth/save-input.fth
new file mode 100644 (file)
index 0000000..9654358
--- /dev/null
@@ -0,0 +1,82 @@
+\ SAVE-INPUT and RESTORE-INPUT
+\
+\ This code is part of pForth.
+\
+\ The pForth software code is dedicated to the public domain,
+\ and any third party may reproduce, distribute and modify
+\ the pForth software code or any derivative works thereof
+\ without any compensation or license.  The pForth software
+\ code is provided on an "as is" basis without any warranty
+\ of any kind, including, without limitation, the implied
+\ warranties of merchantability and fitness for a particular
+\ purpose and their equivalents under the laws of any jurisdiction.
+
+anew task-save-input.fth
+
+private{
+
+: SAVE-BUFFER ( -- column source-id 2 ) >in @ source-id 2 ;
+
+\ Restore >IN from COLUMN unless COLUMN is too large.  Valid values
+\ for COLUMN are from 0 to (including) the length of SOURCE plus one.
+: RESTORE-COLUMN ( column -- flag )
+    source nip 1+ over u<
+    IF   drop  true
+    ELSE >in ! false
+    THEN
+;
+
+\ Return the file-position of the beginning of the current line in
+\ file SOURCE-ID.  Assume that the current line is stored in SOURCE
+\ and that the current file-position is at an end-of-line (or
+\ end-of-file).
+: LINE-START-POSITION ( -- ud )
+    source-id file-position throw
+    \ unless at end-of-file, subtract newline
+    source-id file-size throw 2over d= 0= IF 1 s>d d- THEN
+    \ subtract line length
+    source nip s>d d-
+;
+
+: SAVE-FILE ( column line filepos:ud source-id 5 -- )
+    >in @
+    source-line-number@
+    line-start-position
+    source-id
+    5
+;
+
+: RESTORE-FILE ( column line filepos:ud -- flag )
+    source-id reposition-file  IF 2drop true EXIT THEN
+    refill                     0= IF 2drop true EXIT THEN
+    source-line-number!
+    restore-column
+;
+
+: NDROP ( n*x n -- ) 0 ?DO drop LOOP ;
+
+}private
+
+\ Source      Stack
+\ EVALUATE    >IN  SourceID=(-1)  2
+\ keyboard    >IN  SourceID=(0)   2
+\ file        >IN  lineNumber filePos  SourceID=(fileID) 5
+: SAVE-INPUT ( -- column {line filepos}? source-id n )
+    source-id CASE
+       -1 OF save-buffer ENDOF
+       0  OF save-buffer ENDOF
+       drop save-file EXIT
+    ENDCASE
+;
+
+: RESTORE-INPUT ( column {line filepos}? source-id n -- flag )
+    over source-id <> IF ndrop true EXIT THEN
+    drop
+    CASE
+       -1 OF restore-column ENDOF
+       0  OF restore-column ENDOF
+       drop restore-file EXIT
+    ENDCASE
+;
+
+privatize