blob: 348a012a1b06a22d485d7f9754b22c7f8509c614 [file] [log] [blame]
sewardjb1e1a7a2005-12-26 03:54:49 +00001
2typedef unsigned int size_t;
3
4typedef long int wchar_t;
5
6
7typedef struct
8 {
9 int quot;
10 int rem;
11 } div_t;
12
13
14
15typedef struct
16 {
17 long int quot;
18 long int rem;
19 } ldiv_t;
20
21
22
23
24extern size_t __ctype_get_mb_cur_max (void) __attribute__ ((__nothrow__));
25
26
27
28
29extern double atof (__const char *__nptr)
30 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
31
32extern int atoi (__const char *__nptr)
33 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
34
35extern 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
49extern double strtod (__const char *__restrict __nptr,
50 char **__restrict __endptr) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
51
52
53
54
55extern long int strtol (__const char *__restrict __nptr,
56 char **__restrict __endptr, int __base)
57 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
58
59extern 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__
67extern long long int strtoq (__const char *__restrict __nptr,
68 char **__restrict __endptr, int __base)
69 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
70
71__extension__
72extern 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__
81extern long long int strtoll (__const char *__restrict __nptr,
82 char **__restrict __endptr, int __base)
83 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
84
85__extension__
86extern unsigned long long int strtoull (__const char *__restrict __nptr,
87 char **__restrict __endptr, int __base)
88 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
89
90
91extern double __strtod_internal (__const char *__restrict __nptr,
92 char **__restrict __endptr, int __group)
93 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
94extern float __strtof_internal (__const char *__restrict __nptr,
95 char **__restrict __endptr, int __group)
96 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
97extern long double __strtold_internal (__const char *__restrict __nptr,
98 char **__restrict __endptr,
99 int __group) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
100
101extern 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
108extern 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__
117extern 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__
125extern 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
131extern char *l64a (long int __n) __attribute__ ((__nothrow__));
132
133
134extern long int a64l (__const char *__s)
135 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
136
137
138
139
140
141
142typedef unsigned char __u_char;
143typedef unsigned short int __u_short;
144typedef unsigned int __u_int;
145typedef unsigned long int __u_long;
146
147
148typedef signed char __int8_t;
149typedef unsigned char __uint8_t;
150typedef signed short int __int16_t;
151typedef unsigned short int __uint16_t;
152typedef signed int __int32_t;
153typedef 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
225typedef __off64_t __loff_t;
226typedef __quad_t *__qaddr_t;
227typedef char *__caddr_t;
228
229
230__extension__ typedef int __intptr_t;
231
232
233__extension__ typedef unsigned int __socklen_t;
234
235
236
237
238typedef __u_char u_char;
239typedef __u_short u_short;
240typedef __u_int u_int;
241typedef __u_long u_long;
242typedef __quad_t quad_t;
243typedef __u_quad_t u_quad_t;
244typedef __fsid_t fsid_t;
245
246
247
248
249typedef __loff_t loff_t;
250
251
252
253typedef __ino_t ino_t;
254
255typedef __dev_t dev_t;
256
257
258
259
260typedef __gid_t gid_t;
261
262
263
264
265typedef __mode_t mode_t;
266
267
268
269
270typedef __nlink_t nlink_t;
271
272
273
274
275typedef __uid_t uid_t;
276
277
278
279
280
281typedef __off_t off_t;
282
283typedef __pid_t pid_t;
284
285
286
287
288typedef __id_t id_t;
289
290
291
292
293typedef __ssize_t ssize_t;
294
295
296
297
298
299typedef __daddr_t daddr_t;
300typedef __caddr_t caddr_t;
301
302
303
304
305
306typedef __key_t key_t;
307
308
309typedef __time_t time_t;
310
311
312
313
314typedef __clockid_t clockid_t;
315
316typedef __timer_t timer_t;
317
318
319
320
321typedef unsigned long int ulong;
322typedef unsigned short int ushort;
323typedef unsigned int uint;
324
325typedef int int8_t __attribute__ ((__mode__ (__QI__)));
326typedef int int16_t __attribute__ ((__mode__ (__HI__)));
327typedef int int32_t __attribute__ ((__mode__ (__SI__)));
328typedef int int64_t __attribute__ ((__mode__ (__DI__)));
329
330
331typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__)));
332typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__)));
333typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));
334typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__)));
335
336typedef int register_t __attribute__ ((__mode__ (__word__)));
337
338typedef int __sig_atomic_t;
339
340
341
342
343typedef struct
344 {
345 unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
346 } __sigset_t;
347
348
349
350
351typedef __sigset_t sigset_t;
352
353
354
355
356
357struct timespec
358 {
359 __time_t tv_sec;
360 long int tv_nsec;
361 };
362
363struct timeval
364 {
365 __time_t tv_sec;
366 __suseconds_t tv_usec;
367 };
368
369
370
371typedef __suseconds_t suseconds_t;
372
373
374
375
376
377typedef long int __fd_mask;
378
379typedef 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
397typedef __fd_mask fd_mask;
398
399
400
401extern 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__
407extern __inline unsigned int gnu_dev_major (unsigned long long int __dev)
408 __attribute__ ((__nothrow__));
409__extension__
410extern __inline unsigned int gnu_dev_minor (unsigned long long int __dev)
411 __attribute__ ((__nothrow__));
412__extension__
413extern __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
438typedef __blkcnt_t blkcnt_t;
439
440
441
442typedef __fsblkcnt_t fsblkcnt_t;
443
444
445
446typedef __fsfilcnt_t fsfilcnt_t;
447
448struct __sched_param
449 {
450 int __sched_priority;
451 };
452
453
454
455struct _pthread_fastlock
456{
457 long int __status;
458 int __spinlock;
459
460};
461
462
463
464typedef struct _pthread_descr_struct *_pthread_descr;
465
466
467
468
469
470typedef 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
492typedef 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
503typedef struct
504{
505 int __dummy;
506} pthread_condattr_t;
507
508
509typedef unsigned int pthread_key_t;
510
511
512
513
514
515typedef 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
526typedef struct
527{
528 int __mutexkind;
529} pthread_mutexattr_t;
530
531
532
533typedef int pthread_once_t;
534
535typedef unsigned long int pthread_t;
536
537
538
539
540
541
542
543extern long int random (void) __attribute__ ((__nothrow__));
544
545
546extern void srandom (unsigned int __seed) __attribute__ ((__nothrow__));
547
548
549
550
551
552extern char *initstate (unsigned int __seed, char *__statebuf,
553 size_t __statelen) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2)));
554
555
556
557extern char *setstate (char *__statebuf) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
558
559
560
561
562
563
564
565struct 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
576extern int random_r (struct random_data *__restrict __buf,
577 int32_t *__restrict __result) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2)));
578
579extern int srandom_r (unsigned int __seed, struct random_data *__buf)
580 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2)));
581
582extern 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
587extern 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
596extern int rand (void) __attribute__ ((__nothrow__));
597
598extern void srand (unsigned int __seed) __attribute__ ((__nothrow__));
599
600
601
602
603extern int rand_r (unsigned int *__seed) __attribute__ ((__nothrow__));
604
605
606
607
608
609
610
611extern double drand48 (void) __attribute__ ((__nothrow__));
612extern double erand48 (unsigned short int __xsubi[3]) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
613
614
615extern long int lrand48 (void) __attribute__ ((__nothrow__));
616extern long int nrand48 (unsigned short int __xsubi[3])
617 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
618
619
620extern long int mrand48 (void) __attribute__ ((__nothrow__));
621extern long int jrand48 (unsigned short int __xsubi[3])
622 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
623
624
625extern void srand48 (long int __seedval) __attribute__ ((__nothrow__));
626extern unsigned short int *seed48 (unsigned short int __seed16v[3])
627 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
628extern void lcong48 (unsigned short int __param[7]) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
629
630
631
632
633
634struct 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
644extern int drand48_r (struct drand48_data *__restrict __buffer,
645 double *__restrict __result) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2)));
646extern 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
651extern int lrand48_r (struct drand48_data *__restrict __buffer,
652 long int *__restrict __result)
653 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2)));
654extern 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
660extern int mrand48_r (struct drand48_data *__restrict __buffer,
661 long int *__restrict __result)
662 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2)));
663extern 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
669extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
670 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2)));
671
672extern int seed48_r (unsigned short int __seed16v[3],
673 struct drand48_data *__buffer) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2)));
674
675extern 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
687extern void *malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
688
689extern void *calloc (size_t __nmemb, size_t __size)
690 __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
691
692
693
694
695
696
697
698extern void *realloc (void *__ptr, size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
699
700extern void free (void *__ptr) __attribute__ ((__nothrow__));
701
702
703
704
705extern void cfree (void *__ptr) __attribute__ ((__nothrow__));
706
707
708
709
710extern void *alloca (size_t __size) __attribute__ ((__nothrow__));
711
712
713
714
715
716
717extern void *valloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
718
719extern void abort (void) __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
720
721
722
723extern int atexit (void (*__func) (void)) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
724
725
726
727
728
729extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
730 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
731
732
733
734
735
736
737extern void exit (int __status) __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
738
739extern char *getenv (__const char *__name) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
740
741
742
743
744extern char *__secure_getenv (__const char *__name) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
745
746
747
748
749
750extern int putenv (char *__string) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
751
752
753
754
755
756extern int setenv (__const char *__name, __const char *__value, int __replace)
757 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2)));
758
759
760extern int unsetenv (__const char *__name) __attribute__ ((__nothrow__));
761
762
763
764
765
766
767extern int clearenv (void) __attribute__ ((__nothrow__));
768
769extern char *mktemp (char *__template) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
770
771extern int mkstemp (char *__template) __attribute__ ((__nonnull__ (1)));
772
773extern char *mkdtemp (char *__template) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
774
775
776
777
778
779
780
781
782extern int system (__const char *__command);
783
784extern char *realpath (__const char *__restrict __name,
785 char *__restrict __resolved) __attribute__ ((__nothrow__));
786
787
788
789
790
791
792typedef int (*__compar_fn_t) (__const void *, __const void *);
793
794
795
796
797
798
799
800
801
802extern 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
808extern void qsort (void *__base, size_t __nmemb, size_t __size,
809 __compar_fn_t __compar) __attribute__ ((__nonnull__ (1, 4)));
810
811
812
813extern int abs (int __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__));
814extern long int labs (long int __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__));
815
816
817
818
819
820
821
822
823
824
825
826
827extern div_t div (int __numer, int __denom)
828 __attribute__ ((__nothrow__)) __attribute__ ((__const__));
829extern ldiv_t ldiv (long int __numer, long int __denom)
830 __attribute__ ((__nothrow__)) __attribute__ ((__const__));
831
832extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
833 int *__restrict __sign) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4)));
834
835
836
837
838extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
839 int *__restrict __sign) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4)));
840
841
842
843
844extern char *gcvt (double __value, int __ndigit, char *__buf)
845 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3)));
846
847
848
849
850extern char *qecvt (long double __value, int __ndigit,
851 int *__restrict __decpt, int *__restrict __sign)
852 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4)));
853extern char *qfcvt (long double __value, int __ndigit,
854 int *__restrict __decpt, int *__restrict __sign)
855 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 4)));
856extern char *qgcvt (long double __value, int __ndigit, char *__buf)
857 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3)));
858
859
860
861
862extern 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)));
865extern 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
869extern 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)));
873extern 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
884extern int mblen (__const char *__s, size_t __n) __attribute__ ((__nothrow__));
885
886
887extern int mbtowc (wchar_t *__restrict __pwc,
888 __const char *__restrict __s, size_t __n) __attribute__ ((__nothrow__));
889
890
891extern int wctomb (char *__s, wchar_t __wchar) __attribute__ ((__nothrow__));
892
893
894
895extern size_t mbstowcs (wchar_t *__restrict __pwcs,
896 __const char *__restrict __s, size_t __n) __attribute__ ((__nothrow__));
897
898extern 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
909extern int rpmatch (__const char *__response) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
910extern int getloadavg (double __loadavg[], int __nelem)
911 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
912
913
914
915
916
917
918
919typedef
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
939extern int BZ2_bzCompressInit (
940 bz_stream* strm,
941 int blockSize100k,
942 int verbosity,
943 int workFactor
944 );
945
946extern int BZ2_bzCompress (
947 bz_stream* strm,
948 int action
949 );
950
951extern int BZ2_bzCompressEnd (
952 bz_stream* strm
953 );
954
955extern int BZ2_bzDecompressInit (
956 bz_stream *strm,
957 int verbosity,
958 int small
959 );
960
961extern int BZ2_bzDecompress (
962 bz_stream* strm
963 );
964
965extern int BZ2_bzDecompressEnd (
966 bz_stream *strm
967 );
968
969extern 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
979extern 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
988extern const char * BZ2_bzlibVersion (
989 void
990 );
991
992typedef char Char;
993typedef unsigned char Bool;
994typedef unsigned char UChar;
995typedef int Int32;
996typedef unsigned int UInt32;
997typedef short Int16;
998typedef unsigned short UInt16;
999
1000extern void bz_internal_error ( int errcode );
1001
1002extern Int32 BZ2_rNums[512];
1003
1004extern UInt32 BZ2_crc32Table[256];
1005
1006typedef
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
1082extern void
1083BZ2_blockSort ( EState* );
1084
1085extern void
1086BZ2_compressBlock ( EState*, Bool );
1087
1088extern void
1089BZ2_bsInitWrite ( EState* );
1090
1091extern void
1092BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
1093
1094extern void
1095BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
1096
1097typedef
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
1190extern Int32
1191BZ2_indexIntoF ( Int32, Int32* );
1192
1193extern Int32
1194BZ2_decompress ( DState* );
1195
1196extern void
1197BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
1198 Int32, Int32, Int32 );
1199
1200typedef unsigned long HWord;
1201typedef char HChar;
1202typedef signed int Int;
1203typedef unsigned int UInt;
1204
1205typedef signed long long int Long;
1206typedef unsigned long long int ULong;
1207
1208
1209
1210
1211
1212static HWord (*serviceFn)(HWord,HWord) = 0;
1213
1214char* 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
1226static 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
1236static HChar vex_toupper ( HChar c )
1237{
1238 if (c >= 'a' && c <= 'z')
1239 return c + ('A' - 'a');
1240 else
1241 return c;
1242}
1243
1244static Int vex_strlen ( const HChar* str )
1245{
1246 Int i = 0;
1247 while (str[i] != 0) i++;
1248 return i;
1249}
1250
1251Bool 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
1263static UInt
1264myvprintf_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
1312static UInt
1313myvprintf_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
1372static
1373UInt vprintf_wrk ( )
1374{
1375 return 0;
1376}
1377
1378
1379
1380
1381
1382
1383static HChar myprintf_buf[1000];
1384static Int n_myprintf_buf;
1385
1386static 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
1397static UInt vex_printf ( const char *format, ... )
1398{
1399 return 0;
1400}
1401
1402static
1403void 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
1428Int32 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
1945static
1946__inline__
1947void 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
1976static
1977void 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
2059static
2060void 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
2172static
2173__inline__
2174Bool 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
2298static
2299Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
2300 9841, 29524, 88573, 265720,
2301 797161, 2391484 };
2302
2303static
2304void 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
2376static
2377__inline__
2378UChar 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
2389static
2390void 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
2488static
2489void 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
2690void 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
2743void 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
2815void 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
2833void 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
2865void BZ2_bsInitWrite ( EState* s )
2866{
2867 s->bsLive = 0;
2868 s->bsBuff = 0;
2869}
2870
2871
2872
2873static
2874void 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
2884static
2885__inline__
2886void 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
2895static
2896void 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
2906static
2907void bsPutUChar ( EState* s, UChar c )
2908{
2909 bsW( s, 8, (UInt32)c );
2910}
2911
2912
2913
2914
2915
2916
2917
2918static
2919void 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
2932static
2933void 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
3029static
3030void 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
3382void 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
3440Int32 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
3495UInt32 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
3565void 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
3571void bz_internal_error ( int errcode )
3572{
3573 vex_printf("bz_internal_error called, exiting\n", errcode);
3574 (*serviceFn)(0,0);
3575}
3576
3577
3578static
3579int 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
3589static
3590void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
3591{
3592 void* v = (void*) (*serviceFn)(2, items * size );
3593 return v;
3594}
3595
3596static
3597void default_bzfree ( void* opaque, void* addr )
3598{
3599 if (addr != ((void *)0)) (*serviceFn)( 3, (HWord)addr );
3600}
3601
3602
3603
3604static
3605void 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
3618static
3619void init_RL ( EState* s )
3620{
3621 s->state_in_ch = 256;
3622 s->state_in_len = 0;
3623}
3624
3625
3626static
3627Bool 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
3636int 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
3703static
3704void 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
3739static
3740void flush_RL ( EState* s )
3741{
3742 if (s->state_in_ch < 256) add_pair_to_block ( s );
3743 init_RL ( s );
3744}
3745
3746static
3747Bool 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
3791static
3792Bool 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
3818static
3819Bool 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
3865int 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
3926int 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
3950int 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
3993static
3994Bool 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
4147static
4148Bool 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
4250int 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
4304int 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
4322int 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
4374int 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
4425const char * BZ2_bzlibVersion(void)
4426{
4427 return "1.0.3, 17-Oct-2004";
4428}
4429
4430typedef unsigned char uchar;
4431
4432
4433 char inbuf[1000000];
4434 char outbuf[(1000000 + 1000000)];
4435 char zbuf[1000000 + 600 + (1000000 / 100)];
4436
4437int nIn;
4438unsigned int nOut;
4439unsigned int nZ;
4440
4441void 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
4451void 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
4877typedef struct _IO_FILE FILE;
4878
4879
4880
4881typedef struct _IO_FILE __FILE;
4882typedef unsigned int wint_t;
4883
4884typedef struct
4885{
4886 int __count;
4887 union
4888 {
4889 wint_t __wch;
4890 char __wchb[4];
4891 } __value;
4892} __mbstate_t;
4893
4894
4895typedef struct
4896{
4897 __off_t __pos;
4898 __mbstate_t __state;
4899} _G_fpos_t;
4900typedef struct
4901{
4902 __off64_t __pos;
4903 __mbstate_t __state;
4904} _G_fpos64_t;
4905
4906
4907enum
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
4925enum
4926{
4927 __GCONV_IS_LAST = 0x0001,
4928 __GCONV_IGNORE_ERRORS = 0x0002
4929};
4930
4931
4932
4933struct __gconv_step;
4934struct __gconv_step_data;
4935struct __gconv_loaded_object;
4936struct __gconv_trans_data;
4937
4938
4939
4940typedef 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
4945typedef wint_t (*__gconv_btowc_fct) (struct __gconv_step *, unsigned char);
4946
4947
4948typedef int (*__gconv_init_fct) (struct __gconv_step *);
4949typedef void (*__gconv_end_fct) (struct __gconv_step *);
4950
4951
4952
4953typedef 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
4961typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *,
4962 __const unsigned char *,
4963 unsigned char *, unsigned char *);
4964
4965
4966typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***,
4967 size_t *);
4968
4969
4970typedef int (*__gconv_trans_init_fct) (void **, const char *);
4971typedef void (*__gconv_trans_end_fct) (void *);
4972
4973struct __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
4985struct __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
5015struct __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
5042typedef struct __gconv_info
5043{
5044 size_t __nsteps;
5045 struct __gconv_step *__steps;
5046 __extension__ struct __gconv_step_data __data [];
5047} *__gconv_t;
5048
5049typedef 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
5059typedef int _G_int16_t __attribute__ ((__mode__ (__HI__)));
5060typedef int _G_int32_t __attribute__ ((__mode__ (__SI__)));
5061typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
5062typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__)));
5063
5064struct _IO_jump_t; struct _IO_FILE;
5065
5066typedef void _IO_lock_t;
5067
5068
5069
5070
5071
5072struct _IO_marker {
5073 struct _IO_marker *_next;
5074 struct _IO_FILE *_sbuf;
5075
5076
5077
5078 int _pos;
5079
5080};
5081
5082
5083enum __codecvt_result
5084{
5085 __codecvt_ok,
5086 __codecvt_partial,
5087 __codecvt_error,
5088 __codecvt_noconv
5089};
5090
5091struct _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
5148typedef struct _IO_FILE _IO_FILE;
5149
5150
5151struct _IO_FILE_plus;
5152
5153extern struct _IO_FILE_plus _IO_2_1_stdin_;
5154extern struct _IO_FILE_plus _IO_2_1_stdout_;
5155extern struct _IO_FILE_plus _IO_2_1_stderr_;
5156
5157typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
5158
5159
5160
5161
5162
5163
5164
5165typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf,
5166 size_t __n);
5167
5168
5169
5170
5171
5172
5173
5174typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
5175
5176
5177typedef int __io_close_fn (void *__cookie);
5178
5179extern int __underflow (_IO_FILE *) __attribute__ ((__nothrow__));
5180extern int __uflow (_IO_FILE *) __attribute__ ((__nothrow__));
5181extern int __overflow (_IO_FILE *, int) __attribute__ ((__nothrow__));
5182extern wint_t __wunderflow (_IO_FILE *) __attribute__ ((__nothrow__));
5183extern wint_t __wuflow (_IO_FILE *) __attribute__ ((__nothrow__));
5184extern wint_t __woverflow (_IO_FILE *, wint_t) __attribute__ ((__nothrow__));
5185
5186extern int _IO_getc (_IO_FILE *__fp) __attribute__ ((__nothrow__));
5187extern int _IO_putc (int __c, _IO_FILE *__fp) __attribute__ ((__nothrow__));
5188extern int _IO_feof (_IO_FILE *__fp) __attribute__ ((__nothrow__));
5189extern int _IO_ferror (_IO_FILE *__fp) __attribute__ ((__nothrow__));
5190
5191extern int _IO_peekc_locked (_IO_FILE *__fp) __attribute__ ((__nothrow__));
5192
5193
5194
5195
5196
5197extern void _IO_flockfile (_IO_FILE *) __attribute__ ((__nothrow__));
5198extern void _IO_funlockfile (_IO_FILE *) __attribute__ ((__nothrow__));
5199extern int _IO_ftrylockfile (_IO_FILE *) __attribute__ ((__nothrow__));
5200
5201extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t) __attribute__ ((__nothrow__));
5202extern size_t _IO_sgetn (_IO_FILE *, void *, size_t) __attribute__ ((__nothrow__));
5203
5204extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int) __attribute__ ((__nothrow__));
5205extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int) __attribute__ ((__nothrow__));
5206
5207extern void _IO_free_backup_area (_IO_FILE *) __attribute__ ((__nothrow__));
5208
5209
5210typedef _G_fpos_t fpos_t;
5211
5212
5213
5214
5215
5216
5217
5218
5219extern struct _IO_FILE *stdin;
5220extern struct _IO_FILE *stdout;
5221extern struct _IO_FILE *stderr;
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231extern int remove (__const char *__filename) __attribute__ ((__nothrow__));
5232
5233extern int rename (__const char *__old, __const char *__new) __attribute__ ((__nothrow__));
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243extern FILE *tmpfile (void);
5244
5245extern char *tmpnam (char *__s) __attribute__ ((__nothrow__));
5246
5247
5248
5249
5250
5251extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__));
5252
5253extern char *tempnam (__const char *__dir, __const char *__pfx)
5254 __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
5255
5256
5257
5258
5259
5260
5261
5262
5263extern int fclose (FILE *__stream);
5264
5265
5266
5267
5268extern int fflush (FILE *__stream);
5269
5270
5271extern int fflush_unlocked (FILE *__stream);
5272
5273
5274
5275
5276
5277
5278
5279extern FILE *fopen (__const char *__restrict __filename,
5280 __const char *__restrict __modes);
5281
5282
5283
5284
5285extern FILE *freopen (__const char *__restrict __filename,
5286 __const char *__restrict __modes,
5287 FILE *__restrict __stream);
5288
5289
5290
5291extern FILE *fdopen (int __fd, __const char *__modes) __attribute__ ((__nothrow__));
5292
5293
5294
5295
5296extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__));
5297
5298
5299
5300extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
5301 int __modes, size_t __n) __attribute__ ((__nothrow__));
5302
5303
5304
5305
5306
5307extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
5308 size_t __size) __attribute__ ((__nothrow__));
5309
5310
5311extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__));
5312
5313
5314
5315
5316
5317
5318
5319
5320extern int fprintf (FILE *__restrict __stream,
5321 __const char *__restrict __format, ...);
5322
5323
5324
5325
5326extern int printf (__const char *__restrict __format, ...);
5327
5328extern 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
5346extern 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
5357extern int fscanf (FILE *__restrict __stream,
5358 __const char *__restrict __format, ...);
5359
5360
5361
5362
5363extern int scanf (__const char *__restrict __format, ...);
5364
5365extern int sscanf (__const char *__restrict __s,
5366 __const char *__restrict __format, ...) __attribute__ ((__nothrow__));
5367
5368
5369
5370
5371
5372
5373
5374extern int fgetc (FILE *__stream);
5375extern int getc (FILE *__stream);
5376
5377
5378
5379
5380
5381extern int getchar (void);
5382
5383
5384extern int getc_unlocked (FILE *__stream);
5385extern int getchar_unlocked (void);
5386
5387extern int fgetc_unlocked (FILE *__stream);
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399extern int fputc (int __c, FILE *__stream);
5400extern int putc (int __c, FILE *__stream);
5401
5402
5403
5404
5405
5406extern int putchar (int __c);
5407
5408
5409extern int fputc_unlocked (int __c, FILE *__stream);
5410
5411
5412
5413
5414
5415
5416
5417extern int putc_unlocked (int __c, FILE *__stream);
5418extern int putchar_unlocked (int __c);
5419
5420
5421
5422
5423
5424
5425extern int getw (FILE *__stream);
5426
5427
5428extern int putw (int __w, FILE *__stream);
5429
5430
5431
5432
5433
5434
5435
5436
5437extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream);
5438
5439
5440
5441
5442
5443
5444extern char *gets (char *__s);
5445
5446
5447
5448
5449
5450
5451
5452extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);
5453
5454
5455
5456
5457
5458extern int puts (__const char *__s);
5459
5460
5461
5462
5463
5464
5465extern int ungetc (int __c, FILE *__stream);
5466
5467
5468
5469
5470
5471
5472extern size_t fread (void *__restrict __ptr, size_t __size,
5473 size_t __n, FILE *__restrict __stream);
5474
5475
5476
5477
5478extern size_t fwrite (__const void *__restrict __ptr, size_t __size,
5479 size_t __n, FILE *__restrict __s);
5480
5481
5482extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
5483 size_t __n, FILE *__restrict __stream);
5484extern 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
5494extern int fseek (FILE *__stream, long int __off, int __whence);
5495
5496
5497
5498
5499extern long int ftell (FILE *__stream);
5500
5501
5502
5503
5504extern void rewind (FILE *__stream);
5505
5506
5507
5508
5509
5510
5511
5512
5513extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
5514
5515
5516
5517
5518extern int fsetpos (FILE *__stream, __const fpos_t *__pos);
5519
5520
5521
5522extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__));
5523
5524extern int feof (FILE *__stream) __attribute__ ((__nothrow__));
5525
5526extern int ferror (FILE *__stream) __attribute__ ((__nothrow__));
5527
5528
5529
5530
5531extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__));
5532extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__));
5533extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__));
5534
5535
5536
5537
5538
5539
5540
5541
5542extern void perror (__const char *__s);
5543
5544
5545
5546
5547
5548
5549extern int sys_nerr;
5550extern __const char *__const sys_errlist[];
5551
5552
5553
5554
5555
5556extern int fileno (FILE *__stream) __attribute__ ((__nothrow__));
5557
5558
5559
5560
5561extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__));
5562
5563extern FILE *popen (__const char *__command, __const char *__modes);
5564
5565
5566
5567
5568
5569extern int pclose (FILE *__stream);
5570
5571
5572
5573
5574
5575extern char *ctermid (char *__s) __attribute__ ((__nothrow__));
5576
5577extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__));
5578
5579
5580
5581extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__));
5582
5583
5584extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
5585
5586typedef int ptrdiff_t;
5587
5588extern void * malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
5589
5590
5591extern void * calloc (size_t __nmemb, size_t __size) __attribute__ ((__nothrow__))
5592 __attribute__ ((__malloc__));
5593
5594
5595
5596extern void * realloc (void * __ptr, size_t __size) __attribute__ ((__nothrow__))
5597
5598 __attribute__ ((__malloc__));
5599
5600
5601extern void free (void * __ptr) __attribute__ ((__nothrow__));
5602
5603
5604extern void cfree (void * __ptr) __attribute__ ((__nothrow__));
5605
5606
5607extern void * memalign (size_t __alignment, size_t __size) __attribute__ ((__nothrow__));
5608
5609
5610extern void * valloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__));
5611
5612
5613
5614extern void * pvalloc (size_t __size) __attribute__ ((__nothrow__))
5615 __attribute__ ((__malloc__));
5616
5617
5618
5619extern void * (*__morecore) (ptrdiff_t __size);
5620
5621
5622extern void * __default_morecore (ptrdiff_t __size) __attribute__ ((__nothrow__))
5623 __attribute__ ((__malloc__));
5624
5625
5626
5627struct 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
5641extern struct mallinfo mallinfo (void) __attribute__ ((__nothrow__));
5642
5643extern int mallopt (int __param, int __val) __attribute__ ((__nothrow__));
5644
5645
5646
5647extern int malloc_trim (size_t __pad) __attribute__ ((__nothrow__));
5648
5649
5650
5651extern size_t malloc_usable_size (void * __ptr) __attribute__ ((__nothrow__));
5652
5653
5654extern void malloc_stats (void) __attribute__ ((__nothrow__));
5655
5656
5657extern void * malloc_get_state (void) __attribute__ ((__nothrow__));
5658
5659
5660
5661extern int malloc_set_state (void * __ptr) __attribute__ ((__nothrow__));
5662
5663
5664
5665
5666extern void (*__malloc_initialize_hook) (void);
5667
5668extern void (*__free_hook) (void * __ptr, __const void *);
5669
5670extern void * (*__malloc_hook) (size_t __size, __const void *);
5671
5672extern void * (*__realloc_hook) (void * __ptr, size_t __size, __const void *);
5673
5674
5675extern void * (*__memalign_hook) (size_t __alignment, size_t __size, __const void *);
5676
5677
5678extern void (*__after_morecore_hook) (void);
5679
5680
5681extern void __malloc_check_init (void) __attribute__ ((__nothrow__));
5682
5683
5684
5685extern void __assert_fail (__const char *__assertion, __const char *__file,
5686 unsigned int __line, __const char *__function)
5687 __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
5688
5689
5690extern 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
5698extern void __assert (const char *__assertion, const char *__file, int __line)
5699 __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
5700
5701
5702
5703
5704
5705
5706static 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
5725int 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}