home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * DATACONV.C
- *
- * Data Conversion.
- */
-
- typedef unsigned char ubyte;
- typedef unsigned short uword;
- typedef unsigned long ulong;
-
- extern ubyte DDebug;
-
- int
- Compress7(s, db, n)
- ubyte *s;
- ubyte *db;
- uword n; /* actual source bytes */
- {
- ubyte *d = db;
-
- while (n) {
- *d++ = *s++ << 1;
-
- if (--n == 0)
- break;
- d[-1] |= *s >> 6;
- *d++ = *s++ << 2;
-
- if (--n == 0)
- break;
- d[-1] |= *s >> 5;
- *d++ = *s++ << 3;
-
- if (--n == 0)
- break;
- d[-1] |= *s >> 4;
- *d++ = *s++ << 4;
-
- if (--n == 0)
- break;
- d[-1] |= *s >> 3;
- *d++ = *s++ << 5;
-
- if (--n == 0)
- break;
- d[-1] |= *s >> 2;
- *d++ = *s++ << 6;
-
- if (--n == 0)
- break;
- d[-1] |= *s >> 1;
- *d++ = *s++ << 7;
-
- if (--n == 0)
- break;
- d[-1] |= *s++;
- --n;
- }
- return(d - db);
- }
-
- void
- UnCompress7(s, d, n)
- ubyte *s;
- ubyte *d;
- uword n; /* actual destination bytes */
- {
- while (n) {
- *d++ = s[0] >> 1;
-
- if (--n == 0)
- break;
- *d++ = ((s[0] << 6) | (s[1] >> 2)) & 0x7F;
-
- if (--n == 0)
- break;
- *d++ = ((s[1] << 5) | (s[2] >> 3)) & 0x7F;
-
- if (--n == 0)
- break;
- *d++ = ((s[2] << 4) | (s[3] >> 4)) & 0x7F;
-
- if (--n == 0)
- break;
- *d++ = ((s[3] << 3) | (s[4] >> 5)) & 0x7F;
-
- if (--n == 0)
- break;
- *d++ = ((s[4] << 2) | (s[5] >> 6)) & 0x7F;
-
- if (--n == 0)
- break;
- *d++ = ((s[5] << 1) | (s[6] >> 7)) & 0x7F;
-
- if (--n == 0)
- break;
- *d++ = s[6] & 0x7F;
-
- --n;
- s += 7;
- }
- }
-
-
- int
- Expand6(s, db, n)
- ubyte *s;
- ubyte *db;
- uword n; /* actual source bytes */
- {
- ubyte *d = db;
- ubyte *sb= s;
-
- while (n) {
- *d++ = 0x40 | (*s >> 2);
- *d++ = 0x40 | ((*s++ & 3) << 4);
- if (--n) {
- d[-1] |= *s >> 4;
- *d++ = 0x40 | ((*s++ & 0x0F) << 2);
- if (--n) {
- d[-1] |= *s >> 6;
- *d++ = 0x40 | (*s++ & 0x3F);
- --n;
- }
- }
- }
- if (DDebug)
- printf("e6: %02x %02x -> %02x %02x %02x\n",
- sb[0], sb[1],
- db[0], db[1], db[2]
- );
- return(d - db);
- }
-
- void
- UnExpand6(s, d, n)
- ubyte *s;
- ubyte *d;
- uword n; /* actual destination bytes */
- {
- ubyte *sb = s;
- ubyte *db = d;
-
- while (n) {
- *d++ = (s[0] << 2) | ((s[1] & 0x30) >> 4);
- if (--n == 0)
- break;
- *d++ = (s[1] << 4) | ((s[2] & 0x3C) >> 2);
- if (--n == 0)
- break;
- *d++ = (s[2] << 6) | (s[3] & 0x3F);
- --n;
- s += 4;
- }
- if (DDebug)
- printf("d6: %02x %02x <- %02x %02x %02x\n",
- db[0], db[1],
- sb[0], sb[1], sb[2]
- );
- }
-
-
-
-