changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/std/stream.lisp

changeset 277: 10faf95f90dd
child: efc3e9ec02bf
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 14 Apr 2024 01:19:10 -0400
permissions: -rw-r--r--
description: stream and basic type upgrades. fixed some bugs and improved csv parsing
277
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; std/stream.lisp --- Standard Streams
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;;
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :std)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 (declaim (inline octet-vector=/unsafe))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 (defun octet-vector=/unsafe (v1 v2 start1 end1 start2 end2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
   (declare (optimize (speed 3)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
                      (safety 0)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
                      (debug 0)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
                      (compilation-speed 0))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
            (type octet-vector v1 v2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
            (type array-index start1 start2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
            (type array-length end1 end2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
   (and (= (- end1 start1)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
           (- end2 start2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
        (loop for i from start1 below end1
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
              for j from start2 below end2
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
              always (eql (aref v1 i) (aref v2 j)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 (defun octet-vector= (v1 v2 &key (start1 0) end1
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
                                  (start2 0) end2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
   "Like `string=' for octet vectors."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
   (declare (octet-vector v1 v2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
            (array-index start1 start2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
            ((or array-length null) end1 end2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
            (optimize speed))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
   (let* ((len1 (length v1))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
          (len2 (length v2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
          (end1 (or end1 len1))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
          (end2 (or end2 len2)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
     (assert (<= start1 end1 len1))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
     (assert (<= start2 end2 len2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
     (octet-vector=/unsafe v1 v2 start1 end1 start2 end2)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 (defun file-size-in-octets (file)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
   (multiple-value-bind (path namestring)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
       (etypecase file
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
         (string (values (pathname file)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
                         file))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
         (pathname (values file
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
                           (sb-ext:native-namestring file))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
     (declare (ignorable path namestring))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
     (sb-posix:stat-size (sb-posix:stat path))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
 (define-constant si-prefixes
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
   '((-30 "quecto" "q")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
     (-27 "ronto"  "r")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
     (-24 "yocto"  "y")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
     (-21 "zepto"  "z")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
     (-18 "atto"   "a")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
     (-15 "femto"  "f")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
     (-12 "pico"   "p")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
     ( -9 "nano"   "n")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
     ( -6 "micro"  "μ")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
     ( -3 "milli"  "m")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
     ( -2 "centi"  "c")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
     ( -1 "deci"   "d")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
     (  0 ""       "" )
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
     (  1 "deca"   "da")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
     (  2 "hecto"  "h")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
     (  3 "kilo"   "k")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
     (  6 "mega"   "M")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
     (  9 "giga"   "G")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
     ( 12 "tera"   "T")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
     ( 15 "peta"   "P")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
     ( 18 "exa"    "E")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
     ( 21 "zetta"  "Z")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
     ( 24 "yotta"  "Y")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
     ( 27 "ronna"  "R")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
     ( 30 "quetta" "Q"))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
   :test #'equalp
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
   :documentation "List as SI prefixes: power of ten, long form, short form.")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
 (define-constant si-prefixes-base-1000
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
   (loop for (pow long short) in si-prefixes
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
         unless (and (not (zerop pow))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
                     (< (abs pow) 3))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
           collect (list (truncate pow 3) long short))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
   :test #'equalp
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
   :documentation "The SI prefixes as powers of 1000, with centi, deci, deca and hecto omitted.")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
 (define-constant iec-prefixes
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
   '(( 0 ""     "")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
     (10 "kibi" "Ki")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
     (20 "mebi" "Mi")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
     (30 "gibi" "Gi")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
     (40 "tebi" "Ti")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
     (50 "pebi" "Pi")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
     (60 "exbi" "Ei"))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
   :test #'equalp
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
   :documentation "The IEC binary prefixes, as powers of 2.")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
94
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
95
 (eval-always
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
96
   (defun single (seq)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
97
     "Is SEQ a sequence of one element?"
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
98
     (= (length seq) 1)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
99
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
100
 (defmacro si-prefix-rec (n base prefixes)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
101
   (cond ((null prefixes) (error "No prefixes!"))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
102
         ((single prefixes)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
103
          (destructuring-bind ((power long short)) prefixes
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
104
            `(values ,long ,short ,(expt base power))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
105
         (t
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
106
          ;; good enough
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
107
          (let* ((halfway (ceiling (length prefixes) 2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
108
                 (lo (subseq prefixes 0 halfway))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
109
                 (hi (subseq prefixes halfway))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
110
                 (split (* (expt base (caar hi)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
111
              `(if (< ,n ,split)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
112
                   (si-prefix-rec ,n ,base ,lo)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
113
                   (si-prefix-rec ,n ,base ,hi))))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
114
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
115
 (defun si-prefix (n &key (base 1000))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
116
   "Given a number, return the prefix of the nearest SI unit.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
117
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
118
 Three values are returned: the long form, the short form, and the
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
119
 multiplying factor.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
120
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
121
     (si-prefix 1001) => \"kilo\", \"k\", 1000d0
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
122
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
123
 BASE can be 1000, 10, 1024, or 2. 1000 is the default, and prefixes
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
124
 start at kilo and milli. Base 10 is mostly the same, except the
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
125
 prefixes centi, deci, deca and hecto are also used. Base 1024 uses the
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
126
 same prefixes as 1000, but with 1024 as the base, as in vulgar file
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
127
 sizes. Base 2 uses the IEC binary prefixes."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
128
   (if (zerop n) (values "" "" 1d0)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
129
       (let ((n (abs (coerce n 'double-float))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
130
         (ecase base
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
131
           (2 (si-prefix-rec n 2d0 #.iec-prefixes))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
132
           (10 (si-prefix-rec n 10d0 #.si-prefixes))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
133
           (1000 (si-prefix-rec n 1000d0 #.si-prefixes-base-1000))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
134
           (1024 (si-prefix-rec n 1024d0 #.si-prefixes-base-1000))))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
135
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
136
 (defun human-size-formatter (size &key (flavor :si)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
137
                                        (space (eql flavor :si)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
138
   "Auxiliary function for formatting quantities human-readably.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
139
 Returns two values: a format control and a list of arguments.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
140
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
141
 This can be used to integrate the human-readable printing of
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
142
 quantities into larger format control strings using the recursive
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
143
 processing format directive (~?):
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
144
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
145
     (multiple-value-bind (control args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
146
         (human-size-formatter size)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
147
       (format t \"~?\" control args))"
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
148
   (let ((size (coerce size 'double-float))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
149
         ;; Avoid printing exponent markers.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
150
         (*read-default-float-format* 'double-float)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
151
         (base (ecase flavor
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
152
                 (:file 1024)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
153
                 (:si   1000)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
154
                 (:iec  2))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
155
     (multiple-value-bind (long short factor)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
156
         (si-prefix size :base base)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
157
       (declare (ignore long))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
158
       (let* ((size (/ size factor))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
159
              (int (round size))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
160
              (size
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
161
                (if (> (abs (- size int))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
162
                       0.05d0)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
163
                    size
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
164
                    int)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
165
         (values (formatter "~:[~d~;~,1f~]~:[~; ~]~a")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
166
                 (list (floatp size) size space short))))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
167
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
168
 (defun format-human-size (stream size
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
169
                           &key (flavor :si)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
170
                                (space (eql flavor :si)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
171
   "Write SIZE to STREAM, in human-readable form.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
172
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
173
 STREAM is interpreted as by `format'.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
174
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
175
 If FLAVOR is `:si' (the default) the base is 1000 and SI prefixes are used.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
176
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
177
 If FLAVOR is `:file', the base is 1024 and SI prefixes are used.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
178
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
179
 If FLAVOR is `:iec', the base is 1024 bytes and IEC prefixes (Ki, Mi,
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
180
 etc.) are used.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
181
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
182
 If SPACE is non-nil, include a space between the number and the
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
183
 prefix. (Defaults to T if FLAVOR is `:si'.)"
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
184
   (if (zerop size)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
185
       (format stream "0")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
186
       (multiple-value-bind (formatter args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
187
           (human-size-formatter size :flavor flavor :space space)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
188
         (format stream "~?" formatter args))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
189
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
190
 (defun format-file-size-human-readable (stream file-size
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
191
                                         &key flavor
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
192
                                              (space (eql flavor :si))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
193
                                              (suffix (if (eql flavor :iec) "B" "")))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
194
   "Write FILE-SIZE, a file size in bytes, to STREAM, in human-readable form.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
195
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
196
 STREAM is interpreted as by `format'.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
197
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
198
 If FLAVOR is nil, kilobytes are 1024 bytes and SI prefixes are used.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
199
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
200
 If FLAVOR is `:si', kilobytes are 1000 bytes and SI prefixes are used.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
201
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
202
 If FLAVOR is `:iec', kilobytes are 1024 bytes and IEC prefixes (Ki,
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
203
 Mi, etc.) are used.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
204
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
205
 If SPACE is non-nil, include a space between the number and the
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
206
 prefix. (Defaults to T if FLAVOR is `:si'.)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
207
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
208
 SUFFIX is the suffix to use; defaults to B if FLAVOR is `:iec',
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
209
 otherwise empty."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
210
   (check-type file-size (integer 0 *))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
211
   (if (zerop file-size)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
212
       (format stream "0")
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
213
       (let ((flavor (if (null flavor) :file flavor)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
214
         (multiple-value-bind (formatter args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
215
             (human-size-formatter file-size :flavor flavor :space space)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
216
           (format stream "~?~a" formatter args suffix)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
217
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
218
 (defun file-size-human-readable (file &key flavor space suffix stream)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
219
   "Format the size of FILE (in octets) using `format-file-size-human-readable'.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
220
 The size of file is found by `trivial-file-size:file-size-in-octets'.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
221
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
222
 Inspired by the function of the same name in Emacs."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
223
   (let ((file-size (file-size-in-octets file)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
224
     (format-file-size-human-readable
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
225
      stream
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
226
      file-size
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
227
      :flavor flavor
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
228
      :suffix suffix
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
229
      :space space)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
230
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
231
 (deftype wild-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
232
   "A pathname with wild components."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
233
   '(and pathname (satisfies wild-pathname-p)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
234
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
235
 (deftype non-wild-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
236
   "A pathname without wild components."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
237
   '(or directory-pathname
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
238
     (and pathname (not (satisfies wild-pathname-p)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
239
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
240
 (deftype absolute-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
241
   '(and pathname (satisfies uiop:absolute-pathname-p)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
242
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
243
 (deftype relative-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
244
   '(and pathname (satisfies uiop:relative-pathname-p)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
245
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
246
 (deftype directory-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
247
   '(and pathname (satisfies uiop:directory-pathname-p)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
248
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
249
 (deftype absolute-directory-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
250
   '(and absolute-pathname directory-pathname))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
251
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
252
 (deftype file-pathname ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
253
   '(and pathname (satisfies uiop:file-pathname-p)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
254
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
255
 ;;; logical-pathname is defined in CL.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
256
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
257
 (defconstant +default-element-type+ 'character)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
258
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
259
 (defmacro with-open-files ((&rest args) &body body)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
260
   "A simple macro to open one or more files providing the streams for the BODY. The ARGS is a list of `(stream filespec options*)` as supplied to WITH-OPEN-FILE."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
261
   (case (length args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
262
     ((0)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
263
      `(progn ,@body))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
264
     ((1)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
265
      `(with-open-file ,(first args) ,@body))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
266
     (t `(with-open-file ,(first args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
267
           (with-open-files
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
268
               ,(rest args) ,@body)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
269
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
270
 (defmacro with-open-file* ((stream filespec &key direction element-type
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
271
                                    if-exists if-does-not-exist external-format)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
272
                            &body body)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
273
   "Just like WITH-OPEN-FILE, but NIL values in the keyword arguments
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
274
 mean to use the default value specified for OPEN."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
275
   (once-only (direction element-type if-exists if-does-not-exist external-format)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
276
     `(with-open-stream
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
277
          (,stream (apply #'open ,filespec
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
278
                          (append
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
279
                           (when ,direction
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
280
                             (list :direction ,direction))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
281
                           (list :element-type (or ,element-type
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
282
                                                   +default-element-type+))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
283
                           (when ,if-exists
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
284
                             (list :if-exists ,if-exists))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
285
                           (when ,if-does-not-exist
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
286
                             (list :if-does-not-exist ,if-does-not-exist))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
287
                           (when ,external-format
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
288
                             (list :external-format ,external-format)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
289
        ,@body)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
290
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
291
 (defmacro with-input-from-file ((stream-name file-name &rest args
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
292
                                              &key (direction nil direction-p)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
293
                                              &allow-other-keys)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
294
                                 &body body)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
295
   "Evaluate BODY with STREAM-NAME to an input stream on the file
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
296
 FILE-NAME. ARGS is sent as is to the call to OPEN except EXTERNAL-FORMAT,
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
297
 which is only sent to WITH-OPEN-FILE when it's not NIL."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
298
   (declare (ignore direction))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
299
   (when direction-p
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
300
     (error "Can't specify :DIRECTION for WITH-INPUT-FROM-FILE."))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
301
   `(with-open-file* (,stream-name ,file-name :direction :input ,@args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
302
      ,@body))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
303
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
304
 (defmacro with-output-to-file ((stream-name file-name &rest args
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
305
                                             &key (direction nil direction-p)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
306
                                             &allow-other-keys)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
307
                                &body body)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
308
   "Evaluate BODY with STREAM-NAME to an output stream on the file
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
309
 FILE-NAME. ARGS is sent as is to the call to OPEN except EXTERNAL-FORMAT,
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
310
 which is only sent to WITH-OPEN-FILE when it's not NIL."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
311
   (declare (ignore direction))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
312
   (when direction-p
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
313
     (error "Can't specify :DIRECTION for WITH-OUTPUT-TO-FILE."))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
314
   `(with-open-file* (,stream-name ,file-name :direction :output ,@args)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
315
      ,@body))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
316
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
317
 (defun copy-stream (input output &key (element-type (stream-element-type input))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
318
                     (buffer-size 4096)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
319
                     (buffer (make-array buffer-size :element-type element-type))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
320
                     (start 0) end
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
321
                     finish-output)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
322
   "Reads data from INPUT and writes it to OUTPUT. Both INPUT and OUTPUT must
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
323
 be streams, they will be passed to READ-SEQUENCE and WRITE-SEQUENCE and must have
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
324
 compatible element-types."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
325
   (check-type start non-negative-integer)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
326
   (check-type end (or null non-negative-integer))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
327
   (check-type buffer-size positive-integer)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
328
   (when (and end
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
329
              (< end start))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
330
     (error "END is smaller than START in ~S" 'copy-stream))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
331
   (let ((output-position 0)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
332
         (input-position 0))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
333
     (unless (zerop start)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
334
       ;; FIXME add platform specific optimization to skip seekable streams
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
335
       (loop while (< input-position start)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
336
             do (let ((n (read-sequence buffer input
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
337
                                        :end (min (length buffer)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
338
                                                  (- start input-position)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
339
                  (when (zerop n)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
340
                    (error "~@<Could not read enough bytes from the input to fulfill ~
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
341
                            the :START ~S requirement in ~S.~:@>" 'copy-stream start))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
342
                  (incf input-position n))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
343
     (assert (= input-position start))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
344
     (loop while (or (null end) (< input-position end))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
345
           do (let ((n (read-sequence buffer input
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
346
                                      :end (when end
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
347
                                             (min (length buffer)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
348
                                                  (- end input-position))))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
349
                (when (zerop n)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
350
                  (if end
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
351
                      (error "~@<Could not read enough bytes from the input to fulfill ~
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
352
                           the :END ~S requirement in ~S.~:@>" 'copy-stream end)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
353
                      (return)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
354
                (incf input-position n)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
355
                (write-sequence buffer output :end n)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
356
                (incf output-position n)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
357
     (when finish-output
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
358
       (finish-output output))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
359
     output-position))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
360
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
361
 (defun write-stream-into-file (stream pathname &key (if-exists :error) if-does-not-exist)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
362
   "Read STREAM and write the contents into PATHNAME.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
363
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
364
 STREAM will be closed afterwards, so wrap it with
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
365
 `make-concatenated-stream' if you want it left open."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
366
   (check-type pathname pathname)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
367
   (with-open-stream (in stream)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
368
     (with-output-to-file (out pathname
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
369
                               :element-type (stream-element-type in)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
370
                               :if-exists if-exists
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
371
                               :if-does-not-exist if-does-not-exist)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
372
       (copy-stream in out)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
373
   pathname)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
374
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
375
 (defun write-file-into-stream (pathname output &key (if-does-not-exist :error)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
376
                                                     (external-format :default))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
377
   "Write the contents of FILE into STREAM."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
378
   (check-type pathname pathname)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
379
   (with-input-from-file (input pathname
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
380
                                :element-type (stream-element-type output)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
381
                                :if-does-not-exist if-does-not-exist
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
382
                                :external-format external-format)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
383
     (copy-stream input output)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
384
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
385
 (defun file= (file1 file2 &key (buffer-size 4096))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
386
   "Compare FILE1 and FILE2 octet by octet, \(possibly) using buffers
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
387
 of BUFFER-SIZE."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
388
   (declare (ignorable buffer-size))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
389
   (let ((file1 (truename file1))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
390
         (file2 (truename file2)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
391
     (or (equal file1 file2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
392
         (and (= (file-size-in-octets file1)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
393
                 (file-size-in-octets file2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
394
              #+ccl (file=/mmap file1 file2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
395
              #-ccl (file=/loop file1 file2 :buffer-size buffer-size)))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
396
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
397
 (defun file=/loop (file1 file2 &key (buffer-size 4096))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
398
   "Compare two files by looping over their contents using a buffer."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
399
   (declare
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
400
    (type pathname file1 file2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
401
    (type array-length buffer-size)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
402
    (optimize (safety 1) (debug 0) (compilation-speed 0)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
403
   (flet ((make-buffer ()
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
404
            (make-array buffer-size
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
405
                        :element-type 'octet
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
406
                        :initial-element 0)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
407
     (declare (inline make-buffer))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
408
     (with-open-files ((file1 file1 :element-type 'octet :direction :input)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
409
                       (file2 file2 :element-type 'octet :direction :input))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
410
       (and (= (file-length file1)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
411
               (file-length file2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
412
            (locally (declare (optimize speed))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
413
              (loop with buffer1 = (make-buffer)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
414
                    with buffer2 = (make-buffer)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
415
                    for end1 = (read-sequence buffer1 file1)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
416
                    for end2 = (read-sequence buffer2 file2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
417
                    until (or (zerop end1) (zerop end2))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
418
                    always (and (= end1 end2)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
419
                                (octet-vector= buffer1 buffer2
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
420
                                               :end1 end1
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
421
                                               :end2 end2))))))))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
422
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
423
 (defun file-size (file &key (element-type '(unsigned-byte 8)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
424
   "The size of FILE, in units of ELEMENT-TYPE (defaults to bytes).
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
425
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
426
 The size is computed by opening the file and getting the length of the
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
427
 resulting stream.
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
428
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
429
 If all you want is to read the file's size in octets from its
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
430
 metadata, consider `trivial-file-size:file-size-in-octets' instead."
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
431
   (check-type file (or string pathname))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
432
   (with-input-from-file (in file :element-type element-type)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
433
     (file-length in)))
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
434
 
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
435
 (defconstant +pathsep+
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
436
   (if (uiop:os-windows-p) #\; #\:)
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
437
   "Path separator for this OS.")