DESCRIPTION
-----------
This archive contains a simple and readable ANSI C implementation of the
Burrows-Wheeler transformation (BWT) and its reverse transformation. The
code for this implementation is derived directly from "A Block-sorting
Lossless Data Compression Algorithm" by M. Burrows and D.J. Wheeler.
A PDF copy of the document may be found at:
ftp://apotheca.hpl.hp.com/pub/dec/SRC/research-reports/SRC-124.pdf
More information on Burrows-Wheeler Transform may be found at:
https://michaeldipperstein.github.io/bwt.html
FILES
-----
bwxform.c - Library of Burrows-Wheeler transform (BWT) routines.
bwxform.h - Header containing prototypes for library functions.
COPYING - Rules for copying and distributing GPL software
COPYING.LESSER - Rules for copying and distributing LGPL software
Makefile - makefile for this project (assumes gcc compiler and GNU make)
README - this file
sample.c - Demonstration of how to use BWT library functions
optlist/ - Subtree containing optlist command line option parser library
BUILDING
--------
To build these files with GNU make and gcc, simply enter "make" from the
command line. The executable will be named sample (or sample.exe).
GIT NOTE: Updates to the subtree optlist don't get pulled by "git pull"
Use the following commands to pull their updates:
git subtree pull --prefix optlist https://github.com/MichaelDipperstein/optlist.git master --squash
USAGE
-----
Usage: sample <options>
options:
-c : Encode input file to output file.
-d : Decode input file to output file.
-m : Perform the Move-to-Front coding.
-i <filename> : Name of input file.
-o <filename> : Name of output file.
-h|? : Print out command line options.
-c Generate a probability range list for the specified input file
(see -i) then use arithmetic coding compresses the file using the
range list to the specified output file (see -o).
-d Decompresses the specified input file (see -i) writing the results to
the specified output file (see -o). Only files compressed by this
program may be decompressed.
-m Perform move to front encoding/decoding on each block.
-i <filename> The name of the input file. There is no valid usage of this
program without a specified input file.
-o <filename> The name of the output file. If no file is specified, stdout
will be used. NOTE: Sending compressed output to stdout may
produce undesirable results.
LIBRARY API
-----------
Transforming Data:
int BWXform(FILE *fpIn, FILE *fpOut, const xform_t method);
fpIn
The file stream to be transformed. It must non-NULL and opened.
fpOut
The file stream receiving the transformed data. It must non-NULL and
opened.
method
xform_t type value indicating whether indicate whether or not MTF is used.
Return Value
Zero for success, non-zero for failure.
Reverse Transforming Data:
int BWXform(FILE *fpIn, FILE *fpOut, const xform_t method);
fpIn
The file stream to be reverse transformed. It must non-NULL and opened.
fpOut
The file stream receiving the reverse transformed data. It must non-NULL
and opened.
method
xform_t type value indicating whether indicate whether or not MTF is used.
Return Value
Zero for success, non-zero for failure.
HISTORY
-------
08/20/04 - Initial Release
08/25/04 - Don't prefix blocks with block size. Use value returned
by fread() to recognize partial blocks instead.
05/02/05 - Allocating large arrays on heap instead of stack so that
gcc can handle larger blocks.
11/03/05 - Sort algorithm is now similar to the "faster method" in the
Burrows and Wheeler paper.
08/29/07 - Explicitly licensed under LGPL version 3.
- Replaces getopt() with optlist library
10/29/14 - Changed the API so that encode and decode routines accept opened
file streams instead of file names.
- Upgrade to latest Oplist library
- Tighter adherence to Michael Barr's "Top 10 Bug-Killing Coding
Standard Rules" (http://www.barrgroup.com/webinars/10rules).
07/15/17 - Directory stucture changes for ease of use with GitHub
- Included a test script that I've always used to test things
09/19/19 - Update e-mail address
- pull the latest optlist
TODO
----
- Use "known" efficient Move-To-Front algorithm
- Investigate suffix tree based sorting solutions
- There are several papers claiming speed improvements
AUTHOR
------
Michael Dipperstein (mdipperstein@gmail.com)
https://michaeldipperstein.github.io/