wisp
 
(Arne Babenhauserheide)
2013-04-29: start a line splitter.

start a line splitter.

diff --git a/wisp.w b/wisp.w
--- a/wisp.w
+++ b/wisp.w
@@ -6,7 +6,8 @@
 ;; nostringandbracketbreaks INPORT
 ;; 
 ;; Replace linebreaks within brackets and strings in the INPORT by the
-;; placeholders \\STRING_BREAK_N and \\STRING_BREAK_R.
+;; placeholders \STRING_BREAK_N and \STRING_BREAK_R. Also identify
+;; real comments as ;\REALCOMMENTHERE
 ;; 
 ;; -Author: Arne Babenhauserheide
 define : nostringandbracketbreaks inport
@@ -17,10 +18,13 @@ define : nostringandbracketbreaks inport
           nextchar : read-char inport
           text ""
           incomment #f
+          incommentfirstchar #f ; first char of a comment
           instring #f
           inbrackets 0
           incharform 0 ; #\<something>
         while : not : eof-object? nextchar
+            ; incommentfirstchar is only valid for exactly one char
+            when incommentfirstchar : set! incommentfirstchar #f
             ; already started char forms win over everything, so process them first.
             ; already started means: after the #\
             when : >= incharform 2
@@ -48,6 +52,7 @@ define : nostringandbracketbreaks inport
                      not instring
                      < incharform 2
                 set! incomment #t
+                set! incommentfirstchar #t
                 ; this also closes any potential charform
                 set! incharform 0
             when
@@ -85,8 +90,12 @@ define : nostringandbracketbreaks inport
                     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
+                ; mark the start of a comment, so we do not have to repeat the string matching in later code
+                if incommentfirstchar
+                    set! text : string-append text ( string nextchar ) "\\REALCOMMENTHERE"
+                    ; when not in brackets or string or starting a
+                    ; comment: just append the char
+                    set! text : string-append text : string nextchar
 
             set! lastchar nextchar
             set! nextchar : read-char inport
@@ -94,6 +103,64 @@ define : nostringandbracketbreaks inport
         . text
 
 
+; As next part we have to split a single line into indentation, content and comment.
+define : splitline inport
+    let
+        : nextchar : read-char inport
+          inindentunderbar #t
+          inindent #t ; it always begins in indent
+          incomment #f ; but not in a comment
+          commentstart #f
+          commentstartidentifier "\\REALCOMMENTHERE"
+          commentstartidentifierlength 16
+          commentidentifierindex 0
+          indent 0
+          content ""
+          comment ""
+        while : not : eof-object? nextchar
+            ; check wether we leave the initial underbars
+            when : and inindentunderbar : not : char=? nextchar #\_
+                set! inindentunderbar #f
+                set! indent : + indent 1
+                continue
+            ; check whether we leave the indentation
+            when : and inindent : not : char=? nextchar #\space
+                set! inindent #f
+                set! indent : + indent 1
+                continue
+            ; check whether we leave the content
+            when : and ( not incomment ) : char=? nextchar #\;
+                set! commentstart #t
+                set! comment : string-append comment : string nextchar
+                continue
+            ; check whether we stay in the commentcheck
+            when : and commentstart : char=? nextchar : char : string-ref commentstartidentifier commentidentifierindex
+                 set! commentidentifierindex : + commentidentifierindex 1
+                 set! comment : string-append comment : string nextchar
+                 when : = commentidentifierindex : - commentstartidentifierlength 1
+                     set! commentstart #f
+                     set! incomment #t
+                     ; reset used variables
+                     set! commentidentifierindex 0
+                     set! comment ""
+                 continue
+            ; if we cannot complete the commentcheck, we did not start a real comment. Append it to the content
+            when : and commentstart : not : char=? nextchar : char : string-ref commentstartidentifier commentidentifierindex
+                set! commentstart #f
+                set! content : string-append content comment
+                set! comment ""
+                set! commentidentifierindex 0
+                continue
+            ; if we are in the comment, just append to the comment
+            when incomment
+                set! comment : string-append comment : string nextchar
+                continue
+            ; if nothing else is true, we are in the content
+            set! content : string-append content : string nextchar
+        ; return the indentation, the content and the comment
+        ' indent content comment
+
+
 ; first step: Be able to mirror a file to stdout
 
 let*