Annotation of coherent/b/bin/unzip/unreduce.c, revision 1.1

1.1     ! root        1: /*---------------------------------------------------------------------------
        !             2: 
        !             3:   unreduce.c
        !             4: 
        !             5:   The Reducing algorithm is actually a combination of two distinct algorithms.
        !             6:   The first algorithm compresses repeated byte sequences, and the second al-
        !             7:   gorithm takes the compressed stream from the first algorithm and applies a
        !             8:   probabilistic compression method.
        !             9: 
        !            10:   ---------------------------------------------------------------------------*/
        !            11: 
        !            12: 
        !            13: #include "unzip.h"
        !            14: 
        !            15: 
        !            16: /**************************************/
        !            17: /*  UnReduce Defines, Typedefs, etc.  */
        !            18: /**************************************/
        !            19: 
        !            20: #define DLE    144
        !            21: 
        !            22: typedef byte f_array[64];       /* for followers[256][64] */
        !            23: 
        !            24: static void LoadFollowers __((void));
        !            25: void flush OF((unsigned));      /* routine from inflate.c */
        !            26: 
        !            27: 
        !            28: 
        !            29: /*******************************/
        !            30: /*  UnReduce Global Variables  */
        !            31: /*******************************/
        !            32: 
        !            33: #if (defined(MACOS) || defined(MTS))
        !            34:    f_array *followers;     /* shared work space */
        !            35: #else
        !            36:    f_array *followers = (f_array *) (slide + 0x4000);
        !            37: #endif
        !            38: 
        !            39: byte Slen[256];
        !            40: int factor;
        !            41: 
        !            42: int L_table[] =
        !            43: {0, 0x7f, 0x3f, 0x1f, 0x0f};
        !            44: 
        !            45: int D_shift[] =
        !            46: {0, 0x07, 0x06, 0x05, 0x04};
        !            47: int D_mask[] =
        !            48: {0, 0x01, 0x03, 0x07, 0x0f};
        !            49: 
        !            50: int B_table[] =
        !            51: {8, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5,
        !            52:  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
        !            53:  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
        !            54:  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7,
        !            55:  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
        !            56:  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
        !            57:  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
        !            58:  7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            59:  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            60:  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            61:  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            62:  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            63:  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            64:  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        !            65:  8, 8, 8, 8};
        !            66: 
        !            67: 
        !            68: 
        !            69: 
        !            70: 
        !            71: /*************************/
        !            72: /*  Function unReduce()  */
        !            73: /*************************/
        !            74: 
        !            75: void unReduce()   /* expand probabilistically reduced data */
        !            76: {
        !            77:     register int lchar = 0;
        !            78:     int nchar;
        !            79:     int ExState = 0;
        !            80:     int V = 0;
        !            81:     int Len = 0;
        !            82:     longint s = ucsize;  /* number of bytes left to decompress */
        !            83:     unsigned w = 0;      /* position in output window slide[] */
        !            84:     unsigned u = 1;      /* true if slide[] unflushed */
        !            85: 
        !            86: 
        !            87: #if (defined(MACOS) || defined(MTS))
        !            88:     followers = (f_array *) (slide + 0x4000);
        !            89: #endif
        !            90: 
        !            91:     factor = lrec.compression_method - 1;
        !            92:     LoadFollowers();
        !            93: 
        !            94:     while (s > 0 /* && (!zipeof) */) {
        !            95:         if (Slen[lchar] == 0)
        !            96:             READBIT(8, nchar)   /* ; */
        !            97:         else {
        !            98:             READBIT(1, nchar);
        !            99:             if (nchar != 0)
        !           100:                 READBIT(8, nchar)       /* ; */
        !           101:             else {
        !           102:                 int follower;
        !           103:                 int bitsneeded = B_table[Slen[lchar]];
        !           104:                 READBIT(bitsneeded, follower);
        !           105:                 nchar = followers[lchar][follower];
        !           106:             }
        !           107:         }
        !           108:         /* expand the resulting byte */
        !           109:         switch (ExState) {
        !           110: 
        !           111:         case 0:
        !           112:             if (nchar != DLE) {
        !           113:                 s--;
        !           114:                 slide[w++] = (byte) nchar;
        !           115:                 if (w == 0x4000) {
        !           116:                     flush(w);
        !           117:                     w = u = 0;
        !           118:                 }
        !           119:             }
        !           120:             else
        !           121:                 ExState = 1;
        !           122:             break;
        !           123: 
        !           124:         case 1:
        !           125:             if (nchar != 0) {
        !           126:                 V = nchar;
        !           127:                 Len = V & L_table[factor];
        !           128:                 if (Len == L_table[factor])
        !           129:                     ExState = 2;
        !           130:                 else
        !           131:                     ExState = 3;
        !           132:             } else {
        !           133:                 s--;
        !           134:                 slide[w++] = DLE;
        !           135:                 if (w == 0x4000)
        !           136:                 {
        !           137:                   flush(w);
        !           138:                   w = u = 0;
        !           139:                 }
        !           140:                 ExState = 0;
        !           141:             }
        !           142:             break;
        !           143: 
        !           144:         case 2:{
        !           145:                 Len += nchar;
        !           146:                 ExState = 3;
        !           147:             }
        !           148:             break;
        !           149: 
        !           150:         case 3:{
        !           151:                 register unsigned e;
        !           152:                 register unsigned n = Len + 3;
        !           153:                 register unsigned d = w - ((((V >> D_shift[factor]) &
        !           154:                                D_mask[factor]) << 8) + nchar + 1);
        !           155: 
        !           156:                 s -= n;
        !           157:                 do {
        !           158:                   n -= (e = (e = 0x4000 - ((d &= 0x3fff) > w ? d : w)) > n ?
        !           159:                         n : e);
        !           160:                   if (u && w <= d)
        !           161:                   {
        !           162:                     memset(slide + w, 0, e);
        !           163:                     w += e;
        !           164:                     d += e;
        !           165:                   }
        !           166:                   else
        !           167:                     if (w - d < e)      /* (assume unsigned comparison) */
        !           168:                       do {              /* slow to avoid memcpy() overlap */
        !           169:                         slide[w++] = slide[d++];
        !           170:                       } while (--e);
        !           171:                     else
        !           172:                     {
        !           173:                       memcpy(slide + w, slide + d, e);
        !           174:                       w += e;
        !           175:                       d += e;
        !           176:                     }
        !           177:                   if (w == 0x4000)
        !           178:                   {
        !           179:                     flush(w);
        !           180:                     w = u = 0;
        !           181:                   }
        !           182:                 } while (n);
        !           183: 
        !           184:                 ExState = 0;
        !           185:             }
        !           186:             break;
        !           187:         }
        !           188: 
        !           189:         /* store character for next iteration */
        !           190:         lchar = nchar;
        !           191:     }
        !           192: 
        !           193:     /* flush out slide */
        !           194:     flush(w);
        !           195: }
        !           196: 
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: /******************************/
        !           202: /*  Function LoadFollowers()  */
        !           203: /******************************/
        !           204: 
        !           205: static void LoadFollowers()
        !           206: {
        !           207:     register int x;
        !           208:     register int i;
        !           209: 
        !           210:     for (x = 255; x >= 0; x--) {
        !           211:         READBIT(6, Slen[x]);
        !           212:         for (i = 0; (byte) i < Slen[x]; i++) {
        !           213:             READBIT(8, followers[x][i]);
        !           214:         }
        !           215:     }
        !           216: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.