Fix byte count parsing

This commit is contained in:
2025-11-02 01:42:27 -07:00
parent bb461976f1
commit 239c2319a5

View File

@ -28,18 +28,20 @@
"Metric power suffixes used in parse-byte-count.")
(defparameter *byte-count-pattern*
(cl-ppcre:create-scanner
(format nil "^\\s*(?(?=(?:^|[^0-9])\\.[0-9])|([0-9]+))\\.?((?<=\\.)[0-9]+)?~
\\s*(?:(?:([kmgtpezyrq])(i)?)?B)?$\\s*")
(format nil "^\\s*(?(?=\\.[0-9])\\.|([0-9]+))~
\\.?(?:(?<=\\.)(0*)([0-9]+))?~
\\s*(?:(?:([kmgtpezyrq])(i)?)?B)?$\\s*$")
:extended-mode t
:case-insensitive-mode t)
"Regexp scanner for parse-byte-count.")
(defun make-float (int dec)
(defun make-float (int leading-zero-count dec)
(if (zerop dec)
(float int)
(+ (float int)
(* (if (minusp int) -1 1)
(/ (float dec)
(expt 10 leading-zero-count)
(expt 10 (1+ (floor (log dec 10)))))))))
(defun find-suffix-expt (suffix)
@ -51,10 +53,14 @@
(defun parse-byte-count (string)
"Parse a byte count from STRING."
(or (ppcre:register-groups-bind
((#'parse-integer int dec)
((#'parse-integer int)
leading-zeros
(#'parse-integer dec)
(#'find-suffix-expt power) base-two)
(*byte-count-pattern* string :sharedp t)
(let ((count (* (make-float (or int 0) (or dec 0))
(let ((count (* (make-float (or int 0)
(length leading-zeros)
(or dec 0))
(expt (if base-two 1024 1000) (or power 0)))))
(if (and (not power) (plusp (mod count 1)))
(error "Byte count is not a natural number: ~A" count)