Clarify licensing for Debian.
[ocaml-bitstring.git] / bitmatch.mli
1 (** Bitmatch library. *)
2 (* Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version,
8  * with the OCaml linking exception described in COPYING.LIB.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  *
19  * $Id$
20  *)
21
22 (**
23    {{:#reference}Jump straight to the reference section for
24    documentation on types and functions}.
25
26    {2 Introduction}
27
28    Bitmatch adds Erlang-style bitstrings and matching over bitstrings
29    as a syntax extension and library for OCaml.  You can use
30    this module to both parse and generate binary formats, for
31    example, communications protocols, disk formats and binary files.
32
33    {{:http://code.google.com/p/bitmatch/}OCaml bitmatch website}
34
35    {2 Examples}
36
37    A function which can parse IPv4 packets:
38
39 {[
40 let display pkt =
41   bitmatch pkt with
42   (* IPv4 packet header
43     0                   1                   2                   3   
44     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
45    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46    |   4   |  IHL  |Type of Service|          Total Length         |
47    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48    |         Identification        |Flags|      Fragment Offset    |
49    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50    |  Time to Live |    Protocol   |         Header Checksum       |
51    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52    |                       Source Address                          |
53    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54    |                    Destination Address                        |
55    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56    |                    Options                    |    Padding    |
57    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58   *)
59   | { 4 : 4; hdrlen : 4; tos : 8;   length : 16;
60       identification : 16;          flags : 3; fragoffset : 13;
61       ttl : 8; protocol : 8;        checksum : 16;
62       source : 32;
63       dest : 32;
64       options : (hdrlen-5)*32 : bitstring;
65       payload : -1 : bitstring } ->
66
67     printf "IPv4:\n";
68     printf "  header length: %d * 32 bit words\n" hdrlen;
69     printf "  type of service: %d\n" tos;
70     printf "  packet length: %d bytes\n" length;
71     printf "  identification: %d\n" identification;
72     printf "  flags: %d\n" flags;
73     printf "  fragment offset: %d\n" fragoffset;
74     printf "  ttl: %d\n" ttl;
75     printf "  protocol: %d\n" protocol;
76     printf "  checksum: %d\n" checksum;
77     printf "  source: %lx  dest: %lx\n" source dest;
78     printf "  header options + padding:\n";
79     Bitmatch.hexdump_bitstring stdout options;
80     printf "  packet payload:\n";
81     Bitmatch.hexdump_bitstring stdout payload
82
83   | { version : 4 } ->
84     eprintf "unknown IP version %d\n" version;
85     exit 1
86
87   | { _ } as pkt ->
88     eprintf "data is smaller than one nibble:\n";
89     Bitmatch.hexdump_bitstring stderr pkt;
90     exit 1
91 ]}
92
93    A program which can parse
94    {{:http://lxr.linux.no/linux/include/linux/ext3_fs.h}Linux EXT3 filesystem superblocks}:
95
96 {[
97 let bits = Bitmatch.bitstring_of_file "tests/ext3_sb"
98
99 let () =
100   bitmatch bits with
101   | { s_inodes_count : 32 : littleendian;       (* Inodes count *)
102       s_blocks_count : 32 : littleendian;       (* Blocks count *)
103       s_r_blocks_count : 32 : littleendian;     (* Reserved blocks count *)
104       s_free_blocks_count : 32 : littleendian;  (* Free blocks count *)
105       s_free_inodes_count : 32 : littleendian;  (* Free inodes count *)
106       s_first_data_block : 32 : littleendian;   (* First Data Block *)
107       s_log_block_size : 32 : littleendian;     (* Block size *)
108       s_log_frag_size : 32 : littleendian;      (* Fragment size *)
109       s_blocks_per_group : 32 : littleendian;   (* # Blocks per group *)
110       s_frags_per_group : 32 : littleendian;    (* # Fragments per group *)
111       s_inodes_per_group : 32 : littleendian;   (* # Inodes per group *)
112       s_mtime : 32 : littleendian;              (* Mount time *)
113       s_wtime : 32 : littleendian;              (* Write time *)
114       s_mnt_count : 16 : littleendian;          (* Mount count *)
115       s_max_mnt_count : 16 : littleendian;      (* Maximal mount count *)
116       0xef53 : 16 : littleendian } ->           (* Magic signature *)
117
118     printf "ext3 superblock:\n";
119     printf "  s_inodes_count = %ld\n" s_inodes_count;
120     printf "  s_blocks_count = %ld\n" s_blocks_count;
121     printf "  s_free_inodes_count = %ld\n" s_free_inodes_count;
122     printf "  s_free_blocks_count = %ld\n" s_free_blocks_count
123
124   | { _ } ->
125     eprintf "not an ext3 superblock!\n%!";
126     exit 2
127 ]}
128
129    Constructing packets for a simple binary message
130    protocol:
131
132 {[
133 (*
134   +---------------+---------------+--------------------------+
135   | type          | subtype       | parameter                |
136   +---------------+---------------+--------------------------+
137    <-- 16 bits --> <-- 16 bits --> <------- 32 bits -------->
138
139   All fields are in network byte order.
140 *)
141
142 let make_message typ subtype param =
143   (BITSTRING {
144      typ : 16;
145      subtype : 16;
146      param : 32
147    }) ;;
148 ]}
149
150    {2 Loading, creating bitstrings}
151
152    The basic data type is the {!bitstring}, a string of bits of
153    arbitrary length.  Bitstrings can be any length in bits and
154    operations do not need to be byte-aligned (although they will
155    generally be more efficient if they are byte-aligned).
156
157    Internally a bitstring is stored as a normal OCaml [string]
158    together with an offset and length, where the offset and length are
159    measured in bits.  Thus one can efficiently form substrings of
160    bitstrings, overlay a bitstring on existing data, and load and save
161    bitstrings from files or other external sources.
162
163    To load a bitstring from a file use {!bitstring_of_file} or
164    {!bitstring_of_chan}.
165
166    There are also functions to create bitstrings from arbitrary data.
167    See the {{:#reference}reference} below.
168
169    {2 Matching bitstrings with patterns}
170
171    Use the [bitmatch] operator (part of the syntax extension) to break
172    apart a bitstring into its fields.  [bitmatch] works a lot like the
173    OCaml [match] operator.
174
175    The general form of [bitmatch] is:
176
177    [bitmatch] {i bitstring-expression} [with]
178
179    [| {] {i pattern} [} ->] {i code}
180
181    [| {] {i pattern} [} ->] {i code}
182
183    [|] ...
184
185    As with normal match, the statement attempts to match the
186    bitstring against each pattern in turn.  If none of the patterns
187    match then the standard library [Match_failure] exception is
188    thrown.
189
190    Patterns look a bit different from normal match patterns.  They
191    consist of a list of bitfields separated by [;] where each bitfield
192    contains a bind variable, the width (in bits) of the field, and
193    other information.  Some example patterns:
194
195 {[
196 bitmatch bits with
197
198 | { version : 8; name : 8; param : 8 } -> ...
199
200    (* Bitstring of at least 3 bytes.  First byte is the version
201       number, second byte is a field called name, third byte is
202       a field called parameter. *)
203
204 | { flag : 1 } ->
205    printf "flag is %b\n" flag
206
207    (* A single flag bit (mapped into an OCaml boolean). *)
208
209 | { len : 4; data : 1+len } ->
210    printf "len = %d, data = 0x%Lx\n" len data
211
212    (* A 4-bit length, followed by 1-16 bits of data, where the
213       length of the data is computed from len. *)
214
215 | { ipv6_source : 128 : bitstring;
216     ipv6_dest : 128 : bitstring } -> ...
217
218    (* IPv6 source and destination addresses.  Each is 128 bits
219       and is mapped into a bitstring type which will be a substring
220       of the main bitstring expression. *)
221 ]}
222
223    You can also add conditional when-clauses:
224
225 {[
226 | { version : 4 }
227     when version = 4 || version = 6 -> ...
228
229    (* Only match and run the code when version is 4 or 6.  If
230       it isn't we will drop through to the next case. *)
231 ]}
232
233    Note that the pattern is only compared against the first part of
234    the bitstring (there may be more data in the bitstring following
235    the pattern, which is not matched).  In terms of regular
236    expressions you might say that the pattern matches [^pattern], not
237    [^pattern$].  To ensure that the bitstring contains only the
238    pattern, add a length -1 bitstring to the end and test that its
239    length is zero in the when-clause:
240
241 {[
242 | { n : 4;
243     rest : -1 : bitstring }
244     when Bitmatch.bitstring_length rest = 0 -> ...
245
246    (* Only matches exactly 4 bits. *)
247 ]}
248
249    Normally the first part of each field is a binding variable,
250    but you can also match a constant, as in:
251
252 {[
253 | { (4|6) : 4 } -> ...
254
255    (* Only matches if the first 4 bits contain either
256       the integer 4 or the integer 6. *)
257 ]}
258
259    One may also match on strings:
260
261 {[
262 | { "MAGIC" : 5*8 : string } -> ...
263
264    (* Only matches if the string "MAGIC" appears at the start
265       of the input. *)
266 ]}
267
268    {3:patternfieldreference Pattern field reference}
269
270    The exact format of each pattern field is:
271
272    [pattern : length [: qualifier [,qualifier ...]]]
273
274    [pattern] is the pattern, binding variable name, or constant to
275    match.  [length] is the length in bits which may be either a
276    constant or an expression.  The length expression is just an OCaml
277    expression and can use any values defined in the program, and refer
278    back to earlier fields (but not to later fields).
279
280    Integers can only have lengths in the range \[1..64\] bits.  See the
281    {{:#integertypes}integer types} section below for how these are
282    mapped to the OCaml int/int32/int64 types.  This is checked
283    at compile time if the length expression is constant, otherwise it is
284    checked at runtime and you will get a runtime exception eg. in
285    the case of a computed length expression.
286
287    A bitstring field of length -1 matches all the rest of the
288    bitstring (thus this is only useful as the last field in a
289    pattern).
290
291    A bitstring field of length 0 matches an empty bitstring
292    (occasionally useful when matching optional subfields).
293
294    Qualifiers are a list of identifiers/expressions which control the type,
295    signedness and endianness of the field.  Permissible qualifiers are:
296
297    - [int]: field has an integer type
298    - [string]: field is a string type
299    - [bitstring]: field is a bitstring type
300    - [signed]: field is signed
301    - [unsigned]: field is unsigned
302    - [bigendian]: field is big endian - a.k.a network byte order
303    - [littleendian]: field is little endian - a.k.a Intel byte order
304    - [nativeendian]: field is same endianness as the machine
305    - [endian (expr)]: [expr] should be an expression which evaluates to
306        a {!endian} type, ie. [LittleEndian], [BigEndian] or [NativeEndian].
307        The expression is an arbitrary OCaml expression and can use the
308        value of earlier fields in the bitmatch.
309    - [offset (expr)]: see {{:#computedoffsets}computed offsets} below.
310
311    The default settings are [int], [unsigned], [bigendian], no offset.
312
313    Note that many of these qualifiers cannot be used together,
314    eg. bitstrings do not have endianness.  The syntax extension should
315    give you a compile-time error if you use incompatible qualifiers.
316
317    {3 Other cases in bitmatch}
318
319    As well as a list of fields, it is possible to name the
320    bitstring and/or have a default match case:
321
322 {[
323 | { _ } -> ...
324
325    (* Default match case. *)
326
327 | { _ } as pkt -> ...
328
329    (* Default match case, with 'pkt' bound to the whole bitstring. *)
330 ]}
331
332    {2 Constructing bitstrings}
333
334    Bitstrings may be constructed using the [BITSTRING] operator (as an
335    expression).  The [BITSTRING] operator takes a list of fields,
336    similar to the list of fields for matching:
337
338 {[
339 let version = 1 ;;
340 let data = 10 ;;
341 let bits =
342   BITSTRING {
343     version : 4;
344     data : 12
345   } ;;
346
347    (* Constructs a 16-bit bitstring with the first four bits containing
348       the integer 1, and the following 12 bits containing the integer 10,
349       arranged in network byte order. *)
350
351 Bitmatch.hexdump_bitstring stdout bits ;;
352
353    (* Prints:
354
355       00000000  10 0a         |..              |
356     *)
357 ]}
358
359    The format of each field is the same as for pattern fields (see
360    {{:#patternfieldreference}Pattern field reference section}), and
361    things like computed length fields, fixed value fields, insertion
362    of bitstrings within bitstrings, etc. are all supported.
363
364    {3 Construction exception}
365
366    The [BITSTRING] operator may throw a {!Construct_failure}
367    exception at runtime.
368
369    Runtime errors include:
370
371    - int field length not in the range \[1..64\]
372    - a bitstring with a length declared which doesn't have the
373      same length at runtime
374    - trying to insert an out of range value into an int field
375      (eg. an unsigned int field which is 2 bits wide can only
376      take values in the range \[0..3\]).
377
378    {2:integertypes Integer types}
379
380    Integer types are mapped to OCaml types [bool], [int], [int32] or
381    [int64] using a system which tries to ensure that (a) the types are
382    reasonably predictable and (b) the most efficient type is
383    preferred.
384
385    The rules are slightly different depending on whether the bit
386    length expression in the field is a compile-time constant or a
387    computed expression.
388
389    Detection of compile-time constants is quite simplistic so only
390    simple integer literals and simple expressions (eg. [5*8]) are
391    recognized as constants.
392
393    In any case the bit size of an integer is limited to the range
394    \[1..64\].  This is detected as a compile-time error if that is
395    possible, otherwise a runtime check is added which can throw an
396    [Invalid_argument] exception.
397
398    The mapping is thus:
399
400    {v
401    Bit size         ---- OCaml type ----
402                 Constant        Computed expression
403
404    1            bool            int64
405    2..31        int             int64
406    32           int32           int64
407    33..64       int64           int64
408    v}
409
410    A possible future extension may allow people with 64 bit computers
411    to specify a more optimal [int] type for bit sizes in the range
412    [32..63].  If this was implemented then such code {i could not even
413    be compiled} on 32 bit platforms, so it would limit portability.
414
415    Another future extension may be to allow computed
416    expressions to assert min/max range for the bit size,
417    allowing a more efficient data type than int64 to be
418    used.  (Of course under such circumstances there would
419    still need to be a runtime check to enforce the
420    size).
421
422    {2:computedoffsets Computed offsets}
423
424    You can add an [offset(..)] qualifier to bitmatch patterns in order
425    to move the current offset within the bitstring forwards.
426
427    For example:
428
429 {[
430 bitmatch bits with
431 | { field1 : 8;
432     field2 : 8 : offset(160) } -> ...
433 ]}
434
435    matches [field1] at the start of the bitstring and [field2]
436    at 160 bits into the bitstring.  The middle 152 bits go
437    unmatched (ie. can be anything).
438
439    The generated code is efficient.  If field lengths and offsets
440    are known to be constant at compile time, then almost all
441    runtime checks are avoided.  Non-constant field lengths and/or
442    non-constant offsets can result in more runtime checks being added.
443
444    Note that moving the offset backwards, and moving the offset in
445    [BITSTRING] constructors, are both not supported at present.
446
447    {2 Named patterns and persistent patterns}
448
449    Please see {!Bitmatch_persistent} for documentation on this subject.
450
451    {2 Compiling}
452
453    Using the compiler directly you can do:
454
455    {v
456    ocamlc -I +bitmatch \
457      -pp "camlp4of bitmatch.cma bitmatch_persistent.cma \
458             `ocamlc -where`/bitmatch/pa_bitmatch.cmo" \
459      unix.cma bitmatch.cma test.ml -o test
460    v}
461
462    Simpler method using findlib:
463
464    {v
465    ocamlfind ocamlc \
466      -package bitmatch,bitmatch.syntax -syntax bitmatch.syntax \
467      -linkpkg test.ml -o test
468    v}
469
470    {2 Security and type safety}
471
472    {3 Security on input}
473
474    The main concerns for input are buffer overflows and denial
475    of service.
476
477    It is believed that this library is robust against attempted buffer
478    overflows.  In addition to OCaml's normal bounds checks, we check
479    that field lengths are >= 0, and many additional checks.
480
481    Denial of service attacks are more problematic.  We only work
482    forwards through the bitstring, thus computation will eventually
483    terminate.  As for computed lengths, code such as this is thought
484    to be secure:
485
486    {[
487    bitmatch bits with
488    | { len : 64;
489        buffer : Int64.to_int len : bitstring } ->
490    ]}
491
492    The [len] field can be set arbitrarily large by an attacker, but
493    when pattern-matching against the [buffer] field this merely causes
494    a test such as [if len <= remaining_size] to fail.  Even if the
495    length is chosen so that [buffer] bitstring is allocated, the
496    allocation of sub-bitstrings is efficient and doesn't involve an
497    arbitary-sized allocation or any copying.
498
499    However the above does not necessarily apply to strings used in
500    matching, since they may cause the library to use the
501    {!Bitmatch.string_of_bitstring} function, which allocates a string.
502    So you should take care if you use the [string] type particularly
503    with a computed length that is derived from external input.
504
505    The main protection against attackers should be to ensure that the
506    main program will only read input bitstrings up to a certain
507    length, which is outside the scope of this library.
508
509    {3 Security on output}
510
511    As with the input side, computed lengths are believed to be
512    safe.  For example:
513
514    {[
515    let len = read_untrusted_source () in
516    let buffer = allocate_bitstring () in
517    BITSTRING {
518      buffer : len : bitstring
519    }
520    ]}
521
522    This code merely causes a check that buffer's length is the same as
523    [len].  However the program function [allocate_bitstring] must
524    refuse to allocate an oversized buffer (but that is outside the
525    scope of this library).
526
527    {3 Order of evaluation}
528
529    In [bitmatch] statements, fields are evaluated left to right.
530
531    Note that the when-clause is evaluated {i last}, so if you are
532    relying on the when-clause to filter cases then your code may do a
533    lot of extra and unncessary pattern-matching work on fields which
534    may never be needed just to evaluate the when-clause.  You can
535    usually rearrange the code to do only the first part of the match,
536    followed by the when-clause, followed by a second inner bitmatch.
537
538    {3 Safety}
539
540    The current implementation is believed to be fully type-safe,
541    and makes compile and run-time checks where appropriate.  If
542    you find a case where a check is missing please submit a
543    bug report or a patch.
544
545    {2 Limits}
546
547    These are thought to be the current limits:
548
549    Integers: \[1..64\] bits.
550
551    Bitstrings (32 bit platforms): maximum length is limited
552    by the string size, ie. 16 MBytes.
553
554    Bitstrings (64 bit platforms): maximum length is thought to be
555    limited by the string size, ie. effectively unlimited.
556
557    Bitstrings must be loaded into memory before we can match against
558    them.  Thus available memory may be considered a limit for some
559    applications.
560
561    {2:reference Reference}
562    {3 Types}
563 *)
564
565 type endian = BigEndian | LittleEndian | NativeEndian
566
567 val string_of_endian : endian -> string
568 (** Endianness. *)
569
570 type bitstring = string * int * int
571 (** [bitstring] is the basic type used to store bitstrings.
572
573     The type contains the underlying data (a string),
574     the current bit offset within the string and the
575     current bit length of the string (counting from the
576     bit offset).  Note that the offset and length are
577     in {b bits}, not bytes.
578
579     Normally you don't need to use the bitstring type
580     directly, since there are functions and syntax
581     extensions which hide the details.
582
583     See also {!bitstring_of_string}, {!bitstring_of_file},
584     {!hexdump_bitstring}, {!bitstring_length}.
585 *)
586
587 (** {3 Exceptions} *)
588
589 exception Construct_failure of string * string * int * int
590 (** [Construct_failure (message, file, line, char)] may be
591     raised by the [BITSTRING] constructor.
592
593     Common reasons are that values are out of range of
594     the fields that contain them, or that computed lengths
595     are impossible (eg. negative length bitfields).
596
597     [message] is the error message.
598
599     [file], [line] and [char] point to the original source
600     location of the [BITSTRING] constructor that failed.
601 *)
602
603 (** {3 Bitstrings} *)
604
605 val empty_bitstring : bitstring
606 (** [empty_bitstring] is the empty, zero-length bitstring. *)
607
608 val create_bitstring : int -> bitstring
609 (** [create_bitstring n] creates an [n] bit bitstring
610     containing all zeroes. *)
611
612 val make_bitstring : int -> char -> bitstring
613 (** [make_bitstring n c] creates an [n] bit bitstring
614     containing the repeated 8 bit pattern in [c].
615
616     For example, [make_bitstring 16 '\x5a'] will create
617     the bitstring [0x5a5a] or in binary [0101 1010 0101 1010].
618
619     Note that the length is in bits, not bytes.  The length does NOT
620     need to be a multiple of 8. *)
621
622 val zeroes_bitstring : int -> bitstring
623 (** [zeroes_bitstring] creates an [n] bit bitstring of all 0's.
624
625     Actually this is the same as {!create_bitstring}. *)
626
627 val ones_bitstring : int -> bitstring
628 (** [ones_bitstring] creates an [n] bit bitstring of all 1's. *)
629
630 val bitstring_of_string : string -> bitstring
631 (** [bitstring_of_string str] creates a bitstring
632     of length [String.length str * 8] (bits) containing the
633     bits in [str].
634
635     Note that the bitstring uses [str] as the underlying
636     string (see the representation of {!bitstring}) so you
637     should not change [str] after calling this. *)
638
639 val bitstring_of_file : string -> bitstring
640 (** [bitstring_of_file filename] loads the named file
641     into a bitstring. *)
642
643 val bitstring_of_chan : in_channel -> bitstring
644 (** [bitstring_of_chan chan] loads the contents of
645     the input channel [chan] as a bitstring.
646
647     The length of the final bitstring is determined
648     by the remaining input in [chan], but will always
649     be a multiple of 8 bits.
650
651     See also {!bitstring_of_chan_max}. *)
652
653 val bitstring_of_chan_max : in_channel -> int -> bitstring
654 (** [bitstring_of_chan_max chan max] works like
655     {!bitstring_of_chan} but will only read up to
656     [max] bytes from the channel (or fewer if the end of input
657     occurs before that). *)
658
659 val bitstring_of_file_descr : Unix.file_descr -> bitstring
660 (** [bitstring_of_file_descr fd] loads the contents of
661     the file descriptor [fd] as a bitstring.
662
663     See also {!bitstring_of_chan}, {!bitstring_of_file_descr_max}. *)
664
665 val bitstring_of_file_descr_max : Unix.file_descr -> int -> bitstring
666 (** [bitstring_of_file_descr_max fd max] works like
667     {!bitstring_of_file_descr} but will only read up to
668     [max] bytes from the channel (or fewer if the end of input
669     occurs before that). *)
670
671 val bitstring_length : bitstring -> int
672 (** [bitstring_length bitstring] returns the length of
673     the bitstring in bits. *)
674
675 val string_of_bitstring : bitstring -> string
676 (** [string_of_bitstring bitstring] converts a bitstring to a string
677     (eg. to allow comparison).
678
679     This function is inefficient.  In the best case when the bitstring
680     is nicely byte-aligned we do a [String.sub] operation.  If the
681     bitstring isn't aligned then this involves a lot of bit twiddling
682     and is particularly inefficient.
683
684     If the bitstring is not a multiple of 8 bits wide then the
685     final byte of the string contains the high bits set to the
686     remaining bits and the low bits set to 0. *)
687
688 val bitstring_to_file : bitstring -> string -> unit
689 (** [bitstring_to_file bits filename] writes the bitstring [bits]
690     to the file [filename].  It overwrites the output file.
691
692     Some restrictions apply, see {!bitstring_to_chan}. *)
693
694 val bitstring_to_chan : bitstring -> out_channel -> unit
695 (** [bitstring_to_file bits filename] writes the bitstring [bits]
696     to the channel [chan].
697
698     Channels are made up of bytes, bitstrings can be any bit length
699     including fractions of bytes.  So this function only works
700     if the length of the bitstring is an exact multiple of 8 bits
701     (otherwise it raises [Invalid_argument "bitstring_to_chan"]).
702
703     Furthermore the function is efficient only in the case where
704     the bitstring is stored fully aligned, otherwise it has to
705     do inefficient bit twiddling like {!string_of_bitstring}.
706
707     In the common case where the bitstring was generated by the
708     [BITSTRING] operator and is an exact multiple of 8 bits wide,
709     then this function will always work efficiently.
710 *)
711
712 (** {3 Printing bitstrings} *)
713
714 val hexdump_bitstring : out_channel -> bitstring -> unit
715 (** [hexdump_bitstring chan bitstring] prints the bitstring
716     to the output channel in a format similar to the
717     Unix command [hexdump -C]. *)
718
719 (** {3 Bitstring buffer} *)
720
721 module Buffer : sig
722   type t
723   val create : unit -> t
724   val contents : t -> bitstring
725   val add_bits : t -> string -> int -> unit
726   val add_bit : t -> bool -> unit
727   val add_byte : t -> int -> unit
728 end
729 (** Buffers are mainly used by the [BITSTRING] constructor, but
730     may also be useful for end users.  They work much like the
731     standard library [Buffer] module. *)
732
733 (** {3 Miscellaneous} *)
734
735 val package : string
736 (** The package name, always ["ocaml-bitmatch"] *)
737
738 val version : string
739 (** The package version as a string. *)
740
741 val debug : bool ref
742 (** Set this variable to true to enable extended debugging.
743     This only works if debugging was also enabled in the
744     [pa_bitmatch.ml] file at compile time, otherwise it
745     does nothing. *)
746
747 (**/**)
748
749 (* Private functions, called from generated code.  Do not use
750  * these directly - they are not safe.
751  *)
752
753 val extract_bitstring : string -> int -> int -> int -> bitstring * int * int
754
755 val extract_remainder : string -> int -> int -> bitstring * int * int
756
757 val extract_bit : string -> int -> int -> int -> bool * int * int
758
759 val extract_char_unsigned : string -> int -> int -> int -> int * int * int
760
761 val extract_int_be_unsigned : string -> int -> int -> int -> int * int * int
762
763 val extract_int_le_unsigned : string -> int -> int -> int -> int * int * int
764
765 val extract_int_ne_unsigned : string -> int -> int -> int -> int * int * int
766
767 val extract_int_ee_unsigned : endian -> string -> int -> int -> int -> int * int * int
768
769 val extract_int32_be_unsigned : string -> int -> int -> int -> int32 * int * int
770
771 val extract_int32_le_unsigned : string -> int -> int -> int -> int32 * int * int
772
773 val extract_int32_ne_unsigned : string -> int -> int -> int -> int32 * int * int
774
775 val extract_int32_ee_unsigned : endian -> string -> int -> int -> int -> int32 * int * int
776
777 val extract_int64_be_unsigned : string -> int -> int -> int -> int64 * int * int
778
779 val extract_int64_le_unsigned : string -> int -> int -> int -> int64 * int * int
780
781 val extract_int64_ne_unsigned : string -> int -> int -> int -> int64 * int * int
782
783 val extract_int64_ee_unsigned : endian -> string -> int -> int -> int -> int64 * int * int
784
785 val construct_bit : Buffer.t -> bool -> int -> exn -> unit
786
787 val construct_char_unsigned : Buffer.t -> int -> int -> exn -> unit
788
789 val construct_int_be_unsigned : Buffer.t -> int -> int -> exn -> unit
790
791 val construct_int_ne_unsigned : Buffer.t -> int -> int -> exn -> unit
792
793 val construct_int_ee_unsigned : endian -> Buffer.t -> int -> int -> exn -> unit
794
795 val construct_int32_be_unsigned : Buffer.t -> int32 -> int -> exn -> unit
796
797 val construct_int32_ne_unsigned : Buffer.t -> int32 -> int -> exn -> unit
798
799 val construct_int32_ee_unsigned : endian -> Buffer.t -> int32 -> int -> exn -> unit
800
801 val construct_int64_be_unsigned : Buffer.t -> int64 -> int -> exn -> unit
802
803 val construct_int64_ne_unsigned : Buffer.t -> int64 -> int -> exn -> unit
804
805 val construct_int64_ee_unsigned : endian -> Buffer.t -> int64 -> int -> exn -> unit
806
807 val construct_string : Buffer.t -> string -> unit
808
809 val construct_bitstring : Buffer.t -> bitstring -> unit