v6.1.0 2022-03-29
-----------------

**breaking changes**
- The deprecated functions `Cstruct.len`, `Cstruct.add_len`, `Cstruct.set_len`,
  and `Cstruct.blit_to_string` have been removed (@hannesm #291)

- Implement host_endian (@haesbaert #292, fixes #72)
- Compatibility with OCaml 5.0.0 (@dinosaure #294)
- Drop support of OCaml < 4.08.0, remove bigarray-compat dependency
  (@hannesm #298)
- Fix year in changes of 6.0.1 (@reynir #297)

v6.0.1 2021-06-25
-----------------

**breaking changes**
- `Cstruct.len` is deprecated, it will be deleted at the next
  release. You should use `Cstruct.length` instead.
  (@dinosaure, @hannesm, #284)

- Remove color from ppx's binary to replicate diff of errors in
  any contexts (@dinosaure, @sternenseemann, #285)
- Add `shiftv` (@talex5, @avsm, @dinosaure, #287)
- Use `Bytes_val` if available (@hannesm, @avsm, @dinosaure, #286)

v6.0.0 2020-09-10
-----------------

**breaking changes**
- Add the function `Cstruct.length`, `Cstruct.len` will
  be deprecated to next release (@dinosaure, @hannesm, @avsm, #279)
- `Cstruct.to_string` requires 2 optional arguments `?off` and `?len`
  (@hannesm, @cfcs, @talex5, @dinosaure, #262)

- Use `ppxlib` instead `ppx_tools_versioned`
  (@pveber, @avsm, @dinosaure, #280)
- Delete the support of old version of OCaml (< 4.07.0) for `ppx_cstruct`
  (@avsm, @dinosaure, #280)
- Add useful functions to be able to parse some contents
  with `Cstruct.t` like the `astring` library (#227,
  @dinosaure, @avsm, @samoht, @hannesm).
- Improve the interface of `Cstruct.t` with capabilities
  (@hannesm, @cfcs, @talex5, @dinosaure, #262)

v5.2.0 2020-06-10
-----------------

Upgrade the `ppx_cstruct` library to use the OCaml 4.11
AST rather than than OCaml 4.04, which in turn should
make it easier to port to ppxlib in the future and
improve interoperability with other PPXs (@bikallem #275).

Also upgrades build files to use dune 2.0 (@bikallem #275)
and fixes the GitHub Actions versions (@smorimoto #273)
and also test OCaml 4.10.0 (@avsm).

v5.1.1 2019-11-23
-----------------

This is a point release to fix a regression in 5.1.0
on compilers earlier than 4.07.

The release also fixes the test suite and CI on compilers
greater than 4.07.

v5.1.0 2019-11-23
-----------------

- Do not issue deprecation warnings when using OCaml 4.08.0
  and cstruct-ppx with enums due to `Pervasives` (#269 @cypheon @hannesm)

- Tighten parsing of the `[@len]` attribute to ensure it is a
  valid, positive integer (#265 @emillon)

- Update JavaScript bindings to latest `Js_of_ocaml` 3.5.0
  interfaces (@hhugo #268)

v5.0.0 2019-04-19
-----------------

**Security**: This release tightens bounds checks to ensure
that data outside a given view (but still inside the underlying
buffer) cannot be accessed.

- `sub` does more checks (#244 #245 @hannesm @talex5 review by @dinosaure)
- `add_len` and `set_len` are now deprecated and will be removed
  in a future release. (#251 @hannesm)
- do not add user-provided data for bounds checks 
  (#253 @hannesm, report and review by @talex5)
- improve CI to add fuzzing (#255 #252 @avsm @yomimono @talex5)

**Remove Unix dependency**: cstruct now uses the new `bigarray-compat`
library instead of Bigarray directly, to avoid a dependency on Unix
when using OCaml compilers less than 4.06.0.  This will break downstream
libraries that do not have a direct dependency on `Bigarray`.  Simply
fix it in your library by adding a `bigarray` dependency in your dune
file. (#247 @TheLortex)

**Capability module**: To improve the safety of future code with stronger type
checking, this release introduces a new `Cstruct_cap` module which makes the
underlying Cstruct an abstract type instead of a record. In return for this
extra abstraction, the module can enforce read-only, write only, and read/write
buffers by tracking them as phantom type variables.  Although this library
shares an implementation internally with classic `Cstruct`, it is a significant
revision and so we will be gradually migrating to it.  Feedback on it is
welcome! (#237 @dinosaure and many excited reviewers)

**Ppx compare functions**: A new `compare_X` function is generated for
`cenum` declarations. This respects custom ids supplied in the cenum
declaration and so is more robust than polymorphic compare (#248 @emillon)

The CI has also been switched over to both Azure Pipelines and Drone in
addition to Travis, and as a result the tests all run on Windows, macOS,
various Linux distributions, on x86 and arm64 machines, and runs AFL
fuzz tests on the Drone cloud (#255 @avsm).

v4.0.0 2019-03-25
-----------------

- Sexplib is now an optional library for the base `Cstruct` module.
  A new `Cstruct_sexp` module has been introduced with the serialiser
  functions, contained within the `cstruct-sexp` opam package.

  To convert old code, simply use `Cstruct_sexp.t` instead of
  `Cstruct.t` in a record type for which you are using `[@@deriving sexp]`.
  This is a type alias to `Cstruct.t` but also has the right
  sexp-conversion functions in scope.  There is an example of this
  in the `ppx_test/with-sexp` directory in the source repo.

  When you have converted and released your library, add an
  opam constraint of `cstruct {>="4.0.0"}` to your own opam
  packages to ensure that they pick up this version of the library.
  (fixes #222, @avsm)

- JavaScript stubs are now installed using the jsoo mechanism
  rather than a manual specification (#241 @jonludlam)

- Use computed versions in opam files to ensure that dependent
  opam packages such as cstruct-async get the same base version
  of cstruct to avoid mismatches. (@avsm)

- Add a ppx test suite to checks that all error paths in ppx
  handling are reachable and have meaningful location info (#238 @emillon)

v3.7.0 2019-03-10
-----------------

- Improve performance by not doing redundant bounds checks
  in both the Bigarray and Cstruct level (#236 @Reperator @chambart)
- Ignore fields starting wih `_` by skipping code generation
  but still respecting the space usage of that field. This was
  a convention before but is now enforced by the code generator
  to save space in the output (#233 @emillon)
- More warnings suppression for sizeof and enums (#231 @emillon)

v3.6.0 2019-03-01
-----------------

- A `[%%cstruct type ...]` declaration generates many values that
  are potentially unused. The code generator in `ppx_cstruct` now
  guarantees that there will be no more "unused value" (warning 32)
  statements from use of the ppx form. (#228 @emillon)
- Actually run the ppx tests instead of just building them.
  (#227 @emillon to fix #226 from @XVilka)


v3.5.0 2019-02-26
-----------------

- Remove trailing spaces in hexdump output (#219 @emillon)
- Add `Cstruct.rev` to allocate a reversed cstruct (#221 @emillon)
- `Cstruct_unix` now uses the post-OCaml 4.06 `Unix.map_file`
  instead of the deprecated Bigarray `map_file` that was removed
  in OCaml 4.08 (@avsm, see ocaml/ocaml#2263)
- Remove unnecessary `(wrapped false)` in the build system (@avsm)
- Correct ocamldoc to the right `cstruct-ppx` package pointer (@avsm)

v3.4.0 2019-02-02
-----------------

- Remove old compatibility packages for `cstruct.lwt`, `cstruct.async`,
  `cstruct.ppx` and `cstruct.unix`.  These were deprecated in
  cstruct.3.0.0 in favour of counter part libraries with a dash
  in the name (`cstruct-lwt`, `cstruct-async`, `cstruct.unix`)
  or `ppx_cstruct` for the PPX extension. (@avsm)

v3.3.0 2019-01-22
-----------------

- Support for bi-endian cstructs that generate both sets of accessor
  functions (#212 by @XVilka). This generates both `BE` and `LE`
  modules to use as needed.

- Modify `of_string` and `of_bytes` to have an option `?off`
  offset argument into the source bytes. (#208 by @XVilka)

- Improve tests to work on 32-bit architectures and handle
  Gc better (@samoht)

- Do not depend explicitly on deprecated `ppx_driver`. This was
  primarily there for older compilers, and new uses should be
  based around `ppxlib`. (#201 by @edwintorok).

- Upgrade opam metadata to 2.0 format. (#217 by @XVilka @avsm)

- Upgrade to dune from jbuilder and support dune-release instead
  of topkg (@avsm)

v3.2.1 2017-12-13
-----------------

- improve performance by using primitives instead of C stubs.  the performance
  regression was introduced in #177 in 3.2.0 (#195 by @pqwy)

v3.2.0 2017-11-17
-----------------

- wrap `hexdump_pp` output in a box (#175 by @cfcs)
- remove dependency on `ocplib-endian` (#177 by @hannesm)
- add `of_hex: string -> t` (#179 by @hannesm and @pqwy)
- add `to_bytes: t -> Bytes.t` (#183 by @hannesm)
- add `empty: t` (#184 by @hannesm)
- sub: check the bounds more carefully for overflow (#185 by @hannesm)
- cstruct-unix: fix the build on OCaml 4.06.0 (#187 by @djs55)
- travis: test OCaml 4.04.2 and 4.06.0 (#186 by @hannesm)

v3.1.1 2017-07-13
-----------------

- `check_alignment` now treats a large alignment as an unsigned value
  and so doesnt raise a signal (#171 by @yallop)
- Improve Windows support by avoiding `void *` pointer arithmetic and
  have more portable headers in the C stubs (#170 by @fdopen)

v3.1.0 2017-07-12
-----------------

- Fix arithmetic overflow in `Cstruct.lenv` and `copyv` (#159 by @yallop)
- Reject negative destination offsets in `blit` (#160 by @yallop)
- Add AFL fuzz tests using Crowbar, which independently discovered
  #160 and also an overflow in `of_bigarray` and `sub`, now bith
  fixed (#164 by @talex5)
- Improve performance of several allocation functions by eliminating an
  unnecessary buffer zero step (#158 by @hannesm)
- Compile the source tree with stricter flags, including dead variable
  detection and deprecation warnings (#157 by @samoht)
- Bump the required minimum OCaml version up to 4.03.0 (due to #157).

v3.0.2 2017-06-14
-----------------

- fix the `cstruct-async` package build, and depend on the latest
  Async packages (>="v0.9.0") as part of this. (#152 @jnfoster)

v3.0.1 2017-06-09
-----------------

- ppx: remove an errant standalone initialiser that was messing up
  the composition of cstruct with other `ppx_driver` based ppx converters
  (most notably `ppx_sexp_conv`.  If you are having trouble with using
  `ppx_cstruct` with other drivers, put a constraint on `ppx_cstruct>=3.0.1`.
  (#151 #150 #149 #148 via @djs55 @g2p @avsm @diml).
- ppx: also add a test case for `cstruct` and `lwt` working together, but
  this will not work until a `lwt>3.0` release happens.
- Update opam rules to use `jbuilder subst` for version information
  in the distribution.
- Fix tests so that `check_alignment` expects a negative result.
- Add opam test target for core library.

v3.0.0 2017-05-11
-----------------

- Split up OPAM packages into multiple independent ones. We now
  have a standalone `cstruct`, and then separate `cstruct-lwt`,
  `cstruct-async`, `cstruct-unix` packages, and a `ppx_cstruct`
  package for the syntax extension. Transitional findlib packages
  with the old scheme are available, but now packages should migrate
  to using `cstruct-async` instead of `cstruct.async` for example.
  This has the added benefit of the OPAM package names now matching
  the findlib names. (#138 by @avsm @rgrinberg).

- Port build to [jbuilder](https://github.com/janestreet/jbuilder).
  See the README for local development instructions.

- Ensure that `check_alignment` only takes a non-zero argument
  for alignment (#143 #145 by @cfcs @avsm).

v2.4.1 2017-05-03
-----------------

- fix missing `ppx_tools_versioned` dependency (#136, @let-def)

v2.4.0 2017-03-30
-----------------

Distribute the PPX extension so that it is compatible with Jbuilder.
`ppx_cstruct` is now distributed as both a library and a binary.
Findlib predicates are used to distinguish usage:
 - the binary is used for toplevel and simple -ppx building
 - the library is used for linking custom rewriters
 - `-package cstruct.ppx` alone uses the binary for rewriting.
 - `-package cstruct.ppx` -predicates custom_ppx,ppx_driver" is used to link the rewriter.

To use the PPX extension in jbuilder, just add:

```
  (libraries (cstruct))
  (preprocess (pps (cstruct.ppx)))
```

to your `jbuild` file.  This may be renamed to `ppx_cstruct` in a
future release so that the PPX dependency is decoupled from the main
library, so this `cstruct.ppx` is intended to be transitional as it
is what was originally used.

v2.3.3 2017-03-28
-----------------

* Port ppx extension to use `ocaml-migrate-parsetree` so it should
  also compile on future revisions of OCaml (#127 via @let-def).

v2.3.2 2017-03-03
-----------------

* Add support for OCaml 4.05 for the PPX extension.
* Docs: correct to description of shift function (#121 via @orbifx).

v2.3.1 2016-12-10
-----------------

* Fix a memory leak in the exception printing code (#130 via @djs55)
* Appveyor CI fixes (#130 via @avsm)
* Fix typo in docstring (#117 via @yomimono)
* Fix opam base-unix dependency (#115 via @avsm)

v2.3.0 2016-08-16
-----------------

* Add `Cstruct.of_bytes/to_bytes`. In common with the existing
  implementation, this relies on the representation of bytes and string
  being the same, which is true as of OCaml 4.04 and lower (#105 via @yallop).
* Support OCaml 4.04 (#111 via @gasche).

v2.2.0 2016-06-30
-----------------

* Make `create` zero out the new buffer. The new `create_unsafe`
  function can be used if you want to trade safety for speed.

v2.1.0 2016-05-04
-----------------

* Add `hexdump_pp` that uses the Format module. This works better with the
  Logs library than using `hexdump_to_buffer`, and also makes it easy to
  indent the hexdump (#100 via @talex5).

v2.0.0 2016-04-26
-----------------

* Remove camlp4 extension as it is no longer maintained (#95).
* Add support for OCaml 4.03 in the PPX extension (#96).
* Minimum supported OCaml version for the library is now 4.02.3.
* Fix parsing of high int32 `@@enum` values.
* Move `Cstruct.check_alignment` into the stubs. Before this patch
  we returned the buffer address from C and then calculated using
  OCaml's boxed `Int64.t`. This patch reduces minor allocations by
  performing the calculation in the C stubs. This makes the function
  suitable for use in an assert in a performance sensitive path.

v1.9.0 2016-02-19
-----------------

* Add support for a ppx-based extension that uses the extension point
  support in OCaml 4.02 and higher to generate Cstruct and Cenum
  function definitions.  The new syntax is documented in the README file.

v1.8.0 2016-01-05
-----------------

* Add support for `-safe-string` in OCaml 4.02 upwards.
  The main change is to rename `blit_to_string` to `blit_to_bytes` and
  change its type so that it writes to bytes rather than string
  (#74 by @yallop).
* Remove strong build-time dependency on `camlp4` in the base library.
  The `sexplib` functions were only used in the interface, so replace them
  with manually written ones.  This also enables compatibility with latest
  Core that has switched to ppx.
* Add multi-distro testing via Travis/Docker containers.

v1.7.1 2015-12-15
-----------------

* Correct error output for `LE.get_uint16` on invalid bounds (#75)
* Fix `fillv`. If the source didn't fit in the buffer then we
  skipped the amount we wanted to copy, not the amount actually copied (#77).

v1.7.0 2015-07-11
-----------------

* Add `Cstruct.concat` and `Cstruct.append` (#57, @pqwy)
* Add `js_of_ocaml` stubs (#63, #64, @djs55)

v1.6.0 2015-03-28
-----------------

* Add `memset` to set all the bytes of a cstruct value efficiently (#49)
* More useful `Invalid_argument` parameters (#48).
* Fix `to_sexp` to expose only the current view (#44 from David Kaloper).
* Add `compare` and `equal` (#23, #24 and #45 from David Kaloper).
* Add `fillv` to copy over a list of buffers (from Thomas Leonard).
* Shift to centralised Travis scripts.

v1.5.0 2014-11-24
-----------------

* Make `camlp4` an optional build-time dependency (#35).
* Remove `ounit` as a dependency in the `opam` file.
* Improve `opam` description file for OPAM 1.2 workflow (#36).
* Refresh Merlin IDE description (#37).

v1.4.0 2014-08-10
-----------------

Comprehensive addition of bounds checking to all cstruct operations
(from @pqwy in #33).  The major changes are:
* Disallow negative indexing with all cstruct accessors.
* Disallow negative `sub` and `shift` operations.
* Make sure `of_bigarray` cannot create invalid `cstruct` values.

v1.3.1 2014-07-10
-----------------

* Also bounds test single-byte operations on views (#31 via @pqwy).

v1.3.0 2014-07-04
-----------------

* Add bounds checks for `Cstruct.BE/LE` functions that violate a view.
  Previously, only bounds errors on the underlying buffers would raise.
  Bug #25, reported by Mindy Preston in mirage/mirage-tcpip#56.
* Add 'Lwt_cstruct.complete' to ensure that `read`/`write` operatiosn
  run to completion.
* Add `Sexplib` conversion functions to `Cstruct.t` values (#27 #22).

v1.2.0 2014-06-06
-----------------

Add a `sexp` optional decorator to `cenum` to output the values as s-expressions.
This is compatible with the `sexplib` convention.  The syntax is;

```
cenum foo64 {
  ONE64;
  TWO64;
  THREE64
} as uint64_t(sexp)
```

And `sexp_of_foo64` and `foo64_of_sexp` functions will also be available.
The representation of the Sexp is the string representation of the enum.

v1.1.0 2014-02-19
-----------------

* Improve bounds checks on sub, shift, set_len, add_len.
* Add `to_bigarray` to convert back into a Bigarray slice.

v1.0.1 2013-12-09
-----------------

* Fix Cstruct.shift function

v1.0.0 2013-12-05
-----------------

* Remove IPv4/IPv6 types (now moved to `ocaml-ipaddr`).
* Improved ocamldoc for the interface.
* More conservative bounds checking in the length manipulation functions.
* Build C stubs with `-Wall`.

v0.8.1 2013-11-06
-----------------

* Trailing semicolons are allowed in cstruct field definitions.
* Buffer elements can be any primitive integer, not just `uint8`.

v0.8.0 2013-10-13
-----------------

* Improved ocamldoc for BE/LE modules.
* Add Travis-CI test scripts and fix `test.sh` script compilation.
* Support int32/int64 constant values in cenum like `VAL = 0xffffffffl`, useful for 32-bit hosts.
* Check and raise error in case of negative offsets for blits (#4).
* Correctly preserve the sequence after a constant constructor is set during a `cenum` definition.
* Do not repeat the `sizeof_<field>` binding for every get/set field (should be no externally observable change).
* Add `Cstruct.hexdump_to_buffer` to make spooling hexdump output easier.
* Generate `hexdump_foo` and `hexdump_foo_to_buffer` prettyprinting functions for a `cstruct foo`.

v0.7.1 2013-03-06
-----------------

* Add `Async_cstruct.Pipe` to map pipes of `Cstruct` buffers to strings or `Bigsubstring`.

v0.7.0 2013-02-25
-----------------

* Add zero-copy conversion functions to/from the Core `Bigsubstring`.
* Add an `of_string` function to simplify the construction from OCaml values.
* Add Async interface to interoperate with Jane Street Core code.

v0.6.2 2013-02-08
-----------------

* Add experimental `cstruct.obuild` for the `obuild` build tool.
* Use bounds checked version of all functions in the external interface.
* Expose the `Cstruct.debug` to dump internal state of a buffer to a string.
* Add `set_len` and `add_len` to manipulate the total-length field directly.

v0.6.1 2012-12-20
-----------------

* Add `sendto`, `read` and `recvfrom` functions to the Lwt subpackage.

v0.6.0 2012-12-20
-----------------

* Add fast bigarray<->string functions to replace byte-by-byte copies.
* Add an Lwt sub-package to expose a write call.
* Depend on ocplib-endian for fast low-level parsing of integers.
* Make `Cstruct.t` a record type that doesn't use Bigarray slicing
  to provide views onto buffers. This lets views be allocated directly
  on the minor heap rather than forcing a major heap allocation. It
  does alter the external API, so previous users of cstruct wont work.

v0.5.3 2012-12-16
-----------------

* No functional changes, just OASIS packaging fix to right version.

v0.5.2 2012-12-11
-----------------

* Remove the separate `xen` and `unix` subdirectories, as the
  portable `Bigarray` is now provided by the `xenbigarray` package.

v0.5.1 2012-09-28
-----------------

* Add `string_to_<cenum>` function to match the `<cenum>_to_string`,
  primarily to help with command-line parsing of enum arguments.

v0.5.0 2012-09-20
-----------------

* Add a signature generator for cstruct and cenum to permit their use in `.mli` files.
* Use the more reliable revised syntax camlp4 quotation expander, to avoid
  broken AST output from antiquotations.
* Switch the `xen/` version over to using OASIS also.

v0.4.0 2012-09-02
-----------------

* Fix META file for use with Xen

v0.3 2012-08-25
--------------

* Initial public release
