diff options
Diffstat (limited to 'inc2scm')
| -rwxr-xr-x | inc2scm | 190 | 
1 files changed, 190 insertions, 0 deletions
| @@ -0,0 +1,190 @@ +#! /usr/local/bin/scm \ %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 +- !# +;; Copyright (C) 1991-1999 Free Software Foundation, Inc. +;; +;; 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, 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 software; see the file COPYING.  If not, write to +;; the Free Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111, USA. +;; +;; As a special exception, the Free Software Foundation gives permission +;; for additional uses of the text contained in its release of GUILE. +;; +;; The exception is that, if you link the GUILE library with other files +;; to produce an executable, this does not by itself cause the +;; resulting executable to be covered by the GNU General Public License. +;; Your use of that executable is in no way restricted on account of +;; linking the GUILE library code into it. +;; +;; This exception does not however invalidate any other reasons why +;; the executable file might be covered by the GNU General Public License. +;; +;; This exception applies only to the code released by the +;; Free Software Foundation under the name GUILE.  If you copy +;; code from other Free Software Foundation releases into a copy of +;; GUILE, as the General Public License permits, the exception does +;; not apply to the code that you add in this way.  To avoid misleading +;; anyone as to the status of such modified files, you must delete +;; this exception notice from them. +;; +;; If you write modifications of your own for GUILE, it is your choice +;; whether to permit this exception to apply to your modifications. +;; If you do not wish that, delete this exception notice. + +;;;; "inc2scm", Convert numeric C #defines to Scheme definitions. +;;; Author: Aubrey Jaffer. + +(define (go-script) +  (cond ((not *script*)) +	((< 1 (- (length *argv*) *optind*)) +	 (apply inc2scm (list-tail *argv* *optind*))) +	(else +	 (display "\ +\ +Usage: inc2scm defines.scm [pre:] [/usr/include/] file1.h file2.h ... +\ +  Appends to DEFINES.SCM the Scheme translations of the numeric +  #define statements in /USR/INCLUDE/FILE1.H, /USR/INCLUDE/FILE2.H, ... + +  PRE: is prepended to those scheme names lacking a prefix. + +  /USR/INCLUDE/ defaults to /usr/include/. +" +		  (current-error-port)) +	 (exit #f)))) + +(require 'string-search) +(require 'printf) +(require 'scanf) + +(define (StudlyCaps->dashed-name nstr) +  (do ((idx (+ -1 (string-length nstr)) (+ -1 idx))) +      ((> 2 idx)) +    (cond ((and (char-upper-case? (string-ref nstr (+ -1 idx))) +		(char-lower-case? (string-ref nstr idx))) +	   (set! nstr +		 (string-append (substring nstr 0 (+ -1 idx)) +				"-" +				(substring nstr (+ -1 idx) +					   (string-length nstr))))) +	  ((and (char-lower-case? (string-ref nstr (+ -1 idx))) +		(char-upper-case? (string-ref nstr idx))) +	   (set! nstr +		 (string-append (substring nstr 0 idx) +				"-" +				(substring nstr idx +					   (string-length nstr))))))) +  nstr) + +;; SCHEMEIFY-NAME: +;; * Changes _ to - +;; * Changes the first - to : if it is within the first 3 characters. +;; * inserts dashes between `StudlyCaps' + +(define (schemeify-name pre name) +  (define nstr (string-subst name "_" "-")) +  (let ((sid (string-index nstr #\-))) +    (cond ((and sid (< sid 3)) (string-set! nstr sid #\:) +	   nstr) +	  (pre (string-append pre (StudlyCaps->dashed-name nstr))) +	  (else (StudlyCaps->dashed-name nstr))))) + +(define (extract-defineds port) +  (define sharp (string #\newline #\#)) +  (define defineds '()) +  (do ((find? (find-string-from-port? sharp port) +	      (find-string-from-port? sharp port))) +      ((not find?) (reverse defineds)) +    (do ((chr (read-char port) (read-char port))) +	((or (eof-object? chr) (not (char-whitespace? chr))) +	 (and (eqv? chr #\d) +	      (let ((op #f) (va #f)) +		(fscanf port "efine%*[ \t]%s%*[ \t]%s" op va) +		(if (and op va +			 (not (string-index op #\()) +			 (not (eqv? #\_ (string-ref op 0))) +			 (not (equal? "int" va))) +		    (set! defineds (cons op defineds))))))))) + +(define (scm<-includes scmname pre non-local? . filenames) +  (define tmpprog "tmpprog") +  (call-with-output-file (string-append tmpprog ".c") +    (lambda (cport) +      (for-each (lambda (filename) +		  (fprintf cport +			   (if non-local? +			       "#include <%s>\\n" +			       "#include \"%s\"\\n") +			   filename)) +		filenames) +      (for-each +       (lambda (args) (apply fprintf cport args)) +       `(("#include <stdio.h>\\n") +	 ("void pSl(sname, value)\\n") +	 ("     char sname[];\\n") +	 ("     int  value;\\n") +	 ("{\\n") +	 ("%s\\n" "  printf(\"(define %s %d)\\n\", sname, value);") +	 ("}\\n") +	 ("\\n") +	 ("int main(argc, argv)\\n") +	 ("     int argc;\\n") +	 ("     char *argv[];\\n") +	 ("{\\n") +	 )) +      (for-each +       (lambda (filename) +	 (if non-local? +	     (set! filename (string-append non-local? filename))) +	 (fprintf cport "/* Extract #define values from %s */\\n" filename) +	 (fprintf cport "%s %s%s\\n" +		  "  printf(\";;inc2scm extracted #define values from" +		  filename +		  "\\n\");") +	 (for-each +	  (lambda (name) (fprintf cport "  pSl(\"%s\", %s);\\n" +				  (schemeify-name pre name) name)) +	  (call-with-input-file filename extract-defineds))) +       filenames) +      (fprintf cport "}\\n"))) +  (cond +   ((not (zero? (system (sprintf #f "cc -o %s %s.c" tmpprog tmpprog))))) +   ((not (zero? (system (sprintf #f "./%s >> %s" tmpprog scmname))))))) + +(define (scm<-usr/includes scmname . filenames) +  (define pre (let ((first (car filenames))) +		(cond ((substring-ci? ".h" first) #f) +		      (else (set! filenames (cdr filenames)) first)))) +  (define include-path "/usr/include/") +  (let* ((first (car filenames))) +    (cond ((memv (string-ref first (+ -1 (string-length first))) '(#\\ #\/)) +	   (set! include-path first) +	   (set! filenames (cdr filenames))))) +  (apply scm<-includes scmname pre include-path filenames) +  (delete-file "tmpprog.c") +  (delete-file "tmpprog")) +(define inc2scm scm<-usr/includes) + +(define (scm<-h* scmname . filenames) +  (define pre (let ((first (car filenames))) +		(cond ((substring-ci? ".h" first) first) +		      (else (set! filenames (cdr filenames)) #f)))) +  (apply scm<-includes scmname pre #f filenames) +  (delete-file "tmpprog.c") +  (delete-file "tmpprog")) +(define h2scm scm<-h*) + +(go-script) + +;;; Local Variables: +;;; mode:scheme +;;; End: | 
