Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/Branch/BranchX86.c, revision 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>