// Constants\r
//**************************************\r
#define MINMATCH 4\r
+#define MINLENGTH 6\r
#define SKIPSTRENGTH 6\r
#define STACKLIMIT 13\r
#define HEAPMODE (HASH_LOG>STACKLIMIT) // Defines if memory is allocated into the stack (local variable), or into the heap (malloc()).\r
const BYTE* ip = (BYTE*) source; \r
const BYTE* anchor = ip;\r
const BYTE* const iend = ip + isize;\r
- const BYTE* const ilimit = iend - MINMATCH;\r
+ const BYTE* const ilm = iend - 1;\r
+ const BYTE* const ilimit = iend - MINMATCH - 1;\r
\r
BYTE* op = (BYTE*) dest;\r
BYTE* token;\r
\r
\r
// Init \r
+ if (isize<MINLENGTH) goto _last_literals;\r
#if HEAPMODE\r
if (*ctx == NULL) \r
{\r
// Start Counting\r
ip+=MINMATCH; ref+=MINMATCH; // MinMatch verified\r
anchor = ip;\r
- while (ip<(iend-3))\r
+ while (ip<(iend-4))\r
{\r
if (*(U32*)ref == *(U32*)ip) { ip+=4; ref+=4; continue; }\r
if (*(U16*)ref == *(U16*)ip) { ip+=2; ref+=2; }\r
if (*ref == *ip) ip++;\r
goto _endCount;\r
}\r
- if ((ip<(iend-1)) && (*(U16*)ref == *(U16*)ip)) { ip+=2; ref+=2; }\r
- if ((ip<iend) && (*ref == *ip)) ip++;\r
+ if ((ip<(iend-2)) && (*(U16*)ref == *(U16*)ip)) { ip+=2; ref+=2; }\r
+ if ((ip<iend-1) && (*ref == *ip)) ip++;\r
_endCount:\r
len = (ip - anchor);\r
\r
else *token += len; \r
\r
// Test end of chunk\r
- if (ip > ilimit) { anchor = ip; break; }\r
+ if (ip > ilimit-1) { anchor = ip; break; }\r
\r
// Test next position\r
ref = HashTable[HASH_VALUE(ip)];\r
\r
_last_literals:\r
// Encode Last Literals\r
- if (anchor < iend)\r
{\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
+ } \r
\r
// End\r
return (int) (((char*)op)-dest);\r