📄 zdeflate_8cpp-source.html
字号:
00370 <span class="keywordflow">while</span> (current > limit && --chainLength > 0)00371 {00372 <span class="keyword">const</span> byte *match = m_byteBuffer + current;00373 assert(scan + bestLength < m_byteBuffer + m_stringStart + m_lookahead);00374 <span class="keywordflow">if</span> (scan[bestLength-1] == match[bestLength-1] && scan[bestLength] == match[bestLength] && scan[0] == match[0] && scan[1] == match[1])00375 {00376 assert(scan[2] == match[2]);00377 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = std::mismatch(scan+3, scanEnd, match+3).first - scan;00378 assert(len != bestLength);00379 <span class="keywordflow">if</span> (len > bestLength)00380 {00381 bestLength = len;00382 bestMatch = current;00383 <span class="keywordflow">if</span> (len == (scanEnd - scan))00384 <span class="keywordflow">break</span>;00385 }00386 }00387 current = m_prev[current & DMASK];00388 }00389 <span class="keywordflow">return</span> (bestMatch > 0) ? bestLength : 0;00390 }00391 00392 <span class="keyword">inline</span> <span class="keywordtype">void</span> Deflator::InsertString(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> start)00393 {00394 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hash = ComputeHash(m_byteBuffer + start);00395 m_prev[start & DMASK] = m_head[hash];00396 m_head[hash] = start;00397 }00398 00399 <span class="keywordtype">void</span> Deflator::ProcessBuffer()00400 {00401 <span class="keywordflow">if</span> (!m_headerWritten)00402 {00403 WritePrestreamHeader();00404 m_headerWritten = <span class="keyword">true</span>;00405 }00406 00407 <span class="keywordflow">if</span> (m_deflateLevel == 0)00408 {00409 <span class="keywordflow">while</span> (m_lookahead > 0)00410 {00411 LiteralByte(m_byteBuffer[m_stringStart++]);00412 m_lookahead--;00413 }00414 <span class="keywordflow">return</span>;00415 }00416 00417 <span class="keywordflow">while</span> (m_lookahead > m_minLookahead)00418 {00419 <span class="keywordflow">while</span> (m_dictionaryEnd < m_stringStart && m_dictionaryEnd+3 <= m_stringStart+m_lookahead)00420 InsertString(m_dictionaryEnd++);00421 00422 <span class="keywordflow">if</span> (m_matchAvailable)00423 {00424 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> matchPosition, matchLength;00425 <span class="keywordtype">bool</span> usePreviousMatch;00426 <span class="keywordflow">if</span> (m_previousLength >= MAX_LAZYLENGTH)00427 usePreviousMatch = <span class="keyword">true</span>;00428 <span class="keywordflow">else</span>00429 {00430 matchLength = LongestMatch(matchPosition);00431 usePreviousMatch = (m_previousLength > 0 && matchLength == 0);00432 }00433 <span class="keywordflow">if</span> (usePreviousMatch)00434 {00435 MatchFound(m_stringStart-1-m_previousMatch, m_previousLength);00436 m_stringStart += m_previousLength-1;00437 m_lookahead -= m_previousLength-1;00438 m_matchAvailable = <span class="keyword">false</span>;00439 m_previousLength = 0;00440 }00441 <span class="keywordflow">else</span>00442 {00443 m_previousLength = matchLength;00444 m_previousMatch = matchPosition;00445 LiteralByte(m_byteBuffer[m_stringStart-1]);00446 m_stringStart++;00447 m_lookahead--;00448 }00449 }00450 <span class="keywordflow">else</span>00451 {00452 m_previousLength = LongestMatch(m_previousMatch);00453 m_matchAvailable = <span class="keyword">true</span>;00454 m_stringStart++;00455 m_lookahead--;00456 }00457 }00458 assert(m_stringStart - (m_blockStart+m_blockLength) <= 1);00459 <span class="keywordflow">if</span> (m_minLookahead == 0 && m_matchAvailable)00460 {00461 LiteralByte(m_byteBuffer[m_stringStart-1]);00462 m_matchAvailable = <span class="keyword">false</span>;00463 }00464 }00465 <a name="l00466"></a><a class="code" href="class_deflator.html#_zlib_compressora7">00466</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_deflator.html#_zlib_compressora7">Deflator::Put2</a>(<span class="keyword">const</span> byte *str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)00467 {00468 <span class="keywordflow">if</span> (!blocking)00469 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"Deflator"</span>);00470 00471 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> accepted = 0;00472 <span class="keywordflow">while</span> (accepted < length)00473 {00474 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> newAccepted = FillWindow(str+accepted, length-accepted);00475 ProcessBuffer();00476 <span class="comment">// call ProcessUncompressedData() after WritePrestreamHeader()</span>00477 ProcessUncompressedData(str+accepted, newAccepted);00478 accepted += newAccepted;00479 }00480 assert(accepted == length);00481 00482 <span class="keywordflow">if</span> (messageEnd)00483 {00484 m_minLookahead = 0;00485 ProcessBuffer();00486 EndBlock(<span class="keyword">true</span>);00487 FlushBitBuffer();00488 WritePoststreamTail();00489 Reset();00490 }00491 00492 Output(0, NULL, 0, messageEnd, blocking);00493 <span class="keywordflow">return</span> 0;00494 }00495 00496 <span class="keywordtype">bool</span> Deflator::IsolatedFlush(<span class="keywordtype">bool</span> hardFlush, <span class="keywordtype">bool</span> blocking)00497 {00498 <span class="keywordflow">if</span> (!blocking)00499 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"Deflator"</span>);00500 00501 m_minLookahead = 0;00502 ProcessBuffer();00503 m_minLookahead = MAX_MATCH;00504 EndBlock(<span class="keyword">false</span>);00505 <span class="keywordflow">if</span> (hardFlush)00506 EncodeBlock(<span class="keyword">false</span>, STORED);00507 <span class="keywordflow">return</span> <span class="keyword">false</span>;00508 }00509 00510 <span class="keywordtype">void</span> Deflator::LiteralByte(byte b)00511 {00512 m_matchBuffer[m_matchBufferEnd++].literalCode = b;00513 m_literalCounts[b]++;00514 00515 <span class="keywordflow">if</span> (m_blockStart+(++m_blockLength) == m_byteBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() || m_matchBufferEnd == m_matchBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00516 EndBlock(<span class="keyword">false</span>);00517 }00518 00519 <span class="keywordtype">void</span> Deflator::MatchFound(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distance, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00520 {00521 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthCodes[] = {00522 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, 268,00523 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272,00524 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274,00525 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 276,00526 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,00527 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,00528 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,00529 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,00530 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,00531 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,00532 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,00533 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,00534 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,00535 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,00536 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,00537 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 285};00538 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBases[] = {3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258};00539 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceBases[30] = 00540 {1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577};00541 00542 EncodedMatch &m = m_matchBuffer[m_matchBufferEnd++];00543 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthCode = lengthCodes[length-3];00544 m.literalCode = lengthCode;00545 m.literalExtra = length - lengthBases[lengthCode-257];00546 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceCode = upper_bound(distanceBases, distanceBases+30, distance) - distanceBases - 1;00547 m.distanceCode = distanceCode;00548 m.distanceExtra = distance - distanceBases[distanceCode];00549 00550 m_literalCounts[lengthCode]++;00551 m_distanceCounts[distanceCode]++;00552 00553 <span class="keywordflow">if</span> (m_blockStart+(m_blockLength+=length) == m_byteBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() || m_matchBufferEnd == m_matchBuffer.size())00554 EndBlock(<span class="keyword">false</span>);00555 }00556 00557 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CodeLengthEncode(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *begin,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -