1 2 typedef unsigned int size_t; 3 4 typedef long int wchar_t; 5 6 7 typedef struct 8 { 9 int quot; 10 int rem; 11 } div_t; 12 13 14 15 typedef struct 16 { 17 long int quot; 18 long int rem; 19 } ldiv_t; 20 21 22 23 24 extern size_t __ctype_get_mb_cur_max (void) __attribute__ ((__nothrow__)); 25 26 27 28 29 extern double atof (__const char *__nptr) 30 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); 31 32 extern int atoi (__const char *__nptr) 33 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); 34 35 extern long int atol (__const char *__nptr) 36 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); 37 38 39 40 41 42 __extension__ extern long long int atoll (__const char *__nptr) 43 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); 44 45 46 47 48 49 extern double strtod (__const char *__restrict __nptr, 50 char **__restrict __endptr) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 51 52 53 54 55 extern long int strtol (__const char *__restrict __nptr, 56 char **__restrict __endptr, int __base) 57 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 58 59 extern unsigned long int strtoul (__const char *__restrict __nptr, 60 char **__restrict __endptr, int __base) 61 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 62 63 64 65 66 __extension__ 67 extern long long int strtoq (__const char *__restrict __nptr, 68 char **__restrict __endptr, int __base) 69 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 70 71 __extension__ 72 extern unsigned long long int strtouq (__const char *__restrict __nptr, 73 char **__restrict __endptr, int __base) 74 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 75 76 77 78 79 80 __extension__ 81 extern long long int strtoll (__const char *__restrict __nptr, 82 char **__restrict __endptr, int __base) 83 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 84 85 __extension__ 86 extern unsigned long long int strtoull (__const char *__restrict __nptr, 87 char **__restrict __endptr, int __base) 88 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 89 90 91 extern double __strtod_internal (__const char *__restrict __nptr, 92 char **__restrict __endptr, int __group) 93 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 94 extern float __strtof_internal (__const char *__restrict __nptr, 95 char **__restrict __endptr, int __group) 96 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 97 extern long double __strtold_internal (__const char *__restrict __nptr, 98 char **__restrict __endptr, 99 int __group) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 100 101 extern long int __strtol_internal (__const char *__restrict __nptr, 102 char **__restrict __endptr, 103 int __base, int __group) 104 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 105 106 107 108 extern unsigned long int __strtoul_internal (__const char *__restrict __nptr, 109 char **__restrict __endptr, 110 int __base, int __group) 111 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 112 113 114 115 116 __extension__ 117 extern long long int __strtoll_internal (__const char *__restrict __nptr, 118 char **__restrict __endptr, 119 int __base, int __group) 120 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 121 122 123 124 __extension__ 125 extern unsigned long long int __strtoull_internal (__const char * 126 __restrict __nptr, 127 char **__restrict __endptr, 128 int __base, int __group) 129 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 130 131 extern char *l64a (long int __n) __attribute__ ((__nothrow__)); 132 133 134 extern long int a64l (__const char *__s) 135 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); 136 137 138 139 140 141 142 typedef unsigned char __u_char; 143 typedef unsigned short int __u_short; 144 typedef unsigned int __u_int; 145 typedef unsigned long int __u_long; 146 147 148 typedef signed char __int8_t; 149 typedef unsigned char __uint8_t; 150 typedef signed short int __int16_t; 151 typedef unsigned short int __uint16_t; 152 typedef signed int __int32_t; 153 typedef unsigned int __uint32_t; 154 155 156 157 158 __extension__ typedef signed long long int __int64_t; 159 __extension__ typedef unsigned long long int __uint64_t; 160 161 162 163 164 165 166 167 __extension__ typedef long long int __quad_t; 168 __extension__ typedef unsigned long long int __u_quad_t; 169 170 171 172 173 174 175 __extension__ typedef __u_quad_t __dev_t; 176 __extension__ typedef unsigned int __uid_t; 177 __extension__ typedef unsigned int __gid_t; 178 __extension__ typedef unsigned long int __ino_t; 179 __extension__ typedef __u_quad_t __ino64_t; 180 __extension__ typedef unsigned int __mode_t; 181 __extension__ typedef unsigned int __nlink_t; 182 __extension__ typedef long int __off_t; 183 __extension__ typedef __quad_t __off64_t; 184 __extension__ typedef int __pid_t; 185 __extension__ typedef struct { int __val[2]; } __fsid_t; 186 __extension__ typedef long int __clock_t; 187 __extension__ typedef unsigned long int __rlim_t; 188 __extension__ typedef __u_quad_t __rlim64_t; 189 __extension__ typedef unsigned int __id_t; 190 __extension__ typedef long int __time_t; 191 __extension__ typedef unsigned int __useconds_t; 192 __extension__ typedef long int __suseconds_t; 193 194 __extension__ typedef int __daddr_t; 195 __extension__ typedef long int __swblk_t; 196 __extension__ typedef int __key_t; 197 198 199 __extension__ typedef int __clockid_t; 200 201 202 __extension__ typedef int __timer_t; 203 204 205 __extension__ typedef long int __blksize_t; 206 207 208 209 210 __extension__ typedef long int __blkcnt_t; 211 __extension__ typedef __quad_t __blkcnt64_t; 212 213 214 __extension__ typedef unsigned long int __fsblkcnt_t; 215 __extension__ typedef __u_quad_t __fsblkcnt64_t; 216 217 218 __extension__ typedef unsigned long int __fsfilcnt_t; 219 __extension__ typedef __u_quad_t __fsfilcnt64_t; 220 221 __extension__ typedef int __ssize_t; 222 223 224 225 typedef __off64_t __loff_t; 226 typedef __quad_t *__qaddr_t; 227 typedef char *__caddr_t; 228 229 230 __extension__ typedef int __intptr_t; 231 232 233 __extension__ typedef unsigned int __socklen_t; 234 235 236 237 238 typedef __u_char u_char; 239 typedef __u_short u_short; 240 typedef __u_int u_int; 241 typedef __u_long u_long; 242 typedef __quad_t quad_t; 243 typedef __u_quad_t u_quad_t; 244 typedef __fsid_t fsid_t; 245 246 247 248 249 typedef __loff_t loff_t; 250 251 252 253 typedef __ino_t ino_t; 254 255 typedef __dev_t dev_t; 256 257 258 259 260 typedef __gid_t gid_t; 261 262 263 264 265 typedef __mode_t mode_t; 266 267 268 269 270 typedef __nlink_t nlink_t; 271 272 273 274 275 typedef __uid_t uid_t; 276 277 278 279 280 281 typedef __off_t off_t; 282 283 typedef __pid_t pid_t; 284 285 286 287 288 typedef __id_t id_t; 289 290 291 292 293 typedef __ssize_t ssize_t; 294 295 296 297 298 299 typedef __daddr_t daddr_t; 300 typedef __caddr_t caddr_t; 301 302 303 304 305 306 typedef __key_t key_t; 307 308 309 typedef __time_t time_t; 310 311 312 313 314 typedef __clockid_t clockid_t; 315 316 typedef __timer_t timer_t; 317 318 319 320 321 typedef unsigned long int ulong; 322 typedef unsigned short int ushort; 323 typedef unsigned int uint; 324 325 typedef int int8_t __attribute__ ((__mode__ (__QI__))); 326 typedef int int16_t __attribute__ ((__mode__ (__HI__))); 327 typedef int int32_t __attribute__ ((__mode__ (__SI__))); 328 typedef int int64_t __attribute__ ((__mode__ (__DI__))); 329 330 331 typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__))); 332 typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__))); 333 typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__))); 334 typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__))); 335 336 typedef int register_t __attribute__ ((__mode__ (__word__))); 337 338 typedef int __sig_atomic_t; 339 340 341 342 343 typedef struct 344 { 345 unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))]; 346 } __sigset_t; 347 348 349 350 351 typedef __sigset_t sigset_t; 352 353 354 355 356 357 struct timespec 358 { 359 __time_t tv_sec; 360 long int tv_nsec; 361 }; 362 363 struct timeval 364 { 365 __time_t tv_sec; 366 __suseconds_t tv_usec; 367 }; 368 369 370 371 typedef __suseconds_t suseconds_t; 372 373 374 375 376 377 typedef long int __fd_mask; 378 379 typedef struct 380 { 381 382 383 384 385 386 387 __fd_mask __fds_bits[1024 / (8 * sizeof (__fd_mask))]; 388 389 390 } fd_set; 391 392 393 394 395 396 397 typedef __fd_mask fd_mask; 398 399 400 401 extern int select (int __nfds, fd_set *__restrict __readfds, 402 fd_set *__restrict __writefds, 403 fd_set *__restrict __exceptfds, 404 struct timeval *__restrict __timeout); 405 406 __extension__ 407 extern __inline unsigned int gnu_dev_major (unsigned long long int __dev) 408 __attribute__ ((__nothrow__)); 409 __extension__ 410 extern __inline unsigned int gnu_dev_minor (unsigned long long int __dev) 411 __attribute__ ((__nothrow__)); 412 __extension__ 413 extern __inline unsigned long long int gnu_dev_makedev (unsigned int __major, 414 unsigned int __minor) 415 __attribute__ ((__nothrow__)); 416 417 418 __extension__ extern __inline unsigned int 419 __attribute__ ((__nothrow__)) gnu_dev_major (unsigned long long int __dev) 420 { 421 return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff); 422 } 423 424 __extension__ extern __inline unsigned int 425 __attribute__ ((__nothrow__)) gnu_dev_minor (unsigned long long int __dev) 426 { 427 return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff); 428 } 429 430 __extension__ extern __inline unsigned long long int 431 __attribute__ ((__nothrow__)) gnu_dev_makedev (unsigned int __major, unsigned int __minor) 432 { 433 return ((__minor & 0xff) | ((__major & 0xfff) << 8) 434 | (((unsigned long long int) (__minor & ~0xff)) << 12) 435 | (((unsigned long long int) (__major & ~0xfff)) << 32)); 436 } 437 438 typedef __blkcnt_t blkcnt_t; 439 440 441 442 typedef __fsblkcnt_t fsblkcnt_t; 443 444 445 446 typedef __fsfilcnt_t fsfilcnt_t; 447 448 struct __sched_param 449 { 450 int __sched_priority; 451 }; 452 453 454 455 struct _pthread_fastlock 456 { 457 long int __status; 458 int __spinlock; 459 460 }; 461 462 463 464 typedef struct _pthread_descr_struct *_pthread_descr; 465 466 467 468 469 470 typedef struct __pthread_attr_s 471 { 472 int __detachstate; 473 int __schedpolicy; 474 struct __sched_param __schedparam; 475 int __inheritsched; 476 int __scope; 477 size_t __guardsize; 478 int __stackaddr_set; 479 void *__stackaddr; 480 size_t __stacksize; 481 } pthread_attr_t; 482 483 484 485 486 487 __extension__ typedef long long __pthread_cond_align_t; 488 489 490 491 492 typedef struct 493 { 494 struct _pthread_fastlock __c_lock; 495 _pthread_descr __c_waiting; 496 char __padding[48 - sizeof (struct _pthread_fastlock) 497 - sizeof (_pthread_descr) - sizeof (__pthread_cond_align_t)]; 498 __pthread_cond_align_t __align; 499 } pthread_cond_t; 500 501 502 503 typedef struct 504 { 505 int __dummy; 506 } pthread_condattr_t; 507 508 509 typedef unsigned int pthread_key_t; 510 511 512 513 514 515 typedef struct 516 { 517 int __m_reserved; 518 int __m_count; 519 _pthread_descr __m_owner; 520 int __m_kind; 521 struct _pthread_fastlock __m_lock; 522 } pthread_mutex_t; 523 524 525 526 typedef struct 527 { 528 int __mutexkind; 529 } pthread_mutexattr_t; 530 531 532 533 typedef int pthread_once_t; 534 535 typedef unsigned long int pthread_t; 536 537 538 539 540 541 542 543 extern long int random (void) __attribute__ ((__nothrow__)); 544 545 546 extern void srandom (unsigned int __seed) __attribute__ ((__nothrow__)); 547 548 549 550 551 552 extern char *initstate (unsigned int __seed, char *__statebuf, 553 size_t __statelen) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); 554 555 556 557 extern char *setstate (char *__statebuf) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 558 559 560 561 562 563 564 565 struct random_data 566 { 567 int32_t *fptr; 568 int32_t *rptr; 569 int32_t *state; 570 int rand_type; 571 int rand_deg; 572 int rand_sep; 573 int32_t *end_ptr; 574 }; 575 576 extern int random_r (struct random_data *__restrict __buf, 577 int32_t *__restrict __result) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 578 579 extern int srandom_r (unsigned int __seed, struct random_data *__buf) 580 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); 581 582 extern int initstate_r (unsigned int __seed, char *__restrict __statebuf, 583 size_t __statelen, 584 struct random_data *__restrict __buf) 585 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 4))); 586 587 extern int setstate_r (char *__restrict __statebuf, 588 struct random_data *__restrict __buf) 589 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 590 591 592 593 594 595 596 extern int rand (void) __attribute__ ((__nothrow__)); 597 598 extern void srand (unsigned int __seed) __attribute__ ((__nothrow__)); 599 600 601 602 603 extern int rand_r (unsigned int *__seed) __attribute__ ((__nothrow__)); 604 605 606 607 608 609 610 611 extern double drand48 (void) __attribute__ ((__nothrow__)); 612 extern double erand48 (unsigned short int __xsubi[3]) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 613 614 615 extern long int lrand48 (void) __attribute__ ((__nothrow__)); 616 extern long int nrand48 (unsigned short int __xsubi[3]) 617 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 618 619 620 extern long int mrand48 (void) __attribute__ ((__nothrow__)); 621 extern long int jrand48 (unsigned short int __xsubi[3]) 622 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 623 624 625 extern void srand48 (long int __seedval) __attribute__ ((__nothrow__)); 626 extern unsigned short int *seed48 (unsigned short int __seed16v[3]) 627 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 628 extern void lcong48 (unsigned short int __param[7]) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 629 630 631 632 633 634 struct drand48_data 635 { 636 unsigned short int __x[3]; 637 unsigned short int __old_x[3]; 638 unsigned short int __c; 639 unsigned short int __init; 640 unsigned long long int __a; 641 }; 642 643 644 extern int drand48_r (struct drand48_data *__restrict __buffer, 645 double *__restrict __result) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 646 extern int erand48_r (unsigned short int __xsubi[3], 647 struct drand48_data *__restrict __buffer, 648 double *__restrict __result) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 649 650 651 extern int lrand48_r (struct drand48_data *__restrict __buffer, 652 long int *__restrict __result) 653 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 654 extern int nrand48_r (unsigned short int __xsubi[3], 655 struct drand48_data *__restrict __buffer, 656 long int *__restrict __result) 657 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 658 659 660 extern int mrand48_r (struct drand48_data *__restrict __buffer, 661 long int *__restrict __result) 662 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 663 extern int jrand48_r (unsigned short int __xsubi[3], 664 struct drand48_data *__restrict __buffer, 665 long int *__restrict __result) 666 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 667 668 669 extern int srand48_r (long int __seedval, struct drand48_data *__buffer) 670 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); 671 672 extern int seed48_r (unsigned short int __seed16v[3], 673 struct drand48_data *__buffer) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 674 675 extern int lcong48_r (unsigned short int __param[7], 676 struct drand48_data *__buffer) 677 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 678 679 680 681 682 683 684 685 686 687 extern void *malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 688 689 extern void *calloc (size_t __nmemb, size_t __size) 690 __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 691 692 693 694 695 696 697 698 extern void *realloc (void *__ptr, size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 699 700 extern void free (void *__ptr) __attribute__ ((__nothrow__)); 701 702 703 704 705 extern void cfree (void *__ptr) __attribute__ ((__nothrow__)); 706 707 708 709 710 extern void *alloca (size_t __size) __attribute__ ((__nothrow__)); 711 712 713 714 715 716 717 extern void *valloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 718 719 extern void abort (void) __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); 720 721 722 723 extern int atexit (void (*__func) (void)) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 724 725 726 727 728 729 extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg) 730 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 731 732 733 734 735 736 737 extern void exit (int __status) __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); 738 739 extern char *getenv (__const char *__name) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 740 741 742 743 744 extern char *__secure_getenv (__const char *__name) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 745 746 747 748 749 750 extern int putenv (char *__string) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 751 752 753 754 755 756 extern int setenv (__const char *__name, __const char *__value, int __replace) 757 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); 758 759 760 extern int unsetenv (__const char *__name) __attribute__ ((__nothrow__)); 761 762 763 764 765 766 767 extern int clearenv (void) __attribute__ ((__nothrow__)); 768 769 extern char *mktemp (char *__template) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 770 771 extern int mkstemp (char *__template) __attribute__ ((__nonnull__ (1))); 772 773 extern char *mkdtemp (char *__template) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 774 775 776 777 778 779 780 781 782 extern int system (__const char *__command); 783 784 extern char *realpath (__const char *__restrict __name, 785 char *__restrict __resolved) __attribute__ ((__nothrow__)); 786 787 788 789 790 791 792 typedef int (*__compar_fn_t) (__const void *, __const void *); 793 794 795 796 797 798 799 800 801 802 extern void *bsearch (__const void *__key, __const void *__base, 803 size_t __nmemb, size_t __size, __compar_fn_t __compar) 804 __attribute__ ((__nonnull__ (1, 2, 5))); 805 806 807 808 extern void qsort (void *__base, size_t __nmemb, size_t __size, 809 __compar_fn_t __compar) __attribute__ ((__nonnull__ (1, 4))); 810 811 812 813 extern int abs (int __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__)); 814 extern long int labs (long int __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__)); 815 816 817 818 819 820 821 822 823 824 825 826 827 extern div_t div (int __numer, int __denom) 828 __attribute__ ((__nothrow__)) __attribute__ ((__const__)); 829 extern ldiv_t ldiv (long int __numer, long int __denom) 830 __attribute__ ((__nothrow__)) __attribute__ ((__const__)); 831 832 extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt, 833 int *__restrict __sign) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4))); 834 835 836 837 838 extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt, 839 int *__restrict __sign) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4))); 840 841 842 843 844 extern char *gcvt (double __value, int __ndigit, char *__buf) 845 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3))); 846 847 848 849 850 extern char *qecvt (long double __value, int __ndigit, 851 int *__restrict __decpt, int *__restrict __sign) 852 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4))); 853 extern char *qfcvt (long double __value, int __ndigit, 854 int *__restrict __decpt, int *__restrict __sign) 855 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4))); 856 extern char *qgcvt (long double __value, int __ndigit, char *__buf) 857 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3))); 858 859 860 861 862 extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt, 863 int *__restrict __sign, char *__restrict __buf, 864 size_t __len) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4, 5))); 865 extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt, 866 int *__restrict __sign, char *__restrict __buf, 867 size_t __len) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4, 5))); 868 869 extern int qecvt_r (long double __value, int __ndigit, 870 int *__restrict __decpt, int *__restrict __sign, 871 char *__restrict __buf, size_t __len) 872 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4, 5))); 873 extern int qfcvt_r (long double __value, int __ndigit, 874 int *__restrict __decpt, int *__restrict __sign, 875 char *__restrict __buf, size_t __len) 876 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4, 5))); 877 878 879 880 881 882 883 884 extern int mblen (__const char *__s, size_t __n) __attribute__ ((__nothrow__)); 885 886 887 extern int mbtowc (wchar_t *__restrict __pwc, 888 __const char *__restrict __s, size_t __n) __attribute__ ((__nothrow__)); 889 890 891 extern int wctomb (char *__s, wchar_t __wchar) __attribute__ ((__nothrow__)); 892 893 894 895 extern size_t mbstowcs (wchar_t *__restrict __pwcs, 896 __const char *__restrict __s, size_t __n) __attribute__ ((__nothrow__)); 897 898 extern size_t wcstombs (char *__restrict __s, 899 __const wchar_t *__restrict __pwcs, size_t __n) 900 __attribute__ ((__nothrow__)); 901 902 903 904 905 906 907 908 909 extern int rpmatch (__const char *__response) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 910 extern int getloadavg (double __loadavg[], int __nelem) 911 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); 912 913 914 915 916 917 918 919 typedef 920 struct { 921 char *next_in; 922 unsigned int avail_in; 923 unsigned int total_in_lo32; 924 unsigned int total_in_hi32; 925 926 char *next_out; 927 unsigned int avail_out; 928 unsigned int total_out_lo32; 929 unsigned int total_out_hi32; 930 931 void *state; 932 933 void *(*bzalloc)(void *,int,int); 934 void (*bzfree)(void *,void *); 935 void *opaque; 936 } 937 bz_stream; 938 939 extern int BZ2_bzCompressInit ( 940 bz_stream* strm, 941 int blockSize100k, 942 int verbosity, 943 int workFactor 944 ); 945 946 extern int BZ2_bzCompress ( 947 bz_stream* strm, 948 int action 949 ); 950 951 extern int BZ2_bzCompressEnd ( 952 bz_stream* strm 953 ); 954 955 extern int BZ2_bzDecompressInit ( 956 bz_stream *strm, 957 int verbosity, 958 int small 959 ); 960 961 extern int BZ2_bzDecompress ( 962 bz_stream* strm 963 ); 964 965 extern int BZ2_bzDecompressEnd ( 966 bz_stream *strm 967 ); 968 969 extern int BZ2_bzBuffToBuffCompress ( 970 char* dest, 971 unsigned int* destLen, 972 char* source, 973 unsigned int sourceLen, 974 int blockSize100k, 975 int verbosity, 976 int workFactor 977 ); 978 979 extern int BZ2_bzBuffToBuffDecompress ( 980 char* dest, 981 unsigned int* destLen, 982 char* source, 983 unsigned int sourceLen, 984 int small, 985 int verbosity 986 ); 987 988 extern const char * BZ2_bzlibVersion ( 989 void 990 ); 991 992 typedef char Char; 993 typedef unsigned char Bool; 994 typedef unsigned char UChar; 995 typedef int Int32; 996 typedef unsigned int UInt32; 997 typedef short Int16; 998 typedef unsigned short UInt16; 999 1000 extern void bz_internal_error ( int errcode ); 1001 1002 extern Int32 BZ2_rNums[512]; 1003 1004 extern UInt32 BZ2_crc32Table[256]; 1005 1006 typedef 1007 struct { 1008 1009 bz_stream* strm; 1010 1011 1012 1013 Int32 mode; 1014 Int32 state; 1015 1016 1017 UInt32 avail_in_expect; 1018 1019 1020 UInt32* arr1; 1021 UInt32* arr2; 1022 UInt32* ftab; 1023 Int32 origPtr; 1024 1025 1026 UInt32* ptr; 1027 UChar* block; 1028 UInt16* mtfv; 1029 UChar* zbits; 1030 1031 1032 Int32 workFactor; 1033 1034 1035 UInt32 state_in_ch; 1036 Int32 state_in_len; 1037 Int32 rNToGo; Int32 rTPos; 1038 1039 1040 Int32 nblock; 1041 Int32 nblockMAX; 1042 Int32 numZ; 1043 Int32 state_out_pos; 1044 1045 1046 Int32 nInUse; 1047 Bool inUse[256]; 1048 UChar unseqToSeq[256]; 1049 1050 1051 UInt32 bsBuff; 1052 Int32 bsLive; 1053 1054 1055 UInt32 blockCRC; 1056 UInt32 combinedCRC; 1057 1058 1059 Int32 verbosity; 1060 Int32 blockNo; 1061 Int32 blockSize100k; 1062 1063 1064 Int32 nMTF; 1065 Int32 mtfFreq [258]; 1066 UChar selector [(2 + (900000 / 50))]; 1067 UChar selectorMtf[(2 + (900000 / 50))]; 1068 1069 UChar len [6][258]; 1070 Int32 code [6][258]; 1071 Int32 rfreq [6][258]; 1072 1073 UInt32 len_pack[258][4]; 1074 1075 } 1076 EState; 1077 1078 1079 1080 1081 1082 extern void 1083 BZ2_blockSort ( EState* ); 1084 1085 extern void 1086 BZ2_compressBlock ( EState*, Bool ); 1087 1088 extern void 1089 BZ2_bsInitWrite ( EState* ); 1090 1091 extern void 1092 BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); 1093 1094 extern void 1095 BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); 1096 1097 typedef 1098 struct { 1099 1100 bz_stream* strm; 1101 1102 1103 Int32 state; 1104 1105 1106 UChar state_out_ch; 1107 Int32 state_out_len; 1108 Bool blockRandomised; 1109 Int32 rNToGo; Int32 rTPos; 1110 1111 1112 UInt32 bsBuff; 1113 Int32 bsLive; 1114 1115 1116 Int32 blockSize100k; 1117 Bool smallDecompress; 1118 Int32 currBlockNo; 1119 Int32 verbosity; 1120 1121 1122 Int32 origPtr; 1123 UInt32 tPos; 1124 Int32 k0; 1125 Int32 unzftab[256]; 1126 Int32 nblock_used; 1127 Int32 cftab[257]; 1128 Int32 cftabCopy[257]; 1129 1130 1131 UInt32 *tt; 1132 1133 1134 UInt16 *ll16; 1135 UChar *ll4; 1136 1137 1138 UInt32 storedBlockCRC; 1139 UInt32 storedCombinedCRC; 1140 UInt32 calculatedBlockCRC; 1141 UInt32 calculatedCombinedCRC; 1142 1143 1144 Int32 nInUse; 1145 Bool inUse[256]; 1146 Bool inUse16[16]; 1147 UChar seqToUnseq[256]; 1148 1149 1150 UChar mtfa [4096]; 1151 Int32 mtfbase[256 / 16]; 1152 UChar selector [(2 + (900000 / 50))]; 1153 UChar selectorMtf[(2 + (900000 / 50))]; 1154 UChar len [6][258]; 1155 1156 Int32 limit [6][258]; 1157 Int32 base [6][258]; 1158 Int32 perm [6][258]; 1159 Int32 minLens[6]; 1160 1161 1162 Int32 save_i; 1163 Int32 save_j; 1164 Int32 save_t; 1165 Int32 save_alphaSize; 1166 Int32 save_nGroups; 1167 Int32 save_nSelectors; 1168 Int32 save_EOB; 1169 Int32 save_groupNo; 1170 Int32 save_groupPos; 1171 Int32 save_nextSym; 1172 Int32 save_nblockMAX; 1173 Int32 save_nblock; 1174 Int32 save_es; 1175 Int32 save_N; 1176 Int32 save_curr; 1177 Int32 save_zt; 1178 Int32 save_zn; 1179 Int32 save_zvec; 1180 Int32 save_zj; 1181 Int32 save_gSel; 1182 Int32 save_gMinlen; 1183 Int32* save_gLimit; 1184 Int32* save_gBase; 1185 Int32* save_gPerm; 1186 1187 } 1188 DState; 1189 1190 extern Int32 1191 BZ2_indexIntoF ( Int32, Int32* ); 1192 1193 extern Int32 1194 BZ2_decompress ( DState* ); 1195 1196 extern void 1197 BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, 1198 Int32, Int32, Int32 ); 1199 1200 typedef unsigned long HWord; 1201 typedef char HChar; 1202 typedef signed int Int; 1203 typedef unsigned int UInt; 1204 1205 typedef signed long long int Long; 1206 typedef unsigned long long int ULong; 1207 1208 1209 1210 1211 1212 static HWord (*serviceFn)(HWord,HWord) = 0; 1213 1214 char* my_strcat ( char* dest, const char* src ) 1215 { 1216 char* dest_orig = dest; 1217 while (*dest) dest++; 1218 while (*src) *dest++ = *src++; 1219 *dest = 0; 1220 return dest_orig; 1221 } 1222 1223 1224 1225 1226 static void vex_log_bytes ( char* p, int n ) 1227 { 1228 int i; 1229 for (i = 0; i < n; i++) 1230 (*serviceFn)( 1, (int)p[i] ); 1231 } 1232 1233 1234 1235 1236 static HChar vex_toupper ( HChar c ) 1237 { 1238 if (c >= 'a' && c <= 'z') 1239 return c + ('A' - 'a'); 1240 else 1241 return c; 1242 } 1243 1244 static Int vex_strlen ( const HChar* str ) 1245 { 1246 Int i = 0; 1247 while (str[i] != 0) i++; 1248 return i; 1249 } 1250 1251 Bool vex_streq ( const HChar* s1, const HChar* s2 ) 1252 { 1253 while (((Bool)1)) { 1254 if (*s1 == 0 && *s2 == 0) 1255 return ((Bool)1); 1256 if (*s1 != *s2) 1257 return ((Bool)0); 1258 s1++; 1259 s2++; 1260 } 1261 } 1262 1263 static UInt 1264 myvprintf_str ( void(*send)(HChar), Int flags, Int width, HChar* str, 1265 Bool capitalise ) 1266 { 1267 1268 UInt ret = 0; 1269 Int i, extra; 1270 Int len = vex_strlen(str); 1271 1272 if (width == 0) { 1273 ret += len; 1274 for (i = 0; i < len; i++) 1275 send((capitalise ? vex_toupper(str[i]) : (str[i]))); 1276 return ret; 1277 } 1278 1279 if (len > width) { 1280 ret += width; 1281 for (i = 0; i < width; i++) 1282 send((capitalise ? vex_toupper(str[i]) : (str[i]))); 1283 return ret; 1284 } 1285 1286 extra = width - len; 1287 if (flags & 4) { 1288 ret += extra; 1289 for (i = 0; i < extra; i++) 1290 send(' '); 1291 } 1292 ret += len; 1293 for (i = 0; i < len; i++) 1294 send((capitalise ? vex_toupper(str[i]) : (str[i]))); 1295 if (!(flags & 4)) { 1296 ret += extra; 1297 for (i = 0; i < extra; i++) 1298 send(' '); 1299 } 1300 1301 1302 1303 return ret; 1304 } 1305 1306 1307 1308 1309 1310 1311 1312 static UInt 1313 myvprintf_int64 ( void(*send)(HChar), Int flags, Int base, Int width, ULong pL) 1314 { 1315 HChar buf[40]; 1316 Int ind = 0; 1317 Int i, nc = 0; 1318 Bool neg = ((Bool)0); 1319 HChar *digits = "0123456789ABCDEF"; 1320 UInt ret = 0; 1321 UInt p = (UInt)pL; 1322 1323 if (base < 2 || base > 16) 1324 return ret; 1325 1326 if ((flags & 1) && (Int)p < 0) { 1327 p = - (Int)p; 1328 neg = ((Bool)1); 1329 } 1330 1331 if (p == 0) 1332 buf[ind++] = '0'; 1333 else { 1334 while (p > 0) { 1335 if ((flags & 16) && 10 == base && 1336 0 == (ind-nc) % 3 && 0 != ind) 1337 { 1338 buf[ind++] = ','; 1339 nc++; 1340 } 1341 buf[ind++] = digits[p % base]; 1342 p /= base; 1343 } 1344 } 1345 1346 if (neg) 1347 buf[ind++] = '-'; 1348 1349 if (width > 0 && !(flags & 4)) { 1350 for(; ind < width; ind++) { 1351 1352 buf[ind] = ((flags & 2) ? '0': ' '); 1353 } 1354 } 1355 1356 1357 ret += ind; 1358 for (i = ind -1; i >= 0; i--) { 1359 send(buf[i]); 1360 } 1361 if (width > 0 && (flags & 4)) { 1362 for(; ind < width; ind++) { 1363 ret++; 1364 send(' '); 1365 } 1366 } 1367 return ret; 1368 } 1369 1370 1371 1372 static 1373 UInt vprintf_wrk ( ) 1374 { 1375 return 0; 1376 } 1377 1378 1379 1380 1381 1382 1383 static HChar myprintf_buf[1000]; 1384 static Int n_myprintf_buf; 1385 1386 static void add_to_myprintf_buf ( HChar c ) 1387 { 1388 if (c == '\n' || n_myprintf_buf >= 1000-10 ) { 1389 vex_log_bytes( myprintf_buf, vex_strlen(myprintf_buf) ); 1390 n_myprintf_buf = 0; 1391 myprintf_buf[n_myprintf_buf] = 0; 1392 } 1393 myprintf_buf[n_myprintf_buf++] = c; 1394 myprintf_buf[n_myprintf_buf] = 0; 1395 } 1396 1397 static UInt vex_printf ( const char *format, ... ) 1398 { 1399 return 0; 1400 } 1401 1402 static 1403 void makeMaps_d ( DState* s ) 1404 { 1405 Int32 i; 1406 s->nInUse = 0; 1407 for (i = 0; i < 256; i++) 1408 if (s->inUse[i]) { 1409 s->seqToUnseq[s->nInUse] = i; 1410 s->nInUse++; 1411 } 1412 } 1413 1414 __inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) 1415 { 1416 Int32 nb, na, mid; 1417 nb = 0; 1418 na = 256; 1419 do { 1420 mid = (nb + na) >> 1; 1421 if (indx >= cftab[mid]) nb = mid; else na = mid; 1422 } 1423 while (na - nb != 1); 1424 return nb; 1425 } 1426 1427 1428 Int32 BZ2_decompress ( DState* s ) 1429 { 1430 UChar uc; 1431 Int32 retVal; 1432 Int32 minLen, maxLen; 1433 bz_stream* strm = s->strm; 1434 1435 1436 Int32 i; 1437 Int32 j; 1438 Int32 t; 1439 Int32 alphaSize; 1440 Int32 nGroups; 1441 Int32 nSelectors; 1442 Int32 EOB; 1443 Int32 groupNo; 1444 Int32 groupPos; 1445 Int32 nextSym; 1446 Int32 nblockMAX; 1447 Int32 nblock; 1448 Int32 es; 1449 Int32 N; 1450 Int32 curr; 1451 Int32 zt; 1452 Int32 zn; 1453 Int32 zvec; 1454 Int32 zj; 1455 Int32 gSel; 1456 Int32 gMinlen; 1457 Int32* gLimit; 1458 Int32* gBase; 1459 Int32* gPerm; 1460 1461 if (s->state == 10) { 1462 1463 s->save_i = 0; 1464 s->save_j = 0; 1465 s->save_t = 0; 1466 s->save_alphaSize = 0; 1467 s->save_nGroups = 0; 1468 s->save_nSelectors = 0; 1469 s->save_EOB = 0; 1470 s->save_groupNo = 0; 1471 s->save_groupPos = 0; 1472 s->save_nextSym = 0; 1473 s->save_nblockMAX = 0; 1474 s->save_nblock = 0; 1475 s->save_es = 0; 1476 s->save_N = 0; 1477 s->save_curr = 0; 1478 s->save_zt = 0; 1479 s->save_zn = 0; 1480 s->save_zvec = 0; 1481 s->save_zj = 0; 1482 s->save_gSel = 0; 1483 s->save_gMinlen = 0; 1484 s->save_gLimit = ((void *)0); 1485 s->save_gBase = ((void *)0); 1486 s->save_gPerm = ((void *)0); 1487 } 1488 1489 1490 i = s->save_i; 1491 j = s->save_j; 1492 t = s->save_t; 1493 alphaSize = s->save_alphaSize; 1494 nGroups = s->save_nGroups; 1495 nSelectors = s->save_nSelectors; 1496 EOB = s->save_EOB; 1497 groupNo = s->save_groupNo; 1498 groupPos = s->save_groupPos; 1499 nextSym = s->save_nextSym; 1500 nblockMAX = s->save_nblockMAX; 1501 nblock = s->save_nblock; 1502 es = s->save_es; 1503 N = s->save_N; 1504 curr = s->save_curr; 1505 zt = s->save_zt; 1506 zn = s->save_zn; 1507 zvec = s->save_zvec; 1508 zj = s->save_zj; 1509 gSel = s->save_gSel; 1510 gMinlen = s->save_gMinlen; 1511 gLimit = s->save_gLimit; 1512 gBase = s->save_gBase; 1513 gPerm = s->save_gPerm; 1514 1515 retVal = 0; 1516 1517 switch (s->state) { 1518 1519 case 10: s->state = 10; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1520 if (uc != 0x42) { retVal = (-5); goto save_state_and_return; };; 1521 1522 case 11: s->state = 11; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1523 if (uc != 0x5a) { retVal = (-5); goto save_state_and_return; };; 1524 1525 case 12: s->state = 12; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; } 1526 if (uc != 0x68) { retVal = (-5); goto save_state_and_return; };; 1527 1528 case 13: s->state = 13; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; s->blockSize100k = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; } 1529 if (s->blockSize100k < (0x30 + 1) || 1530 s->blockSize100k > (0x30 + 9)) { retVal = (-5); goto save_state_and_return; };; 1531 s->blockSize100k -= 0x30; 1532 1533 if (s->smallDecompress) { 1534 s->ll16 = (strm->bzalloc)(strm->opaque,(s->blockSize100k * 100000 * sizeof(UInt16)),1); 1535 s->ll4 = (strm->bzalloc)(strm->opaque,(((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)),1); 1536 1537 1538 if (s->ll16 == ((void *)0) || s->ll4 == ((void *)0)) { retVal = (-3); goto save_state_and_return; };; 1539 } else { 1540 s->tt = (strm->bzalloc)(strm->opaque,(s->blockSize100k * 100000 * sizeof(Int32)),1); 1541 if (s->tt == ((void *)0)) { retVal = (-3); goto save_state_and_return; };; 1542 } 1543 1544 case 14: s->state = 14; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1545 1546 if (uc == 0x17) goto endhdr_2; 1547 if (uc != 0x31) { retVal = (-4); goto save_state_and_return; };; 1548 case 15: s->state = 15; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1549 if (uc != 0x41) { retVal = (-4); goto save_state_and_return; };; 1550 case 16: s->state = 16; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1551 if (uc != 0x59) { retVal = (-4); goto save_state_and_return; };; 1552 case 17: s->state = 17; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1553 if (uc != 0x26) { retVal = (-4); goto save_state_and_return; };; 1554 case 18: s->state = 18; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1555 if (uc != 0x53) { retVal = (-4); goto save_state_and_return; };; 1556 case 19: s->state = 19; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1557 if (uc != 0x59) { retVal = (-4); goto save_state_and_return; };; 1558 1559 s->currBlockNo++; 1560 if (s->verbosity >= 2) 1561 vex_printf("\n [%d: huff+mtf ",s->currBlockNo); 1562 1563 s->storedBlockCRC = 0; 1564 case 20: s->state = 20; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1565 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 1566 case 21: s->state = 21; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1567 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 1568 case 22: s->state = 22; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1569 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 1570 case 23: s->state = 23; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1571 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 1572 1573 case 24: s->state = 24; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; s->blockRandomised = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1574 1575 s->origPtr = 0; 1576 case 25: s->state = 25; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1577 s->origPtr = (s->origPtr << 8) | ((Int32)uc); 1578 case 26: s->state = 26; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1579 s->origPtr = (s->origPtr << 8) | ((Int32)uc); 1580 case 27: s->state = 27; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1581 s->origPtr = (s->origPtr << 8) | ((Int32)uc); 1582 1583 if (s->origPtr < 0) 1584 { retVal = (-4); goto save_state_and_return; };; 1585 if (s->origPtr > 10 + 100000*s->blockSize100k) 1586 { retVal = (-4); goto save_state_and_return; };; 1587 1588 1589 for (i = 0; i < 16; i++) { 1590 case 28: s->state = 28; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1591 if (uc == 1) 1592 s->inUse16[i] = ((Bool)1); else 1593 s->inUse16[i] = ((Bool)0); 1594 } 1595 1596 for (i = 0; i < 256; i++) s->inUse[i] = ((Bool)0); 1597 1598 for (i = 0; i < 16; i++) 1599 if (s->inUse16[i]) 1600 for (j = 0; j < 16; j++) { 1601 case 29: s->state = 29; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1602 if (uc == 1) s->inUse[i * 16 + j] = ((Bool)1); 1603 } 1604 makeMaps_d ( s ); 1605 if (s->nInUse == 0) { retVal = (-4); goto save_state_and_return; };; 1606 alphaSize = s->nInUse+2; 1607 1608 1609 case 30: s->state = 30; while (((Bool)1)) { if (s->bsLive >= 3) { UInt32 v; v = (s->bsBuff >> (s->bsLive-3)) & ((1 << 3)-1); s->bsLive -= 3; nGroups = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1610 if (nGroups < 2 || nGroups > 6) { retVal = (-4); goto save_state_and_return; };; 1611 case 31: s->state = 31; while (((Bool)1)) { if (s->bsLive >= 15) { UInt32 v; v = (s->bsBuff >> (s->bsLive-15)) & ((1 << 15)-1); s->bsLive -= 15; nSelectors = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1612 if (nSelectors < 1) { retVal = (-4); goto save_state_and_return; };; 1613 for (i = 0; i < nSelectors; i++) { 1614 j = 0; 1615 while (((Bool)1)) { 1616 case 32: s->state = 32; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1617 if (uc == 0) break; 1618 j++; 1619 if (j >= nGroups) { retVal = (-4); goto save_state_and_return; };; 1620 } 1621 s->selectorMtf[i] = j; 1622 } 1623 1624 1625 { 1626 UChar pos[6], tmp, v; 1627 for (v = 0; v < nGroups; v++) pos[v] = v; 1628 1629 for (i = 0; i < nSelectors; i++) { 1630 v = s->selectorMtf[i]; 1631 tmp = pos[v]; 1632 while (v > 0) { pos[v] = pos[v-1]; v--; } 1633 pos[0] = tmp; 1634 s->selector[i] = tmp; 1635 } 1636 } 1637 1638 1639 for (t = 0; t < nGroups; t++) { 1640 case 33: s->state = 33; while (((Bool)1)) { if (s->bsLive >= 5) { UInt32 v; v = (s->bsBuff >> (s->bsLive-5)) & ((1 << 5)-1); s->bsLive -= 5; curr = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1641 for (i = 0; i < alphaSize; i++) { 1642 while (((Bool)1)) { 1643 if (curr < 1 || curr > 20) { retVal = (-4); goto save_state_and_return; };; 1644 case 34: s->state = 34; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1645 if (uc == 0) break; 1646 case 35: s->state = 35; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1647 if (uc == 0) curr++; else curr--; 1648 } 1649 s->len[t][i] = curr; 1650 } 1651 } 1652 1653 1654 for (t = 0; t < nGroups; t++) { 1655 minLen = 32; 1656 maxLen = 0; 1657 for (i = 0; i < alphaSize; i++) { 1658 if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; 1659 if (s->len[t][i] < minLen) minLen = s->len[t][i]; 1660 } 1661 BZ2_hbCreateDecodeTables ( 1662 &(s->limit[t][0]), 1663 &(s->base[t][0]), 1664 &(s->perm[t][0]), 1665 &(s->len[t][0]), 1666 minLen, maxLen, alphaSize 1667 ); 1668 s->minLens[t] = minLen; 1669 } 1670 1671 1672 1673 EOB = s->nInUse+1; 1674 nblockMAX = 100000 * s->blockSize100k; 1675 groupNo = -1; 1676 groupPos = 0; 1677 1678 for (i = 0; i <= 255; i++) s->unzftab[i] = 0; 1679 1680 1681 { 1682 Int32 ii, jj, kk; 1683 kk = 4096 -1; 1684 for (ii = 256 / 16 - 1; ii >= 0; ii--) { 1685 for (jj = 16 -1; jj >= 0; jj--) { 1686 s->mtfa[kk] = (UChar)(ii * 16 + jj); 1687 kk--; 1688 } 1689 s->mtfbase[ii] = kk + 1; 1690 } 1691 } 1692 1693 1694 nblock = 0; 1695 { if (groupPos == 0) { groupNo++; if (groupNo >= nSelectors) { retVal = (-4); goto save_state_and_return; };; groupPos = 50; gSel = s->selector[groupNo]; gMinlen = s->minLens[gSel]; gLimit = &(s->limit[gSel][0]); gPerm = &(s->perm[gSel][0]); gBase = &(s->base[gSel][0]); } groupPos--; zn = gMinlen; case 36: s->state = 36; while (((Bool)1)) { if (s->bsLive >= zn) { UInt32 v; v = (s->bsBuff >> (s->bsLive-zn)) & ((1 << zn)-1); s->bsLive -= zn; zvec = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; while (1) { if (zn > 20 ) { retVal = (-4); goto save_state_and_return; };; if (zvec <= gLimit[zn]) break; zn++; case 37: s->state = 37; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; zj = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; zvec = (zvec << 1) | zj; }; if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= 258) { retVal = (-4); goto save_state_and_return; };; nextSym = gPerm[zvec - gBase[zn]]; }; 1696 1697 while (((Bool)1)) { 1698 1699 if (nextSym == EOB) break; 1700 1701 if (nextSym == 0 || nextSym == 1) { 1702 1703 es = -1; 1704 N = 1; 1705 do { 1706 if (nextSym == 0) es = es + (0+1) * N; else 1707 if (nextSym == 1) es = es + (1+1) * N; 1708 N = N * 2; 1709 { if (groupPos == 0) { groupNo++; if (groupNo >= nSelectors) { retVal = (-4); goto save_state_and_return; };; groupPos = 50; gSel = s->selector[groupNo]; gMinlen = s->minLens[gSel]; gLimit = &(s->limit[gSel][0]); gPerm = &(s->perm[gSel][0]); gBase = &(s->base[gSel][0]); } groupPos--; zn = gMinlen; case 38: s->state = 38; while (((Bool)1)) { if (s->bsLive >= zn) { UInt32 v; v = (s->bsBuff >> (s->bsLive-zn)) & ((1 << zn)-1); s->bsLive -= zn; zvec = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; while (1) { if (zn > 20 ) { retVal = (-4); goto save_state_and_return; };; if (zvec <= gLimit[zn]) break; zn++; case 39: s->state = 39; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; zj = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; zvec = (zvec << 1) | zj; }; if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= 258) { retVal = (-4); goto save_state_and_return; };; nextSym = gPerm[zvec - gBase[zn]]; }; 1710 } 1711 while (nextSym == 0 || nextSym == 1); 1712 1713 es++; 1714 uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; 1715 s->unzftab[uc] += es; 1716 1717 if (s->smallDecompress) 1718 while (es > 0) { 1719 if (nblock >= nblockMAX) { retVal = (-4); goto save_state_and_return; };; 1720 s->ll16[nblock] = (UInt16)uc; 1721 nblock++; 1722 es--; 1723 } 1724 else 1725 while (es > 0) { 1726 if (nblock >= nblockMAX) { retVal = (-4); goto save_state_and_return; };; 1727 s->tt[nblock] = (UInt32)uc; 1728 nblock++; 1729 es--; 1730 }; 1731 1732 continue; 1733 1734 } else { 1735 1736 if (nblock >= nblockMAX) { retVal = (-4); goto save_state_and_return; };; 1737 1738 1739 { 1740 Int32 ii, jj, kk, pp, lno, off; 1741 UInt32 nn; 1742 nn = (UInt32)(nextSym - 1); 1743 1744 if (nn < 16) { 1745 1746 pp = s->mtfbase[0]; 1747 uc = s->mtfa[pp+nn]; 1748 while (nn > 3) { 1749 Int32 z = pp+nn; 1750 s->mtfa[(z) ] = s->mtfa[(z)-1]; 1751 s->mtfa[(z)-1] = s->mtfa[(z)-2]; 1752 s->mtfa[(z)-2] = s->mtfa[(z)-3]; 1753 s->mtfa[(z)-3] = s->mtfa[(z)-4]; 1754 nn -= 4; 1755 } 1756 while (nn > 0) { 1757 s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 1758 }; 1759 s->mtfa[pp] = uc; 1760 } else { 1761 1762 lno = nn / 16; 1763 off = nn % 16; 1764 pp = s->mtfbase[lno] + off; 1765 uc = s->mtfa[pp]; 1766 while (pp > s->mtfbase[lno]) { 1767 s->mtfa[pp] = s->mtfa[pp-1]; pp--; 1768 }; 1769 s->mtfbase[lno]++; 1770 while (lno > 0) { 1771 s->mtfbase[lno]--; 1772 s->mtfa[s->mtfbase[lno]] 1773 = s->mtfa[s->mtfbase[lno-1] + 16 - 1]; 1774 lno--; 1775 } 1776 s->mtfbase[0]--; 1777 s->mtfa[s->mtfbase[0]] = uc; 1778 if (s->mtfbase[0] == 0) { 1779 kk = 4096 -1; 1780 for (ii = 256 / 16 -1; ii >= 0; ii--) { 1781 for (jj = 16 -1; jj >= 0; jj--) { 1782 s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; 1783 kk--; 1784 } 1785 s->mtfbase[ii] = kk + 1; 1786 } 1787 } 1788 } 1789 } 1790 1791 1792 s->unzftab[s->seqToUnseq[uc]]++; 1793 if (s->smallDecompress) 1794 s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else 1795 s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); 1796 nblock++; 1797 1798 { if (groupPos == 0) { groupNo++; if (groupNo >= nSelectors) { retVal = (-4); goto save_state_and_return; };; groupPos = 50; gSel = s->selector[groupNo]; gMinlen = s->minLens[gSel]; gLimit = &(s->limit[gSel][0]); gPerm = &(s->perm[gSel][0]); gBase = &(s->base[gSel][0]); } groupPos--; zn = gMinlen; case 40: s->state = 40; while (((Bool)1)) { if (s->bsLive >= zn) { UInt32 v; v = (s->bsBuff >> (s->bsLive-zn)) & ((1 << zn)-1); s->bsLive -= zn; zvec = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; while (1) { if (zn > 20 ) { retVal = (-4); goto save_state_and_return; };; if (zvec <= gLimit[zn]) break; zn++; case 41: s->state = 41; while (((Bool)1)) { if (s->bsLive >= 1) { UInt32 v; v = (s->bsBuff >> (s->bsLive-1)) & ((1 << 1)-1); s->bsLive -= 1; zj = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; zvec = (zvec << 1) | zj; }; if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= 258) { retVal = (-4); goto save_state_and_return; };; nextSym = gPerm[zvec - gBase[zn]]; }; 1799 continue; 1800 } 1801 } 1802 1803 1804 1805 1806 if (s->origPtr < 0 || s->origPtr >= nblock) 1807 { retVal = (-4); goto save_state_and_return; };; 1808 1809 1810 s->cftab[0] = 0; 1811 for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; 1812 for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; 1813 for (i = 0; i <= 256; i++) { 1814 if (s->cftab[i] < 0 || s->cftab[i] > nblock) { 1815 1816 { retVal = (-4); goto save_state_and_return; };; 1817 } 1818 } 1819 1820 s->state_out_len = 0; 1821 s->state_out_ch = 0; 1822 { s->calculatedBlockCRC = 0xffffffffL; }; 1823 s->state = 2; 1824 if (s->verbosity >= 2) vex_printf("rt+rld"); 1825 1826 if (s->smallDecompress) { 1827 1828 1829 for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; 1830 1831 1832 for (i = 0; i < nblock; i++) { 1833 uc = (UChar)(s->ll16[i]); 1834 { s->ll16[i] = (UInt16)(s->cftabCopy[uc] & 0x0000ffff); { if (((i) & 0x1) == 0) s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (s->cftabCopy[uc] >> 16); else s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((s->cftabCopy[uc] >> 16) << 4); }; }; 1835 s->cftabCopy[uc]++; 1836 } 1837 1838 1839 i = s->origPtr; 1840 j = (((UInt32)s->ll16[i]) | (((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) << 16)); 1841 do { 1842 Int32 tmp = (((UInt32)s->ll16[j]) | (((((UInt32)(s->ll4[(j) >> 1])) >> (((j) << 2) & 0x4)) & 0xF) << 16)); 1843 { s->ll16[j] = (UInt16)(i & 0x0000ffff); { if (((j) & 0x1) == 0) s->ll4[(j) >> 1] = (s->ll4[(j) >> 1] & 0xf0) | (i >> 16); else s->ll4[(j) >> 1] = (s->ll4[(j) >> 1] & 0x0f) | ((i >> 16) << 4); }; }; 1844 i = j; 1845 j = tmp; 1846 } 1847 while (i != s->origPtr); 1848 1849 s->tPos = s->origPtr; 1850 s->nblock_used = 0; 1851 if (s->blockRandomised) { 1852 s->rNToGo = 0; s->rTPos = 0; 1853 s->k0 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 1854 if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; s->k0 ^= ((s->rNToGo == 1) ? 1 : 0); 1855 } else { 1856 s->k0 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 1857 } 1858 1859 } else { 1860 1861 1862 for (i = 0; i < nblock; i++) { 1863 uc = (UChar)(s->tt[i] & 0xff); 1864 s->tt[s->cftab[uc]] |= (i << 8); 1865 s->cftab[uc]++; 1866 } 1867 1868 s->tPos = s->tt[s->origPtr] >> 8; 1869 s->nblock_used = 0; 1870 if (s->blockRandomised) { 1871 s->rNToGo = 0; s->rTPos = 0; 1872 s->tPos = s->tt[s->tPos]; s->k0 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; s->nblock_used++; 1873 if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; s->k0 ^= ((s->rNToGo == 1) ? 1 : 0); 1874 } else { 1875 s->tPos = s->tt[s->tPos]; s->k0 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; s->nblock_used++; 1876 } 1877 1878 } 1879 1880 { retVal = 0; goto save_state_and_return; };; 1881 1882 1883 1884 endhdr_2: 1885 1886 case 42: s->state = 42; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1887 if (uc != 0x72) { retVal = (-4); goto save_state_and_return; };; 1888 case 43: s->state = 43; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1889 if (uc != 0x45) { retVal = (-4); goto save_state_and_return; };; 1890 case 44: s->state = 44; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1891 if (uc != 0x38) { retVal = (-4); goto save_state_and_return; };; 1892 case 45: s->state = 45; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1893 if (uc != 0x50) { retVal = (-4); goto save_state_and_return; };; 1894 case 46: s->state = 46; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1895 if (uc != 0x90) { retVal = (-4); goto save_state_and_return; };; 1896 1897 s->storedCombinedCRC = 0; 1898 case 47: s->state = 47; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1899 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 1900 case 48: s->state = 48; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1901 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 1902 case 49: s->state = 49; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1903 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 1904 case 50: s->state = 50; while (((Bool)1)) { if (s->bsLive >= 8) { UInt32 v; v = (s->bsBuff >> (s->bsLive-8)) & ((1 << 8)-1); s->bsLive -= 8; uc = v; break; } if (s->strm->avail_in == 0) { retVal = 0; goto save_state_and_return; };; s->bsBuff = (s->bsBuff << 8) | ((UInt32) (*((UChar*)(s->strm->next_in)))); s->bsLive += 8; s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; }; 1905 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 1906 1907 s->state = 1; 1908 { retVal = 4; goto save_state_and_return; };; 1909 1910 default: { if (!(((Bool)0))) bz_internal_error ( 4001 ); }; 1911 } 1912 1913 { if (!(((Bool)0))) bz_internal_error ( 4002 ); }; 1914 1915 save_state_and_return: 1916 1917 s->save_i = i; 1918 s->save_j = j; 1919 s->save_t = t; 1920 s->save_alphaSize = alphaSize; 1921 s->save_nGroups = nGroups; 1922 s->save_nSelectors = nSelectors; 1923 s->save_EOB = EOB; 1924 s->save_groupNo = groupNo; 1925 s->save_groupPos = groupPos; 1926 s->save_nextSym = nextSym; 1927 s->save_nblockMAX = nblockMAX; 1928 s->save_nblock = nblock; 1929 s->save_es = es; 1930 s->save_N = N; 1931 s->save_curr = curr; 1932 s->save_zt = zt; 1933 s->save_zn = zn; 1934 s->save_zvec = zvec; 1935 s->save_zj = zj; 1936 s->save_gSel = gSel; 1937 s->save_gMinlen = gMinlen; 1938 s->save_gLimit = gLimit; 1939 s->save_gBase = gBase; 1940 s->save_gPerm = gPerm; 1941 1942 return retVal; 1943 } 1944 1945 static 1946 __inline__ 1947 void fallbackSimpleSort ( UInt32* fmap, 1948 UInt32* eclass, 1949 Int32 lo, 1950 Int32 hi ) 1951 { 1952 Int32 i, j, tmp; 1953 UInt32 ec_tmp; 1954 1955 if (lo == hi) return; 1956 1957 if (hi - lo > 3) { 1958 for ( i = hi-4; i >= lo; i-- ) { 1959 tmp = fmap[i]; 1960 ec_tmp = eclass[tmp]; 1961 for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) 1962 fmap[j-4] = fmap[j]; 1963 fmap[j-4] = tmp; 1964 } 1965 } 1966 1967 for ( i = hi-1; i >= lo; i-- ) { 1968 tmp = fmap[i]; 1969 ec_tmp = eclass[tmp]; 1970 for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) 1971 fmap[j-1] = fmap[j]; 1972 fmap[j-1] = tmp; 1973 } 1974 } 1975 1976 static 1977 void fallbackQSort3 ( UInt32* fmap, 1978 UInt32* eclass, 1979 Int32 loSt, 1980 Int32 hiSt ) 1981 { 1982 Int32 unLo, unHi, ltLo, gtHi, n, m; 1983 Int32 sp, lo, hi; 1984 UInt32 med, r, r3; 1985 Int32 stackLo[100]; 1986 Int32 stackHi[100]; 1987 1988 r = 0; 1989 1990 sp = 0; 1991 { stackLo[sp] = loSt; stackHi[sp] = hiSt; sp++; }; 1992 1993 while (sp > 0) { 1994 1995 { if (!(sp < 100)) bz_internal_error ( 1004 ); }; 1996 1997 { sp--; lo = stackLo[sp]; hi = stackHi[sp]; }; 1998 if (hi - lo < 10) { 1999 fallbackSimpleSort ( fmap, eclass, lo, hi ); 2000 continue; 2001 } 2002 2003 r = ((r * 7621) + 1) % 32768; 2004 r3 = r % 3; 2005 if (r3 == 0) med = eclass[fmap[lo]]; else 2006 if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else 2007 med = eclass[fmap[hi]]; 2008 2009 unLo = ltLo = lo; 2010 unHi = gtHi = hi; 2011 2012 while (1) { 2013 while (1) { 2014 if (unLo > unHi) break; 2015 n = (Int32)eclass[fmap[unLo]] - (Int32)med; 2016 if (n == 0) { 2017 { Int32 zztmp = fmap[unLo]; fmap[unLo] = fmap[ltLo]; fmap[ltLo] = zztmp; }; 2018 ltLo++; unLo++; 2019 continue; 2020 }; 2021 if (n > 0) break; 2022 unLo++; 2023 } 2024 while (1) { 2025 if (unLo > unHi) break; 2026 n = (Int32)eclass[fmap[unHi]] - (Int32)med; 2027 if (n == 0) { 2028 { Int32 zztmp = fmap[unHi]; fmap[unHi] = fmap[gtHi]; fmap[gtHi] = zztmp; }; 2029 gtHi--; unHi--; 2030 continue; 2031 }; 2032 if (n < 0) break; 2033 unHi--; 2034 } 2035 if (unLo > unHi) break; 2036 { Int32 zztmp = fmap[unLo]; fmap[unLo] = fmap[unHi]; fmap[unHi] = zztmp; }; unLo++; unHi--; 2037 } 2038 2039 ; 2040 2041 if (gtHi < ltLo) continue; 2042 2043 n = ((ltLo-lo) < (unLo-ltLo)) ? (ltLo-lo) : (unLo-ltLo); { Int32 yyp1 = (lo); Int32 yyp2 = (unLo-n); Int32 yyn = (n); while (yyn > 0) { { Int32 zztmp = fmap[yyp1]; fmap[yyp1] = fmap[yyp2]; fmap[yyp2] = zztmp; }; yyp1++; yyp2++; yyn--; } }; 2044 m = ((hi-gtHi) < (gtHi-unHi)) ? (hi-gtHi) : (gtHi-unHi); { Int32 yyp1 = (unLo); Int32 yyp2 = (hi-m+1); Int32 yyn = (m); while (yyn > 0) { { Int32 zztmp = fmap[yyp1]; fmap[yyp1] = fmap[yyp2]; fmap[yyp2] = zztmp; }; yyp1++; yyp2++; yyn--; } }; 2045 2046 n = lo + unLo - ltLo - 1; 2047 m = hi - (gtHi - unHi) + 1; 2048 2049 if (n - lo > hi - m) { 2050 { stackLo[sp] = lo; stackHi[sp] = n; sp++; }; 2051 { stackLo[sp] = m; stackHi[sp] = hi; sp++; }; 2052 } else { 2053 { stackLo[sp] = m; stackHi[sp] = hi; sp++; }; 2054 { stackLo[sp] = lo; stackHi[sp] = n; sp++; }; 2055 } 2056 } 2057 } 2058 2059 static 2060 void fallbackSort ( UInt32* fmap, 2061 UInt32* eclass, 2062 UInt32* bhtab, 2063 Int32 nblock, 2064 Int32 verb ) 2065 { 2066 Int32 ftab[257]; 2067 Int32 ftabCopy[256]; 2068 Int32 H, i, j, k, l, r, cc, cc1; 2069 Int32 nNotDone; 2070 Int32 nBhtab; 2071 UChar* eclass8 = (UChar*)eclass; 2072 2073 2074 2075 2076 2077 if (verb >= 4) 2078 vex_printf(" bucket sorting ...\n"); 2079 for (i = 0; i < 257; i++) ftab[i] = 0; 2080 for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; 2081 for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; 2082 for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; 2083 2084 for (i = 0; i < nblock; i++) { 2085 j = eclass8[i]; 2086 k = ftab[j] - 1; 2087 ftab[j] = k; 2088 fmap[k] = i; 2089 } 2090 2091 nBhtab = 2 + (nblock / 32); 2092 for (i = 0; i < nBhtab; i++) bhtab[i] = 0; 2093 for (i = 0; i < 256; i++) bhtab[(ftab[i]) >> 5] |= (1 << ((ftab[i]) & 31)); 2094 2095 for (i = 0; i < 32; i++) { 2096 bhtab[(nblock + 2*i) >> 5] |= (1 << ((nblock + 2*i) & 31)); 2097 bhtab[(nblock + 2*i + 1) >> 5] &= ~(1 << ((nblock + 2*i + 1) & 31)); 2098 } 2099 2100 2101 H = 1; 2102 while (1) { 2103 2104 if (verb >= 4) 2105 vex_printf(" depth %6d has ",H); 2106 2107 j = 0; 2108 for (i = 0; i < nblock; i++) { 2109 if ((bhtab[(i) >> 5] & (1 << ((i) & 31)))) j = i; 2110 k = fmap[i] - H; if (k < 0) k += nblock; 2111 eclass[k] = j; 2112 } 2113 2114 nNotDone = 0; 2115 r = -1; 2116 while (1) { 2117 2118 2119 k = r + 1; 2120 while ((bhtab[(k) >> 5] & (1 << ((k) & 31))) && ((k) & 0x01f)) k++; 2121 if ((bhtab[(k) >> 5] & (1 << ((k) & 31)))) { 2122 while (bhtab[(k) >> 5] == 0xffffffff) k += 32; 2123 while ((bhtab[(k) >> 5] & (1 << ((k) & 31)))) k++; 2124 } 2125 l = k - 1; 2126 if (l >= nblock) break; 2127 while (!(bhtab[(k) >> 5] & (1 << ((k) & 31))) && ((k) & 0x01f)) k++; 2128 if (!(bhtab[(k) >> 5] & (1 << ((k) & 31)))) { 2129 while (bhtab[(k) >> 5] == 0x00000000) k += 32; 2130 while (!(bhtab[(k) >> 5] & (1 << ((k) & 31)))) k++; 2131 } 2132 r = k - 1; 2133 if (r >= nblock) break; 2134 2135 2136 if (r > l) { 2137 nNotDone += (r - l + 1); 2138 fallbackQSort3 ( fmap, eclass, l, r ); 2139 2140 2141 cc = -1; 2142 for (i = l; i <= r; i++) { 2143 cc1 = eclass[fmap[i]]; 2144 if (cc != cc1) { bhtab[(i) >> 5] |= (1 << ((i) & 31)); cc = cc1; }; 2145 } 2146 } 2147 } 2148 2149 if (verb >= 4) 2150 vex_printf("%6d unresolved strings\n",nNotDone); 2151 2152 H *= 2; 2153 if (H > nblock || nNotDone == 0) break; 2154 } 2155 2156 2157 2158 2159 2160 2161 if (verb >= 4) 2162 vex_printf(" reconstructing block ...\n"); 2163 j = 0; 2164 for (i = 0; i < nblock; i++) { 2165 while (ftabCopy[j] == 0) j++; 2166 ftabCopy[j]--; 2167 eclass8[fmap[i]] = (UChar)j; 2168 } 2169 { if (!(j < 256)) bz_internal_error ( 1005 ); }; 2170 } 2171 2172 static 2173 __inline__ 2174 Bool mainGtU ( UInt32 i1, 2175 UInt32 i2, 2176 UChar* block, 2177 UInt16* quadrant, 2178 UInt32 nblock, 2179 Int32* budget ) 2180 { 2181 Int32 k; 2182 UChar c1, c2; 2183 UInt16 s1, s2; 2184 2185 ; 2186 2187 c1 = block[i1]; c2 = block[i2]; 2188 if (c1 != c2) return (c1 > c2); 2189 i1++; i2++; 2190 2191 c1 = block[i1]; c2 = block[i2]; 2192 if (c1 != c2) return (c1 > c2); 2193 i1++; i2++; 2194 2195 c1 = block[i1]; c2 = block[i2]; 2196 if (c1 != c2) return (c1 > c2); 2197 i1++; i2++; 2198 2199 c1 = block[i1]; c2 = block[i2]; 2200 if (c1 != c2) return (c1 > c2); 2201 i1++; i2++; 2202 2203 c1 = block[i1]; c2 = block[i2]; 2204 if (c1 != c2) return (c1 > c2); 2205 i1++; i2++; 2206 2207 c1 = block[i1]; c2 = block[i2]; 2208 if (c1 != c2) return (c1 > c2); 2209 i1++; i2++; 2210 2211 c1 = block[i1]; c2 = block[i2]; 2212 if (c1 != c2) return (c1 > c2); 2213 i1++; i2++; 2214 2215 c1 = block[i1]; c2 = block[i2]; 2216 if (c1 != c2) return (c1 > c2); 2217 i1++; i2++; 2218 2219 c1 = block[i1]; c2 = block[i2]; 2220 if (c1 != c2) return (c1 > c2); 2221 i1++; i2++; 2222 2223 c1 = block[i1]; c2 = block[i2]; 2224 if (c1 != c2) return (c1 > c2); 2225 i1++; i2++; 2226 2227 c1 = block[i1]; c2 = block[i2]; 2228 if (c1 != c2) return (c1 > c2); 2229 i1++; i2++; 2230 2231 c1 = block[i1]; c2 = block[i2]; 2232 if (c1 != c2) return (c1 > c2); 2233 i1++; i2++; 2234 2235 k = nblock + 8; 2236 2237 do { 2238 2239 c1 = block[i1]; c2 = block[i2]; 2240 if (c1 != c2) return (c1 > c2); 2241 s1 = quadrant[i1]; s2 = quadrant[i2]; 2242 if (s1 != s2) return (s1 > s2); 2243 i1++; i2++; 2244 2245 c1 = block[i1]; c2 = block[i2]; 2246 if (c1 != c2) return (c1 > c2); 2247 s1 = quadrant[i1]; s2 = quadrant[i2]; 2248 if (s1 != s2) return (s1 > s2); 2249 i1++; i2++; 2250 2251 c1 = block[i1]; c2 = block[i2]; 2252 if (c1 != c2) return (c1 > c2); 2253 s1 = quadrant[i1]; s2 = quadrant[i2]; 2254 if (s1 != s2) return (s1 > s2); 2255 i1++; i2++; 2256 2257 c1 = block[i1]; c2 = block[i2]; 2258 if (c1 != c2) return (c1 > c2); 2259 s1 = quadrant[i1]; s2 = quadrant[i2]; 2260 if (s1 != s2) return (s1 > s2); 2261 i1++; i2++; 2262 2263 c1 = block[i1]; c2 = block[i2]; 2264 if (c1 != c2) return (c1 > c2); 2265 s1 = quadrant[i1]; s2 = quadrant[i2]; 2266 if (s1 != s2) return (s1 > s2); 2267 i1++; i2++; 2268 2269 c1 = block[i1]; c2 = block[i2]; 2270 if (c1 != c2) return (c1 > c2); 2271 s1 = quadrant[i1]; s2 = quadrant[i2]; 2272 if (s1 != s2) return (s1 > s2); 2273 i1++; i2++; 2274 2275 c1 = block[i1]; c2 = block[i2]; 2276 if (c1 != c2) return (c1 > c2); 2277 s1 = quadrant[i1]; s2 = quadrant[i2]; 2278 if (s1 != s2) return (s1 > s2); 2279 i1++; i2++; 2280 2281 c1 = block[i1]; c2 = block[i2]; 2282 if (c1 != c2) return (c1 > c2); 2283 s1 = quadrant[i1]; s2 = quadrant[i2]; 2284 if (s1 != s2) return (s1 > s2); 2285 i1++; i2++; 2286 2287 if (i1 >= nblock) i1 -= nblock; 2288 if (i2 >= nblock) i2 -= nblock; 2289 2290 k -= 8; 2291 (*budget)--; 2292 } 2293 while (k >= 0); 2294 2295 return ((Bool)0); 2296 } 2297 2298 static 2299 Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, 2300 9841, 29524, 88573, 265720, 2301 797161, 2391484 }; 2302 2303 static 2304 void mainSimpleSort ( UInt32* ptr, 2305 UChar* block, 2306 UInt16* quadrant, 2307 Int32 nblock, 2308 Int32 lo, 2309 Int32 hi, 2310 Int32 d, 2311 Int32* budget ) 2312 { 2313 Int32 i, j, h, bigN, hp; 2314 UInt32 v; 2315 2316 bigN = hi - lo + 1; 2317 if (bigN < 2) return; 2318 2319 hp = 0; 2320 while (incs[hp] < bigN) hp++; 2321 hp--; 2322 2323 for (; hp >= 0; hp--) { 2324 h = incs[hp]; 2325 2326 i = lo + h; 2327 while (((Bool)1)) { 2328 2329 2330 if (i > hi) break; 2331 v = ptr[i]; 2332 j = i; 2333 while ( mainGtU ( 2334 ptr[j-h]+d, v+d, block, quadrant, nblock, budget 2335 ) ) { 2336 ptr[j] = ptr[j-h]; 2337 j = j - h; 2338 if (j <= (lo + h - 1)) break; 2339 } 2340 ptr[j] = v; 2341 i++; 2342 2343 2344 if (i > hi) break; 2345 v = ptr[i]; 2346 j = i; 2347 while ( mainGtU ( 2348 ptr[j-h]+d, v+d, block, quadrant, nblock, budget 2349 ) ) { 2350 ptr[j] = ptr[j-h]; 2351 j = j - h; 2352 if (j <= (lo + h - 1)) break; 2353 } 2354 ptr[j] = v; 2355 i++; 2356 2357 2358 if (i > hi) break; 2359 v = ptr[i]; 2360 j = i; 2361 while ( mainGtU ( 2362 ptr[j-h]+d, v+d, block, quadrant, nblock, budget 2363 ) ) { 2364 ptr[j] = ptr[j-h]; 2365 j = j - h; 2366 if (j <= (lo + h - 1)) break; 2367 } 2368 ptr[j] = v; 2369 i++; 2370 2371 if (*budget < 0) return; 2372 } 2373 } 2374 } 2375 2376 static 2377 __inline__ 2378 UChar mmed3 ( UChar a, UChar b, UChar c ) 2379 { 2380 UChar t; 2381 if (a > b) { t = a; a = b; b = t; }; 2382 if (b > c) { 2383 b = c; 2384 if (a > b) b = a; 2385 } 2386 return b; 2387 } 2388 2389 static 2390 void mainQSort3 ( UInt32* ptr, 2391 UChar* block, 2392 UInt16* quadrant, 2393 Int32 nblock, 2394 Int32 loSt, 2395 Int32 hiSt, 2396 Int32 dSt, 2397 Int32* budget ) 2398 { 2399 Int32 unLo, unHi, ltLo, gtHi, n, m, med; 2400 Int32 sp, lo, hi, d; 2401 2402 Int32 stackLo[100]; 2403 Int32 stackHi[100]; 2404 Int32 stackD [100]; 2405 2406 Int32 nextLo[3]; 2407 Int32 nextHi[3]; 2408 Int32 nextD [3]; 2409 2410 sp = 0; 2411 { stackLo[sp] = loSt; stackHi[sp] = hiSt; stackD [sp] = dSt; sp++; }; 2412 2413 while (sp > 0) { 2414 2415 { if (!(sp < 100)) bz_internal_error ( 1001 ); }; 2416 2417 { sp--; lo = stackLo[sp]; hi = stackHi[sp]; d = stackD [sp]; }; 2418 if (hi - lo < 20 || 2419 d > (2 + 12)) { 2420 mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); 2421 if (*budget < 0) return; 2422 continue; 2423 } 2424 2425 med = (Int32) 2426 mmed3 ( block[ptr[ lo ]+d], 2427 block[ptr[ hi ]+d], 2428 block[ptr[ (lo+hi)>>1 ]+d] ); 2429 2430 unLo = ltLo = lo; 2431 unHi = gtHi = hi; 2432 2433 while (((Bool)1)) { 2434 while (((Bool)1)) { 2435 if (unLo > unHi) break; 2436 n = ((Int32)block[ptr[unLo]+d]) - med; 2437 if (n == 0) { 2438 { Int32 zztmp = ptr[unLo]; ptr[unLo] = ptr[ltLo]; ptr[ltLo] = zztmp; }; 2439 ltLo++; unLo++; continue; 2440 }; 2441 if (n > 0) break; 2442 unLo++; 2443 } 2444 while (((Bool)1)) { 2445 if (unLo > unHi) break; 2446 n = ((Int32)block[ptr[unHi]+d]) - med; 2447 if (n == 0) { 2448 { Int32 zztmp = ptr[unHi]; ptr[unHi] = ptr[gtHi]; ptr[gtHi] = zztmp; }; 2449 gtHi--; unHi--; continue; 2450 }; 2451 if (n < 0) break; 2452 unHi--; 2453 } 2454 if (unLo > unHi) break; 2455 { Int32 zztmp = ptr[unLo]; ptr[unLo] = ptr[unHi]; ptr[unHi] = zztmp; }; unLo++; unHi--; 2456 } 2457 2458 ; 2459 2460 if (gtHi < ltLo) { 2461 { stackLo[sp] = lo; stackHi[sp] = hi; stackD [sp] = d+1; sp++; }; 2462 continue; 2463 } 2464 2465 n = ((ltLo-lo) < (unLo-ltLo)) ? (ltLo-lo) : (unLo-ltLo); { Int32 yyp1 = (lo); Int32 yyp2 = (unLo-n); Int32 yyn = (n); while (yyn > 0) { { Int32 zztmp = ptr[yyp1]; ptr[yyp1] = ptr[yyp2]; ptr[yyp2] = zztmp; }; yyp1++; yyp2++; yyn--; } }; 2466 m = ((hi-gtHi) < (gtHi-unHi)) ? (hi-gtHi) : (gtHi-unHi); { Int32 yyp1 = (unLo); Int32 yyp2 = (hi-m+1); Int32 yyn = (m); while (yyn > 0) { { Int32 zztmp = ptr[yyp1]; ptr[yyp1] = ptr[yyp2]; ptr[yyp2] = zztmp; }; yyp1++; yyp2++; yyn--; } }; 2467 2468 n = lo + unLo - ltLo - 1; 2469 m = hi - (gtHi - unHi) + 1; 2470 2471 nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; 2472 nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; 2473 nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; 2474 2475 if ((nextHi[0]-nextLo[0]) < (nextHi[1]-nextLo[1])) { Int32 tz; tz = nextLo[0]; nextLo[0] = nextLo[1]; nextLo[1] = tz; tz = nextHi[0]; nextHi[0] = nextHi[1]; nextHi[1] = tz; tz = nextD [0]; nextD [0] = nextD [1]; nextD [1] = tz; }; 2476 if ((nextHi[1]-nextLo[1]) < (nextHi[2]-nextLo[2])) { Int32 tz; tz = nextLo[1]; nextLo[1] = nextLo[2]; nextLo[2] = tz; tz = nextHi[1]; nextHi[1] = nextHi[2]; nextHi[2] = tz; tz = nextD [1]; nextD [1] = nextD [2]; nextD [2] = tz; }; 2477 if ((nextHi[0]-nextLo[0]) < (nextHi[1]-nextLo[1])) { Int32 tz; tz = nextLo[0]; nextLo[0] = nextLo[1]; nextLo[1] = tz; tz = nextHi[0]; nextHi[0] = nextHi[1]; nextHi[1] = tz; tz = nextD [0]; nextD [0] = nextD [1]; nextD [1] = tz; }; 2478 2479 ; 2480 ; 2481 2482 { stackLo[sp] = nextLo[0]; stackHi[sp] = nextHi[0]; stackD [sp] = nextD[0]; sp++; }; 2483 { stackLo[sp] = nextLo[1]; stackHi[sp] = nextHi[1]; stackD [sp] = nextD[1]; sp++; }; 2484 { stackLo[sp] = nextLo[2]; stackHi[sp] = nextHi[2]; stackD [sp] = nextD[2]; sp++; }; 2485 } 2486 } 2487 2488 static 2489 void mainSort ( UInt32* ptr, 2490 UChar* block, 2491 UInt16* quadrant, 2492 UInt32* ftab, 2493 Int32 nblock, 2494 Int32 verb, 2495 Int32* budget ) 2496 { 2497 Int32 i, j, k, ss, sb; 2498 Int32 runningOrder[256]; 2499 Bool bigDone[256]; 2500 Int32 copyStart[256]; 2501 Int32 copyEnd [256]; 2502 UChar c1; 2503 Int32 numQSorted; 2504 UInt16 s; 2505 if (verb >= 4) vex_printf(" main sort initialise ...\n"); 2506 2507 2508 for (i = 65536; i >= 0; i--) ftab[i] = 0; 2509 2510 j = block[0] << 8; 2511 i = nblock-1; 2512 for (; i >= 3; i -= 4) { 2513 quadrant[i] = 0; 2514 j = (j >> 8) | ( ((UInt16)block[i]) << 8); 2515 ftab[j]++; 2516 quadrant[i-1] = 0; 2517 j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); 2518 ftab[j]++; 2519 quadrant[i-2] = 0; 2520 j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); 2521 ftab[j]++; 2522 quadrant[i-3] = 0; 2523 j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); 2524 ftab[j]++; 2525 } 2526 for (; i >= 0; i--) { 2527 quadrant[i] = 0; 2528 j = (j >> 8) | ( ((UInt16)block[i]) << 8); 2529 ftab[j]++; 2530 } 2531 2532 2533 for (i = 0; i < (2 + 12 + 18 + 2); i++) { 2534 block [nblock+i] = block[i]; 2535 quadrant[nblock+i] = 0; 2536 } 2537 2538 if (verb >= 4) vex_printf(" bucket sorting ...\n"); 2539 2540 2541 for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; 2542 2543 s = block[0] << 8; 2544 i = nblock-1; 2545 for (; i >= 3; i -= 4) { 2546 s = (s >> 8) | (block[i] << 8); 2547 j = ftab[s] -1; 2548 ftab[s] = j; 2549 ptr[j] = i; 2550 s = (s >> 8) | (block[i-1] << 8); 2551 j = ftab[s] -1; 2552 ftab[s] = j; 2553 ptr[j] = i-1; 2554 s = (s >> 8) | (block[i-2] << 8); 2555 j = ftab[s] -1; 2556 ftab[s] = j; 2557 ptr[j] = i-2; 2558 s = (s >> 8) | (block[i-3] << 8); 2559 j = ftab[s] -1; 2560 ftab[s] = j; 2561 ptr[j] = i-3; 2562 } 2563 for (; i >= 0; i--) { 2564 s = (s >> 8) | (block[i] << 8); 2565 j = ftab[s] -1; 2566 ftab[s] = j; 2567 ptr[j] = i; 2568 } 2569 2570 2571 2572 2573 2574 2575 for (i = 0; i <= 255; i++) { 2576 bigDone [i] = ((Bool)0); 2577 runningOrder[i] = i; 2578 } 2579 2580 { 2581 Int32 vv; 2582 Int32 h = 1; 2583 do h = 3 * h + 1; while (h <= 256); 2584 do { 2585 h = h / 3; 2586 for (i = h; i <= 255; i++) { 2587 vv = runningOrder[i]; 2588 j = i; 2589 while ( (ftab[((runningOrder[j-h])+1) << 8] - ftab[(runningOrder[j-h]) << 8]) > (ftab[((vv)+1) << 8] - ftab[(vv) << 8]) ) { 2590 runningOrder[j] = runningOrder[j-h]; 2591 j = j - h; 2592 if (j <= (h - 1)) goto zero; 2593 } 2594 zero: 2595 runningOrder[j] = vv; 2596 } 2597 } while (h != 1); 2598 } 2599 2600 2601 2602 2603 2604 numQSorted = 0; 2605 2606 for (i = 0; i <= 255; i++) { 2607 2608 2609 2610 2611 2612 2613 2614 ss = runningOrder[i]; 2615 2616 for (j = 0; j <= 255; j++) { 2617 if (j != ss) { 2618 sb = (ss << 8) + j; 2619 if ( ! (ftab[sb] & (1 << 21)) ) { 2620 Int32 lo = ftab[sb] & (~((1 << 21))); 2621 Int32 hi = (ftab[sb+1] & (~((1 << 21)))) - 1; 2622 if (hi > lo) { 2623 if (verb >= 4) 2624 vex_printf(" qsort [0x%x, 0x%x] " "done %d this %d\n",ss,j,numQSorted,hi - lo + 1); 2625 2626 2627 mainQSort3 ( 2628 ptr, block, quadrant, nblock, 2629 lo, hi, 2, budget 2630 ); 2631 numQSorted += (hi - lo + 1); 2632 if (*budget < 0) return; 2633 } 2634 } 2635 ftab[sb] |= (1 << 21); 2636 } 2637 } 2638 2639 { if (!(!bigDone[ss])) bz_internal_error ( 1006 ); }; 2640 2641 { 2642 for (j = 0; j <= 255; j++) { 2643 copyStart[j] = ftab[(j << 8) + ss] & (~((1 << 21))); 2644 copyEnd [j] = (ftab[(j << 8) + ss + 1] & (~((1 << 21)))) - 1; 2645 } 2646 for (j = ftab[ss << 8] & (~((1 << 21))); j < copyStart[ss]; j++) { 2647 k = ptr[j]-1; if (k < 0) k += nblock; 2648 c1 = block[k]; 2649 if (!bigDone[c1]) 2650 ptr[ copyStart[c1]++ ] = k; 2651 } 2652 for (j = (ftab[(ss+1) << 8] & (~((1 << 21)))) - 1; j > copyEnd[ss]; j--) { 2653 k = ptr[j]-1; if (k < 0) k += nblock; 2654 c1 = block[k]; 2655 if (!bigDone[c1]) 2656 ptr[ copyEnd[c1]-- ] = k; 2657 } 2658 } 2659 2660 { if (!((copyStart[ss]-1 == copyEnd[ss]) || (copyStart[ss] == 0 && copyEnd[ss] == nblock-1))) bz_internal_error ( 1007 ); } 2661 2662 for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= (1 << 21); 2663 2664 bigDone[ss] = ((Bool)1); 2665 2666 if (i < 255) { 2667 Int32 bbStart = ftab[ss << 8] & (~((1 << 21))); 2668 Int32 bbSize = (ftab[(ss+1) << 8] & (~((1 << 21)))) - bbStart; 2669 Int32 shifts = 0; 2670 2671 while ((bbSize >> shifts) > 65534) shifts++; 2672 2673 for (j = bbSize-1; j >= 0; j--) { 2674 Int32 a2update = ptr[bbStart + j]; 2675 UInt16 qVal = (UInt16)(j >> shifts); 2676 quadrant[a2update] = qVal; 2677 if (a2update < (2 + 12 + 18 + 2)) 2678 quadrant[a2update + nblock] = qVal; 2679 } 2680 { if (!(((bbSize-1) >> shifts) <= 65535)) bz_internal_error ( 1002 ); }; 2681 } 2682 2683 } 2684 2685 if (verb >= 4) 2686 vex_printf(" %d pointers, %d sorted, %d scanned\n",nblock,numQSorted,nblock - numQSorted); 2687 2688 } 2689 2690 void BZ2_blockSort ( EState* s ) 2691 { 2692 UInt32* ptr = s->ptr; 2693 UChar* block = s->block; 2694 UInt32* ftab = s->ftab; 2695 Int32 nblock = s->nblock; 2696 Int32 verb = s->verbosity; 2697 Int32 wfact = s->workFactor; 2698 UInt16* quadrant; 2699 Int32 budget; 2700 Int32 budgetInit; 2701 Int32 i; 2702 2703 if (nblock < 1000 ) { 2704 fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); 2705 } else { 2706 2707 2708 2709 2710 2711 i = nblock+(2 + 12 + 18 + 2); 2712 if (i & 1) i++; 2713 quadrant = (UInt16*)(&(block[i])); 2714 2715 if (wfact < 1 ) wfact = 1; 2716 if (wfact > 100) wfact = 100; 2717 budgetInit = nblock * ((wfact-1) / 3); 2718 budget = budgetInit; 2719 2720 mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); 2721 if (0 && verb >= 3) 2722 vex_printf(" %d work, %d block, ratio %5.2f\n",budgetInit - budget,nblock,(float)(budgetInit - budget) / (float)(nblock==0 ? 1 : nblock)); 2723 2724 2725 2726 2727 if (budget < 0) { 2728 if (verb >= 2) 2729 vex_printf(" too repetitive; using fallback" " sorting algorithm\n"); 2730 2731 fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); 2732 } 2733 } 2734 2735 s->origPtr = -1; 2736 for (i = 0; i < s->nblock; i++) 2737 if (ptr[i] == 0) 2738 { s->origPtr = i; break; }; 2739 2740 { if (!(s->origPtr != -1)) bz_internal_error ( 1003 ); }; 2741 } 2742 2743 void BZ2_hbMakeCodeLengths ( UChar *len, 2744 Int32 *freq, 2745 Int32 alphaSize, 2746 Int32 maxLen ) 2747 { 2748 2749 2750 2751 2752 Int32 nNodes, nHeap, n1, n2, i, j, k; 2753 Bool tooLong; 2754 2755 Int32 heap [ 258 + 2 ]; 2756 Int32 weight [ 258 * 2 ]; 2757 Int32 parent [ 258 * 2 ]; 2758 2759 for (i = 0; i < alphaSize; i++) 2760 weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; 2761 2762 while (((Bool)1)) { 2763 2764 nNodes = alphaSize; 2765 nHeap = 0; 2766 2767 heap[0] = 0; 2768 weight[0] = 0; 2769 parent[0] = -2; 2770 2771 for (i = 1; i <= alphaSize; i++) { 2772 parent[i] = -1; 2773 nHeap++; 2774 heap[nHeap] = i; 2775 { Int32 zz, tmp; zz = nHeap; tmp = heap[zz]; while (weight[tmp] < weight[heap[zz >> 1]]) { heap[zz] = heap[zz >> 1]; zz >>= 1; } heap[zz] = tmp; }; 2776 } 2777 2778 { if (!(nHeap < (258 +2))) bz_internal_error ( 2001 ); }; 2779 2780 while (nHeap > 1) { 2781 n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; { Int32 zz, yy, tmp; zz = 1; tmp = heap[zz]; while (((Bool)1)) { yy = zz << 1; if (yy > nHeap) break; if (yy < nHeap && weight[heap[yy+1]] < weight[heap[yy]]) yy++; if (weight[tmp] < weight[heap[yy]]) break; heap[zz] = heap[yy]; zz = yy; } heap[zz] = tmp; }; 2782 n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; { Int32 zz, yy, tmp; zz = 1; tmp = heap[zz]; while (((Bool)1)) { yy = zz << 1; if (yy > nHeap) break; if (yy < nHeap && weight[heap[yy+1]] < weight[heap[yy]]) yy++; if (weight[tmp] < weight[heap[yy]]) break; heap[zz] = heap[yy]; zz = yy; } heap[zz] = tmp; }; 2783 nNodes++; 2784 parent[n1] = parent[n2] = nNodes; 2785 weight[nNodes] = (((weight[n1]) & 0xffffff00)+((weight[n2]) & 0xffffff00)) | (1 + ((((weight[n1]) & 0x000000ff)) > (((weight[n2]) & 0x000000ff)) ? (((weight[n1]) & 0x000000ff)) : (((weight[n2]) & 0x000000ff)))); 2786 parent[nNodes] = -1; 2787 nHeap++; 2788 heap[nHeap] = nNodes; 2789 { Int32 zz, tmp; zz = nHeap; tmp = heap[zz]; while (weight[tmp] < weight[heap[zz >> 1]]) { heap[zz] = heap[zz >> 1]; zz >>= 1; } heap[zz] = tmp; }; 2790 } 2791 2792 { if (!(nNodes < (258 * 2))) bz_internal_error ( 2002 ); }; 2793 2794 tooLong = ((Bool)0); 2795 for (i = 1; i <= alphaSize; i++) { 2796 j = 0; 2797 k = i; 2798 while (parent[k] >= 0) { k = parent[k]; j++; } 2799 len[i-1] = j; 2800 if (j > maxLen) tooLong = ((Bool)1); 2801 } 2802 2803 if (! tooLong) break; 2804 2805 for (i = 1; i <= alphaSize; i++) { 2806 j = weight[i] >> 8; 2807 j = 1 + (j / 2); 2808 weight[i] = j << 8; 2809 } 2810 } 2811 } 2812 2813 2814 2815 void BZ2_hbAssignCodes ( Int32 *code, 2816 UChar *length, 2817 Int32 minLen, 2818 Int32 maxLen, 2819 Int32 alphaSize ) 2820 { 2821 Int32 n, vec, i; 2822 2823 vec = 0; 2824 for (n = minLen; n <= maxLen; n++) { 2825 for (i = 0; i < alphaSize; i++) 2826 if (length[i] == n) { code[i] = vec; vec++; }; 2827 vec <<= 1; 2828 } 2829 } 2830 2831 2832 2833 void BZ2_hbCreateDecodeTables ( Int32 *limit, 2834 Int32 *base, 2835 Int32 *perm, 2836 UChar *length, 2837 Int32 minLen, 2838 Int32 maxLen, 2839 Int32 alphaSize ) 2840 { 2841 Int32 pp, i, j, vec; 2842 2843 pp = 0; 2844 for (i = minLen; i <= maxLen; i++) 2845 for (j = 0; j < alphaSize; j++) 2846 if (length[j] == i) { perm[pp] = j; pp++; }; 2847 2848 for (i = 0; i < 23; i++) base[i] = 0; 2849 for (i = 0; i < alphaSize; i++) base[length[i]+1]++; 2850 2851 for (i = 1; i < 23; i++) base[i] += base[i-1]; 2852 2853 for (i = 0; i < 23; i++) limit[i] = 0; 2854 vec = 0; 2855 2856 for (i = minLen; i <= maxLen; i++) { 2857 vec += (base[i+1] - base[i]); 2858 limit[i] = vec-1; 2859 vec <<= 1; 2860 } 2861 for (i = minLen + 1; i <= maxLen; i++) 2862 base[i] = ((limit[i-1] + 1) << 1) - base[i]; 2863 } 2864 2865 void BZ2_bsInitWrite ( EState* s ) 2866 { 2867 s->bsLive = 0; 2868 s->bsBuff = 0; 2869 } 2870 2871 2872 2873 static 2874 void bsFinishWrite ( EState* s ) 2875 { 2876 while (s->bsLive > 0) { 2877 s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); 2878 s->numZ++; 2879 s->bsBuff <<= 8; 2880 s->bsLive -= 8; 2881 } 2882 } 2883 2884 static 2885 __inline__ 2886 void bsW ( EState* s, Int32 n, UInt32 v ) 2887 { 2888 { while (s->bsLive >= 8) { s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); s->numZ++; s->bsBuff <<= 8; s->bsLive -= 8; } }; 2889 s->bsBuff |= (v << (32 - s->bsLive - n)); 2890 s->bsLive += n; 2891 } 2892 2893 2894 2895 static 2896 void bsPutUInt32 ( EState* s, UInt32 u ) 2897 { 2898 bsW ( s, 8, (u >> 24) & 0xffL ); 2899 bsW ( s, 8, (u >> 16) & 0xffL ); 2900 bsW ( s, 8, (u >> 8) & 0xffL ); 2901 bsW ( s, 8, u & 0xffL ); 2902 } 2903 2904 2905 2906 static 2907 void bsPutUChar ( EState* s, UChar c ) 2908 { 2909 bsW( s, 8, (UInt32)c ); 2910 } 2911 2912 2913 2914 2915 2916 2917 2918 static 2919 void makeMaps_e ( EState* s ) 2920 { 2921 Int32 i; 2922 s->nInUse = 0; 2923 for (i = 0; i < 256; i++) 2924 if (s->inUse[i]) { 2925 s->unseqToSeq[i] = s->nInUse; 2926 s->nInUse++; 2927 } 2928 } 2929 2930 2931 2932 static 2933 void generateMTFValues ( EState* s ) 2934 { 2935 UChar yy[256]; 2936 Int32 i, j; 2937 Int32 zPend; 2938 Int32 wr; 2939 Int32 EOB; 2940 2941 UInt32* ptr = s->ptr; 2942 UChar* block = s->block; 2943 UInt16* mtfv = s->mtfv; 2944 2945 makeMaps_e ( s ); 2946 EOB = s->nInUse+1; 2947 2948 for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; 2949 2950 wr = 0; 2951 zPend = 0; 2952 for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; 2953 2954 for (i = 0; i < s->nblock; i++) { 2955 UChar ll_i; 2956 ; 2957 j = ptr[i]-1; if (j < 0) j += s->nblock; 2958 ll_i = s->unseqToSeq[block[j]]; 2959 ; 2960 2961 if (yy[0] == ll_i) { 2962 zPend++; 2963 } else { 2964 2965 if (zPend > 0) { 2966 zPend--; 2967 while (((Bool)1)) { 2968 if (zPend & 1) { 2969 mtfv[wr] = 1; wr++; 2970 s->mtfFreq[1]++; 2971 } else { 2972 mtfv[wr] = 0; wr++; 2973 s->mtfFreq[0]++; 2974 } 2975 if (zPend < 2) break; 2976 zPend = (zPend - 2) / 2; 2977 }; 2978 zPend = 0; 2979 } 2980 { 2981 register UChar rtmp; 2982 register UChar* ryy_j; 2983 register UChar rll_i; 2984 rtmp = yy[1]; 2985 yy[1] = yy[0]; 2986 ryy_j = &(yy[1]); 2987 rll_i = ll_i; 2988 while ( rll_i != rtmp ) { 2989 register UChar rtmp2; 2990 ryy_j++; 2991 rtmp2 = rtmp; 2992 rtmp = *ryy_j; 2993 *ryy_j = rtmp2; 2994 }; 2995 yy[0] = rtmp; 2996 j = ryy_j - &(yy[0]); 2997 mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; 2998 } 2999 3000 } 3001 } 3002 3003 if (zPend > 0) { 3004 zPend--; 3005 while (((Bool)1)) { 3006 if (zPend & 1) { 3007 mtfv[wr] = 1; wr++; 3008 s->mtfFreq[1]++; 3009 } else { 3010 mtfv[wr] = 0; wr++; 3011 s->mtfFreq[0]++; 3012 } 3013 if (zPend < 2) break; 3014 zPend = (zPend - 2) / 2; 3015 }; 3016 zPend = 0; 3017 } 3018 3019 mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; 3020 3021 s->nMTF = wr; 3022 } 3023 3024 3025 3026 3027 3028 3029 static 3030 void sendMTFValues ( EState* s ) 3031 { 3032 Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; 3033 Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; 3034 Int32 nGroups, nBytes; 3035 3036 UInt16 cost[6]; 3037 Int32 fave[6]; 3038 3039 UInt16* mtfv = s->mtfv; 3040 3041 if (s->verbosity >= 3) 3042 vex_printf(" %d in block, %d after MTF & 1-2 coding, " "%d+2 syms in use\n",s->nblock,s->nMTF,s->nInUse); 3043 3044 3045 3046 alphaSize = s->nInUse+2; 3047 for (t = 0; t < 6; t++) 3048 for (v = 0; v < alphaSize; v++) 3049 s->len[t][v] = 15; 3050 3051 3052 { if (!(s->nMTF > 0)) bz_internal_error ( 3001 ); }; 3053 if (s->nMTF < 200) nGroups = 2; else 3054 if (s->nMTF < 600) nGroups = 3; else 3055 if (s->nMTF < 1200) nGroups = 4; else 3056 if (s->nMTF < 2400) nGroups = 5; else 3057 nGroups = 6; 3058 3059 3060 { 3061 Int32 nPart, remF, tFreq, aFreq; 3062 3063 nPart = nGroups; 3064 remF = s->nMTF; 3065 gs = 0; 3066 while (nPart > 0) { 3067 tFreq = remF / nPart; 3068 ge = gs-1; 3069 aFreq = 0; 3070 while (aFreq < tFreq && ge < alphaSize-1) { 3071 ge++; 3072 aFreq += s->mtfFreq[ge]; 3073 } 3074 3075 if (ge > gs 3076 && nPart != nGroups && nPart != 1 3077 && ((nGroups-nPart) % 2 == 1)) { 3078 aFreq -= s->mtfFreq[ge]; 3079 ge--; 3080 } 3081 3082 if (0 && s->verbosity >= 3) 3083 vex_printf(" initial group %d, [%d .. %d], " "has %d syms (%4.1f%%)\n",nPart,gs,ge,aFreq,(100.0 * (float)aFreq) / (float)(s->nMTF)); 3084 3085 3086 3087 3088 for (v = 0; v < alphaSize; v++) 3089 if (v >= gs && v <= ge) 3090 s->len[nPart-1][v] = 0; else 3091 s->len[nPart-1][v] = 15; 3092 3093 nPart--; 3094 gs = ge+1; 3095 remF -= aFreq; 3096 } 3097 } 3098 3099 3100 3101 3102 for (iter = 0; iter < 4; iter++) { 3103 3104 for (t = 0; t < nGroups; t++) fave[t] = 0; 3105 3106 for (t = 0; t < nGroups; t++) 3107 for (v = 0; v < alphaSize; v++) 3108 s->rfreq[t][v] = 0; 3109 3110 3111 3112 3113 3114 if (nGroups == 6) { 3115 for (v = 0; v < alphaSize; v++) { 3116 s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; 3117 s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; 3118 s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; 3119 } 3120 } 3121 3122 nSelectors = 0; 3123 totc = 0; 3124 gs = 0; 3125 while (((Bool)1)) { 3126 3127 3128 if (gs >= s->nMTF) break; 3129 ge = gs + 50 - 1; 3130 if (ge >= s->nMTF) ge = s->nMTF-1; 3131 3132 3133 3134 3135 3136 for (t = 0; t < nGroups; t++) cost[t] = 0; 3137 3138 if (nGroups == 6 && 50 == ge-gs+1) { 3139 3140 register UInt32 cost01, cost23, cost45; 3141 register UInt16 icv; 3142 cost01 = cost23 = cost45 = 0; 3143 3144 3145 3146 3147 3148 3149 3150 icv = mtfv[gs+(0)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(1)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(2)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(3)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(4)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3151 icv = mtfv[gs+(5)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(6)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(7)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(8)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(9)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3152 icv = mtfv[gs+(10)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(11)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(12)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(13)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(14)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3153 icv = mtfv[gs+(15)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(16)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(17)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(18)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(19)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3154 icv = mtfv[gs+(20)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(21)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(22)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(23)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(24)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3155 icv = mtfv[gs+(25)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(26)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(27)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(28)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(29)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3156 icv = mtfv[gs+(30)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(31)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(32)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(33)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(34)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3157 icv = mtfv[gs+(35)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(36)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(37)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(38)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(39)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3158 icv = mtfv[gs+(40)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(41)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(42)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(43)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(44)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3159 icv = mtfv[gs+(45)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(46)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(47)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(48)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; icv = mtfv[gs+(49)]; cost01 += s->len_pack[icv][0]; cost23 += s->len_pack[icv][1]; cost45 += s->len_pack[icv][2];; 3160 3161 3162 3163 cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; 3164 cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; 3165 cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; 3166 3167 } else { 3168 3169 for (i = gs; i <= ge; i++) { 3170 UInt16 icv = mtfv[i]; 3171 for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; 3172 } 3173 } 3174 3175 3176 3177 3178 3179 bc = 999999999; bt = -1; 3180 for (t = 0; t < nGroups; t++) 3181 if (cost[t] < bc) { bc = cost[t]; bt = t; }; 3182 totc += bc; 3183 fave[bt]++; 3184 s->selector[nSelectors] = bt; 3185 nSelectors++; 3186 3187 3188 3189 3190 if (nGroups == 6 && 50 == ge-gs+1) { 3191 3192 3193 3194 3195 s->rfreq[bt][ mtfv[gs+(0)] ]++; s->rfreq[bt][ mtfv[gs+(1)] ]++; s->rfreq[bt][ mtfv[gs+(2)] ]++; s->rfreq[bt][ mtfv[gs+(3)] ]++; s->rfreq[bt][ mtfv[gs+(4)] ]++; 3196 s->rfreq[bt][ mtfv[gs+(5)] ]++; s->rfreq[bt][ mtfv[gs+(6)] ]++; s->rfreq[bt][ mtfv[gs+(7)] ]++; s->rfreq[bt][ mtfv[gs+(8)] ]++; s->rfreq[bt][ mtfv[gs+(9)] ]++; 3197 s->rfreq[bt][ mtfv[gs+(10)] ]++; s->rfreq[bt][ mtfv[gs+(11)] ]++; s->rfreq[bt][ mtfv[gs+(12)] ]++; s->rfreq[bt][ mtfv[gs+(13)] ]++; s->rfreq[bt][ mtfv[gs+(14)] ]++; 3198 s->rfreq[bt][ mtfv[gs+(15)] ]++; s->rfreq[bt][ mtfv[gs+(16)] ]++; s->rfreq[bt][ mtfv[gs+(17)] ]++; s->rfreq[bt][ mtfv[gs+(18)] ]++; s->rfreq[bt][ mtfv[gs+(19)] ]++; 3199 s->rfreq[bt][ mtfv[gs+(20)] ]++; s->rfreq[bt][ mtfv[gs+(21)] ]++; s->rfreq[bt][ mtfv[gs+(22)] ]++; s->rfreq[bt][ mtfv[gs+(23)] ]++; s->rfreq[bt][ mtfv[gs+(24)] ]++; 3200 s->rfreq[bt][ mtfv[gs+(25)] ]++; s->rfreq[bt][ mtfv[gs+(26)] ]++; s->rfreq[bt][ mtfv[gs+(27)] ]++; s->rfreq[bt][ mtfv[gs+(28)] ]++; s->rfreq[bt][ mtfv[gs+(29)] ]++; 3201 s->rfreq[bt][ mtfv[gs+(30)] ]++; s->rfreq[bt][ mtfv[gs+(31)] ]++; s->rfreq[bt][ mtfv[gs+(32)] ]++; s->rfreq[bt][ mtfv[gs+(33)] ]++; s->rfreq[bt][ mtfv[gs+(34)] ]++; 3202 s->rfreq[bt][ mtfv[gs+(35)] ]++; s->rfreq[bt][ mtfv[gs+(36)] ]++; s->rfreq[bt][ mtfv[gs+(37)] ]++; s->rfreq[bt][ mtfv[gs+(38)] ]++; s->rfreq[bt][ mtfv[gs+(39)] ]++; 3203 s->rfreq[bt][ mtfv[gs+(40)] ]++; s->rfreq[bt][ mtfv[gs+(41)] ]++; s->rfreq[bt][ mtfv[gs+(42)] ]++; s->rfreq[bt][ mtfv[gs+(43)] ]++; s->rfreq[bt][ mtfv[gs+(44)] ]++; 3204 s->rfreq[bt][ mtfv[gs+(45)] ]++; s->rfreq[bt][ mtfv[gs+(46)] ]++; s->rfreq[bt][ mtfv[gs+(47)] ]++; s->rfreq[bt][ mtfv[gs+(48)] ]++; s->rfreq[bt][ mtfv[gs+(49)] ]++; 3205 3206 3207 3208 } else { 3209 3210 for (i = gs; i <= ge; i++) 3211 s->rfreq[bt][ mtfv[i] ]++; 3212 } 3213 3214 gs = ge+1; 3215 } 3216 if (s->verbosity >= 3) { 3217 vex_printf(" pass %d: size is %d, grp uses are ",iter+1,totc/8); 3218 3219 for (t = 0; t < nGroups; t++) 3220 vex_printf("%d ",fave[t]); 3221 vex_printf("\n"); 3222 } 3223 3224 3225 3226 3227 3228 3229 for (t = 0; t < nGroups; t++) 3230 BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 3231 alphaSize, 17 ); 3232 } 3233 3234 3235 { if (!(nGroups < 8)) bz_internal_error ( 3002 ); }; 3236 { if (!(nSelectors < 32768 && nSelectors <= (2 + (900000 / 50)))) bz_internal_error ( 3003 ); }; 3237 3238 3239 3240 3241 3242 { 3243 UChar pos[6], ll_i, tmp2, tmp; 3244 for (i = 0; i < nGroups; i++) pos[i] = i; 3245 for (i = 0; i < nSelectors; i++) { 3246 ll_i = s->selector[i]; 3247 j = 0; 3248 tmp = pos[j]; 3249 while ( ll_i != tmp ) { 3250 j++; 3251 tmp2 = tmp; 3252 tmp = pos[j]; 3253 pos[j] = tmp2; 3254 }; 3255 pos[0] = tmp; 3256 s->selectorMtf[i] = j; 3257 } 3258 }; 3259 3260 3261 for (t = 0; t < nGroups; t++) { 3262 minLen = 32; 3263 maxLen = 0; 3264 for (i = 0; i < alphaSize; i++) { 3265 if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; 3266 if (s->len[t][i] < minLen) minLen = s->len[t][i]; 3267 } 3268 { if (!(!(maxLen > 17 ))) bz_internal_error ( 3004 ); }; 3269 { if (!(!(minLen < 1))) bz_internal_error ( 3005 ); }; 3270 BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 3271 minLen, maxLen, alphaSize ); 3272 } 3273 3274 3275 { 3276 Bool inUse16[16]; 3277 for (i = 0; i < 16; i++) { 3278 inUse16[i] = ((Bool)0); 3279 for (j = 0; j < 16; j++) 3280 if (s->inUse[i * 16 + j]) inUse16[i] = ((Bool)1); 3281 } 3282 3283 nBytes = s->numZ; 3284 for (i = 0; i < 16; i++) 3285 if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); 3286 3287 for (i = 0; i < 16; i++) 3288 if (inUse16[i]) 3289 for (j = 0; j < 16; j++) { 3290 if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); 3291 } 3292 3293 if (s->verbosity >= 3) 3294 vex_printf(" bytes: mapping %d, ",s->numZ-nBytes); 3295 } 3296 3297 3298 nBytes = s->numZ; 3299 bsW ( s, 3, nGroups ); 3300 bsW ( s, 15, nSelectors ); 3301 for (i = 0; i < nSelectors; i++) { 3302 for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); 3303 bsW(s,1,0); 3304 } 3305 if (s->verbosity >= 3) 3306 vex_printf("selectors %d, ",s->numZ-nBytes); 3307 3308 3309 nBytes = s->numZ; 3310 3311 for (t = 0; t < nGroups; t++) { 3312 Int32 curr = s->len[t][0]; 3313 bsW ( s, 5, curr ); 3314 for (i = 0; i < alphaSize; i++) { 3315 while (curr < s->len[t][i]) { bsW(s,2,2); curr++; }; 3316 while (curr > s->len[t][i]) { bsW(s,2,3); curr--; }; 3317 bsW ( s, 1, 0 ); 3318 } 3319 } 3320 3321 if (s->verbosity >= 3) 3322 vex_printf("code lengths %d, ",s->numZ-nBytes); 3323 3324 3325 nBytes = s->numZ; 3326 selCtr = 0; 3327 gs = 0; 3328 while (((Bool)1)) { 3329 if (gs >= s->nMTF) break; 3330 ge = gs + 50 - 1; 3331 if (ge >= s->nMTF) ge = s->nMTF-1; 3332 { if (!(s->selector[selCtr] < nGroups)) bz_internal_error ( 3006 ); }; 3333 3334 if (nGroups == 6 && 50 == ge-gs+1) { 3335 3336 UInt16 mtfv_i; 3337 UChar* s_len_sel_selCtr 3338 = &(s->len[s->selector[selCtr]][0]); 3339 Int32* s_code_sel_selCtr 3340 = &(s->code[s->selector[selCtr]][0]); 3341 3342 3343 3344 3345 3346 3347 3348 mtfv_i = mtfv[gs+(0)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(1)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(2)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(3)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(4)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3349 mtfv_i = mtfv[gs+(5)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(6)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(7)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(8)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(9)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3350 mtfv_i = mtfv[gs+(10)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(11)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(12)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(13)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(14)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3351 mtfv_i = mtfv[gs+(15)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(16)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(17)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(18)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(19)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3352 mtfv_i = mtfv[gs+(20)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(21)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(22)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(23)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(24)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3353 mtfv_i = mtfv[gs+(25)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(26)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(27)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(28)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(29)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3354 mtfv_i = mtfv[gs+(30)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(31)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(32)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(33)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(34)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3355 mtfv_i = mtfv[gs+(35)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(36)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(37)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(38)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(39)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3356 mtfv_i = mtfv[gs+(40)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(41)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(42)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(43)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(44)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3357 mtfv_i = mtfv[gs+(45)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(46)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(47)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(48)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); mtfv_i = mtfv[gs+(49)]; bsW ( s, s_len_sel_selCtr[mtfv_i], s_code_sel_selCtr[mtfv_i] ); 3358 3359 3360 3361 } else { 3362 3363 for (i = gs; i <= ge; i++) { 3364 bsW ( s, 3365 s->len [s->selector[selCtr]] [mtfv[i]], 3366 s->code [s->selector[selCtr]] [mtfv[i]] ); 3367 } 3368 } 3369 3370 3371 gs = ge+1; 3372 selCtr++; 3373 } 3374 { if (!(selCtr == nSelectors)) bz_internal_error ( 3007 ); }; 3375 3376 if (s->verbosity >= 3) 3377 vex_printf("codes %d\n",s->numZ-nBytes); 3378 } 3379 3380 3381 3382 void BZ2_compressBlock ( EState* s, Bool is_last_block ) 3383 { 3384 if (s->nblock > 0) { 3385 3386 { s->blockCRC = ~(s->blockCRC); }; 3387 s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); 3388 s->combinedCRC ^= s->blockCRC; 3389 if (s->blockNo > 1) s->numZ = 0; 3390 3391 if (s->verbosity >= 2) 3392 vex_printf(" block %d: crc = 0x%08x, " "combined CRC = 0x%08x, size = %d\n",s->blockNo,s->blockCRC,s->combinedCRC,s->nblock); 3393 3394 3395 3396 BZ2_blockSort ( s ); 3397 } 3398 3399 s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); 3400 3401 3402 if (s->blockNo == 1) { 3403 BZ2_bsInitWrite ( s ); 3404 bsPutUChar ( s, 0x42 ); 3405 bsPutUChar ( s, 0x5a ); 3406 bsPutUChar ( s, 0x68 ); 3407 bsPutUChar ( s, (UChar)(0x30 + s->blockSize100k) ); 3408 } 3409 3410 if (s->nblock > 0) { 3411 3412 bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); 3413 bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); 3414 bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); 3415 3416 3417 bsPutUInt32 ( s, s->blockCRC ); 3418 3419 bsW(s,1,0); 3420 3421 bsW ( s, 24, s->origPtr ); 3422 generateMTFValues ( s ); 3423 sendMTFValues ( s ); 3424 } 3425 3426 3427 3428 if (is_last_block) { 3429 3430 bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); 3431 bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); 3432 bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); 3433 bsPutUInt32 ( s, s->combinedCRC ); 3434 if (s->verbosity >= 2) 3435 vex_printf(" final combined CRC = 0x%08x\n ",s->combinedCRC); 3436 bsFinishWrite ( s ); 3437 } 3438 } 3439 3440 Int32 BZ2_rNums[512] = { 3441 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 3442 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 3443 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 3444 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 3445 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 3446 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 3447 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 3448 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 3449 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 3450 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 3451 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 3452 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 3453 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 3454 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 3455 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 3456 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 3457 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 3458 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 3459 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 3460 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 3461 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 3462 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 3463 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 3464 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 3465 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 3466 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 3467 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 3468 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 3469 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 3470 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 3471 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 3472 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 3473 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 3474 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 3475 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 3476 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 3477 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 3478 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 3479 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 3480 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 3481 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 3482 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 3483 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 3484 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 3485 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 3486 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 3487 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 3488 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 3489 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 3490 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 3491 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 3492 936, 638 3493 }; 3494 3495 UInt32 BZ2_crc32Table[256] = { 3496 3497 3498 3499 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, 3500 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, 3501 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, 3502 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, 3503 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, 3504 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, 3505 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, 3506 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, 3507 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, 3508 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, 3509 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, 3510 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, 3511 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, 3512 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, 3513 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, 3514 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, 3515 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, 3516 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, 3517 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, 3518 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, 3519 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, 3520 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, 3521 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, 3522 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, 3523 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, 3524 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, 3525 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, 3526 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, 3527 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, 3528 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, 3529 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, 3530 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, 3531 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, 3532 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, 3533 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, 3534 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, 3535 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, 3536 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, 3537 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, 3538 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, 3539 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, 3540 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, 3541 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, 3542 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, 3543 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, 3544 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, 3545 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, 3546 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, 3547 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, 3548 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, 3549 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, 3550 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, 3551 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, 3552 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, 3553 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, 3554 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, 3555 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, 3556 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, 3557 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, 3558 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, 3559 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, 3560 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, 3561 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, 3562 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L 3563 }; 3564 3565 void BZ2_bz__AssertH__fail ( int errcode ) 3566 { 3567 vex_printf("BZ2_bz__AssertH__fail(%d) called, exiting\n", errcode); 3568 (*serviceFn)(0,0); 3569 } 3570 3571 void bz_internal_error ( int errcode ) 3572 { 3573 vex_printf("bz_internal_error called, exiting\n", errcode); 3574 (*serviceFn)(0,0); 3575 } 3576 3577 3578 static 3579 int bz_config_ok ( void ) 3580 { 3581 if (sizeof(int) != 4) return 0; 3582 if (sizeof(short) != 2) return 0; 3583 if (sizeof(char) != 1) return 0; 3584 return 1; 3585 } 3586 3587 3588 3589 static 3590 void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) 3591 { 3592 void* v = (void*) (*serviceFn)(2, items * size ); 3593 return v; 3594 } 3595 3596 static 3597 void default_bzfree ( void* opaque, void* addr ) 3598 { 3599 if (addr != ((void *)0)) (*serviceFn)( 3, (HWord)addr ); 3600 } 3601 3602 3603 3604 static 3605 void prepare_new_block ( EState* s ) 3606 { 3607 Int32 i; 3608 s->nblock = 0; 3609 s->numZ = 0; 3610 s->state_out_pos = 0; 3611 { s->blockCRC = 0xffffffffL; }; 3612 for (i = 0; i < 256; i++) s->inUse[i] = ((Bool)0); 3613 s->blockNo++; 3614 } 3615 3616 3617 3618 static 3619 void init_RL ( EState* s ) 3620 { 3621 s->state_in_ch = 256; 3622 s->state_in_len = 0; 3623 } 3624 3625 3626 static 3627 Bool isempty_RL ( EState* s ) 3628 { 3629 if (s->state_in_ch < 256 && s->state_in_len > 0) 3630 return ((Bool)0); else 3631 return ((Bool)1); 3632 } 3633 3634 3635 3636 int BZ2_bzCompressInit 3637 ( bz_stream* strm, 3638 int blockSize100k, 3639 int verbosity, 3640 int workFactor ) 3641 { 3642 Int32 n; 3643 EState* s; 3644 3645 if (!bz_config_ok()) return (-9); 3646 3647 if (strm == ((void *)0) || 3648 blockSize100k < 1 || blockSize100k > 9 || 3649 workFactor < 0 || workFactor > 250) 3650 return (-2); 3651 3652 if (workFactor == 0) workFactor = 30; 3653 if (strm->bzalloc == ((void *)0)) strm->bzalloc = default_bzalloc; 3654 if (strm->bzfree == ((void *)0)) strm->bzfree = default_bzfree; 3655 3656 s = (strm->bzalloc)(strm->opaque,(sizeof(EState)),1); 3657 if (s == ((void *)0)) return (-3); 3658 s->strm = strm; 3659 3660 s->arr1 = ((void *)0); 3661 s->arr2 = ((void *)0); 3662 s->ftab = ((void *)0); 3663 3664 n = 100000 * blockSize100k; 3665 s->arr1 = (strm->bzalloc)(strm->opaque,(n * sizeof(UInt32)),1); 3666 s->arr2 = (strm->bzalloc)(strm->opaque,((n+(2 + 12 + 18 + 2)) * sizeof(UInt32)),1); 3667 s->ftab = (strm->bzalloc)(strm->opaque,(65537 * sizeof(UInt32)),1); 3668 3669 if (s->arr1 == ((void *)0) || s->arr2 == ((void *)0) || s->ftab == ((void *)0)) { 3670 if (s->arr1 != ((void *)0)) (strm->bzfree)(strm->opaque,(s->arr1)); 3671 if (s->arr2 != ((void *)0)) (strm->bzfree)(strm->opaque,(s->arr2)); 3672 if (s->ftab != ((void *)0)) (strm->bzfree)(strm->opaque,(s->ftab)); 3673 if (s != ((void *)0)) (strm->bzfree)(strm->opaque,(s)); 3674 return (-3); 3675 } 3676 3677 s->blockNo = 0; 3678 s->state = 2; 3679 s->mode = 2; 3680 s->combinedCRC = 0; 3681 s->blockSize100k = blockSize100k; 3682 s->nblockMAX = 100000 * blockSize100k - 19; 3683 s->verbosity = verbosity; 3684 s->workFactor = workFactor; 3685 3686 s->block = (UChar*)s->arr2; 3687 s->mtfv = (UInt16*)s->arr1; 3688 s->zbits = ((void *)0); 3689 s->ptr = (UInt32*)s->arr1; 3690 3691 strm->state = s; 3692 strm->total_in_lo32 = 0; 3693 strm->total_in_hi32 = 0; 3694 strm->total_out_lo32 = 0; 3695 strm->total_out_hi32 = 0; 3696 init_RL ( s ); 3697 prepare_new_block ( s ); 3698 return 0; 3699 } 3700 3701 3702 3703 static 3704 void add_pair_to_block ( EState* s ) 3705 { 3706 Int32 i; 3707 UChar ch = (UChar)(s->state_in_ch); 3708 for (i = 0; i < s->state_in_len; i++) { 3709 { s->blockCRC = (s->blockCRC << 8) ^ BZ2_crc32Table[(s->blockCRC >> 24) ^ ((UChar)ch)]; }; 3710 } 3711 s->inUse[s->state_in_ch] = ((Bool)1); 3712 switch (s->state_in_len) { 3713 case 1: 3714 s->block[s->nblock] = (UChar)ch; s->nblock++; 3715 break; 3716 case 2: 3717 s->block[s->nblock] = (UChar)ch; s->nblock++; 3718 s->block[s->nblock] = (UChar)ch; s->nblock++; 3719 break; 3720 case 3: 3721 s->block[s->nblock] = (UChar)ch; s->nblock++; 3722 s->block[s->nblock] = (UChar)ch; s->nblock++; 3723 s->block[s->nblock] = (UChar)ch; s->nblock++; 3724 break; 3725 default: 3726 s->inUse[s->state_in_len-4] = ((Bool)1); 3727 s->block[s->nblock] = (UChar)ch; s->nblock++; 3728 s->block[s->nblock] = (UChar)ch; s->nblock++; 3729 s->block[s->nblock] = (UChar)ch; s->nblock++; 3730 s->block[s->nblock] = (UChar)ch; s->nblock++; 3731 s->block[s->nblock] = ((UChar)(s->state_in_len-4)); 3732 s->nblock++; 3733 break; 3734 } 3735 } 3736 3737 3738 3739 static 3740 void flush_RL ( EState* s ) 3741 { 3742 if (s->state_in_ch < 256) add_pair_to_block ( s ); 3743 init_RL ( s ); 3744 } 3745 3746 static 3747 Bool copy_input_until_stop ( EState* s ) 3748 { 3749 Bool progress_in = ((Bool)0); 3750 3751 if (s->mode == 2) { 3752 3753 3754 while (((Bool)1)) { 3755 3756 if (s->nblock >= s->nblockMAX) break; 3757 3758 if (s->strm->avail_in == 0) break; 3759 progress_in = ((Bool)1); 3760 { UInt32 zchh = (UInt32)((UInt32)(*((UChar*)(s->strm->next_in)))); if (zchh != s->state_in_ch && s->state_in_len == 1) { UChar ch = (UChar)(s->state_in_ch); { s->blockCRC = (s->blockCRC << 8) ^ BZ2_crc32Table[(s->blockCRC >> 24) ^ ((UChar)ch)]; }; s->inUse[s->state_in_ch] = ((Bool)1); s->block[s->nblock] = (UChar)ch; s->nblock++; s->state_in_ch = zchh; } else if (zchh != s->state_in_ch || s->state_in_len == 255) { if (s->state_in_ch < 256) add_pair_to_block ( s ); s->state_in_ch = zchh; s->state_in_len = 1; } else { s->state_in_len++; } }; 3761 s->strm->next_in++; 3762 s->strm->avail_in--; 3763 s->strm->total_in_lo32++; 3764 if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; 3765 } 3766 3767 } else { 3768 3769 3770 while (((Bool)1)) { 3771 3772 if (s->nblock >= s->nblockMAX) break; 3773 3774 if (s->strm->avail_in == 0) break; 3775 3776 if (s->avail_in_expect == 0) break; 3777 progress_in = ((Bool)1); 3778 { UInt32 zchh = (UInt32)((UInt32)(*((UChar*)(s->strm->next_in)))); if (zchh != s->state_in_ch && s->state_in_len == 1) { UChar ch = (UChar)(s->state_in_ch); { s->blockCRC = (s->blockCRC << 8) ^ BZ2_crc32Table[(s->blockCRC >> 24) ^ ((UChar)ch)]; }; s->inUse[s->state_in_ch] = ((Bool)1); s->block[s->nblock] = (UChar)ch; s->nblock++; s->state_in_ch = zchh; } else if (zchh != s->state_in_ch || s->state_in_len == 255) { if (s->state_in_ch < 256) add_pair_to_block ( s ); s->state_in_ch = zchh; s->state_in_len = 1; } else { s->state_in_len++; } }; 3779 s->strm->next_in++; 3780 s->strm->avail_in--; 3781 s->strm->total_in_lo32++; 3782 if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; 3783 s->avail_in_expect--; 3784 } 3785 } 3786 return progress_in; 3787 } 3788 3789 3790 3791 static 3792 Bool copy_output_until_stop ( EState* s ) 3793 { 3794 Bool progress_out = ((Bool)0); 3795 3796 while (((Bool)1)) { 3797 3798 3799 if (s->strm->avail_out == 0) break; 3800 3801 3802 if (s->state_out_pos >= s->numZ) break; 3803 3804 progress_out = ((Bool)1); 3805 *(s->strm->next_out) = s->zbits[s->state_out_pos]; 3806 s->state_out_pos++; 3807 s->strm->avail_out--; 3808 s->strm->next_out++; 3809 s->strm->total_out_lo32++; 3810 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 3811 } 3812 3813 return progress_out; 3814 } 3815 3816 3817 3818 static 3819 Bool handle_compress ( bz_stream* strm ) 3820 { 3821 Bool progress_in = ((Bool)0); 3822 Bool progress_out = ((Bool)0); 3823 EState* s = strm->state; 3824 3825 while (((Bool)1)) { 3826 3827 if (s->state == 1) { 3828 progress_out |= copy_output_until_stop ( s ); 3829 if (s->state_out_pos < s->numZ) break; 3830 if (s->mode == 4 && 3831 s->avail_in_expect == 0 && 3832 isempty_RL(s)) break; 3833 prepare_new_block ( s ); 3834 s->state = 2; 3835 if (s->mode == 3 && 3836 s->avail_in_expect == 0 && 3837 isempty_RL(s)) break; 3838 } 3839 3840 if (s->state == 2) { 3841 progress_in |= copy_input_until_stop ( s ); 3842 if (s->mode != 2 && s->avail_in_expect == 0) { 3843 flush_RL ( s ); 3844 BZ2_compressBlock ( s, (Bool)(s->mode == 4) ); 3845 s->state = 1; 3846 } 3847 else 3848 if (s->nblock >= s->nblockMAX) { 3849 BZ2_compressBlock ( s, ((Bool)0) ); 3850 s->state = 1; 3851 } 3852 else 3853 if (s->strm->avail_in == 0) { 3854 break; 3855 } 3856 } 3857 3858 } 3859 3860 return progress_in || progress_out; 3861 } 3862 3863 3864 3865 int BZ2_bzCompress ( bz_stream *strm, int action ) 3866 { 3867 Bool progress; 3868 EState* s; 3869 if (strm == ((void *)0)) return (-2); 3870 s = strm->state; 3871 if (s == ((void *)0)) return (-2); 3872 if (s->strm != strm) return (-2); 3873 3874 preswitch: 3875 switch (s->mode) { 3876 3877 case 1: 3878 return (-1); 3879 3880 case 2: 3881 if (action == 0) { 3882 progress = handle_compress ( strm ); 3883 return progress ? 1 : (-2); 3884 } 3885 else 3886 if (action == 1) { 3887 s->avail_in_expect = strm->avail_in; 3888 s->mode = 3; 3889 goto preswitch; 3890 } 3891 else 3892 if (action == 2) { 3893 s->avail_in_expect = strm->avail_in; 3894 s->mode = 4; 3895 goto preswitch; 3896 } 3897 else 3898 return (-2); 3899 3900 case 3: 3901 if (action != 1) return (-1); 3902 if (s->avail_in_expect != s->strm->avail_in) 3903 return (-1); 3904 progress = handle_compress ( strm ); 3905 if (s->avail_in_expect > 0 || !isempty_RL(s) || 3906 s->state_out_pos < s->numZ) return 2; 3907 s->mode = 2; 3908 return 1; 3909 3910 case 4: 3911 if (action != 2) return (-1); 3912 if (s->avail_in_expect != s->strm->avail_in) 3913 return (-1); 3914 progress = handle_compress ( strm ); 3915 if (!progress) return (-1); 3916 if (s->avail_in_expect > 0 || !isempty_RL(s) || 3917 s->state_out_pos < s->numZ) return 3; 3918 s->mode = 1; 3919 return 4; 3920 } 3921 return 0; 3922 } 3923 3924 3925 3926 int BZ2_bzCompressEnd ( bz_stream *strm ) 3927 { 3928 EState* s; 3929 if (strm == ((void *)0)) return (-2); 3930 s = strm->state; 3931 if (s == ((void *)0)) return (-2); 3932 if (s->strm != strm) return (-2); 3933 3934 if (s->arr1 != ((void *)0)) (strm->bzfree)(strm->opaque,(s->arr1)); 3935 if (s->arr2 != ((void *)0)) (strm->bzfree)(strm->opaque,(s->arr2)); 3936 if (s->ftab != ((void *)0)) (strm->bzfree)(strm->opaque,(s->ftab)); 3937 (strm->bzfree)(strm->opaque,(strm->state)); 3938 3939 strm->state = ((void *)0); 3940 3941 return 0; 3942 } 3943 3944 3945 3946 3947 3948 3949 3950 int BZ2_bzDecompressInit 3951 ( bz_stream* strm, 3952 int verbosity, 3953 int small ) 3954 { 3955 DState* s; 3956 3957 if (!bz_config_ok()) return (-9); 3958 3959 if (strm == ((void *)0)) return (-2); 3960 if (small != 0 && small != 1) return (-2); 3961 if (verbosity < 0 || verbosity > 4) return (-2); 3962 3963 if (strm->bzalloc == ((void *)0)) strm->bzalloc = default_bzalloc; 3964 if (strm->bzfree == ((void *)0)) strm->bzfree = default_bzfree; 3965 3966 s = (strm->bzalloc)(strm->opaque,(sizeof(DState)),1); 3967 if (s == ((void *)0)) return (-3); 3968 s->strm = strm; 3969 strm->state = s; 3970 s->state = 10; 3971 s->bsLive = 0; 3972 s->bsBuff = 0; 3973 s->calculatedCombinedCRC = 0; 3974 strm->total_in_lo32 = 0; 3975 strm->total_in_hi32 = 0; 3976 strm->total_out_lo32 = 0; 3977 strm->total_out_hi32 = 0; 3978 s->smallDecompress = (Bool)small; 3979 s->ll4 = ((void *)0); 3980 s->ll16 = ((void *)0); 3981 s->tt = ((void *)0); 3982 s->currBlockNo = 0; 3983 s->verbosity = verbosity; 3984 3985 return 0; 3986 } 3987 3988 3989 3990 3991 3992 3993 static 3994 Bool unRLE_obuf_to_output_FAST ( DState* s ) 3995 { 3996 UChar k1; 3997 3998 if (s->blockRandomised) { 3999 4000 while (((Bool)1)) { 4001 4002 while (((Bool)1)) { 4003 if (s->strm->avail_out == 0) return ((Bool)0); 4004 if (s->state_out_len == 0) break; 4005 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 4006 { s->calculatedBlockCRC = (s->calculatedBlockCRC << 8) ^ BZ2_crc32Table[(s->calculatedBlockCRC >> 24) ^ ((UChar)s->state_out_ch)]; }; 4007 s->state_out_len--; 4008 s->strm->next_out++; 4009 s->strm->avail_out--; 4010 s->strm->total_out_lo32++; 4011 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 4012 } 4013 4014 4015 if (s->nblock_used == s->save_nblock+1) return ((Bool)0); 4016 4017 4018 if (s->nblock_used > s->save_nblock+1) 4019 return ((Bool)1); 4020 4021 s->state_out_len = 1; 4022 s->state_out_ch = s->k0; 4023 s->tPos = s->tt[s->tPos]; k1 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4024 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4025 if (s->nblock_used == s->save_nblock+1) continue; 4026 if (k1 != s->k0) { s->k0 = k1; continue; }; 4027 4028 s->state_out_len = 2; 4029 s->tPos = s->tt[s->tPos]; k1 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4030 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4031 if (s->nblock_used == s->save_nblock+1) continue; 4032 if (k1 != s->k0) { s->k0 = k1; continue; }; 4033 4034 s->state_out_len = 3; 4035 s->tPos = s->tt[s->tPos]; k1 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4036 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4037 if (s->nblock_used == s->save_nblock+1) continue; 4038 if (k1 != s->k0) { s->k0 = k1; continue; }; 4039 4040 s->tPos = s->tt[s->tPos]; k1 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4041 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4042 s->state_out_len = ((Int32)k1) + 4; 4043 s->tPos = s->tt[s->tPos]; s->k0 = (UChar)(s->tPos & 0xff); s->tPos >>= 8;; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4044 s->k0 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4045 } 4046 4047 } else { 4048 4049 4050 UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; 4051 UChar c_state_out_ch = s->state_out_ch; 4052 Int32 c_state_out_len = s->state_out_len; 4053 Int32 c_nblock_used = s->nblock_used; 4054 Int32 c_k0 = s->k0; 4055 UInt32* c_tt = s->tt; 4056 UInt32 c_tPos = s->tPos; 4057 char* cs_next_out = s->strm->next_out; 4058 unsigned int cs_avail_out = s->strm->avail_out; 4059 4060 4061 UInt32 avail_out_INIT = cs_avail_out; 4062 Int32 s_save_nblockPP = s->save_nblock+1; 4063 unsigned int total_out_lo32_old; 4064 4065 while (((Bool)1)) { 4066 4067 4068 if (c_state_out_len > 0) { 4069 while (((Bool)1)) { 4070 if (cs_avail_out == 0) goto return_notr; 4071 if (c_state_out_len == 1) break; 4072 *( (UChar*)(cs_next_out) ) = c_state_out_ch; 4073 { c_calculatedBlockCRC = (c_calculatedBlockCRC << 8) ^ BZ2_crc32Table[(c_calculatedBlockCRC >> 24) ^ ((UChar)c_state_out_ch)]; }; 4074 c_state_out_len--; 4075 cs_next_out++; 4076 cs_avail_out--; 4077 } 4078 s_state_out_len_eq_one: 4079 { 4080 if (cs_avail_out == 0) { 4081 c_state_out_len = 1; goto return_notr; 4082 }; 4083 *( (UChar*)(cs_next_out) ) = c_state_out_ch; 4084 { c_calculatedBlockCRC = (c_calculatedBlockCRC << 8) ^ BZ2_crc32Table[(c_calculatedBlockCRC >> 24) ^ ((UChar)c_state_out_ch)]; }; 4085 cs_next_out++; 4086 cs_avail_out--; 4087 } 4088 } 4089 4090 if (c_nblock_used > s_save_nblockPP) 4091 return ((Bool)1); 4092 4093 4094 if (c_nblock_used == s_save_nblockPP) { 4095 c_state_out_len = 0; goto return_notr; 4096 }; 4097 c_state_out_ch = c_k0; 4098 c_tPos = c_tt[c_tPos]; k1 = (UChar)(c_tPos & 0xff); c_tPos >>= 8;; c_nblock_used++; 4099 if (k1 != c_k0) { 4100 c_k0 = k1; goto s_state_out_len_eq_one; 4101 }; 4102 if (c_nblock_used == s_save_nblockPP) 4103 goto s_state_out_len_eq_one; 4104 4105 c_state_out_len = 2; 4106 c_tPos = c_tt[c_tPos]; k1 = (UChar)(c_tPos & 0xff); c_tPos >>= 8;; c_nblock_used++; 4107 if (c_nblock_used == s_save_nblockPP) continue; 4108 if (k1 != c_k0) { c_k0 = k1; continue; }; 4109 4110 c_state_out_len = 3; 4111 c_tPos = c_tt[c_tPos]; k1 = (UChar)(c_tPos & 0xff); c_tPos >>= 8;; c_nblock_used++; 4112 if (c_nblock_used == s_save_nblockPP) continue; 4113 if (k1 != c_k0) { c_k0 = k1; continue; }; 4114 4115 c_tPos = c_tt[c_tPos]; k1 = (UChar)(c_tPos & 0xff); c_tPos >>= 8;; c_nblock_used++; 4116 c_state_out_len = ((Int32)k1) + 4; 4117 c_tPos = c_tt[c_tPos]; c_k0 = (UChar)(c_tPos & 0xff); c_tPos >>= 8;; c_nblock_used++; 4118 } 4119 4120 return_notr: 4121 total_out_lo32_old = s->strm->total_out_lo32; 4122 s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); 4123 if (s->strm->total_out_lo32 < total_out_lo32_old) 4124 s->strm->total_out_hi32++; 4125 4126 4127 s->calculatedBlockCRC = c_calculatedBlockCRC; 4128 s->state_out_ch = c_state_out_ch; 4129 s->state_out_len = c_state_out_len; 4130 s->nblock_used = c_nblock_used; 4131 s->k0 = c_k0; 4132 s->tt = c_tt; 4133 s->tPos = c_tPos; 4134 s->strm->next_out = cs_next_out; 4135 s->strm->avail_out = cs_avail_out; 4136 4137 } 4138 return ((Bool)0); 4139 } 4140 4141 4142 4143 4144 4145 4146 4147 static 4148 Bool unRLE_obuf_to_output_SMALL ( DState* s ) 4149 { 4150 UChar k1; 4151 4152 if (s->blockRandomised) { 4153 4154 while (((Bool)1)) { 4155 4156 while (((Bool)1)) { 4157 if (s->strm->avail_out == 0) return ((Bool)0); 4158 if (s->state_out_len == 0) break; 4159 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 4160 { s->calculatedBlockCRC = (s->calculatedBlockCRC << 8) ^ BZ2_crc32Table[(s->calculatedBlockCRC >> 24) ^ ((UChar)s->state_out_ch)]; }; 4161 s->state_out_len--; 4162 s->strm->next_out++; 4163 s->strm->avail_out--; 4164 s->strm->total_out_lo32++; 4165 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 4166 } 4167 4168 4169 if (s->nblock_used == s->save_nblock+1) return ((Bool)0); 4170 4171 4172 if (s->nblock_used > s->save_nblock+1) 4173 return ((Bool)1); 4174 4175 s->state_out_len = 1; 4176 s->state_out_ch = s->k0; 4177 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4178 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4179 if (s->nblock_used == s->save_nblock+1) continue; 4180 if (k1 != s->k0) { s->k0 = k1; continue; }; 4181 4182 s->state_out_len = 2; 4183 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4184 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4185 if (s->nblock_used == s->save_nblock+1) continue; 4186 if (k1 != s->k0) { s->k0 = k1; continue; }; 4187 4188 s->state_out_len = 3; 4189 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4190 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4191 if (s->nblock_used == s->save_nblock+1) continue; 4192 if (k1 != s->k0) { s->k0 = k1; continue; }; 4193 4194 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4195 k1 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4196 s->state_out_len = ((Int32)k1) + 4; 4197 s->k0 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; if (s->rNToGo == 0) { s->rNToGo = BZ2_rNums[s->rTPos]; s->rTPos++; if (s->rTPos == 512) s->rTPos = 0; } s->rNToGo--;; 4198 s->k0 ^= ((s->rNToGo == 1) ? 1 : 0); s->nblock_used++; 4199 } 4200 4201 } else { 4202 4203 while (((Bool)1)) { 4204 4205 while (((Bool)1)) { 4206 if (s->strm->avail_out == 0) return ((Bool)0); 4207 if (s->state_out_len == 0) break; 4208 *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 4209 { s->calculatedBlockCRC = (s->calculatedBlockCRC << 8) ^ BZ2_crc32Table[(s->calculatedBlockCRC >> 24) ^ ((UChar)s->state_out_ch)]; }; 4210 s->state_out_len--; 4211 s->strm->next_out++; 4212 s->strm->avail_out--; 4213 s->strm->total_out_lo32++; 4214 if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 4215 } 4216 4217 4218 if (s->nblock_used == s->save_nblock+1) return ((Bool)0); 4219 4220 4221 if (s->nblock_used > s->save_nblock+1) 4222 return ((Bool)1); 4223 4224 s->state_out_len = 1; 4225 s->state_out_ch = s->k0; 4226 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 4227 if (s->nblock_used == s->save_nblock+1) continue; 4228 if (k1 != s->k0) { s->k0 = k1; continue; }; 4229 4230 s->state_out_len = 2; 4231 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 4232 if (s->nblock_used == s->save_nblock+1) continue; 4233 if (k1 != s->k0) { s->k0 = k1; continue; }; 4234 4235 s->state_out_len = 3; 4236 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 4237 if (s->nblock_used == s->save_nblock+1) continue; 4238 if (k1 != s->k0) { s->k0 = k1; continue; }; 4239 4240 k1 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 4241 s->state_out_len = ((Int32)k1) + 4; 4242 s->k0 = BZ2_indexIntoF ( s->tPos, s->cftab ); s->tPos = (((UInt32)s->ll16[s->tPos]) | (((((UInt32)(s->ll4[(s->tPos) >> 1])) >> (((s->tPos) << 2) & 0x4)) & 0xF) << 16));; s->nblock_used++; 4243 } 4244 4245 } 4246 } 4247 4248 4249 4250 int BZ2_bzDecompress ( bz_stream *strm ) 4251 { 4252 Bool corrupt; 4253 DState* s; 4254 if (strm == ((void *)0)) return (-2); 4255 s = strm->state; 4256 if (s == ((void *)0)) return (-2); 4257 if (s->strm != strm) return (-2); 4258 4259 while (((Bool)1)) { 4260 if (s->state == 1) return (-1); 4261 if (s->state == 2) { 4262 if (s->smallDecompress) 4263 corrupt = unRLE_obuf_to_output_SMALL ( s ); else 4264 corrupt = unRLE_obuf_to_output_FAST ( s ); 4265 if (corrupt) return (-4); 4266 if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { 4267 { s->calculatedBlockCRC = ~(s->calculatedBlockCRC); }; 4268 if (s->verbosity >= 3) 4269 vex_printf(" {0x%08x, 0x%08x}",s->storedBlockCRC,s->calculatedBlockCRC); 4270 4271 if (s->verbosity >= 2) vex_printf("]"); 4272 if (s->calculatedBlockCRC != s->storedBlockCRC) 4273 return (-4); 4274 s->calculatedCombinedCRC 4275 = (s->calculatedCombinedCRC << 1) | 4276 (s->calculatedCombinedCRC >> 31); 4277 s->calculatedCombinedCRC ^= s->calculatedBlockCRC; 4278 s->state = 14; 4279 } else { 4280 return 0; 4281 } 4282 } 4283 if (s->state >= 10) { 4284 Int32 r = BZ2_decompress ( s ); 4285 if (r == 4) { 4286 if (s->verbosity >= 3) 4287 vex_printf("\n combined CRCs: stored = 0x%08x, computed = 0x%08x",s->storedCombinedCRC,s->calculatedCombinedCRC); 4288 4289 if (s->calculatedCombinedCRC != s->storedCombinedCRC) 4290 return (-4); 4291 return r; 4292 } 4293 if (s->state != 2) return r; 4294 } 4295 } 4296 4297 { if (!(0)) bz_internal_error ( 6001 ); }; 4298 4299 return 0; 4300 } 4301 4302 4303 4304 int BZ2_bzDecompressEnd ( bz_stream *strm ) 4305 { 4306 DState* s; 4307 if (strm == ((void *)0)) return (-2); 4308 s = strm->state; 4309 if (s == ((void *)0)) return (-2); 4310 if (s->strm != strm) return (-2); 4311 4312 if (s->tt != ((void *)0)) (strm->bzfree)(strm->opaque,(s->tt)); 4313 if (s->ll16 != ((void *)0)) (strm->bzfree)(strm->opaque,(s->ll16)); 4314 if (s->ll4 != ((void *)0)) (strm->bzfree)(strm->opaque,(s->ll4)); 4315 4316 (strm->bzfree)(strm->opaque,(strm->state)); 4317 strm->state = ((void *)0); 4318 4319 return 0; 4320 } 4321 4322 int BZ2_bzBuffToBuffCompress 4323 ( char* dest, 4324 unsigned int* destLen, 4325 char* source, 4326 unsigned int sourceLen, 4327 int blockSize100k, 4328 int verbosity, 4329 int workFactor ) 4330 { 4331 bz_stream strm; 4332 int ret; 4333 4334 if (dest == ((void *)0) || destLen == ((void *)0) || 4335 source == ((void *)0) || 4336 blockSize100k < 1 || blockSize100k > 9 || 4337 verbosity < 0 || verbosity > 4 || 4338 workFactor < 0 || workFactor > 250) 4339 return (-2); 4340 4341 if (workFactor == 0) workFactor = 30; 4342 strm.bzalloc = ((void *)0); 4343 strm.bzfree = ((void *)0); 4344 strm.opaque = ((void *)0); 4345 ret = BZ2_bzCompressInit ( &strm, blockSize100k, 4346 verbosity, workFactor ); 4347 if (ret != 0) return ret; 4348 4349 strm.next_in = source; 4350 strm.next_out = dest; 4351 strm.avail_in = sourceLen; 4352 strm.avail_out = *destLen; 4353 4354 ret = BZ2_bzCompress ( &strm, 2 ); 4355 if (ret == 3) goto output_overflow; 4356 if (ret != 4) goto errhandler; 4357 4358 4359 *destLen -= strm.avail_out; 4360 BZ2_bzCompressEnd ( &strm ); 4361 return 0; 4362 4363 output_overflow: 4364 BZ2_bzCompressEnd ( &strm ); 4365 return (-8); 4366 4367 errhandler: 4368 BZ2_bzCompressEnd ( &strm ); 4369 return ret; 4370 } 4371 4372 4373 4374 int BZ2_bzBuffToBuffDecompress 4375 ( char* dest, 4376 unsigned int* destLen, 4377 char* source, 4378 unsigned int sourceLen, 4379 int small, 4380 int verbosity ) 4381 { 4382 bz_stream strm; 4383 int ret; 4384 4385 if (dest == ((void *)0) || destLen == ((void *)0) || 4386 source == ((void *)0) || 4387 (small != 0 && small != 1) || 4388 verbosity < 0 || verbosity > 4) 4389 return (-2); 4390 4391 strm.bzalloc = ((void *)0); 4392 strm.bzfree = ((void *)0); 4393 strm.opaque = ((void *)0); 4394 ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); 4395 if (ret != 0) return ret; 4396 4397 strm.next_in = source; 4398 strm.next_out = dest; 4399 strm.avail_in = sourceLen; 4400 strm.avail_out = *destLen; 4401 4402 ret = BZ2_bzDecompress ( &strm ); 4403 if (ret == 0) goto output_overflow_or_eof; 4404 if (ret != 4) goto errhandler; 4405 4406 4407 *destLen -= strm.avail_out; 4408 BZ2_bzDecompressEnd ( &strm ); 4409 return 0; 4410 4411 output_overflow_or_eof: 4412 if (strm.avail_out > 0) { 4413 BZ2_bzDecompressEnd ( &strm ); 4414 return (-7); 4415 } else { 4416 BZ2_bzDecompressEnd ( &strm ); 4417 return (-8); 4418 }; 4419 4420 errhandler: 4421 BZ2_bzDecompressEnd ( &strm ); 4422 return ret; 4423 } 4424 4425 const char * BZ2_bzlibVersion(void) 4426 { 4427 return "1.0.3, 17-Oct-2004"; 4428 } 4429 4430 typedef unsigned char uchar; 4431 4432 4433 char inbuf[1000000]; 4434 char outbuf[(1000000 + 1000000)]; 4435 char zbuf[1000000 + 600 + (1000000 / 100)]; 4436 4437 int nIn; 4438 unsigned int nOut; 4439 unsigned int nZ; 4440 4441 void flip_bit ( int bit ) 4442 { 4443 int byteno = bit / 8; 4444 int bitno = bit % 8; 4445 uchar mask = 1 << bitno; 4446 4447 4448 zbuf[byteno] ^= mask; 4449 } 4450 4451 void set_inbuf ( void ) 4452 { 4453 inbuf[0] = 0; 4454 my_strcat(inbuf, "At her sixtieth birthday party, Margaret Thatcher "); 4455 my_strcat(inbuf, "blew on the cake to light the candles.\n"); 4456 my_strcat(inbuf, "This program, bzip2, the associated library libbzip2, and all\n"); 4457 my_strcat(inbuf, "documentation, are copyright (C) 1996-2004 Julian R Seward. All\n"); 4458 my_strcat(inbuf, "rights reserved.\n"); 4459 my_strcat(inbuf, "\n"); 4460 my_strcat(inbuf, "Redistribution and use in source and binary forms, with or without\n"); 4461 my_strcat(inbuf, "modification, are permitted provided that the following conditions\n"); 4462 my_strcat(inbuf, "are met:\n"); 4463 my_strcat(inbuf, "\n"); 4464 my_strcat(inbuf, "1. Redistributions of source code must retain the above copyright\n"); 4465 my_strcat(inbuf, " notice, this list of conditions and the following disclaimer.\n"); 4466 my_strcat(inbuf, "\n"); 4467 my_strcat(inbuf, "2. The origin of this software must not be misrepresented; you must\n"); 4468 my_strcat(inbuf, " not claim that you wrote the original software. If you use this\n"); 4469 my_strcat(inbuf, " software in a product, an acknowledgment in the product\n"); 4470 my_strcat(inbuf, " documentation would be appreciated but is not required.\n"); 4471 my_strcat(inbuf, "\n"); 4472 my_strcat(inbuf, "3. Altered source versions must be plainly marked as such, and must\n"); 4473 my_strcat(inbuf, " not be misrepresented as being the original software.\n"); 4474 my_strcat(inbuf, "\n"); 4475 my_strcat(inbuf, "4. The name of the author may not be used to endorse or promote\n"); 4476 my_strcat(inbuf, " products derived from this software without specific prior written\n"); 4477 my_strcat(inbuf, " permission.\n"); 4478 my_strcat(inbuf, "\n"); 4479 my_strcat(inbuf, "THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\n"); 4480 my_strcat(inbuf, "OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n"); 4481 my_strcat(inbuf, "WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n"); 4482 my_strcat(inbuf, "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n"); 4483 my_strcat(inbuf, "DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n"); 4484 my_strcat(inbuf, "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n"); 4485 my_strcat(inbuf, "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n"); 4486 my_strcat(inbuf, "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n"); 4487 my_strcat(inbuf, "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n"); 4488 my_strcat(inbuf, "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n"); 4489 my_strcat(inbuf, "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"); 4490 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4491 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4492 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4493 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4494 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4495 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4496 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4497 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4498 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4499 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4500 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4501 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4502 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4503 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4504 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4505 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4506 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4507 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4508 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4509 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4510 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4511 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4512 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4513 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4514 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4515 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4516 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4517 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4518 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4519 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4520 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4521 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4522 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4523 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4524 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4525 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4526 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4527 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4528 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4529 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4530 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4531 my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 4532 my_strcat(inbuf, " GNU GENERAL PUBLIC LICENSE\n"); 4533 my_strcat(inbuf, " Version 2, June 1991\n"); 4534 my_strcat(inbuf, "\n"); 4535 my_strcat(inbuf, " Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n"); 4536 my_strcat(inbuf, " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"); 4537 my_strcat(inbuf, " Everyone is permitted to copy and distribute verbatim copies\n"); 4538 my_strcat(inbuf, " of this license document, but changing it is not allowed.\n"); 4539 my_strcat(inbuf, "\n"); 4540 my_strcat(inbuf, " Preamble\n"); 4541 my_strcat(inbuf, "\n"); 4542 my_strcat(inbuf, " The licenses for most software are designed to take away your\n"); 4543 my_strcat(inbuf, "freedom to share and change it. By contrast, the GNU General Public\n"); 4544 my_strcat(inbuf, "License is intended to guarantee your freedom to share and change free\n"); 4545 my_strcat(inbuf, "software--to make sure the software is free for all its users. This\n"); 4546 my_strcat(inbuf, "General Public License applies to most of the Free Software\n"); 4547 my_strcat(inbuf, "Foundation's software and to any other program whose authors commit to\n"); 4548 my_strcat(inbuf, "using it. (Some other Free Software Foundation software is covered by\n"); 4549 my_strcat(inbuf, "the GNU Library General Public License instead.) You can apply it to\n"); 4550 my_strcat(inbuf, "your programs, too.\n"); 4551 my_strcat(inbuf, "\n"); 4552 my_strcat(inbuf, " When we speak of free software, we are referring to freedom, not\n"); 4553 my_strcat(inbuf, "price. Our General Public Licenses are designed to make sure that you\n"); 4554 my_strcat(inbuf, "have the freedom to distribute copies of free software (and charge for\n"); 4555 my_strcat(inbuf, "this service if you wish), that you receive source code or can get it\n"); 4556 my_strcat(inbuf, "if you want it, that you can change the software or use pieces of it\n"); 4557 my_strcat(inbuf, "in new free programs; and that you know you can do these things.\n"); 4558 my_strcat(inbuf, "\n"); 4559 my_strcat(inbuf, " To protect your rights, we need to make restrictions that forbid\n"); 4560 my_strcat(inbuf, "anyone to deny you these rights or to ask you to surrender the rights.\n"); 4561 my_strcat(inbuf, "These restrictions translate to certain responsibilities for you if you\n"); 4562 my_strcat(inbuf, "distribute copies of the software, or if you modify it.\n"); 4563 my_strcat(inbuf, "\n"); 4564 my_strcat(inbuf, " For example, if you distribute copies of such a program, whether\n"); 4565 my_strcat(inbuf, "gratis or for a fee, you must give the recipients all the rights that\n"); 4566 my_strcat(inbuf, "you have. You must make sure that they, too, receive or can get the\n"); 4567 my_strcat(inbuf, "source code. And you must show them these terms so they know their\n"); 4568 my_strcat(inbuf, "rights.\n"); 4569 my_strcat(inbuf, "\n"); 4570 my_strcat(inbuf, " We protect your rights with two steps: (1) copyright the software, and\n"); 4571 my_strcat(inbuf, "(2) offer you this license which gives you legal permission to copy,\n"); 4572 my_strcat(inbuf, "distribute and/or modify the software.\n"); 4573 my_strcat(inbuf, "\n"); 4574 my_strcat(inbuf, " Also, for each author's protection and ours, we want to make certain\n"); 4575 my_strcat(inbuf, "that everyone understands that there is no warranty for this free\n"); 4576 my_strcat(inbuf, "software. If the software is modified by someone else and passed on, we\n"); 4577 my_strcat(inbuf, "want its recipients to know that what they have is not the original, so\n"); 4578 my_strcat(inbuf, "that any problems introduced by others will not reflect on the original\n"); 4579 my_strcat(inbuf, "authors' reputations.\n"); 4580 my_strcat(inbuf, "\n"); 4581 my_strcat(inbuf, " Finally, any free program is threatened constantly by software\n"); 4582 my_strcat(inbuf, "patents. We wish to avoid the danger that redistributors of a free\n"); 4583 my_strcat(inbuf, "program will individually obtain patent licenses, in effect making the\n"); 4584 my_strcat(inbuf, "program proprietary. To prevent this, we have made it clear that any\n"); 4585 my_strcat(inbuf, "patent must be licensed for everyone's free use or not licensed at all.\n"); 4586 my_strcat(inbuf, "\n"); 4587 my_strcat(inbuf, " The precise terms and conditions for copying, distribution and\n"); 4588 my_strcat(inbuf, "modification follow.\n"); 4589 my_strcat(inbuf, "\n"); 4590 my_strcat(inbuf, " GNU GENERAL PUBLIC LICENSE\n"); 4591 my_strcat(inbuf, " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"); 4592 my_strcat(inbuf, "\n"); 4593 my_strcat(inbuf, " 0. This License applies to any program or other work which contains\n"); 4594 my_strcat(inbuf, "a notice placed by the copyright holder saying it may be distributed\n"); 4595 my_strcat(inbuf, "under the terms of this General Public License. The Program, below,\n"); 4596 my_strcat(inbuf, "refers to any such program or work, and a work based on the Program\n"); 4597 my_strcat(inbuf, "means either the Program or any derivative work under copyright law:\n"); 4598 my_strcat(inbuf, "that is to say, a work containing the Program or a portion of it,\n"); 4599 my_strcat(inbuf, "either verbatim or with modifications and/or translated into another\n"); 4600 my_strcat(inbuf, "language. (Hereinafter, translation is included without limitation in\n"); 4601 my_strcat(inbuf, "the term modification.) Each licensee is addressed as you.\n"); 4602 my_strcat(inbuf, "\n"); 4603 my_strcat(inbuf, "Activities other than copying, distribution and modification are not\n"); 4604 my_strcat(inbuf, "covered by this License; they are outside its scope. The act of\n"); 4605 my_strcat(inbuf, "running the Program is not restricted, and the output from the Program\n"); 4606 my_strcat(inbuf, "is covered only if its contents constitute a work based on the\n"); 4607 my_strcat(inbuf, "Program (independent of having been made by running the Program).\n"); 4608 my_strcat(inbuf, "Whether that is true depends on what the Program does.\n"); 4609 my_strcat(inbuf, "\n"); 4610 my_strcat(inbuf, " 1. You may copy and distribute verbatim copies of the Program's\n"); 4611 my_strcat(inbuf, "source code as you receive it, in any medium, provided that you\n"); 4612 my_strcat(inbuf, "conspicuously and appropriately publish on each copy an appropriate\n"); 4613 my_strcat(inbuf, "copyright notice and disclaimer of warranty; keep intact all the\n"); 4614 my_strcat(inbuf, "notices that refer to this License and to the absence of any warranty;\n"); 4615 my_strcat(inbuf, "and give any other recipients of the Program a copy of this License\n"); 4616 my_strcat(inbuf, "along with the Program.\n"); 4617 my_strcat(inbuf, "\n"); 4618 my_strcat(inbuf, "You may charge a fee for the physical act of transferring a copy, and\n"); 4619 my_strcat(inbuf, "you may at your option offer warranty protection in exchange for a fee.\n"); 4620 my_strcat(inbuf, "\n"); 4621 my_strcat(inbuf, " 2. You may modify your copy or copies of the Program or any portion\n"); 4622 my_strcat(inbuf, "of it, thus forming a work based on the Program, and copy and\n"); 4623 my_strcat(inbuf, "distribute such modifications or work under the terms of Section 1\n"); 4624 my_strcat(inbuf, "above, provided that you also meet all of these conditions:\n"); 4625 my_strcat(inbuf, "\n"); 4626 my_strcat(inbuf, " a) You must cause the modified files to carry prominent notices\n"); 4627 my_strcat(inbuf, " stating that you changed the files and the date of any change.\n"); 4628 my_strcat(inbuf, "\n"); 4629 my_strcat(inbuf, " b) You must cause any work that you distribute or publish, that in\n"); 4630 my_strcat(inbuf, " whole or in part contains or is derived from the Program or any\n"); 4631 my_strcat(inbuf, " part thereof, to be licensed as a whole at no charge to all third\n"); 4632 my_strcat(inbuf, " parties under the terms of this License.\n"); 4633 my_strcat(inbuf, "\n"); 4634 my_strcat(inbuf, " c) If the modified program normally reads commands interactively\n"); 4635 my_strcat(inbuf, " when run, you must cause it, when started running for such\n"); 4636 my_strcat(inbuf, " interactive use in the most ordinary way, to print or display an\n"); 4637 my_strcat(inbuf, " announcement including an appropriate copyright notice and a\n"); 4638 my_strcat(inbuf, " notice that there is no warranty (or else, saying that you provide\n"); 4639 my_strcat(inbuf, " a warranty) and that users may redistribute the program under\n"); 4640 my_strcat(inbuf, " these conditions, and telling the user how to view a copy of this\n"); 4641 my_strcat(inbuf, " License. (Exception: if the Program itself is interactive but\n"); 4642 my_strcat(inbuf, " does not normally print such an announcement, your work based on\n"); 4643 my_strcat(inbuf, " the Program is not required to print an announcement.)\n"); 4644 my_strcat(inbuf, "\n"); 4645 my_strcat(inbuf, "These requirements apply to the modified work as a whole. If\n"); 4646 my_strcat(inbuf, "identifiable sections of that work are not derived from the Program,\n"); 4647 my_strcat(inbuf, "and can be reasonably considered independent and separate works in\n"); 4648 my_strcat(inbuf, "themselves, then this License, and its terms, do not apply to those\n"); 4649 my_strcat(inbuf, "sections when you distribute them as separate works. But when you\n"); 4650 my_strcat(inbuf, "distribute the same sections as part of a whole which is a work based\n"); 4651 my_strcat(inbuf, "on the Program, the distribution of the whole must be on the terms of\n"); 4652 my_strcat(inbuf, "this License, whose permissions for other licensees extend to the\n"); 4653 my_strcat(inbuf, "entire whole, and thus to each and every part regardless of who wrote it.\n"); 4654 my_strcat(inbuf, "\n"); 4655 my_strcat(inbuf, "Thus, it is not the intent of this section to claim rights or contest\n"); 4656 my_strcat(inbuf, "your rights to work written entirely by you; rather, the intent is to\n"); 4657 my_strcat(inbuf, "exercise the right to control the distribution of derivative or\n"); 4658 my_strcat(inbuf, "collective works based on the Program.\n"); 4659 my_strcat(inbuf, "\n"); 4660 my_strcat(inbuf, "In addition, mere aggregation of another work not based on the Program\n"); 4661 my_strcat(inbuf, "with the Program (or with a work based on the Program) on a volume of\n"); 4662 my_strcat(inbuf, "a storage or distribution medium does not bring the other work under\n"); 4663 my_strcat(inbuf, "the scope of this License.\n"); 4664 my_strcat(inbuf, "\n"); 4665 my_strcat(inbuf, " 3. You may copy and distribute the Program (or a work based on it,\n"); 4666 my_strcat(inbuf, "under Section 2) in object code or executable form under the terms of\n"); 4667 my_strcat(inbuf, "Sections 1 and 2 above provided that you also do one of the following:\n"); 4668 my_strcat(inbuf, "\n"); 4669 my_strcat(inbuf, " a) Accompany it with the complete corresponding machine-readable\n"); 4670 my_strcat(inbuf, " source code, which must be distributed under the terms of Sections\n"); 4671 my_strcat(inbuf, " 1 and 2 above on a medium customarily used for software interchange; or,\n"); 4672 my_strcat(inbuf, "\n"); 4673 my_strcat(inbuf, " b) Accompany it with a written offer, valid for at least three\n"); 4674 my_strcat(inbuf, " years, to give any third party, for a charge no more than your\n"); 4675 my_strcat(inbuf, " cost of physically performing source distribution, a complete\n"); 4676 my_strcat(inbuf, " machine-readable copy of the corresponding source code, to be\n"); 4677 my_strcat(inbuf, " distributed under the terms of Sections 1 and 2 above on a medium\n"); 4678 my_strcat(inbuf, " customarily used for software interchange; or,\n"); 4679 my_strcat(inbuf, "\n"); 4680 my_strcat(inbuf, " c) Accompany it with the information you received as to the offer\n"); 4681 my_strcat(inbuf, " to distribute corresponding source code. (This alternative is\n"); 4682 my_strcat(inbuf, " allowed only for noncommercial distribution and only if you\n"); 4683 my_strcat(inbuf, " received the program in object code or executable form with such\n"); 4684 my_strcat(inbuf, " an offer, in accord with Subsection b above.)\n"); 4685 my_strcat(inbuf, "\n"); 4686 my_strcat(inbuf, "The source code for a work means the preferred form of the work for\n"); 4687 my_strcat(inbuf, "making modifications to it. For an executable work, complete source\n"); 4688 my_strcat(inbuf, "code means all the source code for all modules it contains, plus any\n"); 4689 my_strcat(inbuf, "associated interface definition files, plus the scripts used to\n"); 4690 my_strcat(inbuf, "control compilation and installation of the executable. However, as a\n"); 4691 my_strcat(inbuf, "special exception, the source code distributed need not include\n"); 4692 my_strcat(inbuf, "anything that is normally distributed (in either source or binary\n"); 4693 my_strcat(inbuf, "form) with the major components (compiler, kernel, and so on) of the\n"); 4694 my_strcat(inbuf, "operating system on which the executable runs, unless that component\n"); 4695 my_strcat(inbuf, "itself accompanies the executable.\n"); 4696 my_strcat(inbuf, "\n"); 4697 my_strcat(inbuf, "If distribution of executable or object code is made by offering\n"); 4698 my_strcat(inbuf, "access to copy from a designated place, then offering equivalent\n"); 4699 my_strcat(inbuf, "access to copy the source code from the same place counts as\n"); 4700 my_strcat(inbuf, "distribution of the source code, even though third parties are not\n"); 4701 my_strcat(inbuf, "compelled to copy the source along with the object code.\n"); 4702 my_strcat(inbuf, "\n"); 4703 my_strcat(inbuf, " 4. You may not copy, modify, sublicense, or distribute the Program\n"); 4704 my_strcat(inbuf, "except as expressly provided under this License. Any attempt\n"); 4705 my_strcat(inbuf, "otherwise to copy, modify, sublicense or distribute the Program is\n"); 4706 my_strcat(inbuf, "void, and will automatically terminate your rights under this License.\n"); 4707 my_strcat(inbuf, "However, parties who have received copies, or rights, from you under\n"); 4708 my_strcat(inbuf, "this License will not have their licenses terminated so long as such\n"); 4709 my_strcat(inbuf, "parties remain in full compliance.\n"); 4710 my_strcat(inbuf, "\n"); 4711 my_strcat(inbuf, " 5. You are not required to accept this License, since you have not\n"); 4712 my_strcat(inbuf, "signed it. However, nothing else grants you permission to modify or\n"); 4713 my_strcat(inbuf, "distribute the Program or its derivative works. These actions are\n"); 4714 my_strcat(inbuf, "prohibited by law if you do not accept this License. Therefore, by\n"); 4715 my_strcat(inbuf, "modifying or distributing the Program (or any work based on the\n"); 4716 my_strcat(inbuf, "Program), you indicate your acceptance of this License to do so, and\n"); 4717 my_strcat(inbuf, "all its terms and conditions for copying, distributing or modifying\n"); 4718 my_strcat(inbuf, "the Program or works based on it.\n"); 4719 my_strcat(inbuf, "\n"); 4720 my_strcat(inbuf, " 6. Each time you redistribute the Program (or any work based on the\n"); 4721 my_strcat(inbuf, "Program), the recipient automatically receives a license from the\n"); 4722 my_strcat(inbuf, "original licensor to copy, distribute or modify the Program subject to\n"); 4723 my_strcat(inbuf, "these terms and conditions. You may not impose any further\n"); 4724 my_strcat(inbuf, "restrictions on the recipients' exercise of the rights granted herein.\n"); 4725 my_strcat(inbuf, "You are not responsible for enforcing compliance by third parties to\n"); 4726 my_strcat(inbuf, "this License.\n"); 4727 my_strcat(inbuf, "\n"); 4728 my_strcat(inbuf, " 7. If, as a consequence of a court judgment or allegation of patent\n"); 4729 my_strcat(inbuf, "infringement or for any other reason (not limited to patent issues),\n"); 4730 my_strcat(inbuf, "conditions are imposed on you (whether by court order, agreement or\n"); 4731 my_strcat(inbuf, "otherwise) that contradict the conditions of this License, they do not\n"); 4732 my_strcat(inbuf, "excuse you from the conditions of this License. If you cannot\n"); 4733 my_strcat(inbuf, "distribute so as to satisfy simultaneously your obligations under this\n"); 4734 my_strcat(inbuf, "License and any other pertinent obligations, then as a consequence you\n"); 4735 my_strcat(inbuf, "may not distribute the Program at all. For example, if a patent\n"); 4736 my_strcat(inbuf, "license would not permit royalty-free redistribution of the Program by\n"); 4737 my_strcat(inbuf, "all those who receive copies directly or indirectly through you, then\n"); 4738 my_strcat(inbuf, "the only way you could satisfy both it and this License would be to\n"); 4739 my_strcat(inbuf, "refrain entirely from distribution of the Program.\n"); 4740 my_strcat(inbuf, "\n"); 4741 my_strcat(inbuf, "If any portion of this section is held invalid or unenforceable under\n"); 4742 my_strcat(inbuf, "any particular circumstance, the balance of the section is intended to\n"); 4743 my_strcat(inbuf, "apply and the section as a whole is intended to apply in other\n"); 4744 my_strcat(inbuf, "circumstances.\n"); 4745 my_strcat(inbuf, "\n"); 4746 my_strcat(inbuf, "It is not the purpose of this section to induce you to infringe any\n"); 4747 my_strcat(inbuf, "patents or other property right claims or to contest validity of any\n"); 4748 my_strcat(inbuf, "such claims; this section has the sole purpose of protecting the\n"); 4749 my_strcat(inbuf, "integrity of the free software distribution system, which is\n"); 4750 my_strcat(inbuf, "implemented by public license practices. Many people have made\n"); 4751 my_strcat(inbuf, "generous contributions to the wide range of software distributed\n"); 4752 my_strcat(inbuf, "through that system in reliance on consistent application of that\n"); 4753 my_strcat(inbuf, "system; it is up to the author/donor to decide if he or she is willing\n"); 4754 my_strcat(inbuf, "to distribute software through any other system and a licensee cannot\n"); 4755 my_strcat(inbuf, "impose that choice.\n"); 4756 my_strcat(inbuf, "\n"); 4757 my_strcat(inbuf, "This section is intended to make thoroughly clear what is believed to\n"); 4758 my_strcat(inbuf, "be a consequence of the rest of this License.\n"); 4759 my_strcat(inbuf, "\n"); 4760 my_strcat(inbuf, " 8. If the distribution and/or use of the Program is restricted in\n"); 4761 my_strcat(inbuf, "certain countries either by patents or by copyrighted interfaces, the\n"); 4762 my_strcat(inbuf, "original copyright holder who places the Program under this License\n"); 4763 my_strcat(inbuf, "may add an explicit geographical distribution limitation excluding\n"); 4764 my_strcat(inbuf, "those countries, so that distribution is permitted only in or among\n"); 4765 my_strcat(inbuf, "countries not thus excluded. In such case, this License incorporates\n"); 4766 my_strcat(inbuf, "the limitation as if written in the body of this License.\n"); 4767 my_strcat(inbuf, "\n"); 4768 my_strcat(inbuf, " 9. The Free Software Foundation may publish revised and/or new versions\n"); 4769 my_strcat(inbuf, "of the General Public License from time to time. Such new versions will\n"); 4770 my_strcat(inbuf, "be similar in spirit to the present version, but may differ in detail to\n"); 4771 my_strcat(inbuf, "address new problems or concerns.\n"); 4772 my_strcat(inbuf, "\n"); 4773 my_strcat(inbuf, "Each version is given a distinguishing version number. If the Program\n"); 4774 my_strcat(inbuf, "specifies a version number of this License which applies to it and any\n"); 4775 my_strcat(inbuf, "later version, you have the option of following the terms and conditions\n"); 4776 my_strcat(inbuf, "either of that version or of any later version published by the Free\n"); 4777 my_strcat(inbuf, "Software Foundation. If the Program does not specify a version number of\n"); 4778 my_strcat(inbuf, "this License, you may choose any version ever published by the Free Software\n"); 4779 my_strcat(inbuf, "Foundation.\n"); 4780 my_strcat(inbuf, "\n"); 4781 my_strcat(inbuf, " 10. If you wish to incorporate parts of the Program into other free\n"); 4782 my_strcat(inbuf, "programs whose distribution conditions are different, write to the author\n"); 4783 my_strcat(inbuf, "to ask for permission. For software which is copyrighted by the Free\n"); 4784 my_strcat(inbuf, "Software Foundation, write to the Free Software Foundation; we sometimes\n"); 4785 my_strcat(inbuf, "make exceptions for this. Our decision will be guided by the two goals\n"); 4786 my_strcat(inbuf, "of preserving the free status of all derivatives of our free software and\n"); 4787 my_strcat(inbuf, "of promoting the sharing and reuse of software generally.\n"); 4788 my_strcat(inbuf, "\n"); 4789 my_strcat(inbuf, " NO WARRANTY\n"); 4790 my_strcat(inbuf, "\n"); 4791 my_strcat(inbuf, " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n"); 4792 my_strcat(inbuf, "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n"); 4793 my_strcat(inbuf, "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n"); 4794 my_strcat(inbuf, "PROVIDE THE PROGRAM AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n"); 4795 my_strcat(inbuf, "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n"); 4796 my_strcat(inbuf, "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n"); 4797 my_strcat(inbuf, "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n"); 4798 my_strcat(inbuf, "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n"); 4799 my_strcat(inbuf, "REPAIR OR CORRECTION.\n"); 4800 my_strcat(inbuf, "\n"); 4801 my_strcat(inbuf, " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n"); 4802 my_strcat(inbuf, "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n"); 4803 my_strcat(inbuf, "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n"); 4804 my_strcat(inbuf, "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n"); 4805 my_strcat(inbuf, "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n"); 4806 my_strcat(inbuf, "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n"); 4807 my_strcat(inbuf, "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n"); 4808 my_strcat(inbuf, "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n"); 4809 my_strcat(inbuf, "POSSIBILITY OF SUCH DAMAGES.\n"); 4810 my_strcat(inbuf, "\n"); 4811 my_strcat(inbuf, " END OF TERMS AND CONDITIONS\n"); 4812 my_strcat(inbuf, "\n"); 4813 my_strcat(inbuf, " How to Apply These Terms to Your New Programs\n"); 4814 my_strcat(inbuf, "\n"); 4815 my_strcat(inbuf, " If you develop a new program, and you want it to be of the greatest\n"); 4816 my_strcat(inbuf, "possible use to the public, the best way to achieve this is to make it\n"); 4817 my_strcat(inbuf, "free software which everyone can redistribute and change under these terms.\n"); 4818 my_strcat(inbuf, "\n"); 4819 my_strcat(inbuf, " To do so, attach the following notices to the program. It is safest\n"); 4820 my_strcat(inbuf, "to attach them to the start of each source file to most effectively\n"); 4821 my_strcat(inbuf, "convey the exclusion of warranty; and each file should have at least\n"); 4822 my_strcat(inbuf, "the copyright line and a pointer to where the full notice is found.\n"); 4823 my_strcat(inbuf, "\n"); 4824 my_strcat(inbuf, " <one line to give the program's name and a brief idea of what it does.>\n"); 4825 my_strcat(inbuf, " Copyright (C) <year> <name of author>\n"); 4826 my_strcat(inbuf, "\n"); 4827 my_strcat(inbuf, " This program is free software; you can redistribute it and/or modify\n"); 4828 my_strcat(inbuf, " it under the terms of the GNU General Public License as published by\n"); 4829 my_strcat(inbuf, " the Free Software Foundation; either version 2 of the License, or\n"); 4830 my_strcat(inbuf, " (at your option) any later version.\n"); 4831 my_strcat(inbuf, "\n"); 4832 my_strcat(inbuf, " This program is distributed in the hope that it will be useful,\n"); 4833 my_strcat(inbuf, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); 4834 my_strcat(inbuf, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); 4835 my_strcat(inbuf, " GNU General Public License for more details.\n"); 4836 my_strcat(inbuf, "\n"); 4837 my_strcat(inbuf, " You should have received a copy of the GNU General Public License\n"); 4838 my_strcat(inbuf, " along with this program; if not, write to the Free Software\n"); 4839 my_strcat(inbuf, " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"); 4840 my_strcat(inbuf, "\n"); 4841 my_strcat(inbuf, "\n"); 4842 my_strcat(inbuf, "Also add information on how to contact you by electronic and paper mail.\n"); 4843 my_strcat(inbuf, "\n"); 4844 my_strcat(inbuf, "If the program is interactive, make it output a short notice like this\n"); 4845 my_strcat(inbuf, "when it starts in an interactive mode:\n"); 4846 my_strcat(inbuf, "\n"); 4847 my_strcat(inbuf, " Gnomovision version 69, Copyright (C) year name of author\n"); 4848 my_strcat(inbuf, " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n"); 4849 my_strcat(inbuf, " This is free software, and you are welcome to redistribute it\n"); 4850 my_strcat(inbuf, " under certain conditions; type `show c' for details.\n"); 4851 my_strcat(inbuf, "\n"); 4852 my_strcat(inbuf, "The hypothetical commands `show w' and `show c' should show the appropriate\n"); 4853 my_strcat(inbuf, "parts of the General Public License. Of course, the commands you use may\n"); 4854 my_strcat(inbuf, "be called something other than `show w' and `show c'; they could even be\n"); 4855 my_strcat(inbuf, "mouse-clicks or menu items--whatever suits your program.\n"); 4856 my_strcat(inbuf, "\n"); 4857 my_strcat(inbuf, "You should also get your employer (if you work as a programmer) or your\n"); 4858 my_strcat(inbuf, "school, if any, to sign a copyright disclaimer for the program, if\n"); 4859 my_strcat(inbuf, "necessary. Here is a sample; alter the names:\n"); 4860 my_strcat(inbuf, "\n"); 4861 my_strcat(inbuf, " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n"); 4862 my_strcat(inbuf, " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n"); 4863 my_strcat(inbuf, "\n"); 4864 my_strcat(inbuf, " <signature of Ty Coon>, 1 April 1989\n"); 4865 my_strcat(inbuf, " Ty Coon, President of Vice\n"); 4866 my_strcat(inbuf, "\n"); 4867 my_strcat(inbuf, "This General Public License does not permit incorporating your program into\n"); 4868 my_strcat(inbuf, "proprietary programs. If your program is a subroutine library, you may\n"); 4869 my_strcat(inbuf, "consider it more useful to permit linking proprietary applications with the\n"); 4870 my_strcat(inbuf, "library. If this is what you want to do, use the GNU Library General\n"); 4871 my_strcat(inbuf, "Public License instead of this License.\n"); 4872 4873 my_strcat(inbuf, "\n"); 4874 } 4875 4876 4877 typedef struct _IO_FILE FILE; 4878 4879 4880 4881 typedef struct _IO_FILE __FILE; 4882 typedef unsigned int wint_t; 4883 4884 typedef struct 4885 { 4886 int __count; 4887 union 4888 { 4889 wint_t __wch; 4890 char __wchb[4]; 4891 } __value; 4892 } __mbstate_t; 4893 4894 4895 typedef struct 4896 { 4897 __off_t __pos; 4898 __mbstate_t __state; 4899 } _G_fpos_t; 4900 typedef struct 4901 { 4902 __off64_t __pos; 4903 __mbstate_t __state; 4904 } _G_fpos64_t; 4905 4906 4907 enum 4908 { 4909 __GCONV_OK = 0, 4910 __GCONV_NOCONV, 4911 __GCONV_NODB, 4912 __GCONV_NOMEM, 4913 4914 __GCONV_EMPTY_INPUT, 4915 __GCONV_FULL_OUTPUT, 4916 __GCONV_ILLEGAL_INPUT, 4917 __GCONV_INCOMPLETE_INPUT, 4918 4919 __GCONV_ILLEGAL_DESCRIPTOR, 4920 __GCONV_INTERNAL_ERROR 4921 }; 4922 4923 4924 4925 enum 4926 { 4927 __GCONV_IS_LAST = 0x0001, 4928 __GCONV_IGNORE_ERRORS = 0x0002 4929 }; 4930 4931 4932 4933 struct __gconv_step; 4934 struct __gconv_step_data; 4935 struct __gconv_loaded_object; 4936 struct __gconv_trans_data; 4937 4938 4939 4940 typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *, 4941 __const unsigned char **, __const unsigned char *, 4942 unsigned char **, size_t *, int, int); 4943 4944 4945 typedef wint_t (*__gconv_btowc_fct) (struct __gconv_step *, unsigned char); 4946 4947 4948 typedef int (*__gconv_init_fct) (struct __gconv_step *); 4949 typedef void (*__gconv_end_fct) (struct __gconv_step *); 4950 4951 4952 4953 typedef int (*__gconv_trans_fct) (struct __gconv_step *, 4954 struct __gconv_step_data *, void *, 4955 __const unsigned char *, 4956 __const unsigned char **, 4957 __const unsigned char *, unsigned char **, 4958 size_t *); 4959 4960 4961 typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *, 4962 __const unsigned char *, 4963 unsigned char *, unsigned char *); 4964 4965 4966 typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***, 4967 size_t *); 4968 4969 4970 typedef int (*__gconv_trans_init_fct) (void **, const char *); 4971 typedef void (*__gconv_trans_end_fct) (void *); 4972 4973 struct __gconv_trans_data 4974 { 4975 4976 __gconv_trans_fct __trans_fct; 4977 __gconv_trans_context_fct __trans_context_fct; 4978 __gconv_trans_end_fct __trans_end_fct; 4979 void *__data; 4980 struct __gconv_trans_data *__next; 4981 }; 4982 4983 4984 4985 struct __gconv_step 4986 { 4987 struct __gconv_loaded_object *__shlib_handle; 4988 __const char *__modname; 4989 4990 int __counter; 4991 4992 char *__from_name; 4993 char *__to_name; 4994 4995 __gconv_fct __fct; 4996 __gconv_btowc_fct __btowc_fct; 4997 __gconv_init_fct __init_fct; 4998 __gconv_end_fct __end_fct; 4999 5000 5001 5002 int __min_needed_from; 5003 int __max_needed_from; 5004 int __min_needed_to; 5005 int __max_needed_to; 5006 5007 5008 int __stateful; 5009 5010 void *__data; 5011 }; 5012 5013 5014 5015 struct __gconv_step_data 5016 { 5017 unsigned char *__outbuf; 5018 unsigned char *__outbufend; 5019 5020 5021 5022 int __flags; 5023 5024 5025 5026 int __invocation_counter; 5027 5028 5029 5030 int __internal_use; 5031 5032 __mbstate_t *__statep; 5033 __mbstate_t __state; 5034 5035 5036 5037 struct __gconv_trans_data *__trans; 5038 }; 5039 5040 5041 5042 typedef struct __gconv_info 5043 { 5044 size_t __nsteps; 5045 struct __gconv_step *__steps; 5046 __extension__ struct __gconv_step_data __data []; 5047 } *__gconv_t; 5048 5049 typedef union 5050 { 5051 struct __gconv_info __cd; 5052 struct 5053 { 5054 struct __gconv_info __cd; 5055 struct __gconv_step_data __data; 5056 } __combined; 5057 } _G_iconv_t; 5058 5059 typedef int _G_int16_t __attribute__ ((__mode__ (__HI__))); 5060 typedef int _G_int32_t __attribute__ ((__mode__ (__SI__))); 5061 typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__))); 5062 typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__))); 5063 5064 struct _IO_jump_t; struct _IO_FILE; 5065 5066 typedef void _IO_lock_t; 5067 5068 5069 5070 5071 5072 struct _IO_marker { 5073 struct _IO_marker *_next; 5074 struct _IO_FILE *_sbuf; 5075 5076 5077 5078 int _pos; 5079 5080 }; 5081 5082 5083 enum __codecvt_result 5084 { 5085 __codecvt_ok, 5086 __codecvt_partial, 5087 __codecvt_error, 5088 __codecvt_noconv 5089 }; 5090 5091 struct _IO_FILE { 5092 int _flags; 5093 5094 5095 5096 5097 char* _IO_read_ptr; 5098 char* _IO_read_end; 5099 char* _IO_read_base; 5100 char* _IO_write_base; 5101 char* _IO_write_ptr; 5102 char* _IO_write_end; 5103 char* _IO_buf_base; 5104 char* _IO_buf_end; 5105 5106 char *_IO_save_base; 5107 char *_IO_backup_base; 5108 char *_IO_save_end; 5109 5110 struct _IO_marker *_markers; 5111 5112 struct _IO_FILE *_chain; 5113 5114 int _fileno; 5115 5116 5117 5118 int _flags2; 5119 5120 __off_t _old_offset; 5121 5122 5123 5124 unsigned short _cur_column; 5125 signed char _vtable_offset; 5126 char _shortbuf[1]; 5127 5128 5129 5130 _IO_lock_t *_lock; 5131 5132 __off64_t _offset; 5133 5134 5135 5136 5137 5138 void *__pad1; 5139 void *__pad2; 5140 5141 int _mode; 5142 5143 char _unused2[15 * sizeof (int) - 2 * sizeof (void *)]; 5144 5145 }; 5146 5147 5148 typedef struct _IO_FILE _IO_FILE; 5149 5150 5151 struct _IO_FILE_plus; 5152 5153 extern struct _IO_FILE_plus _IO_2_1_stdin_; 5154 extern struct _IO_FILE_plus _IO_2_1_stdout_; 5155 extern struct _IO_FILE_plus _IO_2_1_stderr_; 5156 5157 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); 5158 5159 5160 5161 5162 5163 5164 5165 typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf, 5166 size_t __n); 5167 5168 5169 5170 5171 5172 5173 5174 typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); 5175 5176 5177 typedef int __io_close_fn (void *__cookie); 5178 5179 extern int __underflow (_IO_FILE *) __attribute__ ((__nothrow__)); 5180 extern int __uflow (_IO_FILE *) __attribute__ ((__nothrow__)); 5181 extern int __overflow (_IO_FILE *, int) __attribute__ ((__nothrow__)); 5182 extern wint_t __wunderflow (_IO_FILE *) __attribute__ ((__nothrow__)); 5183 extern wint_t __wuflow (_IO_FILE *) __attribute__ ((__nothrow__)); 5184 extern wint_t __woverflow (_IO_FILE *, wint_t) __attribute__ ((__nothrow__)); 5185 5186 extern int _IO_getc (_IO_FILE *__fp) __attribute__ ((__nothrow__)); 5187 extern int _IO_putc (int __c, _IO_FILE *__fp) __attribute__ ((__nothrow__)); 5188 extern int _IO_feof (_IO_FILE *__fp) __attribute__ ((__nothrow__)); 5189 extern int _IO_ferror (_IO_FILE *__fp) __attribute__ ((__nothrow__)); 5190 5191 extern int _IO_peekc_locked (_IO_FILE *__fp) __attribute__ ((__nothrow__)); 5192 5193 5194 5195 5196 5197 extern void _IO_flockfile (_IO_FILE *) __attribute__ ((__nothrow__)); 5198 extern void _IO_funlockfile (_IO_FILE *) __attribute__ ((__nothrow__)); 5199 extern int _IO_ftrylockfile (_IO_FILE *) __attribute__ ((__nothrow__)); 5200 5201 extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t) __attribute__ ((__nothrow__)); 5202 extern size_t _IO_sgetn (_IO_FILE *, void *, size_t) __attribute__ ((__nothrow__)); 5203 5204 extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int) __attribute__ ((__nothrow__)); 5205 extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int) __attribute__ ((__nothrow__)); 5206 5207 extern void _IO_free_backup_area (_IO_FILE *) __attribute__ ((__nothrow__)); 5208 5209 5210 typedef _G_fpos_t fpos_t; 5211 5212 5213 5214 5215 5216 5217 5218 5219 extern struct _IO_FILE *stdin; 5220 extern struct _IO_FILE *stdout; 5221 extern struct _IO_FILE *stderr; 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 extern int remove (__const char *__filename) __attribute__ ((__nothrow__)); 5232 5233 extern int rename (__const char *__old, __const char *__new) __attribute__ ((__nothrow__)); 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 extern FILE *tmpfile (void); 5244 5245 extern char *tmpnam (char *__s) __attribute__ ((__nothrow__)); 5246 5247 5248 5249 5250 5251 extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__)); 5252 5253 extern char *tempnam (__const char *__dir, __const char *__pfx) 5254 __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 5255 5256 5257 5258 5259 5260 5261 5262 5263 extern int fclose (FILE *__stream); 5264 5265 5266 5267 5268 extern int fflush (FILE *__stream); 5269 5270 5271 extern int fflush_unlocked (FILE *__stream); 5272 5273 5274 5275 5276 5277 5278 5279 extern FILE *fopen (__const char *__restrict __filename, 5280 __const char *__restrict __modes); 5281 5282 5283 5284 5285 extern FILE *freopen (__const char *__restrict __filename, 5286 __const char *__restrict __modes, 5287 FILE *__restrict __stream); 5288 5289 5290 5291 extern FILE *fdopen (int __fd, __const char *__modes) __attribute__ ((__nothrow__)); 5292 5293 5294 5295 5296 extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__)); 5297 5298 5299 5300 extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, 5301 int __modes, size_t __n) __attribute__ ((__nothrow__)); 5302 5303 5304 5305 5306 5307 extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, 5308 size_t __size) __attribute__ ((__nothrow__)); 5309 5310 5311 extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__)); 5312 5313 5314 5315 5316 5317 5318 5319 5320 extern int fprintf (FILE *__restrict __stream, 5321 __const char *__restrict __format, ...); 5322 5323 5324 5325 5326 extern int printf (__const char *__restrict __format, ...); 5327 5328 extern int sprintf (char *__restrict __s, 5329 __const char *__restrict __format, ...) __attribute__ ((__nothrow__)); 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 extern int snprintf (char *__restrict __s, size_t __maxlen, 5347 __const char *__restrict __format, ...) 5348 __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4))); 5349 5350 5351 5352 5353 5354 5355 5356 5357 extern int fscanf (FILE *__restrict __stream, 5358 __const char *__restrict __format, ...); 5359 5360 5361 5362 5363 extern int scanf (__const char *__restrict __format, ...); 5364 5365 extern int sscanf (__const char *__restrict __s, 5366 __const char *__restrict __format, ...) __attribute__ ((__nothrow__)); 5367 5368 5369 5370 5371 5372 5373 5374 extern int fgetc (FILE *__stream); 5375 extern int getc (FILE *__stream); 5376 5377 5378 5379 5380 5381 extern int getchar (void); 5382 5383 5384 extern int getc_unlocked (FILE *__stream); 5385 extern int getchar_unlocked (void); 5386 5387 extern int fgetc_unlocked (FILE *__stream); 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 extern int fputc (int __c, FILE *__stream); 5400 extern int putc (int __c, FILE *__stream); 5401 5402 5403 5404 5405 5406 extern int putchar (int __c); 5407 5408 5409 extern int fputc_unlocked (int __c, FILE *__stream); 5410 5411 5412 5413 5414 5415 5416 5417 extern int putc_unlocked (int __c, FILE *__stream); 5418 extern int putchar_unlocked (int __c); 5419 5420 5421 5422 5423 5424 5425 extern int getw (FILE *__stream); 5426 5427 5428 extern int putw (int __w, FILE *__stream); 5429 5430 5431 5432 5433 5434 5435 5436 5437 extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream); 5438 5439 5440 5441 5442 5443 5444 extern char *gets (char *__s); 5445 5446 5447 5448 5449 5450 5451 5452 extern int fputs (__const char *__restrict __s, FILE *__restrict __stream); 5453 5454 5455 5456 5457 5458 extern int puts (__const char *__s); 5459 5460 5461 5462 5463 5464 5465 extern int ungetc (int __c, FILE *__stream); 5466 5467 5468 5469 5470 5471 5472 extern size_t fread (void *__restrict __ptr, size_t __size, 5473 size_t __n, FILE *__restrict __stream); 5474 5475 5476 5477 5478 extern size_t fwrite (__const void *__restrict __ptr, size_t __size, 5479 size_t __n, FILE *__restrict __s); 5480 5481 5482 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, 5483 size_t __n, FILE *__restrict __stream); 5484 extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size, 5485 size_t __n, FILE *__restrict __stream); 5486 5487 5488 5489 5490 5491 5492 5493 5494 extern int fseek (FILE *__stream, long int __off, int __whence); 5495 5496 5497 5498 5499 extern long int ftell (FILE *__stream); 5500 5501 5502 5503 5504 extern void rewind (FILE *__stream); 5505 5506 5507 5508 5509 5510 5511 5512 5513 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); 5514 5515 5516 5517 5518 extern int fsetpos (FILE *__stream, __const fpos_t *__pos); 5519 5520 5521 5522 extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__)); 5523 5524 extern int feof (FILE *__stream) __attribute__ ((__nothrow__)); 5525 5526 extern int ferror (FILE *__stream) __attribute__ ((__nothrow__)); 5527 5528 5529 5530 5531 extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__)); 5532 extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__)); 5533 extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__)); 5534 5535 5536 5537 5538 5539 5540 5541 5542 extern void perror (__const char *__s); 5543 5544 5545 5546 5547 5548 5549 extern int sys_nerr; 5550 extern __const char *__const sys_errlist[]; 5551 5552 5553 5554 5555 5556 extern int fileno (FILE *__stream) __attribute__ ((__nothrow__)); 5557 5558 5559 5560 5561 extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__)); 5562 5563 extern FILE *popen (__const char *__command, __const char *__modes); 5564 5565 5566 5567 5568 5569 extern int pclose (FILE *__stream); 5570 5571 5572 5573 5574 5575 extern char *ctermid (char *__s) __attribute__ ((__nothrow__)); 5576 5577 extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__)); 5578 5579 5580 5581 extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__)); 5582 5583 5584 extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__)); 5585 5586 typedef int ptrdiff_t; 5587 5588 extern void * malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 5589 5590 5591 extern void * calloc (size_t __nmemb, size_t __size) __attribute__ ((__nothrow__)) 5592 __attribute__ ((__malloc__)); 5593 5594 5595 5596 extern void * realloc (void * __ptr, size_t __size) __attribute__ ((__nothrow__)) 5597 5598 __attribute__ ((__malloc__)); 5599 5600 5601 extern void free (void * __ptr) __attribute__ ((__nothrow__)); 5602 5603 5604 extern void cfree (void * __ptr) __attribute__ ((__nothrow__)); 5605 5606 5607 extern void * memalign (size_t __alignment, size_t __size) __attribute__ ((__nothrow__)); 5608 5609 5610 extern void * valloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); 5611 5612 5613 5614 extern void * pvalloc (size_t __size) __attribute__ ((__nothrow__)) 5615 __attribute__ ((__malloc__)); 5616 5617 5618 5619 extern void * (*__morecore) (ptrdiff_t __size); 5620 5621 5622 extern void * __default_morecore (ptrdiff_t __size) __attribute__ ((__nothrow__)) 5623 __attribute__ ((__malloc__)); 5624 5625 5626 5627 struct mallinfo { 5628 int arena; 5629 int ordblks; 5630 int smblks; 5631 int hblks; 5632 int hblkhd; 5633 int usmblks; 5634 int fsmblks; 5635 int uordblks; 5636 int fordblks; 5637 int keepcost; 5638 }; 5639 5640 5641 extern struct mallinfo mallinfo (void) __attribute__ ((__nothrow__)); 5642 5643 extern int mallopt (int __param, int __val) __attribute__ ((__nothrow__)); 5644 5645 5646 5647 extern int malloc_trim (size_t __pad) __attribute__ ((__nothrow__)); 5648 5649 5650 5651 extern size_t malloc_usable_size (void * __ptr) __attribute__ ((__nothrow__)); 5652 5653 5654 extern void malloc_stats (void) __attribute__ ((__nothrow__)); 5655 5656 5657 extern void * malloc_get_state (void) __attribute__ ((__nothrow__)); 5658 5659 5660 5661 extern int malloc_set_state (void * __ptr) __attribute__ ((__nothrow__)); 5662 5663 5664 5665 5666 extern void (*__malloc_initialize_hook) (void); 5667 5668 extern void (*__free_hook) (void * __ptr, __const void *); 5669 5670 extern void * (*__malloc_hook) (size_t __size, __const void *); 5671 5672 extern void * (*__realloc_hook) (void * __ptr, size_t __size, __const void *); 5673 5674 5675 extern void * (*__memalign_hook) (size_t __alignment, size_t __size, __const void *); 5676 5677 5678 extern void (*__after_morecore_hook) (void); 5679 5680 5681 extern void __malloc_check_init (void) __attribute__ ((__nothrow__)); 5682 5683 5684 5685 extern void __assert_fail (__const char *__assertion, __const char *__file, 5686 unsigned int __line, __const char *__function) 5687 __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); 5688 5689 5690 extern void __assert_perror_fail (int __errnum, __const char *__file, 5691 unsigned int __line, 5692 __const char *__function) 5693 __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); 5694 5695 5696 5697 5698 extern void __assert (const char *__assertion, const char *__file, int __line) 5699 __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); 5700 5701 5702 5703 5704 5705 5706 static HWord g_serviceFn ( HWord arg1, HWord arg2 ) 5707 { 5708 switch (arg1) { 5709 case 0: 5710 exit(0); 5711 case 1: 5712 putchar(arg2); 5713 return 0; 5714 case 2: 5715 return (HWord)malloc(arg2); 5716 case 3: 5717 free((void*)arg2); 5718 return 0; 5719 default: 5720 ((void) ((0) ? 0 : (__assert_fail ("0", "./bz2.c", 6428, "__PRETTY_FUNCTION__"), 0))); 5721 } 5722 } 5723 5724 5725 int main ( void ) 5726 { 5727 int r; 5728 int bit; 5729 int i; 5730 5731 serviceFn = g_serviceFn; 5732 5733 set_inbuf(); 5734 nIn = vex_strlen(inbuf)+1; 5735 vex_printf( "%d bytes read\n", nIn ); 5736 5737 nZ = 1000000; 5738 r = BZ2_bzBuffToBuffCompress ( 5739 zbuf, &nZ, inbuf, nIn, 9, 3 , 30 ); 5740 5741 if (r != 0) { 5742 vex_printf("initial compress failed!\n"); 5743 (*serviceFn)(0,0); 5744 } 5745 vex_printf( "%d after compression\n", nZ ); 5746 5747 for (bit = 0; bit < nZ*8; bit += (bit < 35 ? 1 : 137)) { 5748 5749 flip_bit ( bit ); 5750 nOut = (1000000 + 1000000); 5751 r = BZ2_bzBuffToBuffDecompress ( 5752 outbuf, &nOut, zbuf, nZ, 1 , 0 ); 5753 5754 5755 if (r != 0) { 5756 5757 } else { 5758 if (nOut != nIn) { 5759 vex_printf( "nIn/nOut mismatch %d %d\n", nIn, nOut ); 5760 (*serviceFn)(0,0); 5761 } else { 5762 for (i = 0; i < nOut; i++) 5763 if (inbuf[i] != outbuf[i]) { 5764 vex_printf( "mismatch at %d\n", i ); 5765 (*serviceFn)(0,0); 5766 } 5767 if (i == nOut) vex_printf( "really ok!\n" ); 5768 } 5769 } 5770 5771 flip_bit ( bit ); 5772 } 5773 5774 vex_printf( "all ok\n" ); 5775 (*serviceFn)(0,0); 5776 5777 return 0; 5778 } 5779