Deleted Added
full compact
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 ---