;;;
;;; geninsn - generate VM instruction related files
;;;
;;;   Copyright (c) 2004-2005 Shiro Kawai, All rights reserved.
;;;   
;;;   Redistribution and use in source and binary forms, with or without
;;;   modification, are permitted provided that the following conditions
;;;   are met:
;;;   
;;;   1. Redistributions of source code must retain the above copyright
;;;      notice, this list of conditions and the following disclaimer.
;;;  
;;;   2. Redistributions in binary form must reproduce the above copyright
;;;      notice, this list of conditions and the following disclaimer in the
;;;      documentation and/or other materials provided with the distribution.
;;;  
;;;   3. Neither the name of the authors nor the names of its contributors
;;;      may be used to endorse or promote products derived from this
;;;      software without specific prior written permission.
;;;  
;;;   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
;;;   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
;;;   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
;;;   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
;;;   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
;;;   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
;;;   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
;;;   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
;;;   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
;;;   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
;;;   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;;  
;;;  $Id: geninsn,v 1.2 2005/04/12 01:42:27 shirok Exp $
;;;

;; Reads vminsn.scm and generate vminsn.c and gauche/vminsn.h

(use gauche.cgen)
(use gauche.parameter)
(use srfi-13)
(use text.tr)
(use file.util)
(use util.match)

(define (c-insn-name name)
  (string-append "SCM_VM_" (string-tr (x->string name) "-" "_")))

(define *preamble*
  (list #`"/* Generated automatically from vminsn.scm */"
        #`"/* DO NOT EDIT */"))

(define *unit*
  (make <cgen-unit>
    :name "vminsn"
    :preamble *preamble*
    :c-file "vminsn.c"
    :h-file "gauche/vminsn.h"
    :init-prologue ""
    :init-epilogue ""
    ))

(define (main args)
  (let ((insns (file->sexp-list (get-optional (cdr args) "vminsn.scm"))))
    (parameterize ((cgen-current-unit *unit*))
      
      (cgen-extern "enum {")

      (dolist (insn insns)
        (match insn
          ((_ name num-params operand-type)
           (cgen-extern #`"  ,(c-insn-name name),,")
           (cgen-body (format "DEFINSN(~a, \"~a\", ~a, ~a)"
                              (c-insn-name name) name
                              num-params
                              (string-tr (x->string operand-type)
                                         "a-z+-" "A-Z__")))
           )
          (else
           (warn "unrecognized form: ~s" insn))))

      (cgen-extern "  SCM_VM_NUM_INSNS" "};")

      (cgen-emit-h (cgen-current-unit))
      (cgen-emit-c (cgen-current-unit))
      0)))

;; Local variables:
;; mode: scheme
;; end:

