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.") |