bionic (3) VistaIOPackData.3.gz

Provided by: libvistaio-dev_1.2.19-1_amd64 bug

NAME

       VistaIOPackData, VistaIOUnpackData - pack or unpack a vector of values

SYNOPSIS

       typedef enum { VistaIOLsbFirst, VistaIOMsbFirst } VistaIOPackOrder;

       void VistaIOPackData (repn, nels, unpacked, order, plength, ppacked, palloced)
                 VistaIORepnKind repn;
                 size_t nels, *plength;
                 VistaIOPointer unpacked, *ppacked;
                 VistaIOPackOrder order;
                 VistaIOBoolean *palloced;

       void VistaIOUnpackData (repn, nels, packed, order, plength, punpacked, palloced)
                 VistaIORepnKind repn;
                 size_t nels, *plength;
                 VistaIOPointer packed, *punpacked;
                 VistaIOPackOrder order;
                 VistaIOBoolean *palloced;

ARGUMENTS

       repn      Specifies the representation of the values to be packed or unpacked.

       nels      Specifies the number of values to be packed or unpacked.

       unpacked  Specifies the location of the values to be packed.

       packed    Specifies the location of the values to be unpacked.

       order     Specifies  the  order  in  which  values  smaller than a byte are packed into a single byte, or
                 values larger than a byte are split among multiple bytes.

       plength   Specifies and returns the length of the (un)packed data, in bytes. The length is rounded up  to
                 the next whole byte.

       ppacked   Specifies or returns the location of the packed data.

       punpacked Specifies or returns the location of the unpacked data.

       palloced  If  NULL,  specifies  that  a  buffer  is being supplied to contain the results of (un)packing.
                 Otherwise, returns TRUE if memory was allocated by the routine  to  contain  the  results,  and
                 FALSE otherwise.

DESCRIPTION

       VistaIOPackData  packs  a  vector of values into a block of contiguous bytes.  Typically, it is used when
       preparing to output a series of values to a Vista data  file.  VistaIOUnpackData  performs  the  inverse,
       unpacking  a  vector  of  values  from  a block of contiguous bytes. It is used when decoding a series of
       values read from a Vista data file.

       Unpacked values reside in memory in a form dependent upon machine architecture.  Packed  values,  on  the
       other hand, are represented in a machine-independent manner using the fewest bits possible. If the values
       are of type VistaIOBit, for example, they might occupy one byte each in unpacked form, but in packed form
       each occupies a single bit. The types of values that can be (un)packed, and their form when packed, is as
       follows:

              VistaIOBit  is packed as a single bit.

              VistaIOUByte
                          is packed as an unsigned integer in a single 8-bit byte.

              VistaIOSByte
                          is packed as a two's-complement integer in a single 8-bit byte.

              VistaIOShort
                          is packed as a two's-complement integer in two 8-bit bytes.

              VistaIOLong is packed as a two's-complement integer in four 8-bit bytes.

              VistaIOFloat
                          is packed as an IEEE-format floating-point number in four 8-bit bytes.

              VistaIODouble
                          is packed as an IEEE-format floating-point number in eight 8-bit bytes.

              VistaIOBoolean
                          is packed as a single bit.

       The values to be (un)packed must all have one of these types, as specified by the repn argument.

       The order argument specifies the order with which bits are packed into  a  byte,  or  multi-byte,  packed
       values  are separated into bytes. If the packed values each require a single bit, order specifies whether
       successive values are  to  be  packed  into  a  byte  from  least-significant  bit  to  most  significant
       (VistaIOLsbFirst),  or  vice  versa  (VistaIOMsbFirst). If the packed values each require multiple bytes,
       order specifies whether those bytes are to be packed from  least-significant  byte  to  most  significant
       (VistaIOLsbFirst),   or   vice  versa  (VistaIOMsbFirst).  Data  in  Vista  data  files  is  packed  with
       order = VistaIOMsbFirst.

       For a call to VistaIOPackData, nels specifies the number of values to be packed and unpacked points to  a
       vector containing them. You can specify where to place the packed values in either of two ways:

         • You  can  supply your own buffer for the packed values by passing NULL in palloced, passing a pointer
           to the address of your buffer in ppacked, and passing a pointer to  the  length  of  your  buffer  in
           plength. On return, the actual length of the packed values will have been stored at *plength.

         • You  can  let  VistaIOPackData  determine  the location of the packed values by passing in palloced a
           pointer to a VistaIOBoolean variable.  VistaIOPackData then returns, via  ppacked  and  plength,  the
           location  and  length  of  the  packed  data.  Depending  on  the  type of values to be packed, their
           arrangement in memory, and order, actual packing may or may not be needed. That is,  the  packed  and
           unpacked forms of the value may actually be identical. In this case, the returned location and length
           refer to the unpacked data, and palloced returns FALSE to indicate that no separate  buffer  for  the
           packed   data  was  allocated.  If,  however,  the  packed  form  differs  from  the  unpacked  form,
           VistaIOPackData will allocate memory for the packed data. The location and length of this memory  are
           returned  instead,  and  palloced  returns TRUE to indicate that this memory should be freed when the
           packed values are no longer needed.

       VistaIOUnpackData is called in an analogous manner. The nels argument specifies the number of  values  to
       be  unpacked and packed points to a vector containing them. As for VistaIOPackData, you can specify where
       to place the unpacked values in either of two ways indicated by palloced.

RETURN VALUES

       Both routines return TRUE if successful, and  FALSE  otherwise.  In  addition,  they  may  set  *plength,
       *ppacked, *punpacked, and *palloced as described above.

EXAMPLES

       Here  we  pack  a vector of bits, write the packed bits to a file, and free any storage used to represent
       the packed bits:

              size_t nbits, length;
              VistaIOBit *bits;
              VistaIOPointer packed;
              VistaIOBoolean alloced;
              FILE *file;

              ...
              VistaIOPackData (VistaIOBitRepn, nbits, bits, VistaIOMsbFirst, & length, & packed, & alloced);
              fwrite ((char *) packed, 1, length, file);
              if (alloced)
                     VistaIOFree (packed);

NOTES

       Packing or unpacking can be done in place.  For example, in  a  call  to  VistaIOPackData,  unpacked  and
       *ppacked can point to the same storage.

LIMITATIONS

       The  present  implementation  cannot  pack  values  of  type  VistaIOUByte,  VistaIOSByte,  VistaIOShort,
       VistaIOLong, VistaIOFloat, or VistaIODouble if their packed and unpacked sizes differ.

DIAGNOSTICS

       ``Byte order not recognized.''
              The routines trie to automatically detect whether the present  machine  stores  multi-byte  values
              from most-to-least significant byte, or vice versa. If this message is issued it means that a port
              to a new machine architecture was unsuccessful, in  which  case  some  additional  programming  is
              needed to support the new architecture.

       ``Insufficient space for (un)packed data.''
              A buffer was supplied for the results of (un)packing, but the buffer is too small.

       ``(Un)packing type from mbits to nbits bits is not supported.''
              The   present   implementation   cannot   (un)pack  values  of  type  VistaIOUByte,  VistaIOSByte,
              VistaIOShort, VistaIOLong, VistaIOFloat, or VistaIODouble  if  their  packed  and  unpacked  sizes
              differ. If asked to do so the routine will abort the program with this message.

AUTHOR

       Art Pope <pope@cs.ubc.ca>

       Adaption to vistaio: Gert Wollny <gw.fossdev@gmail.com>