
/**
  *  Este fichero ha sido diseqado para manejar de forma estandar
  * las entradas salidas que son necesarias de forma binaria
  *  Se ha intentado optimizar al maximo para aumentar la velocidad
  * sin preocuparse si el origen o destino es memoria o un fichero
  *
  **/


/*  compress InputByte  , OutputBits , OutputBit                    */
/*  expand   OutputByte , InputBits  , InputBit                     */

/*    START of COMPRESS                                             */

/*          UBYTE   endoffile                                       */
/*          CHARS   *inpb                                           */
/*          CHARS   *endinp                                         */
/*          CHARS   *outb                                           */
/*          CHARS   *endout                                         */
/*          ULONG   ioaux                                           */

#define InitOutput()    {                                         \
                        outb      = (CHARS *)xpar->OutBuf;        \
                        *outb     = 0;                            \
                        outmask   = 0x80;                         \
                        endout    = (CHARS *)                     \
                      ((long)xpar->OutBuf+(long)xpar->OutBufLen); \
                        }

#define InitInput()     {                                         \
                        inpb      = (CHARS *)xpar->InBuf;         \
                        endinp    = (CHARS *)                     \
                      ((long)xpar->InBuf+(long)xpar->InLen);      \
                        }


#define OutputBit( bit )  {                                       \
                          if ( bit )                              \
                            *outb |= outmask;                     \
                          outmask >>= 1;                          \
                          if ( !outmask  )                        \
                            {                                     \
                            if( ++outb >= endout )                \
                              return( XPKERR_EXPANSION );         \
                            *outb   = 0;                          \
                            outmask = 0x80;                       \
                            }                                     \
                          }

#define OutputBits( code, count ) {                               \
                          ioaux = 1L << ( count - 1 );            \
                          while ( ioaux != 0)                     \
                            {                                     \
                            if ( code & ioaux )                   \
                              *outb |= outmask;                   \
                            outmask >>= 1;                        \
                            if ( !outmask  )                      \
                              {                                   \
                              if( ++outb >= endout )              \
                                return( XPKERR_EXPANSION );       \
                              *outb   = 0;                        \
                              outmask = 0x80;                     \
                              }                                   \
                            ioaux >>= 1;                          \
                            }                                     \
                          } 

#define InputByte(  )     {                                       \
                          if(inpb++ >=endinp )                    \
                            endoffile = 1;                        \
                          }

#define EndOfFile()       ( endoffile )

/*************************** End of BITIO.C **************************/
