[doc] Replace bindat example: s/fortune cookie/rfc868 payload/

* doc/lispref/processes.texi (Bindat Examples):
Mention two examples in intro blurb; rewrite first example.
This commit is contained in:
Thien-Thi Nguyen 2017-03-10 13:25:41 +01:00
parent 26848af97f
commit ae6b2b8918

View file

@ -3337,91 +3337,31 @@ dotted notation.
@node Bindat Examples
@subsection Examples of Byte Unpacking and Packing
@c FIXME? This seems a very long example for something that is not used
@c very often. As of 24.1, gdb-mi.el is the only user of bindat.el in Emacs.
@c Maybe one or both of these examples should just be moved to the
@c commentary of bindat.el.
Here is a complete example of byte unpacking and packing:
Here are two complete examples that use bindat.el.
The first shows simple byte packing:
@lisp
(require 'bindat)
(defvar fcookie-index-spec
'((:version u32)
(:count u32)
(:longest u32)
(:shortest u32)
(:flags u32)
(:delim u8)
(:ignored fill 3)
(:offset repeat (:count) (:foo u32)))
"Description of a fortune cookie index file's contents.")
(defun rfc868-payload ()
(bindat-pack
'((now-hi u16)
(now-lo u16))
;; Emacs uses Unix epoch, while RFC868 epoch
;; is 1900-01-01 00:00:00, which is 2208988800
;; (or #x83aa7e80) seconds more.
(let ((now (time-add nil '(#x83aa #x7e80))))
`((now-hi . ,(car now))
(now-lo . ,(cadr now))))))
(defun fcookie (cookies &optional index)
"Display a random fortune cookie from file COOKIES.
Optional second arg INDEX specifies the associated index
filename, by default \"COOKIES.dat\". Display cookie text
in buffer \"*Fortune Cookie: BASENAME*\", where BASENAME
is COOKIES without the directory part."
(interactive "fCookies file: ")
(let* ((info (with-temp-buffer
(insert-file-contents-literally
(or index (concat cookies ".dat")))
(bindat-unpack fcookie-index-spec
(buffer-string))))
(sel (random (bindat-get-field info :count)))
(beg (cdar (bindat-get-field info :offset sel)))
(end (or (cdar (bindat-get-field info
:offset (1+ sel)))
(nth 7 (file-attributes cookies)))))
(switch-to-buffer
(get-buffer-create
(format "*Fortune Cookie: %s*"
(file-name-nondirectory cookies))))
(erase-buffer)
(insert-file-contents-literally
cookies nil beg (- end 3))))
(defun fcookie-create-index (cookies &optional index delim)
"Scan file COOKIES, and write out its index file.
Optional arg INDEX specifies the index filename, which by
default is \"COOKIES.dat\". Optional arg DELIM specifies the
unibyte character that, when found on a line of its own in
COOKIES, indicates the border between entries."
(interactive "fCookies file: ")
(setq delim (or delim ?%))
(let ((delim-line (format "\n%c\n" delim))
(count 0)
(max 0)
min p q len offsets)
(unless (= 3 (string-bytes delim-line))
(error "Delimiter cannot be represented in one byte"))
(with-temp-buffer
(insert-file-contents-literally cookies)
(while (and (setq p (point))
(search-forward delim-line (point-max) t)
(setq len (- (point) 3 p)))
(setq count (1+ count)
max (max max len)
min (min (or min max) len)
offsets (cons (1- p) offsets))))
(with-temp-buffer
(set-buffer-multibyte nil)
(insert
(bindat-pack
fcookie-index-spec
`((:version . 2)
(:count . ,count)
(:longest . ,max)
(:shortest . ,min)
(:flags . 0)
(:delim . ,delim)
(:offset . ,(mapcar (lambda (o)
(list (cons :foo o)))
(nreverse offsets))))))
(let ((coding-system-for-write 'raw-text-unix))
(write-file (or index (concat cookies ".dat")))))))
(let ((s (rfc868-payload)))
(list (multibyte-string-p s)
(mapconcat (lambda (byte)
(format "%02x" byte))
s " ")
(current-time-string)))
@result{} (nil "dc 6d 17 01" "Fri Mar 10 13:13:53 2017")
@end lisp
The following is an example of defining and unpacking a complex