Functions

cbf_compress.h File Reference

#include <stdio.h>
#include "cbf_file.h"
Include dependency graph for cbf_compress.h:
This graph shows which files directly or indirectly include this file:

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)

Function Documentation

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;
}