Coverage report: /home/ellis/comp/core/app/skel/core/header.lisp

KindCoveredAll%
expression4978 62.8
branch00nil
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; lib/skel/core/header.lisp --- Skel file-header proto
2
 
3
 ;;
4
 
5
 ;;; Code:
6
 (in-package :skel/core/header)
7
 
8
 ;;; File Headers
9
 (deftype file-header-kind () '(member :source :shebang))
10
 
11
 (defclass sk-file-header (file-header)
12
   ((kind :initform :source :type file-header-kind :initarg :kind)))
13
 
14
 (defun make-file-header (kind hl)
15
   (make-instance 'sk-file-header :kind kind :headline hl))
16
 
17
 (defun make-source-file-header (str)
18
   (make-file-header :source str))
19
 
20
 (defun make-shebang-file-header (str)
21
   (make-file-header :shebang str))
22
 
23
 (defun make-source-header-comment (name &key (cchar #\;) (timestamp nil) (description nil) (opts nil))
24
   "Generate a generic file-header with optional timestamp, description, and opts."
25
   (format nil "~A ~A~A~A~A~%" (make-string 3 :initial-element cchar) 
26
           name
27
           (if timestamp
28
               (multiple-value-bind (s m h d mo y) (decode-universal-time (get-universal-time) 0)
29
                 (format nil " @ ~4,'0d-~2,'0d-~2,'0d.~2,'0d:~2,'0d:~2,'0d" y mo d h m s))
30
               "")
31
           (if description
32
               (format nil " --- ~A" description)
33
               "")
34
           (if opts
35
               (format nil " -*- ~{~A~^;~} -*-" opts)
36
               "")))
37
 
38
 (defun make-shebang-comment (shell &rest args)
39
   "Generate a shebang file-header line."
40
   (format nil "#~A ~{~A~^ ~}~%" shell args))
41
 
42
 (defun parse-stream-file-header (stream)
43
   "Parse a file-header from STREAM."
44
   (std:when-let ((l (read-line stream nil nil)))
45
     l))
46
 
47
 (defun parse-source-file-header (file)
48
   "Return a FILE-HEADER based on the first line of FILE."
49
   (with-open-file (f file)
50
     (make-file-header :source (parse-stream-file-header f))))
51
 
52
 (defun extract-source-file-header (str)
53
   "Extract a FILE-HEADER from STR, returning two values: the extracted object, and the modified string."
54
   (with-input-from-string (s str)
55
     (values
56
      (make-file-header :source (parse-stream-file-header s))
57
      str)))