;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Test of R6RS get-datum, comparable to the parsing benchmark.
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(import (rnrs base)
        (rnrs control)
        (rnrs io ports)
        (rnrs io simple))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; get-datum benchmark comparable to the parsing benchmark.
;
; Reads nboyer.sch into a string before timing begins.
;
; The timed portion of the benchmark parses the string
; representation of nboyer.sch 1000 times.
;
; The output of that parse is checked by comparing it
; the the value returned by the read procedure.
;
; Usage:
;     (read-benchmark n input)
;     (read-from-string-port-benchmark n input)
;     
;
; n defaults to 1000, and input defaults to "nboyer.sch".
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define (read-from-file-benchmark input t)
  (call-with-port
   (open-file-input-port input (file-options) 'block t)
   (lambda (in)
     (do ((x (read in) (read in))
          (y #f x)
          (i 0 (+ i 1)))
         ((eof-object? x) y)))))

(define (main)
  (let* ((count (read))
         (input1 (read))
         (output (read))
         (s2 (number->string count))
         (s1 input1)
         (name "read1:utf-8")
         (t (make-transcoder (utf-8-codec))))
    (run-r6rs-benchmark
     (string-append name ":" s2)
     count
     (lambda () (read-from-file-benchmark (hide count input1) t))
     (lambda (result) (equal? result output)))))