#!/bin/bash
# -*- scheme -*-
exec guile -s $0 "$@"
!#

;; 	Copyright (C) 2005 Andy Wingo
;;
;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public
;; License as published by the Free Software Foundation; either
;; version 2.1 of the License, or (at your option) any later version.
;;
;; This library is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Lesser General Public License for more details.
;;
;; You should have received a copy of the GNU Lesser General Public
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

;; Quick hack to make some data files that gnuplot can read from
;; mass-elements. Guile 1.6.

(use-modules (srfi srfi-13)
             (srfi srfi-1)
             (ice-9 optargs)
             (ice-9 popen))

(define *phases* '(create set run destroy))

(define (read-lines port)
  (let lp ((lines '()))
    (let ((x (read-line port)))
      (if (eof-object? x)
          (begin
            (close-port port)
            (reverse! lines))
          (lp (cons x lines))))))

(define (run-test n-identities)
  (format #t "; running test: ~a\n" n-identities)
  (let lp ((in (read-lines
                (open-input-pipe
                 (format #f "./mass-elements ~A"
                         (number->string n-identities)))))
           (out '()))
    (if (null? in)
        (begin
          (or (eq? (length out) 4) (error "Invalid mass_elements output"))
          (map cons *phases* (reverse! out)))
        (let ((line (car in)))
          (if (eqv? (string-ref line 0) #\*)
              (lp (cdr in) out)
              (lp (cdr in)
                  (cons (fold (lambda (x ret) (+ (* ret 60) x)) 0
                              (map (lambda (x) (with-input-from-string x read))
                                   (string-split line #\:)))
                        out)))))))

(define (run-tests start stop step)
  (let lp ((n start) (out '()))
    (if (> n stop)
        (reverse! out)
        (lp (+ n step)
            (acons n (run-test n) out)))))

(define (output-results results)
  (let ((p (open-output-file "mass_elements.data")))
    (display "#num_identities creation state-change run destroy\n" p)
    (let lp ((in results))
      (if (not (null? in))
          (let* ((line (car in))
                 (n (car line)))
            (display n p)
            (for-each
             (lambda (t) (format p " ~a" t))
             (map cdr (cdr line)))
            (newline p)
            (lp (cdr in)))))
    (close-port p)))

(output-results
 (apply run-tests (map string->number (cdr (program-arguments)))))