\r
const BYTE* ip = (BYTE*) source; \r
const BYTE* anchor = ip;\r
- const BYTE* ref;\r
const BYTE* const iend = ip + isize;\r
const BYTE* const ilimit = iend - MINMATCH;\r
\r
\r
int len, length;\r
const int skipStrength = SKIPSTRENGTH;\r
- U32 skipped = 1U << skipStrength;\r
+ U32 forwardH;\r
\r
\r
// Init \r
*ctx = (void*) srt;\r
}\r
HashTable = srt->hashTable;\r
- memset(HashTable, 0, sizeof(srt->hashTable));\r
+ memset((void*)HashTable, 0, sizeof(srt->hashTable));\r
\r
- // Main Loop\r
- while (ip < ilimit+1)\r
- {\r
- ref = HashTable[HASH_VALUE(ip)];\r
- HashTable[HASH_VALUE(ip)] = ip;\r
\r
- // Min Match\r
- if ((ref < ip - MAX_DISTANCE) || (*(U32*)ref != *(U32*)ip)) { ip += (skipped++) >> skipStrength ; continue; }\r
- skipped = (1U << skipStrength) + 3;\r
+ // First Byte\r
+ HashTable[HASH_VALUE(ip)] = ip++;\r
+ forwardH = HASH_VALUE(ip);\r
+ \r
+ // Main Loop\r
+ for ( ; ; )
+ {
+ int segmentSize = (1U << skipStrength) + 3;
+ const BYTE* forwardIp = ip;
+ const BYTE* ref;
+
+ // Find a match\r
+ do {
+ U32 h = forwardH;
+ int skipped = segmentSize++ >> skipStrength;
+ ip = forwardIp;
+ forwardIp = ip + skipped;
+
+ if (forwardIp > ilimit) { goto _last_literals; }
+\r
+ forwardH = HASH_VALUE(forwardIp);\r
+ ref = HashTable[h];\r
+ HashTable[h] = ip;\r
+
+ } while ((ref < ip - MAX_DISTANCE) || (*(U32*)ref != *(U32*)ip));
\r
// Catch up\r
while ((ip>anchor) && (ref>(BYTE*)source) && (ip[-1]==ref[-1])) { ip--; ref--; } \r
\r
// Prepare next loop\r
anchor = ip++; \r
+ forwardH = HASH_VALUE(ip);\r
}\r
\r
+_last_literals:\r
// Encode Last Literals\r
- len = iend - anchor;\r
- if (len)\r
+ if (anchor < iend)\r
{\r
- orun=op++;\r
- if (len>=(int)RUN_MASK) { *orun=(RUN_MASK<<ML_BITS); len-=RUN_MASK; for(; len > 254 ; len-=255) *op++ = 255; *op++ = (BYTE) len; } \r
- else *orun = (len<<ML_BITS);\r
+ int lastLitRun = iend - anchor;\r
+ if (lastLitRun>=(int)RUN_MASK) { *op++=(RUN_MASK<<ML_BITS); lastLitRun-=RUN_MASK; for(; lastLitRun > 254 ; lastLitRun-=255) *op++ = 255; *op++ = (BYTE) lastLitRun; } \r
+ else *op++ = (lastLitRun<<ML_BITS);\r
while (anchor < iend - 3) { *(U32*)op = *(U32*)anchor; op+=4; anchor+=4; }\r
while (anchor < iend ) *op++ = *anchor++;\r
}\r