#!/home/arne/wisp/wisp-multiline.sh ; !# ; 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 ;; ; first step: Be able to mirror a file to stdout let* : filename : list-ref ( command-line ) 1 origfile : open-file filename "r" ; mode nextchar : read-char origfile text "" while : not : eof-object? nextchar set! text : string-append text : string nextchar set! nextchar : read-char origfile display text newline ; (modify-syntax-entry ?: "w")