(Arne Babenhauserheide)
2013-04-28: correctly get rid of linebreaks in strings and brackets in a correctly get rid of linebreaks in strings and brackets in a preprocessing step.
diff --git a/tests/linebreaks.w b/tests/linebreaks.w
new file mode 100644
--- /dev/null
+++ b/tests/linebreaks.w
@@ -0,0 +1,14 @@
+; Test linebreaks in strings and brackets
+
+"flubbub
+
+flabbab"
+
+hrug (nadda
+madda gadda "shoktom
+ mee" " sep
+ka"
+ hadda)
+ gom
+
+flu
diff --git a/wisp.w b/wisp.w
--- a/wisp.w
+++ b/wisp.w
@@ -3,45 +3,90 @@
; we need to be able to replace end-of-line characters in brackets and strings
-;; define : nostringandbracketbreaks inport
-;; ; Replace end of line characters in brackets and strings
-;; let*
-;; : nextchar : read-char inport
-;; text ""
-;; incomment #f
-;; instring #f
-;; inbrackets 0
-;; incharform 0
-;; while : not : eof-object? nextchar
-;; when : and ( char=? nextchar #\" ) ( not incomment )
-;; set! instring : not instring
-;; display instring
-;; when : and ( char=? nextchar #\; ) ( not incomment ) ( not instring )
-;; set! incomment #t
-;; when
-;; and incomment
-;; not instring
-;; or
-;; char=? nextchar #\newline
-;; char=? nextchar #\linefeed
-;; set! incomment #f
-;; ; TODO: This still treats cod as in brackets which is not, possibly because it cannot cope with char literals: #\( and #\)
-;; when : and ( char=? nextchar #\( ) ( not instring ) ( not incomment )
-;; set! inbrackets : + inbrackets 1
-;; when : and ( char=? nextchar #\) ) ( not instring ) ( not incomment )
-;; set! inbrackets : - inbrackets 1
-;;
-;; if : or instring : > inbrackets 0
-;; if : char=? nextchar #\linefeed
-;; set! text : string-append text "\\LINE_BREAK_N"
-;; if : char=? nextchar #\newline
-;; set! text : string-append text "\\LINE_BREAK_R"
-;; set! text : string-append text : string nextchar
-;; ; when not in brackets or string: just append the char
-;; set! text : string-append text : string nextchar
-;;
-;; set! nextchar : read-char origfile
-;;
+define : nostringandbracketbreaks inport
+ ; Replace end of line characters in brackets and strings
+ ; FIXME: Breaks if the string is shorter than 2 chars
+ let*
+ : lastchar : read-char inport
+ nextchar : read-char inport
+ text ""
+ incomment #f
+ instring #f
+ inbrackets 0
+ incharform 0 ; #\<something>
+ while : not : eof-object? nextchar
+ ; already started char forms win over everything, so process them first.
+ ; already started means: after the #\
+ when : >= incharform 2
+ if : char=? nextchar #\space
+ set! incharform 0
+ ; else
+ set! incharform : + incharform 1
+ ; check if we switch to a string: last char is space, linebreak or in a string, not in a charform, not in a comment
+ when
+ and
+ char=? nextchar #\"
+ or
+ . instring ; when I’m in a string, I can get out
+ char=? lastchar #\space ; when the last char was a space, I can get into a string
+ char=? lastchar #\linefeed ; same for newline chars
+ char=? lastchar #\newline
+ not incomment
+ < incharform 1
+ set! instring : not instring
+ ; check if we switch to a comment
+ when
+ and
+ char=? nextchar #\;
+ not incomment
+ not instring
+ < incharform 2
+ set! incomment #t
+ ; this also closes any potential charform
+ set! incharform 0
+ when
+ and incomment
+ or
+ char=? nextchar #\newline
+ char=? nextchar #\linefeed
+ set! incomment #f
+
+ ; check for the beginning of a charform
+ when
+ and
+ not instring
+ not incomment
+ char=? lastchar #\space
+ char=? nextchar #\#
+ set! incharform 1
+ ; check whether a charform is continued
+ when
+ and
+ = incharform 1
+ char=? lastchar #\#
+ char=? nextchar #\\
+ set! incharform 2
+
+ ; check for brackets
+ when : and ( char=? nextchar #\( ) ( not instring ) ( not incomment ) ( = incharform 0 )
+ set! inbrackets : + inbrackets 1
+ when : and ( char=? nextchar #\) ) ( not instring ) ( not incomment ) ( = incharform 0 )
+ set! inbrackets : - inbrackets 1
+
+ if : or instring ( > inbrackets 0 )
+ if : char=? nextchar #\linefeed
+ set! text : string-append text "\\LINE_BREAK_N"
+ if : char=? nextchar #\newline
+ set! text : string-append text "\\LINE_BREAK_R"
+ set! text : string-append text : string nextchar
+ ; when not in brackets or string: just append the char
+ set! text : string-append text : string nextchar
+
+ set! lastchar nextchar
+ set! nextchar : read-char inport
+ ; return the text
+ . text
+
; first step: Be able to mirror a file to stdout
@@ -53,7 +98,7 @@ let*
while : not : eof-object? nextchar
set! text : string-append text : string nextchar
set! nextchar : read-char origfile
+ set! text : call-with-input-string text nostringandbracketbreaks
display text
newline
-; (modify-syntax-entry ?: "w")