summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htword/WordBitCompress.h
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htword/WordBitCompress.h')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htword/WordBitCompress.h267
1 files changed, 267 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htword/WordBitCompress.h b/debian/htdig/htdig-3.2.0b6/htword/WordBitCompress.h
new file mode 100644
index 00000000..19f2c336
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htword/WordBitCompress.h
@@ -0,0 +1,267 @@
+//
+// WordBitCompress.h
+//
+// BitStream: put and get bits into a buffer
+// *tagging: add tags to keep track of the position of data
+// inside the bitstream for debuging purposes.
+// *freezing: saves current position. further inserts in the BitStream
+// aren't really done. This way you can try different
+// compression algorithms and chose the best.
+//
+// Compressor: BitStream with extended fuctionalities
+//
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1999-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+// $Id: WordBitCompress.h,v 1.7 2004/05/28 13:15:26 lha Exp $
+//
+
+#ifndef _WordBitCompress_h
+#define _WordBitCompress_h
+
+#include<stdio.h>
+#include<stdlib.h>
+#include"HtVector_int.h"
+#include"HtMaxMin.h"
+
+typedef unsigned char byte;
+// ******** HtVector_byte (header)
+#define GType byte
+#define HtVectorGType HtVector_byte
+#include "HtVectorGeneric.h"
+
+typedef char * charptr;
+// ******** HtVector_charptr (header)
+#define GType charptr
+#define HtVectorGType HtVector_charptr
+#include "HtVectorGeneric.h"
+
+
+// ******** Utility inline functions and macros
+
+// error checking
+#define FATAL_ABORT fflush(stdout);fprintf(stderr,"FATAL ERROR at file:%s line:%d !!!\n",__FILE__,__LINE__);fflush(stderr);(*(int *)NULL)=1
+#define errr(s) {fprintf(stderr,"FATAL ERROR:%s\n",s);FATAL_ABORT;}
+#define CHECK_MEM(p) if(!p) errr("mifluz: Out of memory!");
+// max/min of 2 values
+#define TMax(a,b) (((a)>(b)) ? (a) : (b))
+#define TMin(a,b) (((a)<(b)) ? (a) : (b))
+
+// compute integer log2
+// == minimum number of bits needed to code value
+inline int
+num_bits(unsigned int maxval )
+{
+ unsigned int mv=maxval;
+ int nbits;
+ for(nbits=0;mv;nbits++){mv>>=1;}
+ return(nbits);
+}
+// compute 2^x
+#define pow2(x) (1<<(x))
+
+
+// function declarations
+char *label_str(const char *s,int n);
+void show_bits(int v,int n=16);
+
+// unsigned short max_v(unsigned short *vals,int n);
+// unsigned int max_v(unsigned int *vals,int n);
+// unsigned short min_v(unsigned short *vals,int n);
+// unsigned int min_v(unsigned int *vals,int n);
+
+
+
+
+
+// **************************************************
+// *************** BitStream ***********************
+// **************************************************
+// compression is done in Compressor not in BitStream
+class BitStream
+{
+protected:
+
+ // the buffer were the bitstream is stored
+ HtVector_byte buff;
+
+ // current bit position within the buffer
+ int bitpos;
+
+ // tags for debuging
+ HtVector_int tagpos;
+ HtVector_charptr tags;
+ int use_tags;
+
+ // freezing the bitstream
+ HtVector_int freeze_stack;
+ int freezeon;
+public:
+ void freeze();
+ int unfreeze();
+
+ // puts a bit into the bitstream
+ inline void put(unsigned int v)
+ {
+ // SPEED CRITICAL SECTION
+ if(freezeon){bitpos++;return;}
+ if(v){buff.back()|=pow2(bitpos & 0x07);}
+ bitpos++;
+ if(!(bitpos & 0x07))// new byte
+ {
+ buff.push_back(0);
+ }
+ }
+ inline void put(unsigned int v,const char *tag)
+ {
+ if(!freezeon){add_tag(tag);}
+ put(v);
+ }
+
+ // gets a bit from the bitstream
+ inline byte get(const char *tag=(char*)NULL)
+ {
+ // SPEED CRITICAL SECTION
+ if(check_tag(tag)==NOTOK){errr("BitStream::get() check_tag failed");}
+ if(bitpos>=(buff.size()<<3)){errr("BitStream::get reading past end of BitStream!");}
+ byte res=buff[bitpos>>3] & pow2(bitpos & 0x07);
+// printf("get:res:%d bitpos:%5d/%d buff[%3d]=%x\n",res,bitpos,bitpos%8,bitpos/8,buff[bitpos/8]);
+ bitpos++;
+ return(res);
+ }
+
+ // get/put an integer using n bits
+ void put_uint(unsigned int v,int n,const char *tag=(char*)"NOTAG");
+ unsigned int get_uint( int n,const char *tag=(char*)NULL);
+
+ // get/put n bits of data stored in vals
+ void put_zone(byte *vals,int n,const char *tag);
+ void get_zone(byte *vals,int n,const char *tag);
+
+ //
+ inline void add_tag(const char *tag)
+ {
+ if(!use_tags || !tag || freezeon){return;}
+ add_tag1(tag);
+ }
+ void add_tag1(const char *tag);
+ inline int check_tag(const char *tag,int pos=-1)
+ {
+ if(!use_tags || !tag){return OK;}
+ return(check_tag1(tag,pos));
+ }
+ int check_tag1(const char *tag,int pos);
+ void set_use_tags(){use_tags=1;}
+ int find_tag(const char *tag);
+ int find_tag(int pos,int posaftertag=1);
+
+ void show_bits(int a,int n);
+ void show(int a=0,int n=-1);
+
+ // position accesors
+ int size(){return(bitpos);}
+ int buffsize(){return(buff.size());}
+
+ // get a copy of the buffer
+ byte *get_data();
+ // set the buffer from outside data (current buffer must be empty)
+ void set_data(const byte *nbuff,int nbits);
+
+ // use this for reading a BitStream after you have written in it
+ // (generally for debuging)
+ void rewind(){bitpos=0;}
+
+ ~BitStream()
+ {
+ int i;
+ for(i=0;i<tags.size();i++){free(tags[i]);}
+ }
+ BitStream(int size0)
+ {
+ buff.reserve((size0+7)/8);
+ init();
+ }
+ BitStream()
+ {
+ init();
+ }
+ private:
+ void init()
+ {
+ bitpos=0;
+ buff.push_back(0);
+ freezeon=0;
+ use_tags=0;
+ }
+};
+
+
+// **************************************************
+// *************** Compressor ***********************
+// **************************************************
+
+// Constants used by Compressor
+// number of bits to code the number of values in an array
+#define NBITS_NVALS 16
+// number of bits to code the values in an unsigned int array (=sizeof(unsigned int))
+#define NBITS_VAL 32
+// number of bits to code he number of bits used by an unsigned int value
+#define NBITS_NBITS_VAL 5
+// number of bits to code the number of bits used by a byte value
+#define NBITS_NBITS_CHARVAL 4
+
+class Compressor : public BitStream
+{
+public:
+ int verbose;
+ // get/put an integer using a variable number of bits
+ void put_uint_vl(unsigned int v,int maxn,const char *tag=(char*)"NOTAG");
+ unsigned int get_uint_vl( int maxn,const char *tag=(char*)NULL);
+
+ // get/put an integer checking for an expected value
+ void put_uint_ex(unsigned int v,unsigned int ex,int maxn,const char *tag=(char*)"NOTAG")
+ {
+ if(v==ex){put(1,tag);}
+ else{put(0,tag);put_uint(v,maxn,(char*)NULL);}
+ }
+ unsigned int get_uint_ex( unsigned int ex,int maxn,const char *tag=(char*)NULL)
+ {
+ if(get(tag)){return ex;}
+ else{return get_uint(maxn,(char*)NULL);}
+ }
+
+
+ // compress/decompress an array of unsigned ints (choosing best method)
+ int put_vals(unsigned int *vals,int n,const char *tag);
+ int get_vals(unsigned int **pres,const char *tag=(char*)"BADTAG!");
+
+ // compress/decompress an array of bytes (very simple)
+ int put_fixedbitl(byte *vals,int n,const char *tag);
+ int get_fixedbitl(byte **pres,const char *tag=(char*)"BADTAG!");
+
+ // compress/decompress an array of unsigned ints (very simple)
+ void get_fixedbitl(unsigned int *res,int n);
+ void put_fixedbitl(unsigned int *vals,int n);
+
+ // compress/decompress an array of unsigned ints (sophisticated)
+ void get_decr(unsigned int *res,int n);
+ void put_decr(unsigned int *vals,int n);
+
+ Compressor():BitStream()
+ {
+ verbose=0;
+ }
+ Compressor(int size0):BitStream(size0)
+ {
+ verbose=0;
+ }
+
+};
+
+
+
+#endif