#!/usr/bin/guile \
-e "(scripts module-doc-coverage)" -s
!#
;;; module-doc-coverage --- List modules not yet properly documented

;;	Copyright (C) 2003,2004 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, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, 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.

;;; Author: Thien-Thi Nguyen <ttn@gnu.org>

;;; Commentary:

;; Usage: module-doc-coverage [OPTIONS] INFO
;;
;; Scan INFO file's module index and report those that are missing.
;; The list of modules is taken from "./pre-inst.merged-module-catalog",
;; a merged module catalog file in the current working directory.  In
;; the index, also consider missing those modules that are to be found
;; in node "Unexplained Mysteries".  Options are:
;;
;;  -i, --index NODE    -- scan index NODE (default: "Module Index")
;;  -c, --catalog FILE  -- use module catalog FILE instead of default
;;  -m, --missing NODE  -- consider missing those found in NODE

;;; Code:

(define-module (scripts module-doc-coverage)
  #:autoload (scripts PROGRAM) (HVQC-MAIN)
  #:autoload (ice-9 popen) (open-input-pipe)
  #:autoload (ice-9 rdelim) (read-line)
  #:export ())

(define (main/qop qop)
  (let* ((all-port (open-input-file
                    (or (qop 'catalog) "pre-inst.merged-module-catalog")))
         (all (map car (read all-port)))
         (namerx (make-regexp "[*] \\("))
         (mrx (make-regexp (or (qop 'missing) "Unexplained Mysteries")))
         (p (open-input-pipe
             (simple-format #f "info -o- -n '~A' -f ~A"
                            (or (qop 'index) "Module Index")
                            (car (qop '()))))))
    (close-port all-port)
    (let loop ((line (read-line p)))
      (cond ((eof-object? line)
             (close-pipe p))
            ((regexp-exec namerx line)
             (or (regexp-exec mrx line)
                 (set! all (delete (with-input-from-string
                                       (substring line 1)
                                     read)
                                   all)))
             (loop (read-line p)))
            (else
             (loop (read-line p)))))
    (for-each write-line all)))

(define (main args)
  (HVQC-MAIN args main/qop
             '(usage . commentary)
             '(package . "Guile")
             '(option-spec (index   (single-char #\i) (value #t))
                           (catalog (single-char #\c) (value #t))
                           (missing (single-char #\m) (value #t)))))

;;; module-doc-coverage ends here
