Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

source/pack.c

Go to the documentation of this file.
00001 
00007 #include <pack.h>
00008 #include <appconfig.h>
00009 
00010 #define ANDUPTO(X) \
00011         ((1<<((X)-1)) | (1<<((X)-2)) | (1<<((X)-3)) | (1<<((X)-4)) | \
00012         (1<<((X)-5)) | (1<<((X)-6)) | (1<<((X)-7)) | (1<<((X)-8)))
00013 
00022 void
00023 PackBits(void *src, void *dest, UInt8 nbits, UInt32 count)
00024 {
00025         UInt8 *dest2 = (UInt8 *)dest;
00026         UInt8 *src2 = (UInt8 *)src;
00027         UInt8 offset = 8;
00028 
00029         *dest2 = 0;
00030         while (--count) {
00031                 UInt8 val = *src2 & ANDUPTO(nbits);
00032                 src2++;
00033                 if (offset == 0) { /* it's a byte */
00034                         dest2++;
00035                         *dest2 = 0;
00036                         offset = 8;
00037                 }
00038                 if (offset > nbits) { /* have more space available */
00039                         offset -= nbits;
00040                         *dest2 |= val << (offset);
00041                 } else {
00042                         UInt8 lam = nbits - offset;
00043                         *dest2 |= val >> lam;
00044                         offset = 8 - lam;
00045                         dest2++;
00046                         *dest2 = val << offset;
00047                 }
00048         }
00049 }
00050 
00062 void
00063 UnpackBits(void *src, void *dest, UInt8 nbits, UInt32 count)
00064 {
00065         UInt8 *dest2 = (UInt8 *)dest;
00066         UInt8 *src2 = (UInt8 *)src;
00067         UInt8 offset = 8;
00068         UInt8 and = ANDUPTO(nbits);
00069 
00070         while (count--) {
00071                 UInt8 val;
00072                 if (offset == 0) {
00073                         src2++;
00074                         offset = 8;
00075                 }
00076                 if (offset >= nbits) {
00077                         offset -= nbits;
00078                         val = (*src2 >> offset) & and;
00079                 } else {
00080                         /* we have offset remaining bits */
00081                         UInt8 lam = nbits - offset;
00082                         val = (*src2 & ANDUPTO(offset)) << lam;
00083                         offset = 8 - lam;
00084                         src2++;
00085                         val |= (*src2 >> offset) & ANDUPTO(lam);
00086                 }
00087                 *((UInt8 *)dest2) = val;
00088                 dest2++;
00089         }
00090 }
00091 

Generated on Mon Aug 30 19:44:16 2004 for pocketcity by doxygen1.2.18