1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  * Copyright by The HDF Group.                                               *
3  * Copyright by the Board of Trustees of the University of Illinois.         *
4  * All rights reserved.                                                      *
5  *                                                                           *
6  * This file is part of HDF.  The full HDF copyright notice, including       *
7  * terms governing use, modification, and redistribution, is contained in    *
8  * the COPYING file, which can be found at the root of the source code       *
9  * distribution tree, or in https://support.hdfgroup.org/ftp/HDF/releases/.  *
10  * If you do not have access to either file, you may request a copy from     *
11  * help@hdfgroup.org.                                                        *
12  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
13 
14 /* $Id$ */
15 
16 /*
17    **  hbitio.h
18    **
19    **  Data structures and macros for bitfile access to HDF data objects.
20    **  These are mainly used for compression I/O and N-bit data objects.
21  */
22 
23 #ifndef __HBITIO_H
24 #define __HBITIO_H
25 
26 /* Define the number of elements in the buffered array */
27 #define BITBUF_SIZE 4096
28 /* Macro to define the number of bits cached in the 'bits' variable */
29 #define BITNUM      (sizeof(uint8)*8)
30 /* Macro to define the number of bits able to be read/written at a time */
31 #define DATANUM     (sizeof(uint32)*8)
32 
33 typedef struct bitrec_t
34   {
35       int32       acc_id;       /* Access ID for H layer I/O routines */
36       int32       bit_id;       /* Bitfile ID for internal use */
37   /* Note that since HDF has signed 32bit offset limit we need to change this to signed
38      since the get passed to Hxxx calls which take signed 32bit arguments */
39       int32      block_offset, /* offset of the current buffered block in the dataset */
40                  max_offset,   /* offset of the last byte written to the dataset */
41                  byte_offset;  /* offset of the current byte in the dataset */
42 
43       intn       count,        /* bit count to next boundary */
44                  buf_read;     /* number of bytes read into buffer (necessary for random I/O) */
45       uint8       access;       /* What the access on this file is ('r', 'w', etc..) */
46       uint8       mode;         /* how are we interacting with the data now ('r', 'w', etc) */
47       uint8       bits;         /* extra bit buffer, 0..BITNUM-1 bits */
48       uint8      *bytep;        /* current position in buffer */
49       uint8      *bytez;        /* end of buffer to compare */
50       uint8      *bytea;        /* byte buffer */
51   }
52 bitrec_t;
53 
54 #ifndef BITMASTER
55 extern
56 #endif
57 const uint8 maskc[9]
58 #ifdef BITMASTER
59 =
60 {0, 1, 3, 7, 15, 31, 63, 127, 255}
61 #endif
62            ;
63 
64 #ifndef BITMASTER
65 extern
66 #endif
67 const uint32 maskl[33]
68 #ifdef BITMASTER
69 =
70 {0x00000000,
71  0x00000001, 0x00000003, 0x00000007, 0x0000000f,
72  0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
73  0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
74  0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
75  0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
76  0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
77  0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
78  0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffffUL}
79 #endif
80            ;
81 
82 /* Function-like Macros */
83 #define Hputbit(bitid,bit) ((Hbitwrite(bitid,1,(uint32)bit)==FAIL) ? FAIL : SUCCEED)
84 
85 #endif /* __HBITIO_H */
86