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 >
C/C++ Source or Header  |  1989-12-11  |  2KB  |  165 lines

  1.  
  2. /*
  3.  *  DATACONV.C
  4.  *
  5.  *  Data Conversion.
  6.  */
  7.  
  8. typedef unsigned char ubyte;
  9. typedef unsigned short uword;
  10. typedef unsigned long ulong;
  11.  
  12. extern ubyte DDebug;
  13.  
  14. int
  15. Compress7(s, db, n)
  16. ubyte *s;
  17. ubyte *db;
  18. uword n;    /*    actual source bytes */
  19. {
  20.     ubyte *d = db;
  21.  
  22.     while (n) {
  23.     *d++ = *s++ << 1;
  24.  
  25.     if (--n == 0)
  26.         break;
  27.     d[-1] |= *s >> 6;
  28.     *d++ = *s++ << 2;
  29.  
  30.     if (--n == 0)
  31.         break;
  32.     d[-1] |= *s >> 5;
  33.     *d++ = *s++ << 3;
  34.  
  35.     if (--n == 0)
  36.         break;
  37.     d[-1] |= *s >> 4;
  38.     *d++ = *s++ << 4;
  39.  
  40.     if (--n == 0)
  41.         break;
  42.     d[-1] |= *s >> 3;
  43.     *d++ = *s++ << 5;
  44.  
  45.     if (--n == 0)
  46.         break;
  47.     d[-1] |= *s >> 2;
  48.     *d++ = *s++ << 6;
  49.  
  50.     if (--n == 0)
  51.         break;
  52.     d[-1] |= *s >> 1;
  53.     *d++ = *s++ << 7;
  54.  
  55.     if (--n == 0)
  56.         break;
  57.     d[-1] |= *s++;
  58.     --n;
  59.     }
  60.     return(d - db);
  61. }
  62.  
  63. void
  64. UnCompress7(s, d, n)
  65. ubyte *s;
  66. ubyte *d;
  67. uword n;    /*    actual destination bytes */
  68. {
  69.     while (n) {
  70.     *d++ = s[0] >> 1;
  71.  
  72.     if (--n == 0)
  73.         break;
  74.     *d++ = ((s[0] << 6) | (s[1] >> 2)) & 0x7F;
  75.  
  76.     if (--n == 0)
  77.         break;
  78.     *d++ = ((s[1] << 5) | (s[2] >> 3)) & 0x7F;
  79.  
  80.     if (--n == 0)
  81.         break;
  82.     *d++ = ((s[2] << 4) | (s[3] >> 4)) & 0x7F;
  83.  
  84.     if (--n == 0)
  85.         break;
  86.     *d++ = ((s[3] << 3) | (s[4] >> 5)) & 0x7F;
  87.  
  88.     if (--n == 0)
  89.         break;
  90.     *d++ = ((s[4] << 2) | (s[5] >> 6)) & 0x7F;
  91.  
  92.     if (--n == 0)
  93.         break;
  94.     *d++ = ((s[5] << 1) | (s[6] >> 7)) & 0x7F;
  95.  
  96.     if (--n == 0)
  97.         break;
  98.     *d++ = s[6] & 0x7F;
  99.  
  100.     --n;
  101.     s += 7;
  102.     }
  103. }
  104.  
  105.  
  106. int
  107. Expand6(s, db, n)
  108. ubyte *s;
  109. ubyte *db;
  110. uword n;    /*    actual source bytes */
  111. {
  112.     ubyte *d = db;
  113.     ubyte *sb= s;
  114.  
  115.     while (n) {
  116.     *d++ = 0x40 | (*s >> 2);
  117.     *d++ = 0x40 | ((*s++ & 3) << 4);
  118.     if (--n) {
  119.         d[-1] |= *s >> 4;
  120.         *d++ = 0x40 | ((*s++ & 0x0F) << 2);
  121.         if (--n) {
  122.         d[-1] |= *s >> 6;
  123.         *d++ = 0x40 | (*s++ & 0x3F);
  124.         --n;
  125.         }
  126.     }
  127.     }
  128.     if (DDebug)
  129.     printf("e6: %02x %02x -> %02x %02x %02x\n", 
  130.         sb[0], sb[1],
  131.         db[0], db[1], db[2]
  132.     );
  133.     return(d - db);
  134. }
  135.  
  136. void
  137. UnExpand6(s, d, n)
  138. ubyte *s;
  139. ubyte *d;
  140. uword n;    /*    actual destination bytes */
  141. {
  142.     ubyte *sb = s;
  143.     ubyte *db = d;
  144.  
  145.     while (n) {
  146.     *d++ = (s[0] << 2) | ((s[1] & 0x30) >> 4);
  147.     if (--n == 0)
  148.         break;
  149.     *d++ = (s[1] << 4) | ((s[2] & 0x3C) >> 2);
  150.     if (--n == 0)
  151.         break;
  152.     *d++ = (s[2] << 6) | (s[3] & 0x3F);
  153.     --n;
  154.     s += 4;
  155.     }
  156.     if (DDebug)
  157.     printf("d6: %02x %02x <- %02x %02x %02x\n", 
  158.         db[0], db[1],
  159.         sb[0], sb[1], sb[2]
  160.     );
  161. }
  162.  
  163.  
  164.  
  165.