(Arne Babenhauserheide)
2013-09-05: incomplete “does this end in an uneven number of backslashes” incomplete “does this end in an uneven number of backslashes” function.
diff --git a/wisp-guile.w b/wisp-guile.w
--- a/wisp-guile.w
+++ b/wisp-guile.w
@@ -10,6 +10,36 @@
;; real comments as ;\REALCOMMENTHERE
;;
;; -Author: Arne Babenhauserheide
+
+define : endsinunevenbackslashes text
+ if : = 0 : string-length text
+ . #f
+ if : = 1 : string-length text
+ if : equal? "\\" : string-take-right text 1
+ . #t ; only contains a single backslash, so it ends in uneven backslashes
+ . #f ; only contains a non-backslash, so it does not end in uneven backslashes
+ let loop ; else: check the rest
+ : last2 : string-take-right text 2
+ rest : string-drop-right text 2
+ ; repetition condition: last2 is \\ and at least 2 chars left in rest
+ if : equal last2 "\\\\"
+ if : < 1 : string-length rest
+ loop (string-take-right rest 2) (string-drop-right rest 2)
+ ; uneven number of final characters finish condition
+ if ; TODO finish this.
+ and
+ = 1 : string-length rest
+ equal? last2 "\\\\"
+ not : equal? rest "\\"
+ . #t
+ if ; even number of final characters finish condition
+ and
+ = 0 : string-length rest
+ equal? last2 "\\\\"
+ . #t
+
+
+
define : nostringandbracketbreaks inport
; Replace end of line characters in brackets and strings
; FIXME: Breaks if the string is shorter than 2 chars
@@ -45,16 +75,25 @@ define : nostringandbracketbreaks inport
; 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
+ ; FIXME: This fails to capture ";"
char=? nextchar #\"
or
- . instring ; when I’m in a string, I can get out
+ and
+ . instring ; when I’m in a string, I can get out
+ or
+ not char=? lastchar #\\ ; if the last char is not a backslash (escaped quote)
+ ; or the last char is a backslash preceded by an uneven number of backslashes (so the backslash is actually an escaped backslash)
+ and : char=? lastchar #\\
+ ; not : equal? #f : string-match "\\([^\\]\\)+\\(\\\\\\\\\\)*[\\]$" text ; matches [^\](\\)*\$ - non-backslash + arbitrary number of pairs of backslashes + final backslash which undoes the escaping from the lastchar (by actually escaping the lastchar)
+ endsinunevenbackslashes text
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
and : not instring ; outside of strings, brackets are pseudo-whitespace, too
- or
+ or
char=? lastchar #\(
char=? lastchar #\)
+ ; FIXME: This fails when I get "\""
not incomment
< incharform 1
set! instring : not instring
@@ -93,7 +132,6 @@ define : nostringandbracketbreaks inport
set! incharform 2
; check for brackets
- ; FIXME: this fails to parse.
when : and ( char=? nextchar #\( ) ( not instring ) ( not incomment ) ( = incharform 1 )
; format #f "add bracketlevel: lastchar ~a nextchar ~a instring ~a incomment ~a incharform ~a" lastchar nextchar instring incomment incharform
; newline
@@ -111,6 +149,7 @@ define : nostringandbracketbreaks inport
; mark the start of a comment, so we do not have to
; repeat the string matching in later code. We include
; the comment character!
+ ; not (instring or inbrackets) = neither instring nor inbrackets
if incommentfirstchar
set! text : string-append text ( string nextchar ) "\\REALCOMMENTHERE"
; when not in brackets or string or starting a