Mercurial > emacs
changeset 74952:0e7b380a6c47
(Bindat Spec): Explain eval forms and lengths better.
Add count and index variables for eval forms in repeat blocks.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Fri, 29 Dec 2006 01:17:06 +0000 |
parents | 96636bda161b |
children | 2eb7f198d01d |
files | lispref/processes.texi |
diffstat | 1 files changed, 40 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/lispref/processes.texi Thu Dec 28 00:05:53 2006 +0000 +++ b/lispref/processes.texi Fri Dec 29 01:17:06 2006 +0000 @@ -2144,7 +2144,7 @@ String of length @var{len}. @item strz @var{len} -Zero-terminated string of length @var{len}. +Zero-terminated string, in a fixed-size field with length @var{len}. @item vec @var{len} Vector of @var{len} bytes. @@ -2166,6 +2166,14 @@ above-listed type specifications. @end table +For a fixed-size field, the length @var{len} is given as an +integer specifying the number of bytes in the field. When the +length of a field is not fixed, it typically depends on the value of a +preceding field. In this case, the length can be given either by +that field's name as specified for @code{bindat-get-field} below, or by +an expression @code{(eval @var{form})} where @var{form} should +evaluate to an integer, specifying the field length. + A field specification generally has the form @code{([@var{name}] @var{handler})}. The square braces indicate that @var{name} is optional. (Don't use names that are symbols meaningful as type @@ -2184,21 +2192,6 @@ @item eval @var{form} Evaluate @var{form}, a Lisp expression, for side-effect only. If the field name is specified, the value is bound to that field name. -@var{form} can access and update these dynamically bound variables: - -@table @code -@item bindat-raw -The data as a byte array. - -@item bindat-idx -Current index into bindat-raw of the unpacking or packing operation. - -@item struct -Alist. - -@item last -Value of the last field processed. -@end table @item fill @var{len} Skip @var{len} bytes. In packing, this leaves them unchanged, @@ -2235,9 +2228,37 @@ @item repeat @var{count} @var{field-specs}@dots{} Process the @var{field-specs} recursively, in order, then repeat starting from the first one, processing all the specs @var{count} -times overall. @var{count} may be an integer, or a list of one -element that names a previous field. For correct operation, each spec -in @var{field-specs} must include a name. +times overall. The @var{count} is given using the same formats as a +field length---if an @code{eval} form is used, it is evaluated just once. +For correct operation, each spec in @var{field-specs} must include a name. +@end table + +For the @code{(eval @var{form})} forms used in a bindat specification, +the @var{form} can access and update these dynamically bound variables +during evaluation: + +@table @code +@item last +Value of the last field processed. + +@item bindat-raw +The data as a byte array. + +@item bindat-idx +Current index into bindat-raw of the unpacking or packing operation. + +@item struct +The alist containing the structured data that have been unpacked so +far, or the entire structure being packed. You can use +@code{bindat-get-field} to access specific fields of this structure. + +@item count +@itemx index +Inside a @code{repeat} block, these contain the maximum number of +repetitions (as specified by the @var{count} parameter), and the +current repetition number (counting from 0). Setting @code{count} to +zero will terminate the inner-most repeat block after the current +repetition has completed. @end table @node Bindat Functions