home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff294.lzh
/
DNet
/
unix
/
dnet
/
dataconv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-11
|
2KB
|
165 lines
/*
* 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]
);
}