1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

(add-props): New proc.

(make-grok-proc): Renamed from `make-grok-hook'.
(make-members-proc): Renamed from `make-members-hook'.
(make-grouper): Renamed from `make-grouping-hook'.  Update callers.
Add handling for multiple grouping-defs files.
(scan-api): Add handling for multiple grouping-defs files.
Cache `symbol->string' result; adjust `sort' usage.
This commit is contained in:
Thien-Thi Nguyen 2002-05-10 22:17:39 +00:00
parent 5cb3f60097
commit e366d58b79

View file

@ -26,7 +26,7 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
;;; Commentary: ;;; Commentary:
;; Usage: scan-api GUILE SOFILE [GROUPINGS] ;; Usage: scan-api GUILE SOFILE [GROUPINGS ...]
;; ;;
;; Invoke GUILE, an executable guile interpreter, and use nm(1) on SOFILE, a ;; Invoke GUILE, an executable guile interpreter, and use nm(1) on SOFILE, a
;; shared-object library, to determine available interface elements, and ;; shared-object library, to determine available interface elements, and
@ -40,8 +40,8 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
;; initially belong in one of two groups `Scheme' or `C' (but not both -- ;; initially belong in one of two groups `Scheme' or `C' (but not both --
;; signal error if that happens). ;; signal error if that happens).
;; ;;
;; Optional arg GROUPINGS is a file containing a grouping definition alist, ;; Optional GROUPINGS ... are files each containing a single "grouping
;; each entry of which has the form: ;; definition" alist with each entry of the form:
;; ;;
;; (NAME (description "DESCRIPTION") (members SYM...)) ;; (NAME (description "DESCRIPTION") (members SYM...))
;; ;;
@ -59,8 +59,8 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
;; (in-group? x GROUP) ;; (in-group? x GROUP)
;; (name-prefix? x PREFIX) ;; (name-prefix? x PREFIX)
;; ;;
;; TODO: Move symbol->string to hash-fold to make sorting more efficient. ;; TODO: Allow for concurrent Scheme/C membership.
;; Allow for concurrent Scheme/C membership. ;; Completely separate reporting.
;;; Code: ;;; Code:
@ -73,6 +73,15 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
(define put set-object-property!) (define put set-object-property!)
(define get object-property) (define get object-property)
(define (add-props object . args)
(let loop ((args args))
(if (null? args)
object ; retval
(let ((key (car args))
(value (cadr args)))
(put object key value)
(loop (cddr args))))))
(define (scan re command match) (define (scan re command match)
(let ((rx (make-regexp re)) (let ((rx (make-regexp re))
(port (open-pipe command OPEN_READ))) (port (open-pipe command OPEN_READ)))
@ -115,7 +124,7 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
(define (add-group-name! x name) (define (add-group-name! x name)
(put x 'groups (cons name (get x 'groups)))) (put x 'groups (cons name (get x 'groups))))
(define (make-grok-hook name form) (define (make-grok-proc name form)
(let* ((predicate? (eval form THIS-MODULE)) (let* ((predicate? (eval form THIS-MODULE))
(p (lambda (x) (p (lambda (x)
(and (predicate? x) (and (predicate? x)
@ -123,53 +132,58 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
(put p 'name name) (put p 'name name)
p)) p))
(define (make-members-hook name members) (define (make-members-proc name members)
(let ((p (lambda (x) (let ((p (lambda (x)
(and (memq x members) (and (memq x members)
(add-group-name! x name))))) (add-group-name! x name)))))
(put p 'name name) (put p 'name name)
p)) p))
(define (make-grouping-hook file) (define (make-grouper files) ; \/^^^o/ . o
(let ((hook (make-hook 1))) (let ((hook (make-hook 1))) ; /\____\
(for-each (lambda (gdef) (for-each
(let ((name (car gdef)) (lambda (file)
(members (assq-ref gdef 'members)) (for-each
(grok (assq-ref gdef 'grok))) (lambda (gdef)
(or members grok (let ((name (car gdef))
(error "bad grouping, must have `members' or `grok'")) (members (assq-ref gdef 'members))
(add-hook! hook (grok (assq-ref gdef 'grok)))
(if grok (or members grok
(make-grok-hook name (cadr grok)) (error "bad grouping, must have `members' or `grok'"))
(make-members-hook name members)) (add-hook! hook
#t))) ; append (if grok
(read (open-file file "r"))) (add-props (make-grok-proc name (cadr grok))
'description
(assq-ref gdef 'description))
(make-members-proc name members))
#t))) ; append
(read (open-file file OPEN_READ))))
files)
hook)) hook))
(define (scan-api . args) (define (scan-api . args)
(let ((guile (list-ref args 0)) (let ((guile (list-ref args 0))
(sofile (list-ref args 1)) (sofile (list-ref args 1))
(grouping-hook (false-if-exception (grouper (false-if-exception (make-grouper (cddr args))))
(make-grouping-hook (list-ref args 2))))
(ht (make-hash-table 3331))) (ht (make-hash-table 3331)))
(scan-Scheme! ht guile) (scan-Scheme! ht guile)
(scan-C! ht sofile) (scan-C! ht sofile)
(let ((all (sort (hash-fold (lambda (key value prior-result) (let ((all (sort (hash-fold (lambda (key value prior-result)
(put key 'scan-data (add-props
(or (get key 'Scheme) key
(get key 'C))) 'string (symbol->string key)
(put key 'groups 'scan-data (or (get key 'Scheme)
(if (get key 'Scheme) (get key 'C))
'(Scheme) 'groups (if (get key 'Scheme)
'(C))) '(Scheme)
(and grouping-hook '(C)))
(run-hook grouping-hook key)) (and grouper (run-hook grouper key))
(cons key prior-result)) (cons key prior-result))
'() '()
ht) ht)
(lambda (a b) (lambda (a b)
(string<? (symbol->string a) (string<? (get a 'string)
(symbol->string b)))))) (get b 'string))))))
(format #t ";;; generated ~A UTC by scan-api -- do not edit!\n\n" (format #t ";;; generated ~A UTC by scan-api -- do not edit!\n\n"
(strftime "%Y-%m-%d %H:%M:%S" (gmtime (current-time)))) (strftime "%Y-%m-%d %H:%M:%S" (gmtime (current-time))))
(format #t "(\n") (format #t "(\n")
@ -190,9 +204,9 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
i)) i))
(format #t " (sofile . ~S)\n" sofile) (format #t " (sofile . ~S)\n" sofile)
(format #t " ~A\n" (format #t " ~A\n"
(cons 'groups (if grouping-hook (cons 'groups (if grouper
(map (lambda (p) (get p 'name)) (map (lambda (p) (get p 'name))
(hook->list grouping-hook)) (hook->list grouper))
'(Scheme C)))) '(Scheme C))))
(format #t ") ;; end of meta\n") (format #t ") ;; end of meta\n")
(format #t "(interface\n") (format #t "(interface\n")