summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2017-09-22 18:25:21 +0200
committerLudovic Courtès <ludo@gnu.org>2017-09-22 18:40:57 +0200
commit8a7d81a5e23c4d59fbabf2550db32d4ba5572e4b (patch)
tree9b75e42e5455535351077190a9f5c677b8d88027
parent60e36bff1f8e11636626f651519d9e4cca903d78 (diff)
downloadpatches-8a7d81a5e23c4d59fbabf2550db32d4ba5572e4b.tar
patches-8a7d81a5e23c4d59fbabf2550db32d4ba5572e4b.tar.gz
uuid: Add a parser for FAT32 UUIDs.
* gnu/system/uuid.scm (%fat32-uuid-rx): New variable. (string->fat32-uuid): New procedure. (%uuid-parsers): Add it. * tests/uuid.scm ("uuid, FAT32, format preserved"): New test.
-rw-r--r--gnu/system/uuid.scm18
-rw-r--r--tests/uuid.scm4
2 files changed, 22 insertions, 0 deletions
diff --git a/gnu/system/uuid.scm b/gnu/system/uuid.scm
index 1dd6a11339..6470abb8cc 100644
--- a/gnu/system/uuid.scm
+++ b/gnu/system/uuid.scm
@@ -41,6 +41,7 @@
string->ext3-uuid
string->ext4-uuid
string->btrfs-uuid
+ string->fat32-uuid
iso9660-uuid->string
;; XXX: For lack of a better place.
@@ -175,6 +176,22 @@ ISO9660 UUID representation."
(low (bytevector-uint-ref uuid 2 %fat32-endianness 2)))
(format #f "~:@(~x-~x~)" low high)))
+(define %fat32-uuid-rx
+ (make-regexp "^([[:xdigit:]]{4})-([[:xdigit:]]{4})$"))
+
+(define (string->fat32-uuid str)
+ "Parse STR, which is in FAT32 format, and return a bytevector or #f."
+ (match (regexp-exec %fat32-uuid-rx str)
+ (#f
+ #f)
+ (rx-match
+ (uint-list->bytevector (list (string->number
+ (match:substring rx-match 2) 16)
+ (string->number
+ (match:substring rx-match 1) 16))
+ %fat32-endianness
+ 2))))
+
;;;
;;; Generic interface.
@@ -198,6 +215,7 @@ ISO9660 UUID representation."
(define %uuid-parsers
(vhashq
('dce 'ext2 'ext3 'ext4 'btrfs 'luks => string->dce-uuid)
+ ('fat32 'fat => string->fat32-uuid)
('iso9660 => string->iso9660-uuid)))
(define %uuid-printers
diff --git a/tests/uuid.scm b/tests/uuid.scm
index c2f15de996..aacce77233 100644
--- a/tests/uuid.scm
+++ b/tests/uuid.scm
@@ -53,4 +53,8 @@
"1970-01-01-17-14-42-99"
(uuid->string (uuid "1970-01-01-17-14-42-99" 'iso9660)))
+(test-equal "uuid, FAT32, format preserved"
+ "1234-ABCD"
+ (uuid->string (uuid "1234-abcd" 'fat32)))
+
(test-end)