;;;;
;;;; main.stk -- Skribebibtex Main
;;;;
;;;; Copyright © 2004 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
;;;;
;;;;
;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
;;;; the Free Software Foundation; either version 2 of the License, or
;;;; (at your option) any later version.
;;;;
;;;; This program 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 General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Author: Erick Gallesio [eg@essi.fr]
;;;; Creation date: 22-Oct-2004 10:29 (eg)
;;;; Last file update: 26-Oct-2004 21:52 (eg)
;;;;
(define *bibtex-strings* (make-hash-table string=?))
(define *debug* (getenv "DEBUG"))
(define *in* (current-input-port))
(define *out* (current-output-port))
(define (bibtex-string-def! str val)
(hash-table-put! *bibtex-strings* str val))
(define (bibtex-string-ref str)
(list (hash-table-get *bibtex-strings* str str)))
(define (lex-char accent letter)
(list 'CHAR
(case accent
((#\') (case letter
((#\a) "á") ((#\e) "é") ((#\i) "í") ((#\o) "ó") ((#\u) "ú")
((#\A) "Á") ((#\E) "É") ((#\I) "Í") ((#\O) "Ó") ((#\U) "ú")
(else "?")))
((#\`) (case letter
((#\a) "à") ((#\e) "è") ((#\i) "ì") ((#\o) "ò") ((#\u) "ù")
((#\A) "À") ((#\E) "È") ((#\I) "Ì") ((#\O) "Ò") ((#\U) "Ù")
(else "?")))
((#\^) (case letter
((#\a) "â") ((#\e) "ê") ((#\i) "î") ((#\o) "ô") ((#\u) "û")
((#\A) "Â") ((#\E) "Ê") ((#\I) "Î") ((#\O) "Ô") ((#\U) "Û")
(else "?")))
((#\") (case letter
((#\a) "ä") ((#\e) "ë") ((#\i) "ï") ((#\o) "ö") ((#\u) "ü")
((#\A) "Ä") ((#\E) "Ë") ((#\I) "Ï") ((#\O) "Ö") ((#\U) "Ü")
(else "?")))
(else "?"))))
(define (make-bibentry kind key infos)
(define (pretty-string s)
(if (and (string? s)
(>= (string-length s) 2)
(eq? #\" (string-ref s 0))
(eq? #\" (string-ref s (- (string-length s) 1))))
(substring s 1 (- (string-length s) 1))
s))
(format *out* ";;;;\n(~A ~S\n" (car kind) (car key))
(for-each (lambda (x) (format *out* " (~A ~S)\n"
(car x)
(pretty-string (cadr x))))
infos)
(format *out* ")\n\n"))
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
(include "bibtex-lex.stk")
(include "bibtex-parser.stk")
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
(define (bibtex2scheme in out)
(let* ((lex (bibtex-lex in))
(scan (lambda ()
(let ((tok (lexer-next-token lex)))
(when *debug*
(format (current-error-port) "token = ~S\n" tok))
tok)))
(error (lambda (a b) (error 'bibtex-parser "~A~A" a b))))
(parser scan error)))
(define (main args)
;; Parse the program arguments
(parse-arguments args
"Usage: skribebibtex [options] [input]"
(("help" :alternate "h" :help "provide help for the command")
(arg-usage (current-error-port))
(exit 0))
(("options" :help "display the options and exit")
(arg-usage (current-output-port) #t)
(exit 0))
(("output" :alternate "o" :arg file :help "set the output to <file>")
(let ((port (open-file file "w")))
(if port
(set! *out* port)
(die (format "~A: bad output file ~S" 'skribebibtex file) 1))))
(else
(cond
((= (length other-arguments) 1)
(let* ((file (car other-arguments))
(port (open-file file "r")))
(if port
(set! *in* file)
(die (format "~A: bad input file ~S" 'skribebibtex file) 1)))))))
(bibtex2scheme *in* *out*))