aboutsummaryrefslogtreecommitdiff
path: root/module/c/line-fold.scm
blob: c61c2c701a6609809a78b5ea4bb0f5573213fbd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(define-module (c line-fold)
  :use-module (srfi srfi-1)
  :use-module (srfi srfi-71)
  :export (fold-lines))

(define (line-continued? line)
  (and (not (string-null? line))
       (char=? #\\ (string-ref line (1- (string-length line))))))

(define (strip-backslash line)
  (string-drop-right line 1))

(define (fold-lines string)
  (with-output-to-string
    (lambda ()
      (let loop ((lines (string-split string #\newline)))
        (cond ((null? lines) 'NOOP)
              ((null? (cdr lines))
               ;; TODO error message if last character is a backslash
               (display (car lines))
               (newline))
              (else
               (let ((to-merge remaining (span line-continued? lines)))
                 (for-each display (map strip-backslash to-merge))
                 (display (car remaining))
                 (newline)
                 (for-each (lambda _ (newline))
                           (iota (length to-merge)))
                 (loop (cdr remaining)))))))))