/* * * Copyright (c) 2000-2006 Alberto Reggiori * Dirk-Willem van Gulik * * NOTICE * * This product is distributed under a BSD/ASF like license as described in the 'LICENSE' * file you should have received together with this source code. If you did not get a * a copy of such a license agreement you can pick up one at: * * http://rdfstore.sourceforge.net/LICENSE * * $Id: rdfstore_compress.c,v 1.12 2006/06/19 10:10:21 areggiori Exp $ */ #include #include #include #include #include #include "rdfstore_compress.h" #include "sflcomp.h" #include "my_compress.h" #include "fraenkel_compress.h" #define xross_map(name) \ static void _ ## name (unsigned int srclen,unsigned char* src, unsigned int * dstlen, unsigned char * dst) \ { \ * dstlen = name (src,dst,srclen); \ } #define xross_pair( name ) \ xross_map( compress_ ## name ); \ xross_map( expand_ ## name ); /* Build 5x2 functions to de- and en-code using the right arguments. * XXX todo - remove those functions and edit the rdfstore_kernel.c functions * to accept 'bcopy' style arguments. */ xross_pair( nulls ); xross_pair( bits ); xross_pair( block ); xross_pair( rle ); xross_pair( mine ); xross_pair( fraenkel ); static void _bcopy(unsigned int srclen,unsigned char* src, unsigned int * dstlen, unsigned char * dst) { bcopy(src,dst,srclen); * dstlen = srclen; }; #ifdef DEBUG_BDB_PAGESIZES /* Fake compression method which will pad each record up to a specific * multiple of 2; such as 1024 - as to hide small size changes for * the BDB above. */ #define LOGSIZE (10) /* 1024 */ static void _enc(unsigned int srclen,unsigned char* src, unsigned int * dstlen, unsigned char * dst) { *(int *)dst = srclen; bcopy(src,dst+4,srclen); srclen = ((srclen >> LOGSIZE) + 1) << LOGSIZE; * dstlen = srclen; }; static void _dec(unsigned int srclen,unsigned char* src, unsigned int * dstlen, unsigned char * dst) { * dstlen = *(int *)src; bcopy(src,dst+4,srclen); }; #endif int rdfstore_compress_init( rdfstore_compression_types type, void(**func_decode)(unsigned int,unsigned char*, unsigned int *, unsigned char *), void(**func_encode)(unsigned int,unsigned char*, unsigned int *, unsigned char *) ) { if ((type == RDFSTORE_COMPRESSION_TYPE_DEFAULT) && (getenv("RDFSTORE_COMPRESSION")) && (atoi(getenv("RDFSTORE_COMPRESSION"))) ) { type = atoi(getenv("RDFSTORE_COMPRESSION")); fprintf(stderr,"Override type %d\n",type); } switch(type) { #ifdef DEBUG_BDB_PAGESIZES case 999: *func_encode = &_enc; *func_decode = &_dec; break; #endif case RDFSTORE_COMPRESSION_TYPE_NONE: *func_encode = &_bcopy; *func_decode = &_bcopy; break; case RDFSTORE_COMPRESSION_TYPE_BITS: *func_encode = &_compress_bits; *func_decode = &_expand_bits; break; case RDFSTORE_COMPRESSION_TYPE_BLOCK: *func_encode = &_compress_block; *func_decode = &_expand_block; break; case RDFSTORE_COMPRESSION_TYPE_RLE: *func_encode = &_compress_rle; *func_decode = &_expand_rle; break; case RDFSTORE_COMPRESSION_TYPE_FRAENKEL: *func_encode = &_compress_fraenkel; *func_decode = &_expand_fraenkel; break; case RDFSTORE_COMPRESSION_TYPE_ORIGINAL: *func_encode = &_compress_mine; *func_decode = &_expand_mine; break; case RDFSTORE_COMPRESSION_TYPE_DEFAULT: /* break intentionally missing */ case RDFSTORE_COMPRESSION_TYPE_NULLS: *func_encode = &_compress_nulls; *func_decode = &_expand_nulls; break; default: fprintf(stderr,"No compression default specified\n"); exit(1); } return 0; }