bzlib.c (90067) | bzlib.c (146293) |
---|---|
1 2/*-------------------------------------------------------------*/ 3/*--- Library top-level functions. ---*/ 4/*--- bzlib.c ---*/ 5/*-------------------------------------------------------------*/ 6 7/*-- 8 This file is a part of bzip2 and/or libbzip2, a program and 9 library for lossless, block-sorting data compression. 10 | 1 2/*-------------------------------------------------------------*/ 3/*--- Library top-level functions. ---*/ 4/*--- bzlib.c ---*/ 5/*-------------------------------------------------------------*/ 6 7/*-- 8 This file is a part of bzip2 and/or libbzip2, a program and 9 library for lossless, block-sorting data compression. 10 |
11 Copyright (C) 1996-2002 Julian R Seward. All rights reserved. | 11 Copyright (C) 1996-2005 Julian R Seward. All rights reserved. |
12 13 Redistribution and use in source and binary forms, with or without 14 modification, are permitted provided that the following conditions 15 are met: 16 17 1. Redistributions of source code must retain the above copyright 18 notice, this list of conditions and the following disclaimer. 19 --- 17 unchanged lines hidden (view full) --- 37 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 38 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 40 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 41 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 42 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 44 Julian Seward, Cambridge, UK. | 12 13 Redistribution and use in source and binary forms, with or without 14 modification, are permitted provided that the following conditions 15 are met: 16 17 1. Redistributions of source code must retain the above copyright 18 notice, this list of conditions and the following disclaimer. 19 --- 17 unchanged lines hidden (view full) --- 37 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 38 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 40 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 41 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 42 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 44 Julian Seward, Cambridge, UK. |
45 jseward@acm.org | 45 jseward@bzip.org |
46 bzip2/libbzip2 version 1.0 of 21 March 2000 47 48 This program is based on (at least) the work of: 49 Mike Burrows 50 David Wheeler 51 Peter Fenwick 52 Alistair Moffat 53 Radford Neal --- 29 unchanged lines hidden (view full) --- 83 84/*---------------------------------------------------*/ 85#ifndef BZ_NO_STDIO 86void BZ2_bz__AssertH__fail ( int errcode ) 87{ 88 fprintf(stderr, 89 "\n\nbzip2/libbzip2: internal error number %d.\n" 90 "This is a bug in bzip2/libbzip2, %s.\n" | 46 bzip2/libbzip2 version 1.0 of 21 March 2000 47 48 This program is based on (at least) the work of: 49 Mike Burrows 50 David Wheeler 51 Peter Fenwick 52 Alistair Moffat 53 Radford Neal --- 29 unchanged lines hidden (view full) --- 83 84/*---------------------------------------------------*/ 85#ifndef BZ_NO_STDIO 86void BZ2_bz__AssertH__fail ( int errcode ) 87{ 88 fprintf(stderr, 89 "\n\nbzip2/libbzip2: internal error number %d.\n" 90 "This is a bug in bzip2/libbzip2, %s.\n" |
91 "Please report it to me at: jseward@acm.org. If this happened\n" | 91 "Please report it to me at: jseward@bzip.org. If this happened\n" |
92 "when you were using some program which uses libbzip2 as a\n" 93 "component, you should also report this bug to the author(s)\n" 94 "of that program. Please make an effort to report this bug;\n" 95 "timely and accurate bug reports eventually lead to higher\n" | 92 "when you were using some program which uses libbzip2 as a\n" 93 "component, you should also report this bug to the author(s)\n" 94 "of that program. Please make an effort to report this bug;\n" 95 "timely and accurate bug reports eventually lead to higher\n" |
96 "quality software. Thanks. Julian Seward, 30 December 2001.\n\n", | 96 "quality software. Thanks. Julian Seward, 15 February 2005.\n\n", |
97 errcode, 98 BZ2_bzlibVersion() 99 ); 100 101 if (errcode == 1007) { 102 fprintf(stderr, 103 "\n*** A special note about internal error number 1007 ***\n" 104 "\n" --- 464 unchanged lines hidden (view full) --- 569 s->currBlockNo = 0; 570 s->verbosity = verbosity; 571 572 return BZ_OK; 573} 574 575 576/*---------------------------------------------------*/ | 97 errcode, 98 BZ2_bzlibVersion() 99 ); 100 101 if (errcode == 1007) { 102 fprintf(stderr, 103 "\n*** A special note about internal error number 1007 ***\n" 104 "\n" --- 464 unchanged lines hidden (view full) --- 569 s->currBlockNo = 0; 570 s->verbosity = verbosity; 571 572 return BZ_OK; 573} 574 575 576/*---------------------------------------------------*/ |
577/* Return True iff data corruption is discovered. 578 Returns False if there is no problem. 579*/ |
|
577static | 580static |
578void unRLE_obuf_to_output_FAST ( DState* s ) | 581Bool unRLE_obuf_to_output_FAST ( DState* s ) |
579{ 580 UChar k1; 581 582 if (s->blockRandomised) { 583 584 while (True) { 585 /* try to finish existing run */ 586 while (True) { | 582{ 583 UChar k1; 584 585 if (s->blockRandomised) { 586 587 while (True) { 588 /* try to finish existing run */ 589 while (True) { |
587 if (s->strm->avail_out == 0) return; | 590 if (s->strm->avail_out == 0) return False; |
588 if (s->state_out_len == 0) break; 589 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 590 BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 591 s->state_out_len--; 592 s->strm->next_out++; 593 s->strm->avail_out--; 594 s->strm->total_out_lo32++; 595 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 596 } | 591 if (s->state_out_len == 0) break; 592 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 593 BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 594 s->state_out_len--; 595 s->strm->next_out++; 596 s->strm->avail_out--; 597 s->strm->total_out_lo32++; 598 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 599 } |
597 | 600 |
598 /* can a new run be started? */ | 601 /* can a new run be started? */ |
599 if (s->nblock_used == s->save_nblock+1) return; | 602 if (s->nblock_used == s->save_nblock+1) return False; |
600 | 603 |
604 /* Only caused by corrupt data stream? */ 605 if (s->nblock_used > s->save_nblock+1) 606 return True; |
|
601 602 s->state_out_len = 1; 603 s->state_out_ch = s->k0; 604 BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 605 k1 ^= BZ_RAND_MASK; s->nblock_used++; 606 if (s->nblock_used == s->save_nblock+1) continue; 607 if (k1 != s->k0) { s->k0 = k1; continue; }; 608 --- 53 unchanged lines hidden (view full) --- 662 c_state_out_len = 1; goto return_notr; 663 }; 664 *( (UChar*)(cs_next_out) ) = c_state_out_ch; 665 BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); 666 cs_next_out++; 667 cs_avail_out--; 668 } 669 } | 607 608 s->state_out_len = 1; 609 s->state_out_ch = s->k0; 610 BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 611 k1 ^= BZ_RAND_MASK; s->nblock_used++; 612 if (s->nblock_used == s->save_nblock+1) continue; 613 if (k1 != s->k0) { s->k0 = k1; continue; }; 614 --- 53 unchanged lines hidden (view full) --- 668 c_state_out_len = 1; goto return_notr; 669 }; 670 *( (UChar*)(cs_next_out) ) = c_state_out_ch; 671 BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); 672 cs_next_out++; 673 cs_avail_out--; 674 } 675 } |
676 /* Only caused by corrupt data stream? */ 677 if (c_nblock_used > s_save_nblockPP) 678 return True; 679 |
|
670 /* can a new run be started? */ 671 if (c_nblock_used == s_save_nblockPP) { 672 c_state_out_len = 0; goto return_notr; 673 }; 674 c_state_out_ch = c_k0; 675 BZ_GET_FAST_C(k1); c_nblock_used++; 676 if (k1 != c_k0) { 677 c_k0 = k1; goto s_state_out_len_eq_one; --- 29 unchanged lines hidden (view full) --- 707 s->nblock_used = c_nblock_used; 708 s->k0 = c_k0; 709 s->tt = c_tt; 710 s->tPos = c_tPos; 711 s->strm->next_out = cs_next_out; 712 s->strm->avail_out = cs_avail_out; 713 /* end save */ 714 } | 680 /* can a new run be started? */ 681 if (c_nblock_used == s_save_nblockPP) { 682 c_state_out_len = 0; goto return_notr; 683 }; 684 c_state_out_ch = c_k0; 685 BZ_GET_FAST_C(k1); c_nblock_used++; 686 if (k1 != c_k0) { 687 c_k0 = k1; goto s_state_out_len_eq_one; --- 29 unchanged lines hidden (view full) --- 717 s->nblock_used = c_nblock_used; 718 s->k0 = c_k0; 719 s->tt = c_tt; 720 s->tPos = c_tPos; 721 s->strm->next_out = cs_next_out; 722 s->strm->avail_out = cs_avail_out; 723 /* end save */ 724 } |
725 return False; |
|
715} 716 717 718 719/*---------------------------------------------------*/ 720__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) 721{ 722 Int32 nb, na, mid; --- 4 unchanged lines hidden (view full) --- 727 if (indx >= cftab[mid]) nb = mid; else na = mid; 728 } 729 while (na - nb != 1); 730 return nb; 731} 732 733 734/*---------------------------------------------------*/ | 726} 727 728 729 730/*---------------------------------------------------*/ 731__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) 732{ 733 Int32 nb, na, mid; --- 4 unchanged lines hidden (view full) --- 738 if (indx >= cftab[mid]) nb = mid; else na = mid; 739 } 740 while (na - nb != 1); 741 return nb; 742} 743 744 745/*---------------------------------------------------*/ |
746/* Return True iff data corruption is discovered. 747 Returns False if there is no problem. 748*/ |
|
735static | 749static |
736void unRLE_obuf_to_output_SMALL ( DState* s ) | 750Bool unRLE_obuf_to_output_SMALL ( DState* s ) |
737{ 738 UChar k1; 739 740 if (s->blockRandomised) { 741 742 while (True) { 743 /* try to finish existing run */ 744 while (True) { | 751{ 752 UChar k1; 753 754 if (s->blockRandomised) { 755 756 while (True) { 757 /* try to finish existing run */ 758 while (True) { |
745 if (s->strm->avail_out == 0) return; | 759 if (s->strm->avail_out == 0) return False; |
746 if (s->state_out_len == 0) break; 747 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 748 BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 749 s->state_out_len--; 750 s->strm->next_out++; 751 s->strm->avail_out--; 752 s->strm->total_out_lo32++; 753 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 754 } 755 756 /* can a new run be started? */ | 760 if (s->state_out_len == 0) break; 761 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 762 BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 763 s->state_out_len--; 764 s->strm->next_out++; 765 s->strm->avail_out--; 766 s->strm->total_out_lo32++; 767 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 768 } 769 770 /* can a new run be started? */ |
757 if (s->nblock_used == s->save_nblock+1) return; 758 | 771 if (s->nblock_used == s->save_nblock+1) return False; 772 773 /* Only caused by corrupt data stream? */ 774 if (s->nblock_used > s->save_nblock+1) 775 return True; |
759 760 s->state_out_len = 1; 761 s->state_out_ch = s->k0; 762 BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 763 k1 ^= BZ_RAND_MASK; s->nblock_used++; 764 if (s->nblock_used == s->save_nblock+1) continue; 765 if (k1 != s->k0) { s->k0 = k1; continue; }; 766 --- 16 unchanged lines hidden (view full) --- 783 s->k0 ^= BZ_RAND_MASK; s->nblock_used++; 784 } 785 786 } else { 787 788 while (True) { 789 /* try to finish existing run */ 790 while (True) { | 776 777 s->state_out_len = 1; 778 s->state_out_ch = s->k0; 779 BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 780 k1 ^= BZ_RAND_MASK; s->nblock_used++; 781 if (s->nblock_used == s->save_nblock+1) continue; 782 if (k1 != s->k0) { s->k0 = k1; continue; }; 783 --- 16 unchanged lines hidden (view full) --- 800 s->k0 ^= BZ_RAND_MASK; s->nblock_used++; 801 } 802 803 } else { 804 805 while (True) { 806 /* try to finish existing run */ 807 while (True) { |
791 if (s->strm->avail_out == 0) return; | 808 if (s->strm->avail_out == 0) return False; |
792 if (s->state_out_len == 0) break; 793 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 794 BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 795 s->state_out_len--; 796 s->strm->next_out++; 797 s->strm->avail_out--; 798 s->strm->total_out_lo32++; 799 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 800 } 801 802 /* can a new run be started? */ | 809 if (s->state_out_len == 0) break; 810 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 811 BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 812 s->state_out_len--; 813 s->strm->next_out++; 814 s->strm->avail_out--; 815 s->strm->total_out_lo32++; 816 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 817 } 818 819 /* can a new run be started? */ |
803 if (s->nblock_used == s->save_nblock+1) return; | 820 if (s->nblock_used == s->save_nblock+1) return False; 821 822 /* Only caused by corrupt data stream? */ 823 if (s->nblock_used > s->save_nblock+1) 824 return True; |
804 805 s->state_out_len = 1; 806 s->state_out_ch = s->k0; 807 BZ_GET_SMALL(k1); s->nblock_used++; 808 if (s->nblock_used == s->save_nblock+1) continue; 809 if (k1 != s->k0) { s->k0 = k1; continue; }; 810 811 s->state_out_len = 2; --- 13 unchanged lines hidden (view full) --- 825 826 } 827} 828 829 830/*---------------------------------------------------*/ 831int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) 832{ | 825 826 s->state_out_len = 1; 827 s->state_out_ch = s->k0; 828 BZ_GET_SMALL(k1); s->nblock_used++; 829 if (s->nblock_used == s->save_nblock+1) continue; 830 if (k1 != s->k0) { s->k0 = k1; continue; }; 831 832 s->state_out_len = 2; --- 13 unchanged lines hidden (view full) --- 846 847 } 848} 849 850 851/*---------------------------------------------------*/ 852int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) 853{ |
854 Bool corrupt; |
|
833 DState* s; 834 if (strm == NULL) return BZ_PARAM_ERROR; 835 s = strm->state; 836 if (s == NULL) return BZ_PARAM_ERROR; 837 if (s->strm != strm) return BZ_PARAM_ERROR; 838 839 while (True) { 840 if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; 841 if (s->state == BZ_X_OUTPUT) { 842 if (s->smallDecompress) | 855 DState* s; 856 if (strm == NULL) return BZ_PARAM_ERROR; 857 s = strm->state; 858 if (s == NULL) return BZ_PARAM_ERROR; 859 if (s->strm != strm) return BZ_PARAM_ERROR; 860 861 while (True) { 862 if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; 863 if (s->state == BZ_X_OUTPUT) { 864 if (s->smallDecompress) |
843 unRLE_obuf_to_output_SMALL ( s ); else 844 unRLE_obuf_to_output_FAST ( s ); | 865 corrupt = unRLE_obuf_to_output_SMALL ( s ); else 866 corrupt = unRLE_obuf_to_output_FAST ( s ); 867 if (corrupt) return BZ_DATA_ERROR; |
845 if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { 846 BZ_FINALISE_CRC ( s->calculatedBlockCRC ); 847 if (s->verbosity >= 3) | 868 if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { 869 BZ_FINALISE_CRC ( s->calculatedBlockCRC ); 870 if (s->verbosity >= 3) |
848 VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC, | 871 VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, |
849 s->calculatedBlockCRC ); 850 if (s->verbosity >= 2) VPrintf0 ( "]" ); 851 if (s->calculatedBlockCRC != s->storedBlockCRC) 852 return BZ_DATA_ERROR; 853 s->calculatedCombinedCRC 854 = (s->calculatedCombinedCRC << 1) | 855 (s->calculatedCombinedCRC >> 31); 856 s->calculatedCombinedCRC ^= s->calculatedBlockCRC; 857 s->state = BZ_X_BLKHDR_1; 858 } else { 859 return BZ_OK; 860 } 861 } 862 if (s->state >= BZ_X_MAGIC_1) { 863 Int32 r = BZ2_decompress ( s ); 864 if (r == BZ_STREAM_END) { 865 if (s->verbosity >= 3) | 872 s->calculatedBlockCRC ); 873 if (s->verbosity >= 2) VPrintf0 ( "]" ); 874 if (s->calculatedBlockCRC != s->storedBlockCRC) 875 return BZ_DATA_ERROR; 876 s->calculatedCombinedCRC 877 = (s->calculatedCombinedCRC << 1) | 878 (s->calculatedCombinedCRC >> 31); 879 s->calculatedCombinedCRC ^= s->calculatedBlockCRC; 880 s->state = BZ_X_BLKHDR_1; 881 } else { 882 return BZ_OK; 883 } 884 } 885 if (s->state >= BZ_X_MAGIC_1) { 886 Int32 r = BZ2_decompress ( s ); 887 if (r == BZ_STREAM_END) { 888 if (s->verbosity >= 3) |
866 VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x", | 889 VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", |
867 s->storedCombinedCRC, s->calculatedCombinedCRC ); 868 if (s->calculatedCombinedCRC != s->storedCombinedCRC) 869 return BZ_DATA_ERROR; 870 return r; 871 } 872 if (s->state != BZ_X_OUTPUT) return r; 873 } 874 } --- 719 unchanged lines hidden --- | 890 s->storedCombinedCRC, s->calculatedCombinedCRC ); 891 if (s->calculatedCombinedCRC != s->storedCombinedCRC) 892 return BZ_DATA_ERROR; 893 return r; 894 } 895 if (s->state != BZ_X_OUTPUT) return r; 896 } 897 } --- 719 unchanged lines hidden --- |