Bindat (src, strz): Operate on vectors too
Copyright-paperwork-exempt: yes * lisp/emacs-lisp/bindat.el (bindat--unpack-str, bindat--unpack-strz): Fix the non-string case. * test/lisp/emacs-lisp/bindat-tests.el (bindat-test--strz-array-unpack) (bindat-test--str-simple-array-unpack,bindat-test--str-combined-array-unpack): New tests.
This commit is contained in:
parent
693443bbf7
commit
40a361fbd6
2 changed files with 22 additions and 3 deletions
|
@ -163,7 +163,9 @@
|
|||
(let ((s (substring bindat-raw bindat-idx (+ bindat-idx len))))
|
||||
(setq bindat-idx (+ bindat-idx len))
|
||||
(if (stringp s) s
|
||||
(apply #'unibyte-string s))))
|
||||
;; FIXME: There should be a more efficient way to do this.
|
||||
;; Should `apply' accept vectors in addition to lists?
|
||||
(apply #'unibyte-string (append s nil)))))
|
||||
|
||||
(defun bindat--unpack-strz (&optional len)
|
||||
(let ((i 0) s)
|
||||
|
@ -172,7 +174,7 @@
|
|||
(setq s (substring bindat-raw bindat-idx (+ bindat-idx i)))
|
||||
(setq bindat-idx (+ bindat-idx (or len (1+ i))))
|
||||
(if (stringp s) s
|
||||
(apply #'unibyte-string s))))
|
||||
(apply #'unibyte-string (append s nil)))))
|
||||
|
||||
(defun bindat--unpack-bits (len)
|
||||
(let ((bits nil) (bnum (1- (* 8 len))) j m)
|
||||
|
|
|
@ -252,7 +252,24 @@
|
|||
(should (equal (bindat-unpack spec "abc\0") "abc"))
|
||||
;; Missing null terminator.
|
||||
(should-error (bindat-unpack spec ""))
|
||||
(should-error (bindat-unpack spec "a"))))
|
||||
(should-error (bindat-unpack spec "a")))
|
||||
|
||||
(ert-deftest bindat-test--strz-array-unpack ()
|
||||
(should (equal (bindat-unpack spec [#x61 #x62 #x63 #x00]) "abc"))))
|
||||
|
||||
(let ((spec (bindat-type str 3)))
|
||||
(ert-deftest bindat-test--str-simple-array-unpack ()
|
||||
(should (equal (bindat-unpack spec [#x61 #x62 #x63]) "abc"))))
|
||||
|
||||
(let ((spec (bindat-type
|
||||
(first u8)
|
||||
(string str 3)
|
||||
(last uint 16))))
|
||||
(ert-deftest bindat-test--str-combined-array-unpack ()
|
||||
(let ((unpacked (bindat-unpack spec [#xff #x63 #x62 #x61 #xff #xff])))
|
||||
(should (equal (bindat-get-field unpacked 'string) "cba"))
|
||||
(should (equal (bindat-get-field unpacked 'first) (- (expt 2 8) 1)))
|
||||
(should (equal (bindat-get-field unpacked 'last) (- (expt 2 16) 1))))))
|
||||
|
||||
(let ((spec '((x strz 2))))
|
||||
(ert-deftest bindat-test--strz-legacy-fixedlen-len ()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue