Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/Branch/BranchX86.c, revision 1.1.1.1

1.1       misho       1: /* BranchX86.c */
                      2: 
                      3: #include "BranchX86.h"
                      4: 
                      5: /*
                      6: static int inline Test86MSByte(Byte b)
                      7: {
                      8:   return (b == 0 || b == 0xFF);
                      9: }
                     10: */
                     11: #define Test86MSByte(b) ((b) == 0 || (b) == 0xFF)
                     12: 
                     13: const int kMaskToAllowedStatus[8] = {1, 1, 1, 0, 1, 0, 0, 0};
                     14: const Byte kMaskToBitNumber[8] = {0, 1, 2, 2, 3, 3, 3, 3};
                     15: 
                     16: /*
                     17: void x86_Convert_Init(UInt32 *prevMask, UInt32 *prevPos)
                     18: {
                     19:   *prevMask = 0;
                     20:   *prevPos = (UInt32)(-5);
                     21: }
                     22: */
                     23: 
                     24: UInt32 x86_Convert(Byte *buffer, UInt32 endPos, UInt32 nowPos, 
                     25:     UInt32 *prevMask, UInt32 *prevPos, int encoding)
                     26: {
                     27:   UInt32 bufferPos = 0;
                     28:   UInt32 limit;
                     29: 
                     30:   if (endPos < 5)
                     31:     return 0;
                     32:   
                     33:   if (nowPos - *prevPos > 5)
                     34:     *prevPos = nowPos - 5;
                     35:   
                     36:   limit = endPos - 5;
                     37:   while(bufferPos <= limit)
                     38:   {
                     39:     Byte b = buffer[bufferPos];
                     40:     UInt32 offset;
                     41:     if (b != 0xE8 && b != 0xE9)
                     42:     {
                     43:       bufferPos++;
                     44:       continue;
                     45:     }
                     46:     offset = (nowPos + bufferPos - *prevPos);
                     47:     *prevPos = (nowPos + bufferPos);
                     48:     if (offset > 5)
                     49:       *prevMask = 0;
                     50:     else
                     51:     {
                     52:       UInt32 i;
                     53:       for (i = 0; i < offset; i++)
                     54:       {
                     55:         *prevMask &= 0x77;
                     56:         *prevMask <<= 1;
                     57:       }
                     58:     }
                     59:     b = buffer[bufferPos + 4];
                     60:     if (Test86MSByte(b) && kMaskToAllowedStatus[(*prevMask >> 1) & 0x7] && 
                     61:       (*prevMask >> 1) < 0x10)
                     62:     {
                     63:       UInt32 src = 
                     64:         ((UInt32)(b) << 24) |
                     65:         ((UInt32)(buffer[bufferPos + 3]) << 16) |
                     66:         ((UInt32)(buffer[bufferPos + 2]) << 8) |
                     67:         (buffer[bufferPos + 1]);
                     68:       
                     69:       UInt32 dest;
                     70:       while(1)
                     71:       {
                     72:         UInt32 index;
                     73:         if (encoding)
                     74:           dest = (nowPos + bufferPos + 5) + src;
                     75:         else
                     76:           dest = src - (nowPos + bufferPos + 5);
                     77:         if (*prevMask == 0)
                     78:           break;
                     79:         index = kMaskToBitNumber[*prevMask >> 1];
                     80:         b = (Byte)(dest >> (24 - index * 8));
                     81:         if (!Test86MSByte(b))
                     82:           break;
                     83:         src = dest ^ ((1 << (32 - index * 8)) - 1);
                     84:       }
                     85:       buffer[bufferPos + 4] = (Byte)(~(((dest >> 24) & 1) - 1));
                     86:       buffer[bufferPos + 3] = (Byte)(dest >> 16);
                     87:       buffer[bufferPos + 2] = (Byte)(dest >> 8);
                     88:       buffer[bufferPos + 1] = (Byte)dest;
                     89:       bufferPos += 5;
                     90:       *prevMask = 0;
                     91:     }
                     92:     else
                     93:     {
                     94:       bufferPos++;
                     95:       *prevMask |= 1;
                     96:       if (Test86MSByte(b))
                     97:         *prevMask |= 0x10;
                     98:     }
                     99:   }
                    100:   return bufferPos;
                    101: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>