comparison lisp/emacs-lisp/bindat.el @ 83542:2d56e13fd23d

Merged from emacs@sv.gnu.org Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-413 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-414 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-415 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-416 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-417 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-418 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-419 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-420 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-421 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-422 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-423 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-424 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-425 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-426 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-427 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-428 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-429 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-430 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-431 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-432 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-433 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-434 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-435 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-436 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-437 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-438 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-439 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-440 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-441 lisp/url/url-methods.el: Fix format error when http_proxy is empty string * emacs@sv.gnu.org/emacs--devo--0--patch-442 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-443 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-444 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-445 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-446 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-447 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-448 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-449 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-450 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-451 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-452 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-453 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-454 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-455 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-456 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-457 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-458 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-459 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-460 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-461 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-462 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-463 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-464 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-465 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-466 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-467 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-468 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-469 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-470 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-471 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-472 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-473 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-128 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-129 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-130 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-131 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-132 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-133 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-134 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-135 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-136 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-137 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-138 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-139 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-140 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-141 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-142 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-143 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-144 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-145 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-146 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-147 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-148 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-149 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-582
author Karoly Lorentey <lorentey@elte.hu>
date Sat, 14 Oct 2006 17:36:28 +0000
parents 8c9ac6f51916
children 29289b6efd81 a1a25ac6c88a
comparison
equal deleted inserted replaced
83541:694bbb62a75d 83542:2d56e13fd23d
64 ;; struct data item[/* items */]; 64 ;; struct data item[/* items */];
65 ;; }; 65 ;; };
66 ;; 66 ;;
67 ;; The corresponding Lisp bindat specification looks like this: 67 ;; The corresponding Lisp bindat specification looks like this:
68 ;; 68 ;;
69 ;; (setq header-spec 69 ;; (setq header-bindat-spec
70 ;; '((dest-ip ip) 70 ;; '((dest-ip ip)
71 ;; (src-ip ip) 71 ;; (src-ip ip)
72 ;; (dest-port u16) 72 ;; (dest-port u16)
73 ;; (src-port u16))) 73 ;; (src-port u16)))
74 ;; 74 ;;
75 ;; (setq data-spec 75 ;; (setq data-bindat-spec
76 ;; '((type u8) 76 ;; '((type u8)
77 ;; (opcode u8) 77 ;; (opcode u8)
78 ;; (length u16r) ;; little endian order 78 ;; (length u16r) ;; little endian order
79 ;; (id strz 8) 79 ;; (id strz 8)
80 ;; (data vec (length)) 80 ;; (data vec (length))
81 ;; (align 4))) 81 ;; (align 4)))
82 ;; 82 ;;
83 ;; (setq packet-spec 83 ;; (setq packet-bindat-spec
84 ;; '((header struct header-spec) 84 ;; '((header struct header-bindat-spec)
85 ;; (items u8) 85 ;; (items u8)
86 ;; (fill 3) 86 ;; (fill 3)
87 ;; (item repeat (items) 87 ;; (item repeat (items)
88 ;; (struct data-spec)))) 88 ;; (struct data-bindat-spec))))
89 ;; 89 ;;
90 ;; 90 ;;
91 ;; A binary data representation may look like 91 ;; A binary data representation may look like
92 ;; [ 192 168 1 100 192 168 1 101 01 28 21 32 2 0 0 0 92 ;; [ 192 168 1 100 192 168 1 101 01 28 21 32 2 0 0 0
93 ;; 2 3 5 0 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0 93 ;; 2 3 5 0 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0
118 ;; (bindat-get-field decoded-structure 'item 1 'id) 118 ;; (bindat-get-field decoded-structure 'item 1 'id)
119 ;; returns "BCDEFG". 119 ;; returns "BCDEFG".
120 120
121 ;; Binary Data Structure Specification Format 121 ;; Binary Data Structure Specification Format
122 ;; ------------------------------------------ 122 ;; ------------------------------------------
123
124 ;; We recommend using names that end in `-bindat-spec'; such names
125 ;; are recognized automatically as "risky" variables.
123 126
124 ;; The data specification is formatted as follows: 127 ;; The data specification is formatted as follows:
125 128
126 ;; SPEC ::= ( ITEM... ) 129 ;; SPEC ::= ( ITEM... )
127 130
340 (setq struct (append data struct)))))) 343 (setq struct (append data struct))))))
341 struct)) 344 struct))
342 345
343 (defun bindat-unpack (spec bindat-raw &optional bindat-idx) 346 (defun bindat-unpack (spec bindat-raw &optional bindat-idx)
344 "Return structured data according to SPEC for binary data in BINDAT-RAW. 347 "Return structured data according to SPEC for binary data in BINDAT-RAW.
345 BINDAT-RAW is a unibyte string or vector. Optional third arg BINDAT-IDX specifies 348 BINDAT-RAW is a unibyte string or vector.
346 the starting offset in BINDAT-RAW." 349 Optional third arg BINDAT-IDX specifies the starting offset in BINDAT-RAW."
347 (when (multibyte-string-p bindat-raw) 350 (when (multibyte-string-p bindat-raw)
348 (error "String is multibyte")) 351 (error "String is multibyte"))
349 (unless bindat-idx (setq bindat-idx 0)) 352 (unless bindat-idx (setq bindat-idx 0))
350 (bindat--unpack-group spec)) 353 (bindat--unpack-group spec))
351 354