
============================================================================
LZO -- a real-time data compression library                LIBRARY REFERENCE
============================================================================


[ please read LZO.FAQ first ]


Table of Contents
=================

1      Introduction to the LZO Library Reference
1.1      Preliminary notes
1.2      Headers
2      General
2.1      The memory model
2.2      Public integral types
2.3      Public pointer types
2.4      Public function types
3      Function reference
3.1      Initialization
3.2      Compression
3.3      Decompression
3.4      Optimization
3.5      String functions
3.6      Checksum functions
3.7      Version functions
4      Variable reference



1 Introduction to the LZO Library Reference
=============================================


1.1 Preliminary notes
---------------------

- `C90' is short for ISO 9899-1990, the ANSI/ISO standard for the C
  programming language


1.2 Headers
-----------

This section briefly describes the headers.

<lzo/lzoconf.h>

    Contains definitions for the basic integral and pointer types,
    provides wrappers for the library calling conventions, defines
    error codes and contains prototypes for the generic functions.
    This file is automatically included by all LZO headers.

<lzo/lzo1.h>
<lzo/lzo1a.h>
<lzo/lzo1b.h>
<lzo/lzo1c.h>
<lzo/lzo1f.h>
<lzo/lzo1x.h>
<lzo/lzo1y.h>
<lzo/lzo1z.h>
<lzo/lzo2a.h>

    These files provide definitions and prototypes for the
    actual (de-)compression functions.



2 General
=========


2.1 The memory model
--------------------

The documentation indicates that LZO requires 32-bit integers. It's
not the integer size that really matters, though, but the memory
model. If your memory model allows to access pointers at 32-bit
offsets, then there is no problem at all - LZO works fine on my
old Atari ST, which has 16 bit integers and a flat 32-bit memory model.
Using 'huge' 32-bit pointers under 16-bit DOS is a workaround for this.

While LZO also works with a strict 16-bit memory model, I don't officially
support this because this limits the maximum block size to 64 kB - and this
makes the library incompatible with other platforms, i.e. you cannot
decompress larger blocks compressed on those platforms.


2.2 Public integral types
-------------------------

lzo_uint

    used as size_t, must be 32 bits or more for compatibility reasons

lzo_uint32

    *must* be 32 bits or more

lzo_bool

    can store the values 0 ("false") and 1 ("true")

lzo_byte

    unsigned char (memory model specific)


2.3 Public pointer types
------------------------

All pointer types are memory model specific.

lzo_voidp

    pointer to void

lzo_bytep

    pointer to unsigned char

lzo_bytepp

    array of pointers to unsigned char


2.4 Public function types
-------------------------

lzo_compress_t

lzo_decompress_t

lzo_optimize_t

lzo_callback_t



3 Function reference
====================


3.1 Initialization
------------------

int lzo_init ( void );

  This function initializes the LZO library. It must be the first LZO
  function you call, and you cannot use any of the other LZO library
  functions if the call fails.

  Return value:
    Returns LZO_E_OK on success, error code otherwise.

  Note:
    This function is actually implemented using a macro.


3.2 Compression
---------------

All compressors compress the memory block at `src' with the uncompressed
length `src_len' to the address given by `dst'.
The length of the compressed blocked will be returned in the variable
pointed by `dst_len'.

The two blocks may overlap under certain conditions (see examples/overlap.c),
thereby allowing "in-place" compression.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <lzo/lzo1x.h>

int lzo1x_1_compress ( const lzo_bytep src, lzo_uint  src_len,
                             lzo_bytep dst, lzo_uintp dst_len,
                             lzo_voidp wrkmem );

  Algorithm:            LZO1X
  Compression level:    LZO1X-1
  Memory requirements:  LZO1X_1_MEM_COMPRESS    (64 kB on 32-bit machines)

  This compressor is pretty fast.

  Return value:
    Always returns LZO_E_OK (this function can never fail).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <lzo/lzo1x.h>

int lzo1x_999_compress ( const lzo_bytep src, lzo_uint  src_len,
                               lzo_bytep dst, lzo_uintp dst_len,
                               lzo_voidp wrkmem );

  Algorithm:            LZO1X
  Compression level:    LZO1X-999
  Memory requirements:  LZO1X_999_MEM_COMPRESS  (448 kB on 32-bit machines)

  This compressor is quite slow but achieves a good compression
  ratio. It is mainly intended for generating pre-compressed data.

  Return value:
    Always returns LZO_E_OK (this function can never fail).


[ ... lots of other compressors which all follow the same principle ... ]



3.3 Decompression
-----------------

All decompressors decompress the memory block at `src' with the compressed
length `src_len' to the address given by `dst'.
The length of the decompressed block will be returned in the variable
pointed by `dst_len' - on error the number of bytes that have
been decompressed so far will be returned.

The safe decompressors expect that the number of bytes available in
the `dst' block is passed via the variable pointed by `dst_len'.

The two blocks may overlap under certain conditions (see examples/overlap.c),
thereby allowing "in-place" decompression.


Description of return values:

  LZO_E_OK
    Success.

  LZO_E_INPUT_NOT_CONSUMED
    The end of the compressed block has been detected before all
    bytes in the compressed block have been used.
    This may actually not be an error (if `src_len' is too large).

  LZO_E_INPUT_OVERRUN
    The decompressor requested more bytes from the compressed
    block than available.
    Your data is corrupted (or `src_len' is too small).

  LZO_E_OUTPUT_OVERRUN
    The decompressor requested to write more bytes to the uncompressed
    block than available.
    Either your data is corrupted, or you should increase the number of
    available bytes passed in the variable pointed by `dst_len'.

  LZO_E_LOOKBEHIND_OVERRUN
    Your data is corrupted.

  LZO_E_EOF_NOT_FOUND
    No EOF code was found in the compressed block.
    Your data is corrupted (or `src_len' is too small).

  LZO_E_ERROR
    Any other error (data corrupted).


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <lzo1x.h>

int lzo1x_decompress ( const lzo_bytep src, lzo_uint  src_len,
                             lzo_bytep dst, lzo_uintp dst_len,
                             lzo_voidp wrkmem );

  Algorithm:            LZO1X
  Memory requirements:  0


[ ... lots of other decompressors which all follow the same principle ... ]



4 Variable reference
====================

The variables are listed alphabetically.

[ no public variables yet ]



--------------------------- END OF LZOAPI.TXT ------------------------------

