;"mklibcat.scm" Build catalog for SLIB
;Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Aubrey Jaffer
;
;Permission to copy this software, to modify it, to redistribute it,
;to distribute modified versions, and to use it for any purpose is
;granted, subject to the following restrictions and understandings.
;
;1.  Any copy made of this software must include this copyright notice
;in full.
;
;2.  I have made no warranty or representation that the operation of
;this software will be error-free, and I am under no obligation to
;provide any services, by way of maintenance, update, or otherwise.
;
;3.  In conjunction with products arising from the use of this
;material, there shall be no use of my name in any advertising,
;promotional, or sales literature without prior written consent in
;each case.

(let ((catpath (in-vicinity (implementation-vicinity) "slibcat")))
  (and (file-exists? catpath) (delete-file catpath))
  (call-with-output-file catpath
    (lambda (op)
      (define (display* . args)
	(for-each (lambda (arg) (display arg op)) args)
	(newline op))
      (define (write* asp)
	(display " " op) (write asp op) (newline op))
      (display* ";\"slibcat\" SLIB catalog for "
		(scheme-implementation-type) (scheme-implementation-version)
		".        -*-scheme-*-")
      (display* ";")
      (display* "; DO NOT EDIT THIS FILE -- it is automagically generated")
      (display*)

      (display* "(")
      (for-each
       write*
       (append
	(list (cons 'schelog
		    (in-vicinity (sub-vicinity (library-vicinity) "schelog")
				 "schelog"))
	      (cons 'portable-scheme-debugger
		    (in-vicinity (sub-vicinity (library-vicinity) "psd")
				 "psd-slib"))
	      (cons 'jfilter
		    (in-vicinity (sub-vicinity (library-vicinity) "jfilter")
				 "jfilter")))
	(catalog:resolve
	 (library-vicinity)
	 '(
	   ;; null is the start of SLIB associations.
	   (null		source		"null")
	   (aggregate		source		"null")
	   (r2rs	aggregate	rev3-procedures	rev2-procedures)
	   (r3rs	aggregate	rev3-procedures)
	   (r4rs	aggregate	rev4-optional-procedures)
	   (r5rs	aggregate	values	macro	eval)
	   (rev4-optional-procedures	source	"sc4opt")
	   (rev3-procedures	source		"null")
	   (rev2-procedures	source		"sc2")
	   (multiarg/and-	source		"mularg")
	   (multiarg-apply	source		"mulapply")
	   (rationalize		source		"ratize")
	   (transcript		source		"trnscrpt")
	   (with-file		source		"withfile")
	   (dynamic-wind	source		"dynwind")
	   (dynamic		source		"dynamic")
	   (fluid-let		defmacro	"fluidlet")
	   (alist		source		"alist")
	   (hash		source		"hash")
	   (sierpinski		source		"sierpinski")
	   (hilbert-fill	source		"phil-spc")
	   (peano-fill		source		"peanosfc")
	   (soundex		source		"soundex")
	   (hash-table		source		"hashtab")
	   (logical		source		"logical")
	   (random		source		"random")
	   (random-inexact	source		"randinex")
	   (modular		source		"modular")
	   (factor		source		"factor")
	   (primes				factor)
	   (limit		source		"limit")
	   (eps-graph		source		"grapheps")
	   (charplot		source		"charplot")
	   (sort		source		"sort")
	   (srfi-95				sort)
	   (tsort				topological-sort)
	   (topological-sort	source		"tsort")
	   (common-list-functions	source	"comlist")
	   (tree		source		"tree")
	   (coerce		source		"coerce")
	   (format		source		"format")
	   (generic-write	source		"genwrite")
	   (pretty-print	source		"pp")
	   (pprint-file		source		"ppfile")
	   (object->string	source		"obj2str")
	   (string-case		source		"strcase")
	   (line-i/o		source		"lineio")
	   (string-port		source		"strport")
	   (getopt		source		"getopt")
	   (qp			source		"qp")
	   (eval		source		"eval")
	   (record		source		"record")
	   (synchk		source		"synchk")
	   (defmacroexpand	source		"defmacex")

	   (printf		source		"printf")
	   (scanf		defmacro	"scanf")
	   (stdio-ports		source		"stdio")
	   (stdio		aggregate scanf printf stdio-ports)

	   (break		defmacro	"break")
	   (trace		defmacro	"trace")
	   (debugf		source		"debug")
	   (debug		aggregate trace break debugf)

	   (delay				promise)
	   (promise		macro		"promise")

	   (macro-by-example	defmacro	"mbe")

	   (syntax-case		source		"scainit")
	   (syntactic-closures	source		"scmacro")
	   (macros-that-work	source		"macwork")
	   (macro				macro-by-example)
	   (object		source		"object")
	   (yasos		macro		"yasyn")
	   (oop					yasos)
	   (collect		source		"collectx")
	   (structure		syntax-case	"structure")
	   (values		source		"values")
	   (queue		source		"queue")
	   (priority-queue	source		"priorque")
	   (array		source		"array")
	   (subarray		source		"subarray")
	   (array-for-each	source		"arraymap")
	   (array-interpolate	source		"linterp")
	   (repl		source		"repl")
	   (process		source		"process")
	   (chapter-order	source		"chap")
	   (posix-time		source		"psxtime")
	   (common-lisp-time	source		"cltime")
	   (time-core		source		"timecore")
	   (time-zone		defmacro	"timezone")
	   (relational-database	source		"rdms")
	   (databases		source		"dbutil")
	   (database-utilities			databases)
	   (database-commands	source		"dbcom")
	   (database-browse	source		"dbrowse")
	   (database-interpolate	source	"dbinterp")
	   (within-database	macro		"dbsyn")
	   (html-form		source		"htmlform")
	   (alist-table		source		"alistab")
	   (parameters		source		"paramlst")
	   (getopt-parameters	source		"getparam")
	   (read-command	source		"comparse")
	   (batch		source		"batch")
	   (glob		source		"glob")
	   (filename				glob)
	   (crc			source		"crc")
	   (dft			source		"dft")
	   (fft					dft)
	   (Fourier-transform			dft)
	   (wt-tree		source		"wttree")
	   (string-search	source		"strsrch")
	   (root		source		"root")
	   (minimize		source		"minimize")
	   (precedence-parse	defmacro	"prec")
	   (parse				precedence-parse)
	   (commutative-ring	source		"cring")
	   (self-set		source		"selfset")
	   (determinant		source		"determ")
	   (byte		source		"byte")
	   (byte-number		source		"bytenumb")
	   (tzfile		source		"tzfile")
	   (schmooz		source		"schmooz")
	   (transact		defmacro	"transact")
	   (net-clients				transact)
	   (db->html		source		"db2html")
	   (http		defmacro	"http-cgi")
	   (cgi					http)
	   (uri			defmacro	"uri")
	   (uniform-resource-identifier		uri)
	   (pnm			source		"pnm")
	   (metric-units	source		"simetrix")
	   (diff		source		"differ")
	   (solid		source		"solid")
	   (vrml97				solid)
	   (vrml				vrml97)
	   (color		defmacro	"color")
	   (color-space		source		"colorspc")
	   (cie					color-space)
	   (color-names		source		"colornam")
	   (color-database	defmacro	"mkclrnam")
	   (resene		color-names	"clrnamdb.scm")
	   (saturate		color-names	"clrnamdb.scm")
	   (nbs-iscc		color-names	"clrnamdb.scm")
	   (daylight		source		"daylight")
	   (matfile		source		"matfile")
	   (mat-file				matfile)
	   (spectral-tristimulus-values		color-space)
	   (cie1964 spectral-tristimulus-values "cie1964.xyz")
	   (cie1931 spectral-tristimulus-values "cie1931.xyz")
	   (ciexyz				cie1931)
	   (cvs			defmacro	"cvs")
	   (html-for-each	defmacro	"html4each")
	   (directory		source		"dirs")
	   (ncbi-dna		defmacro	"ncbi-dna")
	   (manifest		source		"manifest")
	   (top-refs		source		"top-refs")
	   (vet			source		"vet")
	   (srfi				srfi-0)
	   (srfi-0		defmacro	"srfi")
	   (srfi-1		source		"srfi-1")
	   (and-let*				srfi-2)
	   (srfi-2		defmacro	"srfi-2")
	   (receive				srfi-8)
	   (srfi-8		macro		"srfi-8")
	   (define-record-type			srfi-9)
	   (srfi-9		macro		"srfi-9")
	   (let-values				srfi-11)
	   (srfi-11		macro		"srfi-11")
	   (srfi-28				format)
	   (srfi-47				array)
	   (srfi-63				array)
	   (srfi-60				logical)
	   (guarded-cond-clause			srfi-61)
	   (srfi-61		macro		"srfi-61")
	   (srfi-23		source		"srfi-23")
	   (math-integer	source		"math-integer")
	   (math-real		source		"math-real")
	   (srfi-94		aggregate math-integer math-real)
	   (ssax				xml-parse)
	   (xml-parse		source		"xml-parse")
	   (new-catalog		source		"mklibcat")
	   ))))
      (let* ((req (in-vicinity (library-vicinity)
			       (string-append "require" (scheme-file-suffix)))))
	(write* (cons '*slib-version* (or (slib:version req) *slib-version*))))
      (display* ")")

      (let ((load-if-exists
	     (lambda (path)
	       (cond ((file-exists? (string-append path (scheme-file-suffix)))
		      (slib:load-source path))))))
	;;(load-if-exists (in-vicinity (implementation-vicinity) "mksitcat"))
	(load-if-exists (in-vicinity (implementation-vicinity) "mkimpcat")))

      (let ((catcat
	     (lambda (vicinity name specificity)
	       (let ((path (in-vicinity vicinity name)))
		 (and (file-exists? path)
		      (call-with-input-file path
			(lambda (ip)
			  (display*)
			  (display* "; " "\"" path "\"" " SLIB "
				    specificity "-specific catalog additions")
			  (display*)
			  (do ((c (read-char ip) (read-char ip)))
			      ((eof-object? c))
			    (write-char c op)))))))))
	(catcat (library-vicinity) "sitecat" "site")
	(catcat (implementation-vicinity) "implcat" "implementation")
	(catcat (implementation-vicinity) "sitecat" "site"))
      ))
  (set! *catalog* #f))
