text: // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
  // License: https://creativecommons.org/licenses/by-nc-sa/4.0/
  
  // See page 362.
  // This is the version that appears in print,
  // but it does not comply with the proposed
  // rules for passing pointers between Go and C.
  // (https://github.com/golang/proposal/blob/master/design/12416-cgo-pointers.md)
  // See gopl.io/ch13/bzip for an updated version.
  
  //!+
  /* This file is gopl.io/ch13/bzip/bzip2.c,         */
  /* a simple wrapper for libbzip2 suitable for cgo. */
  #include <bzlib.h>
  
  int bz2compress(bz_stream *s, int action,
                  char *in, unsigned *inlen, char *out, unsigned *outlen) {
    s->next_in = in;
    s->avail_in = *inlen;
    s->next_out = out;
    s->avail_out = *outlen;
    int r = BZ2_bzCompress(s, action);
    *inlen -= s->avail_in;
    *outlen -= s->avail_out;
    return r;
  }
  
  //!-
  