#!/usr/bin/env guile
; !#
; first step: Be able to mirror a file to stdout
let ((i (display
1)))
display 1
let : : a "rcie
rcie
crie"
display "
"
let*
: filename : list-ref ( command-line ) 1
origfile : open-file filename "r" ; mode
nextchar : read-char origfile
; Replace end of line characters in brackets and strings
let*
: text ""
incomment #f
instring #f
inbrackets 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
display text
newline