blob: a69b1f0f0c1fff988a771aa57b470aaaf4588237 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2011 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
#ifndef __COMPRESION__
#define __COMPRESION__
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#define NBITSPERBYTE (8)
#ifndef NULL
#define NULL (0)
#endif
#define COMPRESSION_TABLE_FLAG 0x10
enum Compression_Algorithms {BYTE_HUFFMAN};
enum Errors {NO_ERROR, OUT_OF_MEMORY, UNKNOWN_COMPRESSION_METHOD, ALL_ZERO_FREQUENCIES, SINGLE_SYMBOL_DEGENERATE, INVALID_ARGUMENT};
static char *error_strings [] = {
"No error.", "Out of memory.", "Unknown compression method.", "All frequency inputs are zero.", "Degenerate case. Only one symbol in input stream.", "Invalid input argument(s)."
};
extern enum Errors compression_error_no;
void print_compression_error(void);
struct compression_buffer
{
unsigned char *data;
int compressed_len;
int uncompressed_len;
unsigned char flags;
};
/* symbol struct only has the encoding. Mapping to original representation will be responsibility of the implementation */
struct symbol
{
unsigned char *encoding;
int encoding_length;
};
struct compression_method;
/* a bunch of pointer to functions. Implementations will be provided by the actual compression algorithm being used */
typedef int (*init_compression_func)(struct compression_method *);
typedef int (*encoder_type)(struct compression_method *method, struct compression_buffer *input);
typedef unsigned char *(*decode_info_type)(struct compression_method *method, int *len);
/* this function decodes the data and returns the decoded data */
typedef struct compression_buffer *(*decoder_type)(struct compression_method *method, unsigned char *in, int compressed_len, int uncompressed_len, int decoder_info_present);
typedef void (*free_compression_func)(struct compression_method *method);
typedef struct symbol *(*get_symbol_func)(struct compression_method *method, unsigned char *rep, int len);
/*parses uncompressed input stream and returns size of next symbol */
typedef int (*stream_parser_func)(const unsigned char *input_stream);
typedef void (*get_symbol_rep_func)(struct compression_method *method, int id, unsigned char *out, int *rep_len);
struct compression_method
{
enum Compression_Algorithms type;
encoder_type encoder;
decoder_type decoder;
decode_info_type get_dictionary;
init_compression_func initializer;
free_compression_func destructor;
stream_parser_func parser;
get_symbol_func get_symbol;
get_symbol_rep_func get_symbol_rep;
void *decode_info; /* data structure used for decoding - huffman tree for ex */
void *compression_table; /* some data structure used for storing information about the symbols in the input stream */
void **free_list; /*list of objects on heap to be freed */
};
/* compression related methods */
/* initialize compression object */
int init_compression(int method, struct compression_method *comp_object);
struct compression_buffer *compress(struct compression_method *method, struct compression_buffer *in_buf);
struct compression_buffer *uncompress(struct compression_method *method, struct compression_buffer *in_buf);
/* called at the end to free memory and other cleanups. */
void end_compression(struct compression_method *method);
void pack_bits_into_stream(unsigned char *stream, unsigned char *pattern, int at, int len);
/* free the memory associated with this buffer as well as this buffer */
void free_compression_buffer(struct compression_buffer *buf);
/* allocate compression buffer. Returns a compression buffer with memory mem_size or NULL in case of failure */
struct compression_buffer * alloc_compression_buffer(int mem_size);
/* reallocs the compression buffer buf to new size new_mem_size. Returns the newly allocated buffer or NULL in case of failure */
void *realloc_compression_buffer(struct compression_buffer *buf, int new_mem_size);
/* sets the pos bit in pattern to 1 if val is non-zero, otherwise to 0.*/
void set_bit(unsigned char *pattern, int pos, int val);
/* return non-zero if this machine is big endian architecture, otherwise zero */
int is_bigendian();
/* reverses the byte order of int representation */
void swap_int(unsigned int *in);
/* gets the pos bit in pattern. Returns zero if the bit is zero otherwise returns non-zero */
#define get_bit(pattern, pos) ((int)(*((pattern) + (pos) / NBITSPERBYTE) & (1 << (pos) % NBITSPERBYTE)))
#endif