-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreader.lisp
50 lines (44 loc) · 1.91 KB
/
reader.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(in-package #:qldeb)
;;; Taken from http://paste.lisp.org/display/246995
;;; Graciously provided by Xach on irc.
(defun defsystem-form-info (defsystem)
(list :name (string-downcase (second defsystem))
:license (or (getf defsystem :license)
(getf defsystem :licence))
:description (getf defsystem :description)
:homepage (getf defsystem :homepage)
:author (getf defsystem :author)
:version (getf defsystem :version)))
(defun read-sharpdot-expression (stream character argument)
(declare (ignore character argument))
(let ((form (read stream)))
(prin1-to-string form)))
(defun make-sharpdot-readtable ()
(let ((readtable (copy-readtable nil)))
(set-dispatch-macro-character #\# #\.
#'read-sharpdot-expression
readtable)
readtable))
(defparameter *sharpdot-readtable* (make-sharpdot-readtable))
(defun system-file-info (stream system)
"Read SYSTEM-FILE and look for a DEFSYSTEM form matching its
pathname-name. Return the interesting properties of the
form (license, description, perhaps more) as a plist."
(let* ((*read-eval* nil)
(*readtable* *sharpdot-readtable*)
(cffi-grovel-p (find-package '#:cffi-grovel)))
(unless cffi-grovel-p
(let ((package (make-package '#:cffi-grovel)))
(let ((symbol (intern "GROVEL-FILE" package)))
(export symbol package))))
(unwind-protect
(handler-case
(loop for form = (read stream nil stream)
until (eq form stream)
when (and (consp form)
(string-equal (first form) "DEFSYSTEM")
(string-equal (second form) (ql-dist:name system)))
return (defsystem-form-info form))
(sb-int:simple-reader-error () nil))
(unless cffi-grovel-p
(delete-package '#:cffi-grovel)))))