1028{
1032 int len;
1037
1038
1039
1042
1043#ifdef UNALIGNED_OK
1044
1045
1046
1048 ush scan_start = *(
ushf*)scan;
1049 ush scan_end = *(
ushf*)(scan+best_len-1);
1050#else
1052 Byte scan_end1 = scan[best_len-1];
1053 Byte scan_end = scan[best_len];
1054#endif
1055
1056
1057
1058
1060
1061
1063 chain_length >>= 2;
1064 }
1065
1066
1067
1069
1071
1072 do {
1073 Assert(cur_match < s->strstart,
"no future");
1074 match = s->
window + cur_match;
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
1085
1086
1087
1088 if (*(
ushf*)(match+best_len-1) != scan_end ||
1089 *(
ushf*)match != scan_start)
continue;
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100 Assert(scan[2] == match[2],
"scan[2]?");
1101 scan++, match++;
1102 do {
1103 }
while (*(
ushf*)(scan+=2) == *(
ushf*)(match+=2) &&
1104 *(
ushf*)(scan+=2) == *(
ushf*)(match+=2) &&
1105 *(
ushf*)(scan+=2) == *(
ushf*)(match+=2) &&
1106 *(
ushf*)(scan+=2) == *(
ushf*)(match+=2) &&
1107 scan < strend);
1108
1109
1110
1112 if (*scan == *match) scan++;
1113
1114 len = (
MAX_MATCH - 1) - (
int)(strend-scan);
1116
1117#else
1118
1119 if (match[best_len] != scan_end ||
1120 match[best_len-1] != scan_end1 ||
1121 *match != *scan ||
1122 *++match != scan[1]) continue;
1123
1124
1125
1126
1127
1128
1129
1130 scan += 2, match++;
1131 Assert(*scan == *match,
"match[2]?");
1132
1133
1134
1135
1136 do {
1137 } while (*++scan == *++match && *++scan == *++match &&
1138 *++scan == *++match && *++scan == *++match &&
1139 *++scan == *++match && *++scan == *++match &&
1140 *++scan == *++match && *++scan == *++match &&
1141 scan < strend);
1142
1144
1147
1148#endif
1149
1150 if (len > best_len) {
1152 best_len = len;
1153 if (len >= nice_match) break;
1154#ifdef UNALIGNED_OK
1155 scan_end = *(
ushf*)(scan+best_len-1);
1156#else
1157 scan_end1 = scan[best_len-1];
1158 scan_end = scan[best_len];
1159#endif
1160 }
1161 } while ((cur_match = prev[cur_match & wmask]) > limit
1162 && --chain_length != 0);
1163
1164 if ((
uInt)best_len <= s->lookahead)
return (
uInt)best_len;
1166}