Deleted Added
full compact
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.
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
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"
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",
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/*---------------------------------------------------*/
577static
578void 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) {
587 if (s->strm->avail_out == 0) return;
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 }
597
598 /* can a new run be started? */
599 if (s->nblock_used == s->save_nblock+1) return;
600
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 }
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 }
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/*---------------------------------------------------*/
735static
736void 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) {
745 if (s->strm->avail_out == 0) return;
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? */
757 if (s->nblock_used == s->save_nblock+1) return;
758
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) {
791 if (s->strm->avail_out == 0) return;
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? */
803 if (s->nblock_used == s->save_nblock+1) return;
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{
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)
843 unRLE_obuf_to_output_SMALL ( s ); else
844 unRLE_obuf_to_output_FAST ( s );
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)
848 VPrintf2 ( " {0x%x, 0x%x}", 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)
866 VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x",
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 ---