#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include "cbf.h"
#include "cbf_alloc.h"
#include "cbf_file.h"
#include "cbf_compress.h"
#include "cbf_canonical.h"
#include "cbf_packed.h"
#include "cbf_byte_offset.h"
#include "cbf_predictor.h"
#include "cbf_uncompressed.h"
Go to the source code of this file.
Functions | |
int | cbf_compress (void *source, size_t elsize, int elsign, size_t nelem, unsigned int compression, cbf_file *file, size_t *compressedsize, int *bits, char *digest) |
int | cbf_decompress_parameters (int *eltype, size_t *elsize, int *elsigned, int *elunsigned, size_t *nelem, int *minelem, int *maxelem, unsigned int compression, cbf_file *file) |
int | cbf_decompress (void *destination, size_t elsize, int elsign, size_t nelem, size_t *nelem_read, unsigned int compression, int bits, int sign, cbf_file *file) |
int cbf_compress | ( | void * | source, |
size_t | elsize, | ||
int | elsign, | ||
size_t | nelem, | ||
unsigned int | compression, | ||
cbf_file * | file, | ||
size_t * | compressedsize, | ||
int * | bits, | ||
char * | digest | ||
) |
Definition at line 142 of file cbf_compress.c.
References CBF_ARGUMENT, CBF_BYTE_OFFSET, CBF_CANONICAL, cbf_compress_byte_offset(), cbf_compress_canonical(), cbf_compress_none(), cbf_compress_packed(), cbf_compress_predictor(), cbf_end_digest(), cbf_failnez, cbf_flush_bits(), CBF_NONE, CBF_PACKED, CBF_PREDICTOR, cbf_reset_bits(), and cbf_start_digest().
Referenced by cbf_set_binary().
{ int errorcode; size_t size; /* Discard any bits in the buffers */ cbf_failnez (cbf_reset_bits (file)) if (compressedsize) *compressedsize = 0; /* Start a digest? */ if (digest) cbf_failnez (cbf_start_digest (file)) errorcode = 0; size = 0; switch (compression) { case CBF_CANONICAL: errorcode = cbf_compress_canonical (source, elsize, elsign, nelem, compression, file, &size, bits); break; case CBF_PACKED: case 0: errorcode = cbf_compress_packed (source, elsize, elsign, nelem, compression, file, &size, bits); break; case CBF_BYTE_OFFSET: errorcode = cbf_compress_byte_offset (source, elsize, elsign, nelem, compression, file, &size, bits); break; case CBF_PREDICTOR: errorcode = cbf_compress_predictor (source, elsize, elsign, nelem, compression, file, &size, bits); break; case CBF_NONE: errorcode = cbf_compress_none (source, elsize, elsign, nelem, compression, file, &size, bits); break; default: errorcode = CBF_ARGUMENT; } /* Add the compressed size */ if (compressedsize) *compressedsize += size; /* Flush the buffers */ errorcode |= cbf_flush_bits (file); /* Get the digest? */ if (digest) errorcode |= cbf_end_digest (file, digest); /* Done */ return errorcode; }
int cbf_decompress | ( | void * | destination, |
size_t | elsize, | ||
int | elsign, | ||
size_t | nelem, | ||
size_t * | nelem_read, | ||
unsigned int | compression, | ||
int | bits, | ||
int | sign, | ||
cbf_file * | file | ||
) |
Definition at line 389 of file cbf_compress.c.
References CBF_ARGUMENT, CBF_BYTE_OFFSET, CBF_CANONICAL, cbf_decompress_byte_offset(), cbf_decompress_canonical(), cbf_decompress_none(), cbf_decompress_packed(), cbf_decompress_predictor(), CBF_NONE, CBF_PACKED, and CBF_PREDICTOR.
Referenced by cbf_get_binary().
{ switch (compression) { case CBF_CANONICAL: return cbf_decompress_canonical (destination, elsize, elsign, nelem, nelem_read, compression, file); case CBF_PACKED: case 0: return cbf_decompress_packed (destination, elsize, elsign, nelem, nelem_read, compression, file); case CBF_BYTE_OFFSET: return cbf_decompress_byte_offset (destination, elsize, elsign, nelem, nelem_read, compression, file); case CBF_PREDICTOR: return cbf_decompress_predictor (destination, elsize, elsign, nelem, nelem_read, compression, file); case CBF_NONE: return cbf_decompress_none (destination, elsize, elsign, nelem, nelem_read, compression, bits, sign, file); } /* Fail */ return CBF_ARGUMENT; }
int cbf_decompress_parameters | ( | int * | eltype, |
size_t * | elsize, | ||
int * | elsigned, | ||
int * | elunsigned, | ||
size_t * | nelem, | ||
int * | minelem, | ||
int * | maxelem, | ||
unsigned int | compression, | ||
cbf_file * | file | ||
) |
Definition at line 248 of file cbf_compress.c.
References CBF_BYTE_OFFSET, CBF_CANONICAL, cbf_failnez, CBF_FORMAT, cbf_get_integer(), CBF_INTEGER, CBF_NONE, CBF_OVERFLOW, CBF_PACKED, CBF_PREDICTOR, and cbf_reset_bits().
Referenced by cbf_binary_parameters(), and cbf_get_binary().
{ unsigned int compression_file, nelem_file; int errorcode, minelement_file, maxelement_file, elsigned_file, elunsigned_file; /* Discard any bits in the buffers */ cbf_failnez (cbf_reset_bits (file)); /* Check compression type */ if (compression != CBF_CANONICAL && compression != CBF_PACKED && compression != CBF_BYTE_OFFSET && compression != CBF_PREDICTOR && compression != CBF_NONE) return CBF_FORMAT; if (compression == CBF_NONE) { nelem_file = 0; minelement_file = maxelement_file = 0; } else { /* Read the number of elements (64 bits) */ cbf_failnez (cbf_get_integer (file, (int *) &nelem_file, 0, 64)) /* Read the minimum element (64 bits) */ errorcode = cbf_get_integer (file, &minelement_file, 1, 64); if (errorcode && errorcode != CBF_OVERFLOW) return errorcode; /* Read the maximum element (64 bits) */ errorcode = cbf_get_integer (file, &maxelement_file, 1, 64); if (errorcode && errorcode != CBF_OVERFLOW) return errorcode; } /* Update the element sign, type, minimum, maximum and number */ elsigned_file = !(((unsigned) minelement_file) <= ((unsigned) maxelement_file) && ((signed) minelement_file) > ((signed) maxelement_file)); elunsigned_file = !(((signed) minelement_file) <= ((signed) maxelement_file) && ((unsigned) minelement_file) > ((unsigned) maxelement_file)); if (elsigned) *elsigned = elsigned_file; if (elunsigned) *elunsigned = elunsigned_file; if (eltype) *eltype = CBF_INTEGER; if (elsize) /* Calculate the minimum number of bytes needed to hold the elements */ if (minelement_file == 0 && maxelement_file == 0) *elsize = 0; else if ((!elsigned_file || ((signed) minelement_file == (signed short) minelement_file && (signed) maxelement_file == (signed short) maxelement_file)) || (!elunsigned_file || ((unsigned) minelement_file == (unsigned short) minelement_file && (unsigned) maxelement_file == (unsigned short) maxelement_file))) if ((!elsigned_file || ((signed) minelement_file == (signed char) minelement_file && (signed) maxelement_file == (signed char) maxelement_file)) || (!elunsigned_file || ((unsigned) minelement_file == (unsigned char) minelement_file && (unsigned) maxelement_file == (unsigned char) maxelement_file))) *elsize = sizeof (char); else *elsize = sizeof (short); else *elsize = sizeof (int); if (minelem) *minelem = minelement_file; if (maxelem) *maxelem = maxelement_file; if (nelem) *nelem = nelem_file; /* Success */ return 0; }