From 353259d7b95b1783b1fb0f572df4b1bb43cca9c4 Mon Sep 17 00:00:00 2001 From: Tim Vaughan Date: Fri, 28 Oct 2016 01:10:44 +1300 Subject: [PATCH] Fixed interpret-mode behaviour of S". --- src/lib_6_strings.4th | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/lib_6_strings.4th b/src/lib_6_strings.4th index aec678b..753e756 100644 --- a/src/lib_6_strings.4th +++ b/src/lib_6_strings.4th @@ -37,12 +37,19 @@ DROP ; -( Compile-mode word which compiles everything until the next - double quote as a litstring. ) -: S" IMMEDIATE ( -- addr len ) - ['] LITSTRING , ( compile LITSTRING ) - HERE ( save the address of the length word on the stack ) - 0 , ( dummy length - we don't know what it is yet ) +: COMPILING? STATE @ 0<> ; + +( In compile mode, word compiles everything until the next + double quote as a litstring. Otherwise, dynamically allocates + memory and stores string there, returning address and length. ) +: S" IMMEDIATE ( -- addr len ) + COMPILING? IF + ['] LITSTRING , ( compile LITSTRING ) + HERE ( save the address of the length word on the stack ) + 0 , ( dummy length - we don't know what it is yet ) + ELSE + HERE ( save the starting address on the stack ) + THEN BEGIN >IN @ #IB @ >= IF \ End of IB? @@ -53,13 +60,18 @@ DUP [CHAR] " <> WHILE - C, ( copy character ) + , ( copy character ) REPEAT DROP ( drop the double quote character at the end ) - DUP ( get the saved address of the length word ) - HERE SWAP - ( calculate the length ) - 1- ( subtract 1 (because we measured from the start of the length word) ) - SWAP ! ( and back-fill the length location ) + + COMPILING? IF + DUP ( get the saved address of the length word ) + HERE SWAP - ( calculate the length ) + 1- ( subtract 1 (because we measured from the start of the length word) ) + SWAP ! ( and back-fill the length location ) + ELSE + DUP HERE SWAP - + THEN ; ( Compile-mode word which compiles everything until the -- 2.20.1