;;; output.scm -- Output documentation "snarffed" from C files in Texi/GDF. ;;; ;;; Copyright 2006-2012 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 3 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 St, Fifth Floor, Boston, MA 02110-1301 USA (define-module (system documentation output) :use-module (srfi srfi-1) :use-module (srfi srfi-13) :use-module (srfi srfi-39) :autoload (system documentation c-snarf) (run-cpp-and-extract-snarfing) :export (schemify-name scheme-procedure-texi-line procedure-gdf-string procedure-texi-documentation output-procedure-texi-documentation-from-c-file *document-c-functions?*)) ;;; Author: Ludovic Courtès ;;; ;;; Commentary: ;;; ;;; This module provides support function to issue Texinfo or GDF (Guile ;;; Documentation Format) documentation from "snarffed" C files. ;;; ;;; Code: ;;; ;;; Utility. ;;; (define (schemify-name str) "Turn @var{str}, a C variable or function name, into a more ``Schemey'' form, e.g., one with dashed instead of underscores, etc." (string-map (lambda (chr) (if (eq? chr #\_) #\- chr)) (if (string-suffix? "_p" str) (string-append (substring str 0 (- (string-length str) 2)) "?") str))) ;;; ;;; Issuing Texinfo and GDF-formatted doc (i.e., `guile-procedures.texi'). ;;; GDF = Guile Documentation Format ;;; (define *document-c-functions?* ;; Whether to mention C function names along with Scheme procedure names. (make-parameter #t)) (define (scheme-procedure-texi-line proc-name args required-args optional-args rest-arg?) "Return a Texinfo string describing the Scheme procedure named @var{proc-name}, whose arguments are listed in @var{args} (a list of strings) and whose signature is defined by @var{required-args}, @var{optional-args} and @var{rest-arg?}." (string-append "@deffn {Scheme Procedure} " proc-name " " (string-join (take args required-args) " ") (string-join (take (drop args required-args) (+ optional-args (if rest-arg? 1 0))) " [" 'prefix) (if rest-arg? "...]" "") (make-string optional-args #\]))) (define (procedure-gdf-string proc-doc) "Issue a Texinfo/GDF docstring corresponding to @var{proc-doc}, a documentation alist as returned by @code{parse-snarfed-line}. To produce actual GDF-formatted doc, the resulting string must be processed by @code{makeinfo}." (let* ((proc-name (assq-ref proc-doc 'scheme-name)) (args (assq-ref proc-doc 'arguments)) (signature (assq-ref proc-doc 'signature)) (required-args (assq-ref signature 'required)) (optional-args (assq-ref signature 'optional)) (rest-arg? (assq-ref signature 'rest?)) (location (assq-ref proc-doc 'location)) (file-name (car location)) (line (cadr location)) (documentation (assq-ref proc-doc 'documentation))) (string-append " " ;; form feed proc-name (string #\newline) (format #f "@c snarfed from ~a:~a~%" file-name line) (scheme-procedure-texi-line proc-name (map schemify-name args) required-args optional-args rest-arg?) (string #\newline) documentation (string #\newline) "@end deffn" (string #\newline)))) (define (procedure-texi-documentation proc-doc) "Issue a Texinfo docstring corresponding to @var{proc-doc}, a documentation alist as returned by @var{parse-snarfed-line}. The resulting Texinfo string is meant for use in a manual since it also documents the corresponding C function." (let* ((proc-name (assq-ref proc-doc 'scheme-name)) (c-name (assq-ref proc-doc 'c-name)) (args (assq-ref proc-doc 'arguments)) (signature (assq-ref proc-doc 'signature)) (required-args (assq-ref signature 'required)) (optional-args (assq-ref signature 'optional)) (rest-arg? (assq-ref signature 'rest?)) (location (assq-ref proc-doc 'location)) (file-name (car location)) (line (cadr location)) (documentation (assq-ref proc-doc 'documentation))) (string-append (string #\newline) (format #f "@c snarfed from ~a:~a~%" file-name line) ;; document the Scheme procedure (scheme-procedure-texi-line proc-name (map schemify-name args) required-args optional-args rest-arg?) (string #\newline) (if (*document-c-functions?*) (string-append ;; document the C function "@deffnx {C Function} " c-name " (" (if (null? args) "void" (string-join (map (lambda (arg) (string-append "SCM " arg)) args) ", ")) ")" (string #\newline)) "") documentation (string #\newline) "@end deffn" (string #\newline)))) ;;; ;;; Very high-level interface. ;;; (define (output-procedure-texi-documentation-from-c-file c-file cpp cflags port) (for-each (lambda (texi-string) (display texi-string port)) (map procedure-texi-documentation (run-cpp-and-extract-snarfing c-file cpp cflags)))) ;;; output.scm ends here ;;; Local Variables: ;;; mode: scheme ;;; coding: latin-1 ;;; End: ;;; arch-tag: 20ca493a-6f1a-4d7f-9d24-ccce0d32df49