diff lisp/emacs-lisp/bindat.el @ 71033:b2dddb50f233

(bindat-idx, bindat-raw): Rename dynamic variables `pos' and `raw-data' for clarity, as eval forms may access these.
author Kim F. Storm <storm@cua.dk>
date Sun, 28 May 2006 22:19:52 +0000
parents ae4950765fb1
children 805ccb94d5d6 a8190f7e546e
line wrap: on
line diff
--- a/lisp/emacs-lisp/bindat.el	Sun May 28 21:31:04 2006 +0000
+++ b/lisp/emacs-lisp/bindat.el	Sun May 28 22:19:52 2006 +0000
@@ -188,21 +188,20 @@
 ;;  ([FIELD] eval FORM)
 ;; is interpreted by evalling FORM for its side effects only.
 ;; If FIELD is specified, the value is bound to that field.
-;; The FORM may access and update `raw-data' and `pos' (see `bindat-unpack'),
-;; as well as the lisp data structure in `struct'.
+;; The FORM may access and update `bindat-raw' and `bindat-idx' (see `bindat-unpack').
 
 ;;; Code:
 
 ;; Helper functions for structure unpacking.
-;; Relies on dynamic binding of RAW-DATA and POS
+;; Relies on dynamic binding of BINDAT-RAW and BINDAT-IDX
 
-(defvar raw-data)
-(defvar pos)
+(defvar bindat-raw)
+(defvar bindat-idx)
 
 (defun bindat--unpack-u8 ()
   (prog1
-    (aref raw-data pos)
-    (setq pos (1+ pos))))
+    (aref bindat-raw bindat-idx)
+    (setq bindat-idx (1+ bindat-idx))))
 
 (defun bindat--unpack-u16 ()
   (let* ((a (bindat--unpack-u8)) (b (bindat--unpack-u8)))
@@ -259,16 +258,16 @@
 		  j (lsh j -1)))))
       bits))
    ((eq type 'str)
-    (let ((s (substring raw-data pos (+ pos len))))
-      (setq pos (+ pos len))
+    (let ((s (substring bindat-raw bindat-idx (+ bindat-idx len))))
+      (setq bindat-idx (+ bindat-idx len))
       (if (stringp s) s
 	(string-make-unibyte (concat s)))))
    ((eq type 'strz)
     (let ((i 0) s)
-      (while (and (< i len) (/= (aref raw-data (+ pos i)) 0))
+      (while (and (< i len) (/= (aref bindat-raw (+ bindat-idx i)) 0))
 	(setq i (1+ i)))
-      (setq s (substring raw-data pos (+ pos i)))
-      (setq pos (+ pos len))
+      (setq s (substring bindat-raw bindat-idx (+ bindat-idx i)))
+      (setq bindat-idx (+ bindat-idx len))
       (if (stringp s) s
 	(string-make-unibyte (concat s)))))
    ((eq type 'vec)
@@ -310,10 +309,10 @@
 	      (setq data (eval len))
 	    (eval len)))
 	 ((eq type 'fill)
-	  (setq pos (+ pos len)))
+	  (setq bindat-idx (+ bindat-idx len)))
 	 ((eq type 'align)
-	  (while (/= (% pos len) 0)
-	    (setq pos (1+ pos))))
+	  (while (/= (% bindat-idx len) 0)
+	    (setq bindat-idx (1+ bindat-idx))))
 	 ((eq type 'struct)
 	  (setq data (bindat--unpack-group (eval len))))
 	 ((eq type 'repeat)
@@ -341,13 +340,13 @@
 	      (setq struct (append data struct))))))
     struct))
 
-(defun bindat-unpack (spec raw-data &optional pos)
-  "Return structured data according to SPEC for binary data in RAW-DATA.
-RAW-DATA is a unibyte string or vector.  Optional third arg POS specifies
-the starting offset in RAW-DATA."
-  (when (multibyte-string-p raw-data)
+(defun bindat-unpack (spec bindat-raw &optional bindat-idx)
+  "Return structured data according to SPEC for binary data in BINDAT-RAW.
+BINDAT-RAW is a unibyte string or vector.  Optional third arg BINDAT-IDX specifies
+the starting offset in BINDAT-RAW."
+  (when (multibyte-string-p bindat-raw)
     (error "String is multibyte"))
-  (unless pos (setq pos 0))
+  (unless bindat-idx (setq bindat-idx 0))
   (bindat--unpack-group spec))
 
 (defun bindat-get-field (struct &rest field)
@@ -366,7 +365,7 @@
   struct)
 
 
-;; Calculate raw-data length of structured data
+;; Calculate bindat-raw length of structured data
 
 (defvar bindat--fixed-length-alist
   '((u8 . 1) (byte . 1)
@@ -405,10 +404,10 @@
 	      (setq struct (cons (cons field (eval len)) struct))
 	    (eval len)))
 	 ((eq type 'fill)
-	  (setq pos (+ pos len)))
+	  (setq bindat-idx (+ bindat-idx len)))
 	 ((eq type 'align)
-	  (while (/= (% pos len) 0)
-	    (setq pos (1+ pos))))
+	  (while (/= (% bindat-idx len) 0)
+	    (setq bindat-idx (1+ bindat-idx))))
 	 ((eq type 'struct)
 	  (bindat--length-group
 	   (if field (bindat-get-field struct field) struct) (eval len)))
@@ -435,25 +434,25 @@
 	      (setq len (cdr type)))
 	  (if field
 	      (setq last (bindat-get-field struct field)))
-	  (setq pos (+ pos len))))))))
+	  (setq bindat-idx (+ bindat-idx len))))))))
 
 (defun bindat-length (spec struct)
-  "Calculate raw-data length for STRUCT according to bindat SPEC."
-  (let ((pos 0))
+  "Calculate bindat-raw length for STRUCT according to bindat SPEC."
+  (let ((bindat-idx 0))
     (bindat--length-group struct spec)
-    pos))
+    bindat-idx))
 
 
-;; Pack structured data into raw-data
+;; Pack structured data into bindat-raw
 
 (defun bindat--pack-u8 (v)
-  (aset raw-data pos (logand v 255))
-  (setq pos (1+ pos)))
+  (aset bindat-raw bindat-idx (logand v 255))
+  (setq bindat-idx (1+ bindat-idx)))
 
 (defun bindat--pack-u16 (v)
-  (aset raw-data pos (logand (lsh v -8) 255))
-  (aset raw-data (1+ pos) (logand v 255))
-  (setq pos (+ pos 2)))
+  (aset bindat-raw bindat-idx (logand (lsh v -8) 255))
+  (aset bindat-raw (1+ bindat-idx) (logand v 255))
+  (setq bindat-idx (+ bindat-idx 2)))
 
 (defun bindat--pack-u24 (v)
   (bindat--pack-u8 (lsh v -16))
@@ -464,9 +463,9 @@
   (bindat--pack-u16 v))
 
 (defun bindat--pack-u16r (v)
-  (aset raw-data (1+ pos) (logand (lsh v -8) 255))
-  (aset raw-data pos (logand v 255))
-  (setq pos (+ pos 2)))
+  (aset bindat-raw (1+ bindat-idx) (logand (lsh v -8) 255))
+  (aset bindat-raw bindat-idx (logand v 255))
+  (setq bindat-idx (+ bindat-idx 2)))
 
 (defun bindat--pack-u24r (v)
   (bindat--pack-u16r v)
@@ -481,7 +480,7 @@
       (setq type 'vec len 4))
   (cond
    ((null v)
-    (setq pos (+ pos len)))
+    (setq bindat-idx (+ bindat-idx len)))
    ((memq type '(u8 byte))
     (bindat--pack-u8 v))
    ((memq type '(u16 word short))
@@ -513,11 +512,11 @@
     (let ((l (length v)) (i 0))
       (if (> l len) (setq l len))
       (while (< i l)
-	(aset raw-data (+ pos i) (aref v i))
+	(aset bindat-raw (+ bindat-idx i) (aref v i))
 	(setq i (1+ i)))
-      (setq pos (+ pos len))))
+      (setq bindat-idx (+ bindat-idx len))))
    (t
-    (setq pos (+ pos len)))))
+    (setq bindat-idx (+ bindat-idx len)))))
 
 (defun bindat--pack-group (struct spec)
   (let (last)
@@ -549,10 +548,10 @@
 	      (setq struct (cons (cons field (eval len)) struct))
 	    (eval len)))
 	 ((eq type 'fill)
-	  (setq pos (+ pos len)))
+	  (setq bindat-idx (+ bindat-idx len)))
 	 ((eq type 'align)
-	  (while (/= (% pos len) 0)
-	    (setq pos (1+ pos))))
+	  (while (/= (% bindat-idx len) 0)
+	    (setq bindat-idx (1+ bindat-idx))))
 	 ((eq type 'struct)
 	  (bindat--pack-group
 	   (if field (bindat-get-field struct field) struct) (eval len)))
@@ -579,18 +578,19 @@
 	  (bindat--pack-item last type len)
 	  ))))))
 
-(defun bindat-pack (spec struct &optional raw-data pos)
+(defun bindat-pack (spec struct &optional bindat-raw bindat-idx)
   "Return binary data packed according to SPEC for structured data STRUCT.
-Optional third arg RAW-DATA is a pre-allocated unibyte string or vector to
-pack into.  Optional fourth arg POS is the starting offset into RAW-DATA."
-  (when (multibyte-string-p raw-data)
+Optional third arg BINDAT-RAW is a pre-allocated unibyte string or vector to
+pack into.
+Optional fourth arg BINDAT-IDX is the starting offset into BINDAT-RAW."
+  (when (multibyte-string-p bindat-raw)
     (error "Pre-allocated string is multibyte"))
-  (let ((no-return raw-data))
-    (unless pos (setq pos 0))
-    (unless raw-data
-      (setq raw-data (make-vector (+ pos (bindat-length spec struct)) 0)))
+  (let ((no-return bindat-raw))
+    (unless bindat-idx (setq bindat-idx 0))
+    (unless bindat-raw
+      (setq bindat-raw (make-vector (+ bindat-idx (bindat-length spec struct)) 0)))
     (bindat--pack-group struct spec)
-    (if no-return nil (concat raw-data))))
+    (if no-return nil (concat bindat-raw))))
 
 
 ;; Misc. format conversions