;assumes multipage.mistie
(define h-string-trim-blanks
(lambda (s)
(let ((orig-n (string-length s)))
(let ((i 0) (n orig-n))
(let loop ((k i))
(unless (>= k n)
(cond ((char-whitespace? (string-ref s k))
(loop (+ k 1)))
(else (set! i k)))))
(let loop ((k (- n 1)))
(unless (<= k i)
(cond ((char-whitespace? (string-ref s k))
(loop (- k 1)))
(else (set! n (+ k 1))))))
(if (and (= i 0) (= n orig-n)) s
(substring s i n))))))
(define h-labels '())
(mistie-def-ctl-seq 'label
(lambda ()
(let ((lbl (h-string-trim-blanks (h-read-group))))
(write `(set! h-labels
(cons (list ,lbl ,h-page-count
,h-recent-label ,h-recent-label-value )
h-labels)) h-aux-port)
(newline h-aux-port))))
(define h-resolve-xref
(lambda (lbl)
(let ((val (assoc lbl h-labels)))
(if val
(begin (display "")
(display (list-ref val 3))
(display ""))
(begin
(display "***")
(display lbl)
(display "***"))))))
(mistie-def-ctl-seq 'ref
(lambda ()
(let ((lbl (h-string-trim-blanks (h-read-group))))
(h-resolve-xref lbl))))
(define h-bibitem-number 0)
(mistie-def-ctl-seq 'bibitem
(lambda ()
(set! h-bibitem-number (+ h-bibitem-number 1))
(set! h-recent-label (string-append "BIBITEM_"
(number->string h-bibitem-number)))
(set! h-recent-label-value h-bibitem-number)
(display "[")
(display h-bibitem-number)
(display "] ")
((mistie-lookup-ctl-seq 'label))))
(mistie-def-ctl-seq 'cite
(lambda ()
(h-ignore-spaces)
(let ((ch (read-char)))
(unless (eqv? ch #\{)
(error "cite: expected #\\{ but got" ch)))
(write-char #\[)
(let loop ()
(h-resolve-xref
(h-string-trim-blanks
(h-read-until
(lambda (c)
(or (eqv? c #\,) (eqv? c #\}))))))
(unless (char=? (read-char) #\}) (write-char #\,) (loop)))
(write-char #\])))