Fixed interpret-mode behaviour of S".
authorTim Vaughan <tgvaughan@gmail.com>
Thu, 27 Oct 2016 12:10:44 +0000 (01:10 +1300)
committerTim Vaughan <tgvaughan@gmail.com>
Thu, 27 Oct 2016 12:10:44 +0000 (01:10 +1300)
src/lib_6_strings.4th

index aec678b..753e756 100644 (file)
         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?
 
                 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