From 02daaed6dc76d4290a7df43e77342fd7b640591d Mon Sep 17 00:00:00 2001 From: aCaB Date: Mon, 12 Oct 2009 23:34:17 +0200 Subject: [PATCH] add win32 vcproj and 3rd party libs --- ChangeLog | 4 + win32/.gitignore | 6 + win32/3rdparty/bzip2/CHANGES | 319 + win32/3rdparty/bzip2/LICENSE | 42 + win32/3rdparty/bzip2/Makefile-libbz2_so | 59 + win32/3rdparty/bzip2/README | 210 + .../bzip2/README.COMPILATION.PROBLEMS | 58 + win32/3rdparty/bzip2/README.XML.STUFF | 45 + win32/3rdparty/bzip2/blocksort.c | 1094 + win32/3rdparty/bzip2/bz-common.xsl | 39 + win32/3rdparty/bzip2/bz-fo.xsl | 276 + win32/3rdparty/bzip2/bz-html.xsl | 20 + win32/3rdparty/bzip2/bzdiff | 76 + win32/3rdparty/bzip2/bzdiff.1 | 47 + win32/3rdparty/bzip2/bzgrep | 75 + win32/3rdparty/bzip2/bzgrep.1 | 56 + win32/3rdparty/bzip2/bzip.css | 74 + win32/3rdparty/bzip2/bzip2.1 | 454 + win32/3rdparty/bzip2/bzip2.1.preformatted | 399 + win32/3rdparty/bzip2/bzip2.c | 2034 + win32/3rdparty/bzip2/bzip2.txt | 391 + win32/3rdparty/bzip2/bzip2recover.c | 514 + win32/3rdparty/bzip2/bzlib.c | 1572 + win32/3rdparty/bzip2/bzlib.h | 282 + win32/3rdparty/bzip2/bzlib_private.h | 509 + win32/3rdparty/bzip2/bzmore | 61 + win32/3rdparty/bzip2/bzmore.1 | 152 + win32/3rdparty/bzip2/compress.c | 672 + win32/3rdparty/bzip2/crctable.c | 104 + win32/3rdparty/bzip2/decompress.c | 626 + win32/3rdparty/bzip2/dlltest.c | 175 + win32/3rdparty/bzip2/dlltest.dsp | 93 + win32/3rdparty/bzip2/entities.xml | 9 + win32/3rdparty/bzip2/format.pl | 68 + win32/3rdparty/bzip2/huffman.c | 205 + win32/3rdparty/bzip2/libbz2.def | 27 + win32/3rdparty/bzip2/libbz2.dsp | 130 + win32/3rdparty/bzip2/makefile.msc | 63 + win32/3rdparty/bzip2/manual.html | 2540 + win32/3rdparty/bzip2/manual.ps | 82900 ++++++++++++++++ win32/3rdparty/bzip2/manual.xml | 2964 + win32/3rdparty/bzip2/mk251.c | 31 + win32/3rdparty/bzip2/randtable.c | 84 + win32/3rdparty/bzip2/sample3.ref | Bin 0 -> 120244 bytes win32/3rdparty/bzip2/spewG.c | 54 + win32/3rdparty/bzip2/unzcrash.c | 141 + win32/3rdparty/bzip2/words0 | 9 + win32/3rdparty/bzip2/words1 | 4 + win32/3rdparty/bzip2/words2 | 5 + win32/3rdparty/bzip2/words3 | 30 + win32/3rdparty/bzip2/xmlproc.sh | 114 + win32/3rdparty/pthreads/ANNOUNCE | 476 + win32/3rdparty/pthreads/BUGS | 133 + win32/3rdparty/pthreads/Bmakefile | 266 + win32/3rdparty/pthreads/CONTRIBUTORS | 129 + win32/3rdparty/pthreads/COPYING | 150 + win32/3rdparty/pthreads/COPYING.LIB | 504 + win32/3rdparty/pthreads/ChangeLog | 4821 + win32/3rdparty/pthreads/FAQ | 403 + win32/3rdparty/pthreads/GNUmakefile | 583 + win32/3rdparty/pthreads/MAINTAINERS | 4 + win32/3rdparty/pthreads/NEWS | 1110 + win32/3rdparty/pthreads/Nmakefile | 24 + win32/3rdparty/pthreads/Nmakefile.tests | 260 + win32/3rdparty/pthreads/PROGRESS | 4 + win32/3rdparty/pthreads/README | 593 + win32/3rdparty/pthreads/README.Borland | 57 + win32/3rdparty/pthreads/README.CV | 3036 + win32/3rdparty/pthreads/README.NONPORTABLE | 285 + win32/3rdparty/pthreads/README.Watcom | 62 + win32/3rdparty/pthreads/README.WinCE | 6 + win32/3rdparty/pthreads/TODO | 7 + win32/3rdparty/pthreads/WinCE-PORT | 217 + win32/3rdparty/pthreads/attr.c | 53 + win32/3rdparty/pthreads/barrier.c | 47 + win32/3rdparty/pthreads/builddmc.bat | 9 + win32/3rdparty/pthreads/cancel.c | 44 + win32/3rdparty/pthreads/cleanup.c | 148 + win32/3rdparty/pthreads/condvar.c | 50 + win32/3rdparty/pthreads/config.h | 134 + win32/3rdparty/pthreads/create.c | 305 + win32/3rdparty/pthreads/dll.c | 92 + win32/3rdparty/pthreads/errno.c | 94 + win32/3rdparty/pthreads/exit.c | 44 + win32/3rdparty/pthreads/fork.c | 39 + win32/3rdparty/pthreads/global.c | 115 + win32/3rdparty/pthreads/implement.h | 710 + win32/3rdparty/pthreads/manual/ChangeLog | 62 + .../pthreads/manual/PortabilityIssues.html | 718 + win32/3rdparty/pthreads/manual/index.html | 146 + .../manual/pthreadCancelableWait.html | 86 + .../pthreads/manual/pthread_attr_init.html | 280 + .../manual/pthread_attr_setstackaddr.html | 158 + .../manual/pthread_attr_setstacksize.html | 127 + .../pthreads/manual/pthread_barrier_init.html | 200 + .../pthreads/manual/pthread_barrier_wait.html | 167 + .../manual/pthread_barrierattr_init.html | 142 + .../pthread_barrierattr_setpshared.html | 159 + .../pthreads/manual/pthread_cancel.html | 205 + .../pthreads/manual/pthread_cleanup_push.html | 140 + .../pthreads/manual/pthread_cond_init.html | 313 + .../manual/pthread_condattr_init.html | 98 + .../manual/pthread_condattr_setpshared.html | 153 + .../pthreads/manual/pthread_create.html | 94 + .../pthreads/manual/pthread_delay_np.html | 71 + .../pthreads/manual/pthread_detach.html | 90 + .../pthreads/manual/pthread_equal.html | 48 + .../pthreads/manual/pthread_exit.html | 59 + .../manual/pthread_getw32threadhandle_np.html | 57 + .../pthreads/manual/pthread_join.html | 118 + .../pthreads/manual/pthread_key_create.html | 211 + .../pthreads/manual/pthread_kill.html | 152 + .../pthreads/manual/pthread_mutex_init.html | 277 + .../manual/pthread_mutexattr_init.html | 157 + .../manual/pthread_mutexattr_setpshared.html | 151 + .../manual/pthread_num_processors_np.html | 57 + .../pthreads/manual/pthread_once.html | 83 + .../pthreads/manual/pthread_rwlock_init.html | 193 + .../manual/pthread_rwlock_rdlock.html | 168 + .../manual/pthread_rwlock_timedrdlock.html | 156 + .../manual/pthread_rwlock_timedwrlock.html | 150 + .../manual/pthread_rwlock_unlock.html | 141 + .../manual/pthread_rwlock_wrlock.html | 153 + .../manual/pthread_rwlockattr_init.html | 141 + .../manual/pthread_rwlockattr_setpshared.html | 160 + .../pthreads/manual/pthread_self.html | 70 + .../manual/pthread_setcancelstate.html | 207 + .../manual/pthread_setcanceltype.html | 207 + .../manual/pthread_setconcurrency.html | 155 + .../manual/pthread_setschedparam.html | 113 + .../pthreads/manual/pthread_spin_init.html | 176 + .../pthreads/manual/pthread_spin_lock.html | 141 + .../pthreads/manual/pthread_spin_unlock.html | 124 + .../manual/pthread_timechange_handler_np.html | 76 + .../pthread_win32_attach_detach_np.html | 74 + .../pthread_win32_test_features_np.html | 68 + .../manual/sched_get_priority_max.html | 115 + .../pthreads/manual/sched_getscheduler.html | 127 + .../pthreads/manual/sched_setscheduler.html | 181 + .../3rdparty/pthreads/manual/sched_yield.html | 98 + win32/3rdparty/pthreads/manual/sem_init.html | 200 + win32/3rdparty/pthreads/misc.c | 50 + win32/3rdparty/pthreads/mutex.c | 59 + win32/3rdparty/pthreads/need_errno.h | 132 + win32/3rdparty/pthreads/nonportable.c | 46 + win32/3rdparty/pthreads/private.c | 57 + win32/3rdparty/pthreads/pthread.c | 65 + win32/3rdparty/pthreads/pthread.dsp | 142 + win32/3rdparty/pthreads/pthread.dsw | 29 + win32/3rdparty/pthreads/pthread.h | 1368 + .../3rdparty/pthreads/pthread_attr_destroy.c | 79 + .../pthreads/pthread_attr_getdetachstate.c | 87 + .../pthreads/pthread_attr_getinheritsched.c | 51 + .../pthreads/pthread_attr_getschedparam.c | 52 + .../pthreads/pthread_attr_getschedpolicy.c | 61 + .../3rdparty/pthreads/pthread_attr_getscope.c | 54 + .../pthreads/pthread_attr_getstackaddr.c | 97 + .../pthreads/pthread_attr_getstacksize.c | 100 + win32/3rdparty/pthreads/pthread_attr_init.c | 117 + .../pthreads/pthread_attr_setdetachstate.c | 91 + .../pthreads/pthread_attr_setinheritsched.c | 57 + .../pthreads/pthread_attr_setschedparam.c | 63 + .../pthreads/pthread_attr_setschedpolicy.c | 55 + .../3rdparty/pthreads/pthread_attr_setscope.c | 62 + .../pthreads/pthread_attr_setstackaddr.c | 97 + .../pthreads/pthread_attr_setstacksize.c | 110 + .../pthreads/pthread_barrier_destroy.c | 67 + .../3rdparty/pthreads/pthread_barrier_init.c | 81 + .../3rdparty/pthreads/pthread_barrier_wait.c | 99 + .../pthreads/pthread_barrierattr_destroy.c | 83 + .../pthreads/pthread_barrierattr_getpshared.c | 95 + .../pthreads/pthread_barrierattr_init.c | 85 + .../pthreads/pthread_barrierattr_setpshared.c | 119 + win32/3rdparty/pthreads/pthread_cancel.c | 223 + .../3rdparty/pthreads/pthread_cond_destroy.c | 244 + win32/3rdparty/pthreads/pthread_cond_init.c | 165 + win32/3rdparty/pthreads/pthread_cond_signal.c | 231 + win32/3rdparty/pthreads/pthread_cond_wait.c | 567 + .../pthreads/pthread_condattr_destroy.c | 86 + .../pthreads/pthread_condattr_getpshared.c | 97 + .../3rdparty/pthreads/pthread_condattr_init.c | 87 + .../pthreads/pthread_condattr_setpshared.c | 117 + win32/3rdparty/pthreads/pthread_delay_np.c | 171 + win32/3rdparty/pthreads/pthread_detach.c | 139 + win32/3rdparty/pthreads/pthread_equal.c | 76 + win32/3rdparty/pthreads/pthread_exit.c | 106 + .../pthreads/pthread_getconcurrency.c | 45 + .../3rdparty/pthreads/pthread_getschedparam.c | 75 + win32/3rdparty/pthreads/pthread_getspecific.c | 84 + .../pthreads/pthread_getw32threadhandle_np.c | 53 + win32/3rdparty/pthreads/pthread_join.c | 154 + win32/3rdparty/pthreads/pthread_key_create.c | 108 + win32/3rdparty/pthreads/pthread_key_delete.c | 133 + win32/3rdparty/pthreads/pthread_kill.c | 102 + .../3rdparty/pthreads/pthread_mutex_destroy.c | 146 + win32/3rdparty/pthreads/pthread_mutex_init.c | 104 + win32/3rdparty/pthreads/pthread_mutex_lock.c | 139 + .../pthreads/pthread_mutex_timedlock.c | 196 + .../3rdparty/pthreads/pthread_mutex_trylock.c | 92 + .../3rdparty/pthreads/pthread_mutex_unlock.c | 119 + .../pthreads/pthread_mutexattr_destroy.c | 83 + .../pthreads/pthread_mutexattr_getkind_np.c | 44 + .../pthreads/pthread_mutexattr_getpshared.c | 95 + .../pthreads/pthread_mutexattr_gettype.c | 56 + .../pthreads/pthread_mutexattr_init.c | 86 + .../pthreads/pthread_mutexattr_setkind_np.c | 44 + .../pthreads/pthread_mutexattr_setpshared.c | 119 + .../pthreads/pthread_mutexattr_settype.c | 143 + .../pthreads/pthread_num_processors_np.c | 56 + win32/3rdparty/pthreads/pthread_once.c | 86 + .../pthreads/pthread_rwlock_destroy.c | 143 + win32/3rdparty/pthreads/pthread_rwlock_init.c | 110 + .../3rdparty/pthreads/pthread_rwlock_rdlock.c | 103 + .../pthreads/pthread_rwlock_timedrdlock.c | 110 + .../pthreads/pthread_rwlock_timedwrlock.c | 140 + .../pthreads/pthread_rwlock_tryrdlock.c | 103 + .../pthreads/pthread_rwlock_trywrlock.c | 123 + .../3rdparty/pthreads/pthread_rwlock_unlock.c | 94 + .../3rdparty/pthreads/pthread_rwlock_wrlock.c | 134 + .../pthreads/pthread_rwlockattr_destroy.c | 85 + .../pthreads/pthread_rwlockattr_getpshared.c | 98 + .../pthreads/pthread_rwlockattr_init.c | 84 + .../pthreads/pthread_rwlockattr_setpshared.c | 121 + win32/3rdparty/pthreads/pthread_self.c | 138 + .../pthreads/pthread_setcancelstate.c | 124 + .../3rdparty/pthreads/pthread_setcanceltype.c | 125 + .../pthreads/pthread_setconcurrency.c | 53 + .../3rdparty/pthreads/pthread_setschedparam.c | 125 + win32/3rdparty/pthreads/pthread_setspecific.c | 168 + .../3rdparty/pthreads/pthread_spin_destroy.c | 112 + win32/3rdparty/pthreads/pthread_spin_init.c | 123 + win32/3rdparty/pthreads/pthread_spin_lock.c | 83 + .../3rdparty/pthreads/pthread_spin_trylock.c | 80 + win32/3rdparty/pthreads/pthread_spin_unlock.c | 75 + win32/3rdparty/pthreads/pthread_testcancel.c | 102 + .../pthreads/pthread_timechange_handler_np.c | 107 + .../pthreads/pthread_win32_attach_detach_np.c | 303 + .../ptw32_InterlockedCompareExchange.c | 303 + win32/3rdparty/pthreads/ptw32_MCS_lock.c | 210 + .../pthreads/ptw32_callUserDestroyRoutines.c | 220 + win32/3rdparty/pthreads/ptw32_calloc.c | 56 + .../pthreads/ptw32_cond_check_need_init.c | 94 + win32/3rdparty/pthreads/ptw32_getprocessors.c | 91 + win32/3rdparty/pthreads/ptw32_is_attr.c | 47 + .../pthreads/ptw32_mutex_check_need_init.c | 112 + win32/3rdparty/pthreads/ptw32_new.c | 91 + .../pthreads/ptw32_processInitialize.c | 102 + .../pthreads/ptw32_processTerminate.c | 114 + win32/3rdparty/pthreads/ptw32_relmillisecs.c | 120 + win32/3rdparty/pthreads/ptw32_reuse.c | 147 + .../pthreads/ptw32_rwlock_cancelwrwait.c | 50 + .../pthreads/ptw32_rwlock_check_need_init.c | 93 + win32/3rdparty/pthreads/ptw32_semwait.c | 118 + .../pthreads/ptw32_spinlock_check_need_init.c | 81 + win32/3rdparty/pthreads/ptw32_threadDestroy.c | 82 + win32/3rdparty/pthreads/ptw32_threadStart.c | 360 + win32/3rdparty/pthreads/ptw32_throw.c | 167 + win32/3rdparty/pthreads/ptw32_timespec.c | 83 + win32/3rdparty/pthreads/ptw32_tkAssocCreate.c | 118 + .../3rdparty/pthreads/ptw32_tkAssocDestroy.c | 114 + win32/3rdparty/pthreads/rwlock.c | 51 + win32/3rdparty/pthreads/sched.c | 53 + win32/3rdparty/pthreads/sched.h | 178 + .../pthreads/sched_get_priority_max.c | 134 + .../pthreads/sched_get_priority_min.c | 135 + win32/3rdparty/pthreads/sched_getscheduler.c | 69 + win32/3rdparty/pthreads/sched_setscheduler.c | 81 + win32/3rdparty/pthreads/sched_yield.c | 71 + win32/3rdparty/pthreads/sem_close.c | 58 + win32/3rdparty/pthreads/sem_destroy.c | 144 + win32/3rdparty/pthreads/sem_getvalue.c | 110 + win32/3rdparty/pthreads/sem_init.c | 169 + win32/3rdparty/pthreads/sem_open.c | 58 + win32/3rdparty/pthreads/sem_post.c | 128 + win32/3rdparty/pthreads/sem_post_multiple.c | 142 + win32/3rdparty/pthreads/sem_timedwait.c | 238 + win32/3rdparty/pthreads/sem_trywait.c | 117 + win32/3rdparty/pthreads/sem_unlink.c | 58 + win32/3rdparty/pthreads/sem_wait.c | 187 + win32/3rdparty/pthreads/semaphore.c | 69 + win32/3rdparty/pthreads/semaphore.h | 166 + win32/3rdparty/pthreads/signal.c | 179 + win32/3rdparty/pthreads/spin.c | 46 + win32/3rdparty/pthreads/sync.c | 43 + win32/3rdparty/pthreads/tests/Bmakefile | 350 + win32/3rdparty/pthreads/tests/ChangeLog | 894 + win32/3rdparty/pthreads/tests/Debug.dsp | 93 + win32/3rdparty/pthreads/tests/Debug.dsw | 29 + win32/3rdparty/pthreads/tests/Debug.plg | 32 + win32/3rdparty/pthreads/tests/Debug.txt | 6 + win32/3rdparty/pthreads/tests/GNUmakefile | 375 + win32/3rdparty/pthreads/tests/README | 44 + .../3rdparty/pthreads/tests/README.BENCHTESTS | 74 + win32/3rdparty/pthreads/tests/SIZES.GC | 20 + win32/3rdparty/pthreads/tests/SIZES.GCE | 20 + win32/3rdparty/pthreads/tests/SIZES.VC | 20 + win32/3rdparty/pthreads/tests/SIZES.VCE | 19 + win32/3rdparty/pthreads/tests/SIZES.VSE | 19 + win32/3rdparty/pthreads/tests/Wmakefile | 346 + win32/3rdparty/pthreads/tests/barrier1.c | 58 + win32/3rdparty/pthreads/tests/barrier2.c | 55 + win32/3rdparty/pthreads/tests/barrier3.c | 71 + win32/3rdparty/pthreads/tests/barrier4.c | 110 + win32/3rdparty/pthreads/tests/barrier5.c | 128 + win32/3rdparty/pthreads/tests/benchlib.c | 363 + win32/3rdparty/pthreads/tests/benchtest.h | 70 + win32/3rdparty/pthreads/tests/benchtest1.c | 249 + win32/3rdparty/pthreads/tests/benchtest2.c | 311 + win32/3rdparty/pthreads/tests/benchtest3.c | 201 + win32/3rdparty/pthreads/tests/benchtest4.c | 182 + win32/3rdparty/pthreads/tests/benchtest5.c | 159 + win32/3rdparty/pthreads/tests/cancel1.c | 179 + win32/3rdparty/pthreads/tests/cancel2.c | 251 + win32/3rdparty/pthreads/tests/cancel3.c | 201 + win32/3rdparty/pthreads/tests/cancel4.c | 203 + win32/3rdparty/pthreads/tests/cancel5.c | 199 + win32/3rdparty/pthreads/tests/cancel6a.c | 191 + win32/3rdparty/pthreads/tests/cancel6d.c | 190 + win32/3rdparty/pthreads/tests/cancel7.c | 216 + win32/3rdparty/pthreads/tests/cancel8.c | 217 + win32/3rdparty/pthreads/tests/cancel9.c | 202 + win32/3rdparty/pthreads/tests/cleanup0.c | 229 + win32/3rdparty/pthreads/tests/cleanup1.c | 242 + win32/3rdparty/pthreads/tests/cleanup2.c | 217 + win32/3rdparty/pthreads/tests/cleanup3.c | 222 + win32/3rdparty/pthreads/tests/condvar1.c | 97 + win32/3rdparty/pthreads/tests/condvar1_1.c | 115 + win32/3rdparty/pthreads/tests/condvar1_2.c | 124 + win32/3rdparty/pthreads/tests/condvar2.c | 125 + win32/3rdparty/pthreads/tests/condvar2_1.c | 153 + win32/3rdparty/pthreads/tests/condvar3.c | 148 + win32/3rdparty/pthreads/tests/condvar3_1.c | 201 + win32/3rdparty/pthreads/tests/condvar3_2.c | 193 + win32/3rdparty/pthreads/tests/condvar3_3.c | 132 + win32/3rdparty/pthreads/tests/condvar4.c | 169 + win32/3rdparty/pthreads/tests/condvar5.c | 168 + win32/3rdparty/pthreads/tests/condvar6.c | 242 + win32/3rdparty/pthreads/tests/condvar7.c | 257 + win32/3rdparty/pthreads/tests/condvar8.c | 258 + win32/3rdparty/pthreads/tests/condvar9.c | 267 + win32/3rdparty/pthreads/tests/context1.c | 144 + win32/3rdparty/pthreads/tests/count1.c | 90 + win32/3rdparty/pthreads/tests/create1.c | 66 + win32/3rdparty/pthreads/tests/create2.c | 108 + win32/3rdparty/pthreads/tests/create3.c | 122 + win32/3rdparty/pthreads/tests/delay1.c | 51 + win32/3rdparty/pthreads/tests/delay2.c | 82 + win32/3rdparty/pthreads/tests/detach1.c | 93 + win32/3rdparty/pthreads/tests/equal1.c | 66 + win32/3rdparty/pthreads/tests/errno1.c | 177 + win32/3rdparty/pthreads/tests/exception1.c | 263 + win32/3rdparty/pthreads/tests/exception2.c | 158 + win32/3rdparty/pthreads/tests/exception3.c | 196 + win32/3rdparty/pthreads/tests/exit1.c | 50 + win32/3rdparty/pthreads/tests/exit2.c | 64 + win32/3rdparty/pthreads/tests/exit3.c | 68 + win32/3rdparty/pthreads/tests/exit4.c | 199 + win32/3rdparty/pthreads/tests/exit5.c | 205 + win32/3rdparty/pthreads/tests/eyal1.c | 367 + win32/3rdparty/pthreads/tests/inherit1.c | 177 + win32/3rdparty/pthreads/tests/join0.c | 67 + win32/3rdparty/pthreads/tests/join1.c | 78 + win32/3rdparty/pthreads/tests/join2.c | 69 + win32/3rdparty/pthreads/tests/join3.c | 75 + win32/3rdparty/pthreads/tests/kill1.c | 83 + win32/3rdparty/pthreads/tests/loadfree.c | 70 + win32/3rdparty/pthreads/tests/mutex1.c | 68 + win32/3rdparty/pthreads/tests/mutex1e.c | 74 + win32/3rdparty/pthreads/tests/mutex1n.c | 74 + win32/3rdparty/pthreads/tests/mutex1r.c | 74 + win32/3rdparty/pthreads/tests/mutex2.c | 66 + win32/3rdparty/pthreads/tests/mutex2e.c | 66 + win32/3rdparty/pthreads/tests/mutex2r.c | 66 + win32/3rdparty/pthreads/tests/mutex3.c | 75 + win32/3rdparty/pthreads/tests/mutex3e.c | 75 + win32/3rdparty/pthreads/tests/mutex3r.c | 75 + win32/3rdparty/pthreads/tests/mutex4.c | 111 + win32/3rdparty/pthreads/tests/mutex5.c | 67 + win32/3rdparty/pthreads/tests/mutex6.c | 93 + win32/3rdparty/pthreads/tests/mutex6e.c | 102 + win32/3rdparty/pthreads/tests/mutex6es.c | 94 + win32/3rdparty/pthreads/tests/mutex6n.c | 104 + win32/3rdparty/pthreads/tests/mutex6r.c | 100 + win32/3rdparty/pthreads/tests/mutex6rs.c | 92 + win32/3rdparty/pthreads/tests/mutex6s.c | 93 + win32/3rdparty/pthreads/tests/mutex7.c | 82 + win32/3rdparty/pthreads/tests/mutex7e.c | 102 + win32/3rdparty/pthreads/tests/mutex7n.c | 93 + win32/3rdparty/pthreads/tests/mutex7r.c | 100 + win32/3rdparty/pthreads/tests/mutex8.c | 82 + win32/3rdparty/pthreads/tests/mutex8e.c | 97 + win32/3rdparty/pthreads/tests/mutex8n.c | 97 + win32/3rdparty/pthreads/tests/mutex8r.c | 97 + win32/3rdparty/pthreads/tests/once1.c | 77 + win32/3rdparty/pthreads/tests/once2.c | 109 + win32/3rdparty/pthreads/tests/once3.c | 132 + win32/3rdparty/pthreads/tests/once4.c | 191 + win32/3rdparty/pthreads/tests/priority1.c | 172 + win32/3rdparty/pthreads/tests/priority2.c | 169 + win32/3rdparty/pthreads/tests/reuse1.c | 124 + win32/3rdparty/pthreads/tests/reuse2.c | 167 + win32/3rdparty/pthreads/tests/rwlock1.c | 61 + win32/3rdparty/pthreads/tests/rwlock2.c | 66 + win32/3rdparty/pthreads/tests/rwlock2_t.c | 78 + win32/3rdparty/pthreads/tests/rwlock3.c | 76 + win32/3rdparty/pthreads/tests/rwlock3_t.c | 87 + win32/3rdparty/pthreads/tests/rwlock4.c | 76 + win32/3rdparty/pthreads/tests/rwlock4_t.c | 87 + win32/3rdparty/pthreads/tests/rwlock5.c | 78 + win32/3rdparty/pthreads/tests/rwlock5_t.c | 89 + win32/3rdparty/pthreads/tests/rwlock6.c | 101 + win32/3rdparty/pthreads/tests/rwlock6_t.c | 126 + win32/3rdparty/pthreads/tests/rwlock6_t2.c | 119 + win32/3rdparty/pthreads/tests/rwlock7.c | 199 + win32/3rdparty/pthreads/tests/rwlock8.c | 205 + win32/3rdparty/pthreads/tests/self1.c | 69 + win32/3rdparty/pthreads/tests/self2.c | 73 + win32/3rdparty/pthreads/tests/semaphore1.c | 161 + win32/3rdparty/pthreads/tests/semaphore2.c | 108 + win32/3rdparty/pthreads/tests/semaphore3.c | 121 + win32/3rdparty/pthreads/tests/semaphore4.c | 138 + win32/3rdparty/pthreads/tests/semaphore4t.c | 132 + win32/3rdparty/pthreads/tests/sizes.c | 32 + win32/3rdparty/pthreads/tests/spin1.c | 59 + win32/3rdparty/pthreads/tests/spin2.c | 75 + win32/3rdparty/pthreads/tests/spin3.c | 72 + win32/3rdparty/pthreads/tests/spin4.c | 103 + win32/3rdparty/pthreads/tests/stress1.c | 278 + win32/3rdparty/pthreads/tests/test.h | 140 + win32/3rdparty/pthreads/tests/tryentercs.c | 103 + win32/3rdparty/pthreads/tests/tryentercs2.c | 92 + win32/3rdparty/pthreads/tests/tsd1.c | 211 + win32/3rdparty/pthreads/tests/tsd2.c | 215 + win32/3rdparty/pthreads/tests/valid1.c | 103 + win32/3rdparty/pthreads/tests/valid2.c | 84 + win32/3rdparty/pthreads/tsd.c | 44 + win32/3rdparty/pthreads/version.rc | 384 + win32/3rdparty/pthreads/w32_CancelableWait.c | 160 + win32/3rdparty/zlib/ChangeLog | 855 + win32/3rdparty/zlib/FAQ | 339 + win32/3rdparty/zlib/INDEX | 51 + win32/3rdparty/zlib/Makefile.in | 154 + win32/3rdparty/zlib/README | 125 + win32/3rdparty/zlib/adler32.c | 149 + win32/3rdparty/zlib/algorithm.txt | 209 + win32/3rdparty/zlib/amiga/Makefile.pup | 66 + win32/3rdparty/zlib/amiga/Makefile.sas | 65 + win32/3rdparty/zlib/as400/bndsrc | 132 + win32/3rdparty/zlib/as400/compile.clp | 123 + win32/3rdparty/zlib/as400/readme.txt | 111 + win32/3rdparty/zlib/as400/zlib.inc | 331 + win32/3rdparty/zlib/compress.c | 79 + win32/3rdparty/zlib/configure | 459 + win32/3rdparty/zlib/contrib/README.contrib | 71 + .../3rdparty/zlib/contrib/ada/buffer_demo.adb | 106 + win32/3rdparty/zlib/contrib/ada/mtest.adb | 156 + win32/3rdparty/zlib/contrib/ada/read.adb | 156 + win32/3rdparty/zlib/contrib/ada/readme.txt | 65 + win32/3rdparty/zlib/contrib/ada/test.adb | 463 + .../zlib/contrib/ada/zlib-streams.adb | 225 + .../zlib/contrib/ada/zlib-streams.ads | 114 + win32/3rdparty/zlib/contrib/ada/zlib-thin.adb | 141 + win32/3rdparty/zlib/contrib/ada/zlib-thin.ads | 450 + win32/3rdparty/zlib/contrib/ada/zlib.adb | 701 + win32/3rdparty/zlib/contrib/ada/zlib.ads | 328 + win32/3rdparty/zlib/contrib/ada/zlib.gpr | 20 + win32/3rdparty/zlib/contrib/asm586/README.586 | 43 + win32/3rdparty/zlib/contrib/asm586/match.S | 364 + win32/3rdparty/zlib/contrib/asm686/README.686 | 34 + win32/3rdparty/zlib/contrib/asm686/match.S | 329 + win32/3rdparty/zlib/contrib/blast/README | 4 + win32/3rdparty/zlib/contrib/blast/blast.c | 444 + win32/3rdparty/zlib/contrib/blast/blast.h | 71 + win32/3rdparty/zlib/contrib/blast/test.txt | 1 + win32/3rdparty/zlib/contrib/delphi/ZLib.pas | 557 + .../zlib/contrib/delphi/ZLibConst.pas | 11 + win32/3rdparty/zlib/contrib/delphi/readme.txt | 76 + .../3rdparty/zlib/contrib/delphi/zlibd32.mak | 93 + .../zlib/contrib/dotzlib/DotZLib.build | 33 + .../3rdparty/zlib/contrib/dotzlib/DotZLib.sln | 21 + .../contrib/dotzlib/DotZLib/AssemblyInfo.cs | 58 + .../contrib/dotzlib/DotZLib/ChecksumImpl.cs | 202 + .../contrib/dotzlib/DotZLib/CircularBuffer.cs | 83 + .../zlib/contrib/dotzlib/DotZLib/CodecBase.cs | 198 + .../zlib/contrib/dotzlib/DotZLib/Deflater.cs | 106 + .../zlib/contrib/dotzlib/DotZLib/DotZLib.cs | 288 + .../contrib/dotzlib/DotZLib/DotZLib.csproj | 141 + .../contrib/dotzlib/DotZLib/GZipStream.cs | 301 + .../zlib/contrib/dotzlib/DotZLib/Inflater.cs | 105 + .../zlib/contrib/dotzlib/DotZLib/UnitTests.cs | 274 + .../zlib/contrib/dotzlib/LICENSE_1_0.txt | 23 + .../3rdparty/zlib/contrib/dotzlib/readme.txt | 58 + win32/3rdparty/zlib/contrib/infback9/README | 1 + .../3rdparty/zlib/contrib/infback9/infback9.c | 608 + .../3rdparty/zlib/contrib/infback9/infback9.h | 37 + .../3rdparty/zlib/contrib/infback9/inffix9.h | 107 + .../3rdparty/zlib/contrib/infback9/inflate9.h | 47 + .../3rdparty/zlib/contrib/infback9/inftree9.c | 323 + .../3rdparty/zlib/contrib/infback9/inftree9.h | 55 + .../zlib/contrib/inflate86/inffas86.c | 1157 + .../3rdparty/zlib/contrib/inflate86/inffast.S | 1368 + win32/3rdparty/zlib/contrib/iostream/test.cpp | 24 + .../zlib/contrib/iostream/zfstream.cpp | 329 + .../3rdparty/zlib/contrib/iostream/zfstream.h | 128 + .../3rdparty/zlib/contrib/iostream2/zstream.h | 307 + .../zlib/contrib/iostream2/zstream_test.cpp | 25 + win32/3rdparty/zlib/contrib/iostream3/README | 35 + win32/3rdparty/zlib/contrib/iostream3/TODO | 17 + win32/3rdparty/zlib/contrib/iostream3/test.cc | 50 + .../zlib/contrib/iostream3/zfstream.cc | 479 + .../zlib/contrib/iostream3/zfstream.h | 466 + win32/3rdparty/zlib/contrib/masm686/match.asm | 413 + .../zlib/contrib/masmx64/bld_ml64.bat | 2 + .../3rdparty/zlib/contrib/masmx64/gvmat64.asm | 513 + .../zlib/contrib/masmx64/inffas8664.c | 186 + .../zlib/contrib/masmx64/inffasx64.asm | 392 + .../3rdparty/zlib/contrib/masmx64/readme.txt | 28 + .../zlib/contrib/masmx86/bld_ml32.bat | 2 + .../3rdparty/zlib/contrib/masmx86/gvmat32.asm | 972 + .../3rdparty/zlib/contrib/masmx86/gvmat32c.c | 62 + .../zlib/contrib/masmx86/inffas32.asm | 1083 + win32/3rdparty/zlib/contrib/masmx86/mkasm.bat | 3 + .../3rdparty/zlib/contrib/masmx86/readme.txt | 21 + .../zlib/contrib/minizip/ChangeLogUnzip | 67 + win32/3rdparty/zlib/contrib/minizip/crypt.h | 132 + win32/3rdparty/zlib/contrib/minizip/ioapi.c | 177 + win32/3rdparty/zlib/contrib/minizip/ioapi.h | 75 + win32/3rdparty/zlib/contrib/minizip/iowin32.c | 270 + win32/3rdparty/zlib/contrib/minizip/iowin32.h | 21 + win32/3rdparty/zlib/contrib/minizip/miniunz.c | 585 + win32/3rdparty/zlib/contrib/minizip/minizip.c | 420 + win32/3rdparty/zlib/contrib/minizip/mztools.c | 281 + win32/3rdparty/zlib/contrib/minizip/mztools.h | 31 + win32/3rdparty/zlib/contrib/minizip/unzip.c | 1598 + win32/3rdparty/zlib/contrib/minizip/unzip.h | 354 + win32/3rdparty/zlib/contrib/minizip/zip.c | 1219 + win32/3rdparty/zlib/contrib/minizip/zip.h | 235 + .../3rdparty/zlib/contrib/pascal/example.pas | 599 + win32/3rdparty/zlib/contrib/pascal/readme.txt | 76 + .../3rdparty/zlib/contrib/pascal/zlibd32.mak | 93 + .../3rdparty/zlib/contrib/pascal/zlibpas.pas | 236 + win32/3rdparty/zlib/contrib/puff/README | 63 + win32/3rdparty/zlib/contrib/puff/puff.c | 837 + win32/3rdparty/zlib/contrib/puff/puff.h | 31 + .../3rdparty/zlib/contrib/testzlib/testzlib.c | 275 + .../zlib/contrib/testzlib/testzlib.txt | 10 + .../3rdparty/zlib/contrib/untgz/Makefile.msc | 17 + win32/3rdparty/zlib/contrib/untgz/untgz.c | 674 + .../3rdparty/zlib/contrib/vstudio/readme.txt | 73 + .../zlib/contrib/vstudio/vc7/miniunz.vcproj | 126 + .../zlib/contrib/vstudio/vc7/minizip.vcproj | 126 + .../zlib/contrib/vstudio/vc7/testzlib.vcproj | 126 + .../3rdparty/zlib/contrib/vstudio/vc7/zlib.rc | 32 + .../zlib/contrib/vstudio/vc7/zlibstat.vcproj | 246 + .../zlib/contrib/vstudio/vc7/zlibvc.def | 92 + .../zlib/contrib/vstudio/vc7/zlibvc.sln | 78 + .../zlib/contrib/vstudio/vc7/zlibvc.vcproj | 445 + .../zlib/contrib/vstudio/vc8/miniunz.vcproj | 566 + .../zlib/contrib/vstudio/vc8/minizip.vcproj | 563 + .../zlib/contrib/vstudio/vc8/testzlib.vcproj | 948 + .../contrib/vstudio/vc8/testzlibdll.vcproj | 567 + .../3rdparty/zlib/contrib/vstudio/vc8/zlib.rc | 32 + .../zlib/contrib/vstudio/vc8/zlibstat.vcproj | 870 + .../zlib/contrib/vstudio/vc8/zlibvc.def | 92 + .../zlib/contrib/vstudio/vc8/zlibvc.sln | 144 + .../zlib/contrib/vstudio/vc8/zlibvc.vcproj | 1219 + win32/3rdparty/zlib/crc32.c | 423 + win32/3rdparty/zlib/crc32.h | 441 + win32/3rdparty/zlib/deflate.c | 1736 + win32/3rdparty/zlib/deflate.h | 331 + win32/3rdparty/zlib/example.c | 565 + win32/3rdparty/zlib/examples/README.examples | 42 + win32/3rdparty/zlib/examples/fitblk.c | 233 + win32/3rdparty/zlib/examples/gun.c | 693 + win32/3rdparty/zlib/examples/gzappend.c | 500 + win32/3rdparty/zlib/examples/gzjoin.c | 448 + win32/3rdparty/zlib/examples/gzlog.c | 413 + win32/3rdparty/zlib/examples/gzlog.h | 58 + win32/3rdparty/zlib/examples/zlib_how.html | 523 + win32/3rdparty/zlib/examples/zpipe.c | 191 + win32/3rdparty/zlib/examples/zran.c | 404 + win32/3rdparty/zlib/gzio.c | 1026 + win32/3rdparty/zlib/infback.c | 623 + win32/3rdparty/zlib/inffast.c | 318 + win32/3rdparty/zlib/inffast.h | 11 + win32/3rdparty/zlib/inffixed.h | 94 + win32/3rdparty/zlib/inflate.c | 1368 + win32/3rdparty/zlib/inflate.h | 115 + win32/3rdparty/zlib/inftrees.c | 329 + win32/3rdparty/zlib/inftrees.h | 55 + win32/3rdparty/zlib/make_vms.com | 461 + win32/3rdparty/zlib/minigzip.c | 322 + win32/3rdparty/zlib/msdos/Makefile.bor | 109 + win32/3rdparty/zlib/msdos/Makefile.dj2 | 104 + win32/3rdparty/zlib/msdos/Makefile.emx | 69 + win32/3rdparty/zlib/msdos/Makefile.msc | 106 + win32/3rdparty/zlib/msdos/Makefile.tc | 94 + win32/3rdparty/zlib/old/Makefile.riscos | 151 + win32/3rdparty/zlib/old/README | 3 + win32/3rdparty/zlib/old/descrip.mms | 48 + win32/3rdparty/zlib/old/os2/Makefile.os2 | 136 + win32/3rdparty/zlib/old/os2/zlib.def | 51 + win32/3rdparty/zlib/old/visual-basic.txt | 160 + win32/3rdparty/zlib/old/zlib.html | 971 + win32/3rdparty/zlib/projects/README.projects | 41 + .../zlib/projects/visualc6/README.txt | 73 + .../zlib/projects/visualc6/example.dsp | 278 + .../zlib/projects/visualc6/minigzip.dsp | 278 + .../3rdparty/zlib/projects/visualc6/zlib.dsp | 609 + .../3rdparty/zlib/projects/visualc6/zlib.dsw | 59 + win32/3rdparty/zlib/qnx/package.qpg | 141 + win32/3rdparty/zlib/trees.c | 1219 + win32/3rdparty/zlib/trees.h | 128 + win32/3rdparty/zlib/uncompr.c | 61 + win32/3rdparty/zlib/win32/DLL_FAQ.txt | 397 + win32/3rdparty/zlib/win32/Makefile.bor | 107 + win32/3rdparty/zlib/win32/Makefile.emx | 69 + win32/3rdparty/zlib/win32/Makefile.gcc | 141 + win32/3rdparty/zlib/win32/Makefile.msc | 126 + win32/3rdparty/zlib/win32/VisualC.txt | 3 + win32/3rdparty/zlib/win32/zlib.def | 60 + win32/3rdparty/zlib/win32/zlib1.rc | 39 + win32/3rdparty/zlib/zconf.h | 332 + win32/3rdparty/zlib/zconf.in.h | 332 + win32/3rdparty/zlib/zlib.3 | 159 + win32/3rdparty/zlib/zlib.h | 1357 + win32/3rdparty/zlib/zutil.c | 318 + win32/3rdparty/zlib/zutil.h | 269 + win32/ClamAV.sln | 20 + win32/clamav-config.h | 571 + win32/compat/dirent.c | 26 + win32/compat/dirent.h | 57 + win32/libclamav.vcproj | 887 + win32/platform.h | 43 + 634 files changed, 217414 insertions(+) create mode 100644 win32/.gitignore create mode 100644 win32/3rdparty/bzip2/CHANGES create mode 100644 win32/3rdparty/bzip2/LICENSE create mode 100644 win32/3rdparty/bzip2/Makefile-libbz2_so create mode 100644 win32/3rdparty/bzip2/README create mode 100644 win32/3rdparty/bzip2/README.COMPILATION.PROBLEMS create mode 100644 win32/3rdparty/bzip2/README.XML.STUFF create mode 100644 win32/3rdparty/bzip2/blocksort.c create mode 100644 win32/3rdparty/bzip2/bz-common.xsl create mode 100644 win32/3rdparty/bzip2/bz-fo.xsl create mode 100644 win32/3rdparty/bzip2/bz-html.xsl create mode 100644 win32/3rdparty/bzip2/bzdiff create mode 100644 win32/3rdparty/bzip2/bzdiff.1 create mode 100644 win32/3rdparty/bzip2/bzgrep create mode 100644 win32/3rdparty/bzip2/bzgrep.1 create mode 100644 win32/3rdparty/bzip2/bzip.css create mode 100644 win32/3rdparty/bzip2/bzip2.1 create mode 100644 win32/3rdparty/bzip2/bzip2.1.preformatted create mode 100644 win32/3rdparty/bzip2/bzip2.c create mode 100644 win32/3rdparty/bzip2/bzip2.txt create mode 100644 win32/3rdparty/bzip2/bzip2recover.c create mode 100644 win32/3rdparty/bzip2/bzlib.c create mode 100644 win32/3rdparty/bzip2/bzlib.h create mode 100644 win32/3rdparty/bzip2/bzlib_private.h create mode 100644 win32/3rdparty/bzip2/bzmore create mode 100644 win32/3rdparty/bzip2/bzmore.1 create mode 100644 win32/3rdparty/bzip2/compress.c create mode 100644 win32/3rdparty/bzip2/crctable.c create mode 100644 win32/3rdparty/bzip2/decompress.c create mode 100644 win32/3rdparty/bzip2/dlltest.c create mode 100644 win32/3rdparty/bzip2/dlltest.dsp create mode 100644 win32/3rdparty/bzip2/entities.xml create mode 100644 win32/3rdparty/bzip2/format.pl create mode 100644 win32/3rdparty/bzip2/huffman.c create mode 100644 win32/3rdparty/bzip2/libbz2.def create mode 100644 win32/3rdparty/bzip2/libbz2.dsp create mode 100644 win32/3rdparty/bzip2/makefile.msc create mode 100644 win32/3rdparty/bzip2/manual.html create mode 100644 win32/3rdparty/bzip2/manual.ps create mode 100644 win32/3rdparty/bzip2/manual.xml create mode 100644 win32/3rdparty/bzip2/mk251.c create mode 100644 win32/3rdparty/bzip2/randtable.c create mode 100644 win32/3rdparty/bzip2/sample3.ref create mode 100644 win32/3rdparty/bzip2/spewG.c create mode 100644 win32/3rdparty/bzip2/unzcrash.c create mode 100644 win32/3rdparty/bzip2/words0 create mode 100644 win32/3rdparty/bzip2/words1 create mode 100644 win32/3rdparty/bzip2/words2 create mode 100644 win32/3rdparty/bzip2/words3 create mode 100644 win32/3rdparty/bzip2/xmlproc.sh create mode 100644 win32/3rdparty/pthreads/ANNOUNCE create mode 100644 win32/3rdparty/pthreads/BUGS create mode 100644 win32/3rdparty/pthreads/Bmakefile create mode 100644 win32/3rdparty/pthreads/CONTRIBUTORS create mode 100644 win32/3rdparty/pthreads/COPYING create mode 100644 win32/3rdparty/pthreads/COPYING.LIB create mode 100644 win32/3rdparty/pthreads/ChangeLog create mode 100644 win32/3rdparty/pthreads/FAQ create mode 100644 win32/3rdparty/pthreads/GNUmakefile create mode 100644 win32/3rdparty/pthreads/MAINTAINERS create mode 100644 win32/3rdparty/pthreads/NEWS create mode 100644 win32/3rdparty/pthreads/Nmakefile create mode 100644 win32/3rdparty/pthreads/Nmakefile.tests create mode 100644 win32/3rdparty/pthreads/PROGRESS create mode 100644 win32/3rdparty/pthreads/README create mode 100644 win32/3rdparty/pthreads/README.Borland create mode 100644 win32/3rdparty/pthreads/README.CV create mode 100644 win32/3rdparty/pthreads/README.NONPORTABLE create mode 100644 win32/3rdparty/pthreads/README.Watcom create mode 100644 win32/3rdparty/pthreads/README.WinCE create mode 100644 win32/3rdparty/pthreads/TODO create mode 100644 win32/3rdparty/pthreads/WinCE-PORT create mode 100644 win32/3rdparty/pthreads/attr.c create mode 100644 win32/3rdparty/pthreads/barrier.c create mode 100644 win32/3rdparty/pthreads/builddmc.bat create mode 100644 win32/3rdparty/pthreads/cancel.c create mode 100644 win32/3rdparty/pthreads/cleanup.c create mode 100644 win32/3rdparty/pthreads/condvar.c create mode 100644 win32/3rdparty/pthreads/config.h create mode 100644 win32/3rdparty/pthreads/create.c create mode 100644 win32/3rdparty/pthreads/dll.c create mode 100644 win32/3rdparty/pthreads/errno.c create mode 100644 win32/3rdparty/pthreads/exit.c create mode 100644 win32/3rdparty/pthreads/fork.c create mode 100644 win32/3rdparty/pthreads/global.c create mode 100644 win32/3rdparty/pthreads/implement.h create mode 100644 win32/3rdparty/pthreads/manual/ChangeLog create mode 100644 win32/3rdparty/pthreads/manual/PortabilityIssues.html create mode 100644 win32/3rdparty/pthreads/manual/index.html create mode 100644 win32/3rdparty/pthreads/manual/pthreadCancelableWait.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_attr_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_attr_setstackaddr.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_attr_setstacksize.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_barrier_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_barrier_wait.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_barrierattr_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_barrierattr_setpshared.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_cancel.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_cleanup_push.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_cond_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_condattr_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_condattr_setpshared.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_create.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_delay_np.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_detach.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_equal.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_exit.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_getw32threadhandle_np.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_join.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_key_create.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_kill.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_mutex_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_mutexattr_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_mutexattr_setpshared.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_num_processors_np.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_once.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlock_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlock_rdlock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlock_timedrdlock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlock_timedwrlock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlock_unlock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlock_wrlock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlockattr_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_rwlockattr_setpshared.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_self.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_setcancelstate.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_setcanceltype.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_setconcurrency.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_setschedparam.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_spin_init.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_spin_lock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_spin_unlock.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_timechange_handler_np.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_win32_attach_detach_np.html create mode 100644 win32/3rdparty/pthreads/manual/pthread_win32_test_features_np.html create mode 100644 win32/3rdparty/pthreads/manual/sched_get_priority_max.html create mode 100644 win32/3rdparty/pthreads/manual/sched_getscheduler.html create mode 100644 win32/3rdparty/pthreads/manual/sched_setscheduler.html create mode 100644 win32/3rdparty/pthreads/manual/sched_yield.html create mode 100644 win32/3rdparty/pthreads/manual/sem_init.html create mode 100644 win32/3rdparty/pthreads/misc.c create mode 100644 win32/3rdparty/pthreads/mutex.c create mode 100644 win32/3rdparty/pthreads/need_errno.h create mode 100644 win32/3rdparty/pthreads/nonportable.c create mode 100644 win32/3rdparty/pthreads/private.c create mode 100644 win32/3rdparty/pthreads/pthread.c create mode 100644 win32/3rdparty/pthreads/pthread.dsp create mode 100644 win32/3rdparty/pthreads/pthread.dsw create mode 100644 win32/3rdparty/pthreads/pthread.h create mode 100644 win32/3rdparty/pthreads/pthread_attr_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getdetachstate.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getinheritsched.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getschedparam.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getschedpolicy.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getscope.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getstackaddr.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_getstacksize.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_init.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setdetachstate.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setinheritsched.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setschedparam.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setschedpolicy.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setscope.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setstackaddr.c create mode 100644 win32/3rdparty/pthreads/pthread_attr_setstacksize.c create mode 100644 win32/3rdparty/pthreads/pthread_barrier_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_barrier_init.c create mode 100644 win32/3rdparty/pthreads/pthread_barrier_wait.c create mode 100644 win32/3rdparty/pthreads/pthread_barrierattr_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_barrierattr_getpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_barrierattr_init.c create mode 100644 win32/3rdparty/pthreads/pthread_barrierattr_setpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_cancel.c create mode 100644 win32/3rdparty/pthreads/pthread_cond_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_cond_init.c create mode 100644 win32/3rdparty/pthreads/pthread_cond_signal.c create mode 100644 win32/3rdparty/pthreads/pthread_cond_wait.c create mode 100644 win32/3rdparty/pthreads/pthread_condattr_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_condattr_getpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_condattr_init.c create mode 100644 win32/3rdparty/pthreads/pthread_condattr_setpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_delay_np.c create mode 100644 win32/3rdparty/pthreads/pthread_detach.c create mode 100644 win32/3rdparty/pthreads/pthread_equal.c create mode 100644 win32/3rdparty/pthreads/pthread_exit.c create mode 100644 win32/3rdparty/pthreads/pthread_getconcurrency.c create mode 100644 win32/3rdparty/pthreads/pthread_getschedparam.c create mode 100644 win32/3rdparty/pthreads/pthread_getspecific.c create mode 100644 win32/3rdparty/pthreads/pthread_getw32threadhandle_np.c create mode 100644 win32/3rdparty/pthreads/pthread_join.c create mode 100644 win32/3rdparty/pthreads/pthread_key_create.c create mode 100644 win32/3rdparty/pthreads/pthread_key_delete.c create mode 100644 win32/3rdparty/pthreads/pthread_kill.c create mode 100644 win32/3rdparty/pthreads/pthread_mutex_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_mutex_init.c create mode 100644 win32/3rdparty/pthreads/pthread_mutex_lock.c create mode 100644 win32/3rdparty/pthreads/pthread_mutex_timedlock.c create mode 100644 win32/3rdparty/pthreads/pthread_mutex_trylock.c create mode 100644 win32/3rdparty/pthreads/pthread_mutex_unlock.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_getkind_np.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_getpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_gettype.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_init.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_setkind_np.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_setpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_mutexattr_settype.c create mode 100644 win32/3rdparty/pthreads/pthread_num_processors_np.c create mode 100644 win32/3rdparty/pthreads/pthread_once.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_init.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_rdlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_timedrdlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_timedwrlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_tryrdlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_trywrlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_unlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlock_wrlock.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlockattr_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlockattr_getpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlockattr_init.c create mode 100644 win32/3rdparty/pthreads/pthread_rwlockattr_setpshared.c create mode 100644 win32/3rdparty/pthreads/pthread_self.c create mode 100644 win32/3rdparty/pthreads/pthread_setcancelstate.c create mode 100644 win32/3rdparty/pthreads/pthread_setcanceltype.c create mode 100644 win32/3rdparty/pthreads/pthread_setconcurrency.c create mode 100644 win32/3rdparty/pthreads/pthread_setschedparam.c create mode 100644 win32/3rdparty/pthreads/pthread_setspecific.c create mode 100644 win32/3rdparty/pthreads/pthread_spin_destroy.c create mode 100644 win32/3rdparty/pthreads/pthread_spin_init.c create mode 100644 win32/3rdparty/pthreads/pthread_spin_lock.c create mode 100644 win32/3rdparty/pthreads/pthread_spin_trylock.c create mode 100644 win32/3rdparty/pthreads/pthread_spin_unlock.c create mode 100644 win32/3rdparty/pthreads/pthread_testcancel.c create mode 100644 win32/3rdparty/pthreads/pthread_timechange_handler_np.c create mode 100644 win32/3rdparty/pthreads/pthread_win32_attach_detach_np.c create mode 100644 win32/3rdparty/pthreads/ptw32_InterlockedCompareExchange.c create mode 100644 win32/3rdparty/pthreads/ptw32_MCS_lock.c create mode 100644 win32/3rdparty/pthreads/ptw32_callUserDestroyRoutines.c create mode 100644 win32/3rdparty/pthreads/ptw32_calloc.c create mode 100644 win32/3rdparty/pthreads/ptw32_cond_check_need_init.c create mode 100644 win32/3rdparty/pthreads/ptw32_getprocessors.c create mode 100644 win32/3rdparty/pthreads/ptw32_is_attr.c create mode 100644 win32/3rdparty/pthreads/ptw32_mutex_check_need_init.c create mode 100644 win32/3rdparty/pthreads/ptw32_new.c create mode 100644 win32/3rdparty/pthreads/ptw32_processInitialize.c create mode 100644 win32/3rdparty/pthreads/ptw32_processTerminate.c create mode 100644 win32/3rdparty/pthreads/ptw32_relmillisecs.c create mode 100644 win32/3rdparty/pthreads/ptw32_reuse.c create mode 100644 win32/3rdparty/pthreads/ptw32_rwlock_cancelwrwait.c create mode 100644 win32/3rdparty/pthreads/ptw32_rwlock_check_need_init.c create mode 100644 win32/3rdparty/pthreads/ptw32_semwait.c create mode 100644 win32/3rdparty/pthreads/ptw32_spinlock_check_need_init.c create mode 100644 win32/3rdparty/pthreads/ptw32_threadDestroy.c create mode 100644 win32/3rdparty/pthreads/ptw32_threadStart.c create mode 100644 win32/3rdparty/pthreads/ptw32_throw.c create mode 100644 win32/3rdparty/pthreads/ptw32_timespec.c create mode 100644 win32/3rdparty/pthreads/ptw32_tkAssocCreate.c create mode 100644 win32/3rdparty/pthreads/ptw32_tkAssocDestroy.c create mode 100644 win32/3rdparty/pthreads/rwlock.c create mode 100644 win32/3rdparty/pthreads/sched.c create mode 100644 win32/3rdparty/pthreads/sched.h create mode 100644 win32/3rdparty/pthreads/sched_get_priority_max.c create mode 100644 win32/3rdparty/pthreads/sched_get_priority_min.c create mode 100644 win32/3rdparty/pthreads/sched_getscheduler.c create mode 100644 win32/3rdparty/pthreads/sched_setscheduler.c create mode 100644 win32/3rdparty/pthreads/sched_yield.c create mode 100644 win32/3rdparty/pthreads/sem_close.c create mode 100644 win32/3rdparty/pthreads/sem_destroy.c create mode 100644 win32/3rdparty/pthreads/sem_getvalue.c create mode 100644 win32/3rdparty/pthreads/sem_init.c create mode 100644 win32/3rdparty/pthreads/sem_open.c create mode 100644 win32/3rdparty/pthreads/sem_post.c create mode 100644 win32/3rdparty/pthreads/sem_post_multiple.c create mode 100644 win32/3rdparty/pthreads/sem_timedwait.c create mode 100644 win32/3rdparty/pthreads/sem_trywait.c create mode 100644 win32/3rdparty/pthreads/sem_unlink.c create mode 100644 win32/3rdparty/pthreads/sem_wait.c create mode 100644 win32/3rdparty/pthreads/semaphore.c create mode 100644 win32/3rdparty/pthreads/semaphore.h create mode 100644 win32/3rdparty/pthreads/signal.c create mode 100644 win32/3rdparty/pthreads/spin.c create mode 100644 win32/3rdparty/pthreads/sync.c create mode 100644 win32/3rdparty/pthreads/tests/Bmakefile create mode 100644 win32/3rdparty/pthreads/tests/ChangeLog create mode 100644 win32/3rdparty/pthreads/tests/Debug.dsp create mode 100644 win32/3rdparty/pthreads/tests/Debug.dsw create mode 100644 win32/3rdparty/pthreads/tests/Debug.plg create mode 100644 win32/3rdparty/pthreads/tests/Debug.txt create mode 100644 win32/3rdparty/pthreads/tests/GNUmakefile create mode 100644 win32/3rdparty/pthreads/tests/README create mode 100644 win32/3rdparty/pthreads/tests/README.BENCHTESTS create mode 100644 win32/3rdparty/pthreads/tests/SIZES.GC create mode 100644 win32/3rdparty/pthreads/tests/SIZES.GCE create mode 100644 win32/3rdparty/pthreads/tests/SIZES.VC create mode 100644 win32/3rdparty/pthreads/tests/SIZES.VCE create mode 100644 win32/3rdparty/pthreads/tests/SIZES.VSE create mode 100644 win32/3rdparty/pthreads/tests/Wmakefile create mode 100644 win32/3rdparty/pthreads/tests/barrier1.c create mode 100644 win32/3rdparty/pthreads/tests/barrier2.c create mode 100644 win32/3rdparty/pthreads/tests/barrier3.c create mode 100644 win32/3rdparty/pthreads/tests/barrier4.c create mode 100644 win32/3rdparty/pthreads/tests/barrier5.c create mode 100644 win32/3rdparty/pthreads/tests/benchlib.c create mode 100644 win32/3rdparty/pthreads/tests/benchtest.h create mode 100644 win32/3rdparty/pthreads/tests/benchtest1.c create mode 100644 win32/3rdparty/pthreads/tests/benchtest2.c create mode 100644 win32/3rdparty/pthreads/tests/benchtest3.c create mode 100644 win32/3rdparty/pthreads/tests/benchtest4.c create mode 100644 win32/3rdparty/pthreads/tests/benchtest5.c create mode 100644 win32/3rdparty/pthreads/tests/cancel1.c create mode 100644 win32/3rdparty/pthreads/tests/cancel2.c create mode 100644 win32/3rdparty/pthreads/tests/cancel3.c create mode 100644 win32/3rdparty/pthreads/tests/cancel4.c create mode 100644 win32/3rdparty/pthreads/tests/cancel5.c create mode 100644 win32/3rdparty/pthreads/tests/cancel6a.c create mode 100644 win32/3rdparty/pthreads/tests/cancel6d.c create mode 100644 win32/3rdparty/pthreads/tests/cancel7.c create mode 100644 win32/3rdparty/pthreads/tests/cancel8.c create mode 100644 win32/3rdparty/pthreads/tests/cancel9.c create mode 100644 win32/3rdparty/pthreads/tests/cleanup0.c create mode 100644 win32/3rdparty/pthreads/tests/cleanup1.c create mode 100644 win32/3rdparty/pthreads/tests/cleanup2.c create mode 100644 win32/3rdparty/pthreads/tests/cleanup3.c create mode 100644 win32/3rdparty/pthreads/tests/condvar1.c create mode 100644 win32/3rdparty/pthreads/tests/condvar1_1.c create mode 100644 win32/3rdparty/pthreads/tests/condvar1_2.c create mode 100644 win32/3rdparty/pthreads/tests/condvar2.c create mode 100644 win32/3rdparty/pthreads/tests/condvar2_1.c create mode 100644 win32/3rdparty/pthreads/tests/condvar3.c create mode 100644 win32/3rdparty/pthreads/tests/condvar3_1.c create mode 100644 win32/3rdparty/pthreads/tests/condvar3_2.c create mode 100644 win32/3rdparty/pthreads/tests/condvar3_3.c create mode 100644 win32/3rdparty/pthreads/tests/condvar4.c create mode 100644 win32/3rdparty/pthreads/tests/condvar5.c create mode 100644 win32/3rdparty/pthreads/tests/condvar6.c create mode 100644 win32/3rdparty/pthreads/tests/condvar7.c create mode 100644 win32/3rdparty/pthreads/tests/condvar8.c create mode 100644 win32/3rdparty/pthreads/tests/condvar9.c create mode 100644 win32/3rdparty/pthreads/tests/context1.c create mode 100644 win32/3rdparty/pthreads/tests/count1.c create mode 100644 win32/3rdparty/pthreads/tests/create1.c create mode 100644 win32/3rdparty/pthreads/tests/create2.c create mode 100644 win32/3rdparty/pthreads/tests/create3.c create mode 100644 win32/3rdparty/pthreads/tests/delay1.c create mode 100644 win32/3rdparty/pthreads/tests/delay2.c create mode 100644 win32/3rdparty/pthreads/tests/detach1.c create mode 100644 win32/3rdparty/pthreads/tests/equal1.c create mode 100644 win32/3rdparty/pthreads/tests/errno1.c create mode 100644 win32/3rdparty/pthreads/tests/exception1.c create mode 100644 win32/3rdparty/pthreads/tests/exception2.c create mode 100644 win32/3rdparty/pthreads/tests/exception3.c create mode 100644 win32/3rdparty/pthreads/tests/exit1.c create mode 100644 win32/3rdparty/pthreads/tests/exit2.c create mode 100644 win32/3rdparty/pthreads/tests/exit3.c create mode 100644 win32/3rdparty/pthreads/tests/exit4.c create mode 100644 win32/3rdparty/pthreads/tests/exit5.c create mode 100644 win32/3rdparty/pthreads/tests/eyal1.c create mode 100644 win32/3rdparty/pthreads/tests/inherit1.c create mode 100644 win32/3rdparty/pthreads/tests/join0.c create mode 100644 win32/3rdparty/pthreads/tests/join1.c create mode 100644 win32/3rdparty/pthreads/tests/join2.c create mode 100644 win32/3rdparty/pthreads/tests/join3.c create mode 100644 win32/3rdparty/pthreads/tests/kill1.c create mode 100644 win32/3rdparty/pthreads/tests/loadfree.c create mode 100644 win32/3rdparty/pthreads/tests/mutex1.c create mode 100644 win32/3rdparty/pthreads/tests/mutex1e.c create mode 100644 win32/3rdparty/pthreads/tests/mutex1n.c create mode 100644 win32/3rdparty/pthreads/tests/mutex1r.c create mode 100644 win32/3rdparty/pthreads/tests/mutex2.c create mode 100644 win32/3rdparty/pthreads/tests/mutex2e.c create mode 100644 win32/3rdparty/pthreads/tests/mutex2r.c create mode 100644 win32/3rdparty/pthreads/tests/mutex3.c create mode 100644 win32/3rdparty/pthreads/tests/mutex3e.c create mode 100644 win32/3rdparty/pthreads/tests/mutex3r.c create mode 100644 win32/3rdparty/pthreads/tests/mutex4.c create mode 100644 win32/3rdparty/pthreads/tests/mutex5.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6e.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6es.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6n.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6r.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6rs.c create mode 100644 win32/3rdparty/pthreads/tests/mutex6s.c create mode 100644 win32/3rdparty/pthreads/tests/mutex7.c create mode 100644 win32/3rdparty/pthreads/tests/mutex7e.c create mode 100644 win32/3rdparty/pthreads/tests/mutex7n.c create mode 100644 win32/3rdparty/pthreads/tests/mutex7r.c create mode 100644 win32/3rdparty/pthreads/tests/mutex8.c create mode 100644 win32/3rdparty/pthreads/tests/mutex8e.c create mode 100644 win32/3rdparty/pthreads/tests/mutex8n.c create mode 100644 win32/3rdparty/pthreads/tests/mutex8r.c create mode 100644 win32/3rdparty/pthreads/tests/once1.c create mode 100644 win32/3rdparty/pthreads/tests/once2.c create mode 100644 win32/3rdparty/pthreads/tests/once3.c create mode 100644 win32/3rdparty/pthreads/tests/once4.c create mode 100644 win32/3rdparty/pthreads/tests/priority1.c create mode 100644 win32/3rdparty/pthreads/tests/priority2.c create mode 100644 win32/3rdparty/pthreads/tests/reuse1.c create mode 100644 win32/3rdparty/pthreads/tests/reuse2.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock1.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock2.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock2_t.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock3.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock3_t.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock4.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock4_t.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock5.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock5_t.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock6.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock6_t.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock6_t2.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock7.c create mode 100644 win32/3rdparty/pthreads/tests/rwlock8.c create mode 100644 win32/3rdparty/pthreads/tests/self1.c create mode 100644 win32/3rdparty/pthreads/tests/self2.c create mode 100644 win32/3rdparty/pthreads/tests/semaphore1.c create mode 100644 win32/3rdparty/pthreads/tests/semaphore2.c create mode 100644 win32/3rdparty/pthreads/tests/semaphore3.c create mode 100644 win32/3rdparty/pthreads/tests/semaphore4.c create mode 100644 win32/3rdparty/pthreads/tests/semaphore4t.c create mode 100644 win32/3rdparty/pthreads/tests/sizes.c create mode 100644 win32/3rdparty/pthreads/tests/spin1.c create mode 100644 win32/3rdparty/pthreads/tests/spin2.c create mode 100644 win32/3rdparty/pthreads/tests/spin3.c create mode 100644 win32/3rdparty/pthreads/tests/spin4.c create mode 100644 win32/3rdparty/pthreads/tests/stress1.c create mode 100644 win32/3rdparty/pthreads/tests/test.h create mode 100644 win32/3rdparty/pthreads/tests/tryentercs.c create mode 100644 win32/3rdparty/pthreads/tests/tryentercs2.c create mode 100644 win32/3rdparty/pthreads/tests/tsd1.c create mode 100644 win32/3rdparty/pthreads/tests/tsd2.c create mode 100644 win32/3rdparty/pthreads/tests/valid1.c create mode 100644 win32/3rdparty/pthreads/tests/valid2.c create mode 100644 win32/3rdparty/pthreads/tsd.c create mode 100644 win32/3rdparty/pthreads/version.rc create mode 100644 win32/3rdparty/pthreads/w32_CancelableWait.c create mode 100644 win32/3rdparty/zlib/ChangeLog create mode 100644 win32/3rdparty/zlib/FAQ create mode 100644 win32/3rdparty/zlib/INDEX create mode 100644 win32/3rdparty/zlib/Makefile.in create mode 100644 win32/3rdparty/zlib/README create mode 100644 win32/3rdparty/zlib/adler32.c create mode 100644 win32/3rdparty/zlib/algorithm.txt create mode 100644 win32/3rdparty/zlib/amiga/Makefile.pup create mode 100644 win32/3rdparty/zlib/amiga/Makefile.sas create mode 100644 win32/3rdparty/zlib/as400/bndsrc create mode 100644 win32/3rdparty/zlib/as400/compile.clp create mode 100644 win32/3rdparty/zlib/as400/readme.txt create mode 100644 win32/3rdparty/zlib/as400/zlib.inc create mode 100644 win32/3rdparty/zlib/compress.c create mode 100644 win32/3rdparty/zlib/configure create mode 100644 win32/3rdparty/zlib/contrib/README.contrib create mode 100644 win32/3rdparty/zlib/contrib/ada/buffer_demo.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/mtest.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/read.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/ada/test.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib-streams.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib-streams.ads create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib-thin.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib-thin.ads create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib.adb create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib.ads create mode 100644 win32/3rdparty/zlib/contrib/ada/zlib.gpr create mode 100644 win32/3rdparty/zlib/contrib/asm586/README.586 create mode 100644 win32/3rdparty/zlib/contrib/asm586/match.S create mode 100644 win32/3rdparty/zlib/contrib/asm686/README.686 create mode 100644 win32/3rdparty/zlib/contrib/asm686/match.S create mode 100644 win32/3rdparty/zlib/contrib/blast/README create mode 100644 win32/3rdparty/zlib/contrib/blast/blast.c create mode 100644 win32/3rdparty/zlib/contrib/blast/blast.h create mode 100644 win32/3rdparty/zlib/contrib/blast/test.txt create mode 100644 win32/3rdparty/zlib/contrib/delphi/ZLib.pas create mode 100644 win32/3rdparty/zlib/contrib/delphi/ZLibConst.pas create mode 100644 win32/3rdparty/zlib/contrib/delphi/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/delphi/zlibd32.mak create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib.build create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib.sln create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CodecBase.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Deflater.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/GZipStream.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Inflater.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/LICENSE_1_0.txt create mode 100644 win32/3rdparty/zlib/contrib/dotzlib/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/infback9/README create mode 100644 win32/3rdparty/zlib/contrib/infback9/infback9.c create mode 100644 win32/3rdparty/zlib/contrib/infback9/infback9.h create mode 100644 win32/3rdparty/zlib/contrib/infback9/inffix9.h create mode 100644 win32/3rdparty/zlib/contrib/infback9/inflate9.h create mode 100644 win32/3rdparty/zlib/contrib/infback9/inftree9.c create mode 100644 win32/3rdparty/zlib/contrib/infback9/inftree9.h create mode 100644 win32/3rdparty/zlib/contrib/inflate86/inffas86.c create mode 100644 win32/3rdparty/zlib/contrib/inflate86/inffast.S create mode 100644 win32/3rdparty/zlib/contrib/iostream/test.cpp create mode 100644 win32/3rdparty/zlib/contrib/iostream/zfstream.cpp create mode 100644 win32/3rdparty/zlib/contrib/iostream/zfstream.h create mode 100644 win32/3rdparty/zlib/contrib/iostream2/zstream.h create mode 100644 win32/3rdparty/zlib/contrib/iostream2/zstream_test.cpp create mode 100644 win32/3rdparty/zlib/contrib/iostream3/README create mode 100644 win32/3rdparty/zlib/contrib/iostream3/TODO create mode 100644 win32/3rdparty/zlib/contrib/iostream3/test.cc create mode 100644 win32/3rdparty/zlib/contrib/iostream3/zfstream.cc create mode 100644 win32/3rdparty/zlib/contrib/iostream3/zfstream.h create mode 100644 win32/3rdparty/zlib/contrib/masm686/match.asm create mode 100644 win32/3rdparty/zlib/contrib/masmx64/bld_ml64.bat create mode 100644 win32/3rdparty/zlib/contrib/masmx64/gvmat64.asm create mode 100644 win32/3rdparty/zlib/contrib/masmx64/inffas8664.c create mode 100644 win32/3rdparty/zlib/contrib/masmx64/inffasx64.asm create mode 100644 win32/3rdparty/zlib/contrib/masmx64/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/masmx86/bld_ml32.bat create mode 100644 win32/3rdparty/zlib/contrib/masmx86/gvmat32.asm create mode 100644 win32/3rdparty/zlib/contrib/masmx86/gvmat32c.c create mode 100644 win32/3rdparty/zlib/contrib/masmx86/inffas32.asm create mode 100644 win32/3rdparty/zlib/contrib/masmx86/mkasm.bat create mode 100644 win32/3rdparty/zlib/contrib/masmx86/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/minizip/ChangeLogUnzip create mode 100644 win32/3rdparty/zlib/contrib/minizip/crypt.h create mode 100644 win32/3rdparty/zlib/contrib/minizip/ioapi.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/ioapi.h create mode 100644 win32/3rdparty/zlib/contrib/minizip/iowin32.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/iowin32.h create mode 100644 win32/3rdparty/zlib/contrib/minizip/miniunz.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/minizip.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/mztools.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/mztools.h create mode 100644 win32/3rdparty/zlib/contrib/minizip/unzip.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/unzip.h create mode 100644 win32/3rdparty/zlib/contrib/minizip/zip.c create mode 100644 win32/3rdparty/zlib/contrib/minizip/zip.h create mode 100644 win32/3rdparty/zlib/contrib/pascal/example.pas create mode 100644 win32/3rdparty/zlib/contrib/pascal/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/pascal/zlibd32.mak create mode 100644 win32/3rdparty/zlib/contrib/pascal/zlibpas.pas create mode 100644 win32/3rdparty/zlib/contrib/puff/README create mode 100644 win32/3rdparty/zlib/contrib/puff/puff.c create mode 100644 win32/3rdparty/zlib/contrib/puff/puff.h create mode 100644 win32/3rdparty/zlib/contrib/testzlib/testzlib.c create mode 100644 win32/3rdparty/zlib/contrib/testzlib/testzlib.txt create mode 100644 win32/3rdparty/zlib/contrib/untgz/Makefile.msc create mode 100644 win32/3rdparty/zlib/contrib/untgz/untgz.c create mode 100644 win32/3rdparty/zlib/contrib/vstudio/readme.txt create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/miniunz.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/minizip.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/testzlib.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/zlib.rc create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/zlibstat.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.def create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.sln create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/miniunz.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/minizip.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/testzlib.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/testzlibdll.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/zlib.rc create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/zlibstat.vcproj create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.def create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.sln create mode 100644 win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.vcproj create mode 100644 win32/3rdparty/zlib/crc32.c create mode 100644 win32/3rdparty/zlib/crc32.h create mode 100644 win32/3rdparty/zlib/deflate.c create mode 100644 win32/3rdparty/zlib/deflate.h create mode 100644 win32/3rdparty/zlib/example.c create mode 100644 win32/3rdparty/zlib/examples/README.examples create mode 100644 win32/3rdparty/zlib/examples/fitblk.c create mode 100644 win32/3rdparty/zlib/examples/gun.c create mode 100644 win32/3rdparty/zlib/examples/gzappend.c create mode 100644 win32/3rdparty/zlib/examples/gzjoin.c create mode 100644 win32/3rdparty/zlib/examples/gzlog.c create mode 100644 win32/3rdparty/zlib/examples/gzlog.h create mode 100644 win32/3rdparty/zlib/examples/zlib_how.html create mode 100644 win32/3rdparty/zlib/examples/zpipe.c create mode 100644 win32/3rdparty/zlib/examples/zran.c create mode 100644 win32/3rdparty/zlib/gzio.c create mode 100644 win32/3rdparty/zlib/infback.c create mode 100644 win32/3rdparty/zlib/inffast.c create mode 100644 win32/3rdparty/zlib/inffast.h create mode 100644 win32/3rdparty/zlib/inffixed.h create mode 100644 win32/3rdparty/zlib/inflate.c create mode 100644 win32/3rdparty/zlib/inflate.h create mode 100644 win32/3rdparty/zlib/inftrees.c create mode 100644 win32/3rdparty/zlib/inftrees.h create mode 100644 win32/3rdparty/zlib/make_vms.com create mode 100644 win32/3rdparty/zlib/minigzip.c create mode 100644 win32/3rdparty/zlib/msdos/Makefile.bor create mode 100644 win32/3rdparty/zlib/msdos/Makefile.dj2 create mode 100644 win32/3rdparty/zlib/msdos/Makefile.emx create mode 100644 win32/3rdparty/zlib/msdos/Makefile.msc create mode 100644 win32/3rdparty/zlib/msdos/Makefile.tc create mode 100644 win32/3rdparty/zlib/old/Makefile.riscos create mode 100644 win32/3rdparty/zlib/old/README create mode 100644 win32/3rdparty/zlib/old/descrip.mms create mode 100644 win32/3rdparty/zlib/old/os2/Makefile.os2 create mode 100644 win32/3rdparty/zlib/old/os2/zlib.def create mode 100644 win32/3rdparty/zlib/old/visual-basic.txt create mode 100644 win32/3rdparty/zlib/old/zlib.html create mode 100644 win32/3rdparty/zlib/projects/README.projects create mode 100644 win32/3rdparty/zlib/projects/visualc6/README.txt create mode 100644 win32/3rdparty/zlib/projects/visualc6/example.dsp create mode 100644 win32/3rdparty/zlib/projects/visualc6/minigzip.dsp create mode 100644 win32/3rdparty/zlib/projects/visualc6/zlib.dsp create mode 100644 win32/3rdparty/zlib/projects/visualc6/zlib.dsw create mode 100644 win32/3rdparty/zlib/qnx/package.qpg create mode 100644 win32/3rdparty/zlib/trees.c create mode 100644 win32/3rdparty/zlib/trees.h create mode 100644 win32/3rdparty/zlib/uncompr.c create mode 100644 win32/3rdparty/zlib/win32/DLL_FAQ.txt create mode 100644 win32/3rdparty/zlib/win32/Makefile.bor create mode 100644 win32/3rdparty/zlib/win32/Makefile.emx create mode 100644 win32/3rdparty/zlib/win32/Makefile.gcc create mode 100644 win32/3rdparty/zlib/win32/Makefile.msc create mode 100644 win32/3rdparty/zlib/win32/VisualC.txt create mode 100644 win32/3rdparty/zlib/win32/zlib.def create mode 100644 win32/3rdparty/zlib/win32/zlib1.rc create mode 100644 win32/3rdparty/zlib/zconf.h create mode 100644 win32/3rdparty/zlib/zconf.in.h create mode 100644 win32/3rdparty/zlib/zlib.3 create mode 100644 win32/3rdparty/zlib/zlib.h create mode 100644 win32/3rdparty/zlib/zutil.c create mode 100644 win32/3rdparty/zlib/zutil.h create mode 100644 win32/ClamAV.sln create mode 100644 win32/clamav-config.h create mode 100644 win32/compat/dirent.c create mode 100644 win32/compat/dirent.h create mode 100644 win32/libclamav.vcproj create mode 100644 win32/platform.h diff --git a/ChangeLog b/ChangeLog index d0d5598f5..5bc35f522 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Oct 12 23:33:32 CEST 2009 (acab) +------------------------------------ + * /win32: VC project file and 3rd party stuff + Sat Oct 10 20:22:10 CEST 2009 (acab) ------------------------------------ * libclamav: completed merge of fmap4all diff --git a/win32/.gitignore b/win32/.gitignore new file mode 100644 index 000000000..067886709 --- /dev/null +++ b/win32/.gitignore @@ -0,0 +1,6 @@ +!clamav-config.h +!platform.h +build +*.ncb +*.suo +*.user diff --git a/win32/3rdparty/bzip2/CHANGES b/win32/3rdparty/bzip2/CHANGES new file mode 100644 index 000000000..6e4f65e2e --- /dev/null +++ b/win32/3rdparty/bzip2/CHANGES @@ -0,0 +1,319 @@ + ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ + + +0.9.0 +~~~~~ +First version. + + +0.9.0a +~~~~~~ +Removed 'ranlib' from Makefile, since most modern Unix-es +don't need it, or even know about it. + + +0.9.0b +~~~~~~ +Fixed a problem with error reporting in bzip2.c. This does not effect +the library in any way. Problem is: versions 0.9.0 and 0.9.0a (of the +program proper) compress and decompress correctly, but give misleading +error messages (internal panics) when an I/O error occurs, instead of +reporting the problem correctly. This shouldn't give any data loss +(as far as I can see), but is confusing. + +Made the inline declarations disappear for non-GCC compilers. + + +0.9.0c +~~~~~~ +Fixed some problems in the library pertaining to some boundary cases. +This makes the library behave more correctly in those situations. The +fixes apply only to features (calls and parameters) not used by +bzip2.c, so the non-fixedness of them in previous versions has no +effect on reliability of bzip2.c. + +In bzlib.c: + * made zero-length BZ_FLUSH work correctly in bzCompress(). + * fixed bzWrite/bzRead to ignore zero-length requests. + * fixed bzread to correctly handle read requests after EOF. + * wrong parameter order in call to bzDecompressInit in + bzBuffToBuffDecompress. Fixed. + +In compress.c: + * changed setting of nGroups in sendMTFValues() so as to + do a bit better on small files. This _does_ effect + bzip2.c. + + +0.9.5a +~~~~~~ +Major change: add a fallback sorting algorithm (blocksort.c) +to give reasonable behaviour even for very repetitive inputs. +Nuked --repetitive-best and --repetitive-fast since they are +no longer useful. + +Minor changes: mostly a whole bunch of small changes/ +bugfixes in the driver (bzip2.c). Changes pertaining to the +user interface are: + + allow decompression of symlink'd files to stdout + decompress/test files even without .bz2 extension + give more accurate error messages for I/O errors + when compressing/decompressing to stdout, don't catch control-C + read flags from BZIP2 and BZIP environment variables + decline to break hard links to a file unless forced with -f + allow -c flag even with no filenames + preserve file ownerships as far as possible + make -s -1 give the expected block size (100k) + add a flag -q --quiet to suppress nonessential warnings + stop decoding flags after --, so files beginning in - can be handled + resolved inconsistent naming: bzcat or bz2cat ? + bzip2 --help now returns 0 + +Programming-level changes are: + + fixed syntax error in GET_LL4 for Borland C++ 5.02 + let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC} + fix overshoot of mode-string end in bzopen_or_bzdopen + wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... } + close file handles under all error conditions + added minor mods so it compiles with DJGPP out of the box + fixed Makefile so it doesn't give problems with BSD make + fix uninitialised memory reads in dlltest.c + +0.9.5b +~~~~~~ +Open stdin/stdout in binary mode for DJGPP. + +0.9.5c +~~~~~~ +Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1. The + 1 +version could cause the sorted order to be wrong in some extremely +obscure cases. Also changed setting of quadrant in blocksort.c. + +0.9.5d +~~~~~~ +The only functional change is to make bzlibVersion() in the library +return the correct string. This has no effect whatsoever on the +functioning of the bzip2 program or library. Added a couple of casts +so the library compiles without warnings at level 3 in MS Visual +Studio 6.0. Included a Y2K statement in the file Y2K_INFO. All other +changes are minor documentation changes. + +1.0 +~~~ +Several minor bugfixes and enhancements: + +* Large file support. The library uses 64-bit counters to + count the volume of data passing through it. bzip2.c + is now compiled with -D_FILE_OFFSET_BITS=64 to get large + file support from the C library. -v correctly prints out + file sizes greater than 4 gigabytes. All these changes have + been made without assuming a 64-bit platform or a C compiler + which supports 64-bit ints, so, except for the C library + aspect, they are fully portable. + +* Decompression robustness. The library/program should be + robust to any corruption of compressed data, detecting and + handling _all_ corruption, instead of merely relying on + the CRCs. What this means is that the program should + never crash, given corrupted data, and the library should + always return BZ_DATA_ERROR. + +* Fixed an obscure race-condition bug only ever observed on + Solaris, in which, if you were very unlucky and issued + control-C at exactly the wrong time, both input and output + files would be deleted. + +* Don't run out of file handles on test/decompression when + large numbers of files have invalid magic numbers. + +* Avoid library namespace pollution. Prefix all exported + symbols with BZ2_. + +* Minor sorting enhancements from my DCC2000 paper. + +* Advance the version number to 1.0, so as to counteract the + (false-in-this-case) impression some people have that programs + with version numbers less than 1.0 are in some way, experimental, + pre-release versions. + +* Create an initial Makefile-libbz2_so to build a shared library. + Yes, I know I should really use libtool et al ... + +* Make the program exit with 2 instead of 0 when decompression + fails due to a bad magic number (ie, an invalid bzip2 header). + Also exit with 1 (as the manual claims :-) whenever a diagnostic + message would have been printed AND the corresponding operation + is aborted, for example + bzip2: Output file xx already exists. + When a diagnostic message is printed but the operation is not + aborted, for example + bzip2: Can't guess original name for wurble -- using wurble.out + then the exit value 0 is returned, unless some other problem is + also detected. + + I think it corresponds more closely to what the manual claims now. + + +1.0.1 +~~~~~ +* Modified dlltest.c so it uses the new BZ2_ naming scheme. +* Modified makefile-msc to fix minor build probs on Win2k. +* Updated README.COMPILATION.PROBLEMS. + +There are no functionality changes or bug fixes relative to version +1.0.0. This is just a documentation update + a fix for minor Win32 +build problems. For almost everyone, upgrading from 1.0.0 to 1.0.1 is +utterly pointless. Don't bother. + + +1.0.2 +~~~~~ +A bug fix release, addressing various minor issues which have appeared +in the 18 or so months since 1.0.1 was released. Most of the fixes +are to do with file-handling or documentation bugs. To the best of my +knowledge, there have been no data-loss-causing bugs reported in the +compression/decompression engine of 1.0.0 or 1.0.1. + +Note that this release does not improve the rather crude build system +for Unix platforms. The general plan here is to autoconfiscate/ +libtoolise 1.0.2 soon after release, and release the result as 1.1.0 +or perhaps 1.2.0. That, however, is still just a plan at this point. + +Here are the changes in 1.0.2. Bug-reporters and/or patch-senders in +parentheses. + +* Fix an infinite segfault loop in 1.0.1 when a directory is + encountered in -f (force) mode. + (Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt) + +* Avoid double fclose() of output file on certain I/O error paths. + (Solar Designer) + +* Don't fail with internal error 1007 when fed a long stream (> 48MB) + of byte 251. Also print useful message suggesting that 1007s may be + caused by bad memory. + (noticed by Juan Pedro Vallejo, fixed by me) + +* Fix uninitialised variable silly bug in demo prog dlltest.c. + (Jorj Bauer) + +* Remove 512-MB limitation on recovered file size for bzip2recover + on selected platforms which support 64-bit ints. At the moment + all GCC supported platforms, and Win32. + (me, Alson van der Meulen) + +* Hard-code header byte values, to give correct operation on platforms + using EBCDIC as their native character set (IBM's OS/390). + (Leland Lucius) + +* Copy file access times correctly. + (Marty Leisner) + +* Add distclean and check targets to Makefile. + (Michael Carmack) + +* Parameterise use of ar and ranlib in Makefile. Also add $(LDFLAGS). + (Rich Ireland, Bo Thorsen) + +* Pass -p (create parent dirs as needed) to mkdir during make install. + (Jeremy Fusco) + +* Dereference symlinks when copying file permissions in -f mode. + (Volker Schmidt) + +* Majorly simplify implementation of uInt64_qrm10. + (Bo Lindbergh) + +* Check the input file still exists before deleting the output one, + when aborting in cleanUpAndFail(). + (Joerg Prante, Robert Linden, Matthias Krings) + +Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer +of bzip2: + +* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore. + +* Spelling changes and minor enhancements in bzip2.1. + +* Avoid race condition between creating the output file and setting its + interim permissions safely, by using fopen_output_safely(). + No changes to bzip2recover since there is no issue with file + permissions there. + +* do not print senseless report with -v when compressing an empty + file. + +* bzcat -f works on non-bzip2 files. + +* do not try to escape shell meta-characters on unix (the shell takes + care of these). + +* added --fast and --best aliases for -1 -9 for gzip compatibility. + + +1.0.3 (15 Feb 05) +~~~~~~~~~~~~~~~~~ +Fixes some minor bugs since the last version, 1.0.2. + +* Further robustification against corrupted compressed data. + There are currently no known bitstreams which can cause the + decompressor to crash, loop or access memory which does not + belong to it. If you are using bzip2 or the library to + decompress bitstreams from untrusted sources, an upgrade + to 1.0.3 is recommended. This fixes CAN-2005-1260. + +* The documentation has been converted to XML, from which html + and pdf can be derived. + +* Various minor bugs in the documentation have been fixed. + +* Fixes for various compilation warnings with newer versions of + gcc, and on 64-bit platforms. + +* The BZ_NO_STDIO cpp symbol was not properly observed in 1.0.2. + This has been fixed. + + +1.0.4 (20 Dec 06) +~~~~~~~~~~~~~~~~~ +Fixes some minor bugs since the last version, 1.0.3. + +* Fix file permissions race problem (CAN-2005-0953). + +* Avoid possible segfault in BZ2_bzclose. From Coverity's NetBSD + scan. + +* 'const'/prototype cleanups in the C code. + +* Change default install location to /usr/local, and handle multiple + 'make install's without error. + +* Sanitise file names more carefully in bzgrep. Fixes CAN-2005-0758 + to the extent that applies to bzgrep. + +* Use 'mktemp' rather than 'tempfile' in bzdiff. + +* Tighten up a couple of assertions in blocksort.c following automated + analysis. + +* Fix minor doc/comment bugs. + + +1.0.5 (10 Dec 07) +~~~~~~~~~~~~~~~~~ +Security fix only. Fixes CERT-FI 20469 as it applies to bzip2. + diff --git a/win32/3rdparty/bzip2/LICENSE b/win32/3rdparty/bzip2/LICENSE new file mode 100644 index 000000000..f420cffb6 --- /dev/null +++ b/win32/3rdparty/bzip2/LICENSE @@ -0,0 +1,42 @@ + +-------------------------------------------------------------------------- + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2007 Julian R Seward. All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Julian Seward, jseward@bzip.org +bzip2/libbzip2 version 1.0.5 of 10 December 2007 + +-------------------------------------------------------------------------- diff --git a/win32/3rdparty/bzip2/Makefile-libbz2_so b/win32/3rdparty/bzip2/Makefile-libbz2_so new file mode 100644 index 000000000..9a13c77e4 --- /dev/null +++ b/win32/3rdparty/bzip2/Makefile-libbz2_so @@ -0,0 +1,59 @@ + +# This Makefile builds a shared version of the library, +# libbz2.so.1.0.4, with soname libbz2.so.1.0, +# at least on x86-Linux (RedHat 7.2), +# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98). +# Please see the README file for some important info +# about building the library like this. + +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.5 of 10 December 2007 +# Copyright (C) 1996-2007 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ------------------------------------------------------------------ + + +SHELL=/bin/sh +CC=gcc +BIGFILES=-D_FILE_OFFSET_BITS=64 +CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES) + +OBJS= blocksort.o \ + huffman.o \ + crctable.o \ + randtable.o \ + compress.o \ + decompress.o \ + bzlib.o + +all: $(OBJS) + $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.4 $(OBJS) + $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.4 + rm -f libbz2.so.1.0 + ln -s libbz2.so.1.0.4 libbz2.so.1.0 + +clean: + rm -f $(OBJS) bzip2.o libbz2.so.1.0.4 libbz2.so.1.0 bzip2-shared + +blocksort.o: blocksort.c + $(CC) $(CFLAGS) -c blocksort.c +huffman.o: huffman.c + $(CC) $(CFLAGS) -c huffman.c +crctable.o: crctable.c + $(CC) $(CFLAGS) -c crctable.c +randtable.o: randtable.c + $(CC) $(CFLAGS) -c randtable.c +compress.o: compress.c + $(CC) $(CFLAGS) -c compress.c +decompress.o: decompress.c + $(CC) $(CFLAGS) -c decompress.c +bzlib.o: bzlib.c + $(CC) $(CFLAGS) -c bzlib.c diff --git a/win32/3rdparty/bzip2/README b/win32/3rdparty/bzip2/README new file mode 100644 index 000000000..e17a84e04 --- /dev/null +++ b/win32/3rdparty/bzip2/README @@ -0,0 +1,210 @@ + +This is the README for bzip2/libzip2. +This version is fully compatible with the previous public releases. + +------------------------------------------------------------------ +This file is part of bzip2/libbzip2, a program and library for +lossless, block-sorting data compression. + +bzip2/libbzip2 version 1.0.5 of 10 December 2007 +Copyright (C) 1996-2007 Julian Seward + +Please read the WARNING, DISCLAIMER and PATENTS sections in this file. + +This program is released under the terms of the license contained +in the file LICENSE. +------------------------------------------------------------------ + +Complete documentation is available in Postscript form (manual.ps), +PDF (manual.pdf) or html (manual.html). A plain-text version of the +manual page is available as bzip2.txt. + + +HOW TO BUILD -- UNIX + +Type 'make'. This builds the library libbz2.a and then the programs +bzip2 and bzip2recover. Six self-tests are run. If the self-tests +complete ok, carry on to installation: + +To install in /usr/local/bin, /usr/local/lib, /usr/local/man and +/usr/local/include, type + + make install + +To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type + + make install PREFIX=/xxx/yyy + +If you are (justifiably) paranoid and want to see what 'make install' +is going to do, you can first do + + make -n install or + make -n install PREFIX=/xxx/yyy respectively. + +The -n instructs make to show the commands it would execute, but not +actually execute them. + + +HOW TO BUILD -- UNIX, shared library libbz2.so. + +Do 'make -f Makefile-libbz2_so'. This Makefile seems to work for +Linux-ELF (RedHat 7.2 on an x86 box), with gcc. I make no claims +that it works for any other platform, though I suspect it probably +will work for most platforms employing both ELF and gcc. + +bzip2-shared, a client of the shared library, is also built, but not +self-tested. So I suggest you also build using the normal Makefile, +since that conducts a self-test. A second reason to prefer the +version statically linked to the library is that, on x86 platforms, +building shared objects makes a valuable register (%ebx) unavailable +to gcc, resulting in a slowdown of 10%-20%, at least for bzip2. + +Important note for people upgrading .so's from 0.9.0/0.9.5 to version +1.0.X. All the functions in the library have been renamed, from (eg) +bzCompress to BZ2_bzCompress, to avoid namespace pollution. +Unfortunately this means that the libbz2.so created by +Makefile-libbz2_so will not work with any program which used an older +version of the library. I do encourage library clients to make the +effort to upgrade to use version 1.0, since it is both faster and more +robust than previous versions. + + +HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc. + +It's difficult for me to support compilation on all these platforms. +My approach is to collect binaries for these platforms, and put them +on the master web site (http://www.bzip.org). Look there. However +(FWIW), bzip2-1.0.X is very standard ANSI C and should compile +unmodified with MS Visual C. If you have difficulties building, you +might want to read README.COMPILATION.PROBLEMS. + +At least using MS Visual C++ 6, you can build from the unmodified +sources by issuing, in a command shell: + + nmake -f makefile.msc + +(you may need to first run the MSVC-provided script VCVARS32.BAT + so as to set up paths to the MSVC tools correctly). + + +VALIDATION + +Correct operation, in the sense that a compressed file can always be +decompressed to reproduce the original, is obviously of paramount +importance. To validate bzip2, I used a modified version of Mark +Nelson's churn program. Churn is an automated test driver which +recursively traverses a directory structure, using bzip2 to compress +and then decompress each file it encounters, and checking that the +decompressed data is the same as the original. + + + +Please read and be aware of the following: + +WARNING: + + This program and library (attempts to) compress data by + performing several non-trivial transformations on it. + Unless you are 100% familiar with *all* the algorithms + contained herein, and with the consequences of modifying them, + you should NOT meddle with the compression or decompression + machinery. Incorrect changes can and very likely *will* + lead to disastrous loss of data. + + +DISCLAIMER: + + I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE + USE OF THIS PROGRAM/LIBRARY, HOWSOEVER CAUSED. + + Every compression of a file implies an assumption that the + compressed file can be decompressed to reproduce the original. + Great efforts in design, coding and testing have been made to + ensure that this program works correctly. However, the complexity + of the algorithms, and, in particular, the presence of various + special cases in the code which occur with very low but non-zero + probability make it impossible to rule out the possibility of bugs + remaining in the program. DO NOT COMPRESS ANY DATA WITH THIS + PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER + SMALL, THAT THE DATA WILL NOT BE RECOVERABLE. + + That is not to say this program is inherently unreliable. + Indeed, I very much hope the opposite is true. bzip2/libbzip2 + has been carefully constructed and extensively tested. + + +PATENTS: + + To the best of my knowledge, bzip2/libbzip2 does not use any + patented algorithms. However, I do not have the resources + to carry out a patent search. Therefore I cannot give any + guarantee of the above statement. + + + +WHAT'S NEW IN 0.9.0 (as compared to 0.1pl2) ? + + * Approx 10% faster compression, 30% faster decompression + * -t (test mode) is a lot quicker + * Can decompress concatenated compressed files + * Programming interface, so programs can directly read/write .bz2 files + * Less restrictive (BSD-style) licensing + * Flag handling more compatible with GNU gzip + * Much more documentation, i.e., a proper user manual + * Hopefully, improved portability (at least of the library) + +WHAT'S NEW IN 0.9.5 ? + + * Compression speed is much less sensitive to the input + data than in previous versions. Specifically, the very + slow performance caused by repetitive data is fixed. + * Many small improvements in file and flag handling. + * A Y2K statement. + +WHAT'S NEW IN 1.0.0 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.2 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.3 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.4 ? + + See the CHANGES file. + +WHAT'S NEW IN 1.0.5 ? + + See the CHANGES file. + + +I hope you find bzip2 useful. Feel free to contact me at + jseward@bzip.org +if you have any suggestions or queries. Many people mailed me with +comments, suggestions and patches after the releases of bzip-0.15, +bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, +1.0.2 and 1.0.3, and the changes in bzip2 are largely a result of this +feedback. I thank you for your comments. + +bzip2's "home" is http://www.bzip.org/ + +Julian Seward +jseward@bzip.org +Cambridge, UK. + +18 July 1996 (version 0.15) +25 August 1996 (version 0.21) + 7 August 1997 (bzip2, version 0.1) +29 August 1997 (bzip2, version 0.1pl2) +23 August 1998 (bzip2, version 0.9.0) + 8 June 1999 (bzip2, version 0.9.5) + 4 Sept 1999 (bzip2, version 0.9.5d) + 5 May 2000 (bzip2, version 1.0pre8) +30 December 2001 (bzip2, version 1.0.2pre1) +15 February 2005 (bzip2, version 1.0.3) +20 December 2006 (bzip2, version 1.0.4) +10 December 2007 (bzip2, version 1.0.5) diff --git a/win32/3rdparty/bzip2/README.COMPILATION.PROBLEMS b/win32/3rdparty/bzip2/README.COMPILATION.PROBLEMS new file mode 100644 index 000000000..22b95c6cb --- /dev/null +++ b/win32/3rdparty/bzip2/README.COMPILATION.PROBLEMS @@ -0,0 +1,58 @@ +------------------------------------------------------------------ +This file is part of bzip2/libbzip2, a program and library for +lossless, block-sorting data compression. + +bzip2/libbzip2 version 1.0.5 of 10 December 2007 +Copyright (C) 1996-2007 Julian Seward + +Please read the WARNING, DISCLAIMER and PATENTS sections in the +README file. + +This program is released under the terms of the license contained +in the file LICENSE. +------------------------------------------------------------------ + +bzip2-1.0.5 should compile without problems on the vast majority of +platforms. Using the supplied Makefile, I've built and tested it +myself for x86-linux and amd64-linux. With makefile.msc, Visual C++ +6.0 and nmake, you can build a native Win32 version too. Large file +support seems to work correctly on at least on amd64-linux. + +When I say "large file" I mean a file of size 2,147,483,648 (2^31) +bytes or above. Many older OSs can't handle files above this size, +but many newer ones can. Large files are pretty huge -- most files +you'll encounter are not Large Files. + +Early versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide variety +of platforms without difficulty, and I hope this version will continue +in that tradition. However, in order to support large files, I've had +to include the define -D_FILE_OFFSET_BITS=64 in the Makefile. This +can cause problems. + +The technique of adding -D_FILE_OFFSET_BITS=64 to get large file +support is, as far as I know, the Recommended Way to get correct large +file support. For more details, see the Large File Support +Specification, published by the Large File Summit, at + + http://ftp.sas.com/standards/large.file + +As a general comment, if you get compilation errors which you think +are related to large file support, try removing the above define from +the Makefile, ie, delete the line + + BIGFILES=-D_FILE_OFFSET_BITS=64 + +from the Makefile, and do 'make clean ; make'. This will give you a +version of bzip2 without large file support, which, for most +applications, is probably not a problem. + +Alternatively, try some of the platform-specific hints listed below. + +You can use the spewG.c program to generate huge files to test bzip2's +large file support, if you are feeling paranoid. Be aware though that +any compilation problems which affect bzip2 will also affect spewG.c, +alas. + +AIX: I have reports that for large file support, you need to specify +-D_LARGE_FILES rather than -D_FILE_OFFSET_BITS=64. I have not tested +this myself. diff --git a/win32/3rdparty/bzip2/README.XML.STUFF b/win32/3rdparty/bzip2/README.XML.STUFF new file mode 100644 index 000000000..1a5b4c55a --- /dev/null +++ b/win32/3rdparty/bzip2/README.XML.STUFF @@ -0,0 +1,45 @@ + ---------------------------------------------------------------- + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ---------------------------------------------------------------- + +The script xmlproc.sh takes an xml file as input, +and processes it to create .pdf, .html or .ps output. +It uses format.pl, a perl script to format
 blocks nicely,
+ and add CDATA tags so writers do not have to use eg. < 
+
+The file "entities.xml" must be edited to reflect current
+version, year, etc.
+
+
+Usage:
+
+  ./xmlproc.sh -v manual.xml
+  Validates an xml file to ensure no dtd-compliance errors
+
+  ./xmlproc.sh -html manual.xml
+  Output: manual.html
+
+  ./xmlproc.sh -pdf manual.xml
+  Output: manual.pdf
+
+  ./xmlproc.sh -ps manual.xml
+  Output: manual.ps
+
+
+Notum bene: 
+- pdfxmltex barfs if given a filename with an underscore in it
+
+- xmltex won't work yet - there's a bug in passivetex
+    which we are all waiting for Sebastian to fix.
+  So we are going the xml -> pdf -> ps route for the time being,
+    using pdfxmltex.
diff --git a/win32/3rdparty/bzip2/blocksort.c b/win32/3rdparty/bzip2/blocksort.c
new file mode 100644
index 000000000..bd2dec157
--- /dev/null
+++ b/win32/3rdparty/bzip2/blocksort.c
@@ -0,0 +1,1094 @@
+
+/*-------------------------------------------------------------*/
+/*--- Block sorting machinery                               ---*/
+/*---                                           blocksort.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------*/
+/*--- Fallback O(N log(N)^2) sorting        ---*/
+/*--- algorithm, for repetitive blocks      ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+__inline__
+void fallbackSimpleSort ( UInt32* fmap, 
+                          UInt32* eclass, 
+                          Int32   lo, 
+                          Int32   hi )
+{
+   Int32 i, j, tmp;
+   UInt32 ec_tmp;
+
+   if (lo == hi) return;
+
+   if (hi - lo > 3) {
+      for ( i = hi-4; i >= lo; i-- ) {
+         tmp = fmap[i];
+         ec_tmp = eclass[tmp];
+         for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 )
+            fmap[j-4] = fmap[j];
+         fmap[j-4] = tmp;
+      }
+   }
+
+   for ( i = hi-1; i >= lo; i-- ) {
+      tmp = fmap[i];
+      ec_tmp = eclass[tmp];
+      for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ )
+         fmap[j-1] = fmap[j];
+      fmap[j-1] = tmp;
+   }
+}
+
+
+/*---------------------------------------------*/
+#define fswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define fvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      fswap(fmap[yyp1], fmap[yyp2]);  \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+
+#define fmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define fpush(lz,hz) { stackLo[sp] = lz; \
+                       stackHi[sp] = hz; \
+                       sp++; }
+
+#define fpop(lz,hz) { sp--;              \
+                      lz = stackLo[sp];  \
+                      hz = stackHi[sp]; }
+
+#define FALLBACK_QSORT_SMALL_THRESH 10
+#define FALLBACK_QSORT_STACK_SIZE   100
+
+
+static
+void fallbackQSort3 ( UInt32* fmap, 
+                      UInt32* eclass,
+                      Int32   loSt, 
+                      Int32   hiSt )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m;
+   Int32 sp, lo, hi;
+   UInt32 med, r, r3;
+   Int32 stackLo[FALLBACK_QSORT_STACK_SIZE];
+   Int32 stackHi[FALLBACK_QSORT_STACK_SIZE];
+
+   r = 0;
+
+   sp = 0;
+   fpush ( loSt, hiSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 );
+
+      fpop ( lo, hi );
+      if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) {
+         fallbackSimpleSort ( fmap, eclass, lo, hi );
+         continue;
+      }
+
+      /* Random partitioning.  Median of 3 sometimes fails to
+         avoid bad cases.  Median of 9 seems to help but 
+         looks rather expensive.  This too seems to work but
+         is cheaper.  Guidance for the magic constants 
+         7621 and 32768 is taken from Sedgewick's algorithms
+         book, chapter 35.
+      */
+      r = ((r * 7621) + 1) % 32768;
+      r3 = r % 3;
+      if (r3 == 0) med = eclass[fmap[lo]]; else
+      if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else
+                   med = eclass[fmap[hi]];
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (1) {
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unLo]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unLo], fmap[ltLo]); 
+               ltLo++; unLo++; 
+               continue; 
+            };
+            if (n > 0) break;
+            unLo++;
+         }
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unHi]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unHi], fmap[gtHi]); 
+               gtHi--; unHi--; 
+               continue; 
+            };
+            if (n < 0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "fallbackQSort3(2)" );
+
+      if (gtHi < ltLo) continue;
+
+      n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n);
+      m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      if (n - lo > hi - m) {
+         fpush ( lo, n );
+         fpush ( m, hi );
+      } else {
+         fpush ( m, hi );
+         fpush ( lo, n );
+      }
+   }
+}
+
+#undef fmin
+#undef fpush
+#undef fpop
+#undef fswap
+#undef fvswap
+#undef FALLBACK_QSORT_SMALL_THRESH
+#undef FALLBACK_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      eclass exists for [0 .. nblock-1]
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      All other areas of eclass destroyed
+      fmap [0 .. nblock-1] holds sorted order
+      bhtab [ 0 .. 2+(nblock/32) ] destroyed
+*/
+
+#define       SET_BH(zz)  bhtab[(zz) >> 5] |= (1 << ((zz) & 31))
+#define     CLEAR_BH(zz)  bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31))
+#define     ISSET_BH(zz)  (bhtab[(zz) >> 5] & (1 << ((zz) & 31)))
+#define      WORD_BH(zz)  bhtab[(zz) >> 5]
+#define UNALIGNED_BH(zz)  ((zz) & 0x01f)
+
+static
+void fallbackSort ( UInt32* fmap, 
+                    UInt32* eclass, 
+                    UInt32* bhtab,
+                    Int32   nblock,
+                    Int32   verb )
+{
+   Int32 ftab[257];
+   Int32 ftabCopy[256];
+   Int32 H, i, j, k, l, r, cc, cc1;
+   Int32 nNotDone;
+   Int32 nBhtab;
+   UChar* eclass8 = (UChar*)eclass;
+
+   /*--
+      Initial 1-char radix sort to generate
+      initial fmap and initial BH bits.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        bucket sorting ...\n" );
+   for (i = 0; i < 257;    i++) ftab[i] = 0;
+   for (i = 0; i < nblock; i++) ftab[eclass8[i]]++;
+   for (i = 0; i < 256;    i++) ftabCopy[i] = ftab[i];
+   for (i = 1; i < 257;    i++) ftab[i] += ftab[i-1];
+
+   for (i = 0; i < nblock; i++) {
+      j = eclass8[i];
+      k = ftab[j] - 1;
+      ftab[j] = k;
+      fmap[k] = i;
+   }
+
+   nBhtab = 2 + (nblock / 32);
+   for (i = 0; i < nBhtab; i++) bhtab[i] = 0;
+   for (i = 0; i < 256; i++) SET_BH(ftab[i]);
+
+   /*--
+      Inductively refine the buckets.  Kind-of an
+      "exponential radix sort" (!), inspired by the
+      Manber-Myers suffix array construction algorithm.
+   --*/
+
+   /*-- set sentinel bits for block-end detection --*/
+   for (i = 0; i < 32; i++) { 
+      SET_BH(nblock + 2*i);
+      CLEAR_BH(nblock + 2*i + 1);
+   }
+
+   /*-- the log(N) loop --*/
+   H = 1;
+   while (1) {
+
+      if (verb >= 4) 
+         VPrintf1 ( "        depth %6d has ", H );
+
+      j = 0;
+      for (i = 0; i < nblock; i++) {
+         if (ISSET_BH(i)) j = i;
+         k = fmap[i] - H; if (k < 0) k += nblock;
+         eclass[k] = j;
+      }
+
+      nNotDone = 0;
+      r = -1;
+      while (1) {
+
+	 /*-- find the next non-singleton bucket --*/
+         k = r + 1;
+         while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (ISSET_BH(k)) {
+            while (WORD_BH(k) == 0xffffffff) k += 32;
+            while (ISSET_BH(k)) k++;
+         }
+         l = k - 1;
+         if (l >= nblock) break;
+         while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (!ISSET_BH(k)) {
+            while (WORD_BH(k) == 0x00000000) k += 32;
+            while (!ISSET_BH(k)) k++;
+         }
+         r = k - 1;
+         if (r >= nblock) break;
+
+         /*-- now [l, r] bracket current bucket --*/
+         if (r > l) {
+            nNotDone += (r - l + 1);
+            fallbackQSort3 ( fmap, eclass, l, r );
+
+            /*-- scan bucket and generate header bits-- */
+            cc = -1;
+            for (i = l; i <= r; i++) {
+               cc1 = eclass[fmap[i]];
+               if (cc != cc1) { SET_BH(i); cc = cc1; };
+            }
+         }
+      }
+
+      if (verb >= 4) 
+         VPrintf1 ( "%6d unresolved strings\n", nNotDone );
+
+      H *= 2;
+      if (H > nblock || nNotDone == 0) break;
+   }
+
+   /*-- 
+      Reconstruct the original block in
+      eclass8 [0 .. nblock-1], since the
+      previous phase destroyed it.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        reconstructing block ...\n" );
+   j = 0;
+   for (i = 0; i < nblock; i++) {
+      while (ftabCopy[j] == 0) j++;
+      ftabCopy[j]--;
+      eclass8[fmap[i]] = (UChar)j;
+   }
+   AssertH ( j < 256, 1005 );
+}
+
+#undef       SET_BH
+#undef     CLEAR_BH
+#undef     ISSET_BH
+#undef      WORD_BH
+#undef UNALIGNED_BH
+
+
+/*---------------------------------------------*/
+/*--- The main, O(N^2 log(N)) sorting       ---*/
+/*--- algorithm.  Faster for "normal"       ---*/
+/*--- non-repetitive blocks.                ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+__inline__
+Bool mainGtU ( UInt32  i1, 
+               UInt32  i2,
+               UChar*  block, 
+               UInt16* quadrant,
+               UInt32  nblock,
+               Int32*  budget )
+{
+   Int32  k;
+   UChar  c1, c2;
+   UInt16 s1, s2;
+
+   AssertD ( i1 != i2, "mainGtU" );
+   /* 1 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 2 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 3 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 4 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 5 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 6 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 7 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 8 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 9 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 10 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 11 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 12 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+
+   k = nblock + 8;
+
+   do {
+      /* 1 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 2 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 3 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 4 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 5 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 6 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 7 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 8 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+
+      if (i1 >= nblock) i1 -= nblock;
+      if (i2 >= nblock) i2 -= nblock;
+
+      k -= 8;
+      (*budget)--;
+   }
+      while (k >= 0);
+
+   return False;
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Knuth's increments seem to work better
+   than Incerpi-Sedgewick here.  Possibly
+   because the number of elems to sort is
+   usually small, typically <= 20.
+--*/
+static
+Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
+                   9841, 29524, 88573, 265720,
+                   797161, 2391484 };
+
+static
+void mainSimpleSort ( UInt32* ptr,
+                      UChar*  block,
+                      UInt16* quadrant,
+                      Int32   nblock,
+                      Int32   lo, 
+                      Int32   hi, 
+                      Int32   d,
+                      Int32*  budget )
+{
+   Int32 i, j, h, bigN, hp;
+   UInt32 v;
+
+   bigN = hi - lo + 1;
+   if (bigN < 2) return;
+
+   hp = 0;
+   while (incs[hp] < bigN) hp++;
+   hp--;
+
+   for (; hp >= 0; hp--) {
+      h = incs[hp];
+
+      i = lo + h;
+      while (True) {
+
+         /*-- copy 1 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 2 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 3 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         if (*budget < 0) return;
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+/*--
+   The following is an implementation of
+   an elegant 3-way quicksort for strings,
+   described in a paper "Fast Algorithms for
+   Sorting and Searching Strings", by Robert
+   Sedgewick and Jon L. Bentley.
+--*/
+
+#define mswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define mvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      mswap(ptr[yyp1], ptr[yyp2]);    \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+static 
+__inline__
+UChar mmed3 ( UChar a, UChar b, UChar c )
+{
+   UChar t;
+   if (a > b) { t = a; a = b; b = t; };
+   if (b > c) { 
+      b = c;
+      if (a > b) b = a;
+   }
+   return b;
+}
+
+#define mmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define mpush(lz,hz,dz) { stackLo[sp] = lz; \
+                          stackHi[sp] = hz; \
+                          stackD [sp] = dz; \
+                          sp++; }
+
+#define mpop(lz,hz,dz) { sp--;             \
+                         lz = stackLo[sp]; \
+                         hz = stackHi[sp]; \
+                         dz = stackD [sp]; }
+
+
+#define mnextsize(az) (nextHi[az]-nextLo[az])
+
+#define mnextswap(az,bz)                                        \
+   { Int32 tz;                                                  \
+     tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \
+     tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \
+     tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; }
+
+
+#define MAIN_QSORT_SMALL_THRESH 20
+#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
+#define MAIN_QSORT_STACK_SIZE 100
+
+static
+void mainQSort3 ( UInt32* ptr,
+                  UChar*  block,
+                  UInt16* quadrant,
+                  Int32   nblock,
+                  Int32   loSt, 
+                  Int32   hiSt, 
+                  Int32   dSt,
+                  Int32*  budget )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m, med;
+   Int32 sp, lo, hi, d;
+
+   Int32 stackLo[MAIN_QSORT_STACK_SIZE];
+   Int32 stackHi[MAIN_QSORT_STACK_SIZE];
+   Int32 stackD [MAIN_QSORT_STACK_SIZE];
+
+   Int32 nextLo[3];
+   Int32 nextHi[3];
+   Int32 nextD [3];
+
+   sp = 0;
+   mpush ( loSt, hiSt, dSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 );
+
+      mpop ( lo, hi, d );
+      if (hi - lo < MAIN_QSORT_SMALL_THRESH || 
+          d > MAIN_QSORT_DEPTH_THRESH) {
+         mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
+         if (*budget < 0) return;
+         continue;
+      }
+
+      med = (Int32) 
+            mmed3 ( block[ptr[ lo         ]+d],
+                    block[ptr[ hi         ]+d],
+                    block[ptr[ (lo+hi)>>1 ]+d] );
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (True) {
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unLo]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unLo], ptr[ltLo]); 
+               ltLo++; unLo++; continue; 
+            };
+            if (n >  0) break;
+            unLo++;
+         }
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unHi]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unHi], ptr[gtHi]); 
+               gtHi--; unHi--; continue; 
+            };
+            if (n <  0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "mainQSort3(2)" );
+
+      if (gtHi < ltLo) {
+         mpush(lo, hi, d+1 );
+         continue;
+      }
+
+      n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n);
+      m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      nextLo[0] = lo;  nextHi[0] = n;   nextD[0] = d;
+      nextLo[1] = m;   nextHi[1] = hi;  nextD[1] = d;
+      nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1;
+
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+      if (mnextsize(1) < mnextsize(2)) mnextswap(1,2);
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+
+      AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" );
+      AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" );
+
+      mpush (nextLo[0], nextHi[0], nextD[0]);
+      mpush (nextLo[1], nextHi[1], nextD[1]);
+      mpush (nextLo[2], nextHi[2], nextD[2]);
+   }
+}
+
+#undef mswap
+#undef mvswap
+#undef mpush
+#undef mpop
+#undef mmin
+#undef mnextsize
+#undef mnextswap
+#undef MAIN_QSORT_SMALL_THRESH
+#undef MAIN_QSORT_DEPTH_THRESH
+#undef MAIN_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > N_OVERSHOOT
+      block32 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      All other areas of block32 destroyed
+      ftab [0 .. 65536 ] destroyed
+      ptr [0 .. nblock-1] holds sorted order
+      if (*budget < 0), sorting was abandoned
+*/
+
+#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8])
+#define SETMASK (1 << 21)
+#define CLEARMASK (~(SETMASK))
+
+static
+void mainSort ( UInt32* ptr, 
+                UChar*  block,
+                UInt16* quadrant, 
+                UInt32* ftab,
+                Int32   nblock,
+                Int32   verb,
+                Int32*  budget )
+{
+   Int32  i, j, k, ss, sb;
+   Int32  runningOrder[256];
+   Bool   bigDone[256];
+   Int32  copyStart[256];
+   Int32  copyEnd  [256];
+   UChar  c1;
+   Int32  numQSorted;
+   UInt16 s;
+   if (verb >= 4) VPrintf0 ( "        main sort initialise ...\n" );
+
+   /*-- set up the 2-byte frequency table --*/
+   for (i = 65536; i >= 0; i--) ftab[i] = 0;
+
+   j = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+      quadrant[i-1] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-1]) << 8);
+      ftab[j]++;
+      quadrant[i-2] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-2]) << 8);
+      ftab[j]++;
+      quadrant[i-3] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-3]) << 8);
+      ftab[j]++;
+   }
+   for (; i >= 0; i--) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+   }
+
+   /*-- (emphasises close relationship of block & quadrant) --*/
+   for (i = 0; i < BZ_N_OVERSHOOT; i++) {
+      block   [nblock+i] = block[i];
+      quadrant[nblock+i] = 0;
+   }
+
+   if (verb >= 4) VPrintf0 ( "        bucket sorting ...\n" );
+
+   /*-- Complete the initial radix sort --*/
+   for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1];
+
+   s = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+      s = (s >> 8) | (block[i-1] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-1;
+      s = (s >> 8) | (block[i-2] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-2;
+      s = (s >> 8) | (block[i-3] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-3;
+   }
+   for (; i >= 0; i--) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+   }
+
+   /*--
+      Now ftab contains the first loc of every small bucket.
+      Calculate the running order, from smallest to largest
+      big bucket.
+   --*/
+   for (i = 0; i <= 255; i++) {
+      bigDone     [i] = False;
+      runningOrder[i] = i;
+   }
+
+   {
+      Int32 vv;
+      Int32 h = 1;
+      do h = 3 * h + 1; while (h <= 256);
+      do {
+         h = h / 3;
+         for (i = h; i <= 255; i++) {
+            vv = runningOrder[i];
+            j = i;
+            while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) {
+               runningOrder[j] = runningOrder[j-h];
+               j = j - h;
+               if (j <= (h - 1)) goto zero;
+            }
+            zero:
+            runningOrder[j] = vv;
+         }
+      } while (h != 1);
+   }
+
+   /*--
+      The main sorting loop.
+   --*/
+
+   numQSorted = 0;
+
+   for (i = 0; i <= 255; i++) {
+
+      /*--
+         Process big buckets, starting with the least full.
+         Basically this is a 3-step process in which we call
+         mainQSort3 to sort the small buckets [ss, j], but
+         also make a big effort to avoid the calls if we can.
+      --*/
+      ss = runningOrder[i];
+
+      /*--
+         Step 1:
+         Complete the big bucket [ss] by quicksorting
+         any unsorted small buckets [ss, j], for j != ss.  
+         Hopefully previous pointer-scanning phases have already
+         completed many of the small buckets [ss, j], so
+         we don't have to sort them at all.
+      --*/
+      for (j = 0; j <= 255; j++) {
+         if (j != ss) {
+            sb = (ss << 8) + j;
+            if ( ! (ftab[sb] & SETMASK) ) {
+               Int32 lo = ftab[sb]   & CLEARMASK;
+               Int32 hi = (ftab[sb+1] & CLEARMASK) - 1;
+               if (hi > lo) {
+                  if (verb >= 4)
+                     VPrintf4 ( "        qsort [0x%x, 0x%x]   "
+                                "done %d   this %d\n",
+                                ss, j, numQSorted, hi - lo + 1 );
+                  mainQSort3 ( 
+                     ptr, block, quadrant, nblock, 
+                     lo, hi, BZ_N_RADIX, budget 
+                  );   
+                  numQSorted += (hi - lo + 1);
+                  if (*budget < 0) return;
+               }
+            }
+            ftab[sb] |= SETMASK;
+         }
+      }
+
+      AssertH ( !bigDone[ss], 1006 );
+
+      /*--
+         Step 2:
+         Now scan this big bucket [ss] so as to synthesise the
+         sorted order for small buckets [t, ss] for all t,
+         including, magically, the bucket [ss,ss] too.
+         This will avoid doing Real Work in subsequent Step 1's.
+      --*/
+      {
+         for (j = 0; j <= 255; j++) {
+            copyStart[j] =  ftab[(j << 8) + ss]     & CLEARMASK;
+            copyEnd  [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1;
+         }
+         for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1])
+               ptr[ copyStart[c1]++ ] = k;
+         }
+         for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1]) 
+               ptr[ copyEnd[c1]-- ] = k;
+         }
+      }
+
+      AssertH ( (copyStart[ss]-1 == copyEnd[ss])
+                || 
+                /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
+                   Necessity for this case is demonstrated by compressing 
+                   a sequence of approximately 48.5 million of character 
+                   251; 1.0.0/1.0.1 will then die here. */
+                (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
+                1007 )
+
+      for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
+
+      /*--
+         Step 3:
+         The [ss] big bucket is now done.  Record this fact,
+         and update the quadrant descriptors.  Remember to
+         update quadrants in the overshoot area too, if
+         necessary.  The "if (i < 255)" test merely skips
+         this updating for the last bucket processed, since
+         updating for the last bucket is pointless.
+
+         The quadrant array provides a way to incrementally
+         cache sort orderings, as they appear, so as to 
+         make subsequent comparisons in fullGtU() complete
+         faster.  For repetitive blocks this makes a big
+         difference (but not big enough to be able to avoid
+         the fallback sorting mechanism, exponential radix sort).
+
+         The precise meaning is: at all times:
+
+            for 0 <= i < nblock and 0 <= j <= nblock
+
+            if block[i] != block[j], 
+
+               then the relative values of quadrant[i] and 
+                    quadrant[j] are meaningless.
+
+               else {
+                  if quadrant[i] < quadrant[j]
+                     then the string starting at i lexicographically
+                     precedes the string starting at j
+
+                  else if quadrant[i] > quadrant[j]
+                     then the string starting at j lexicographically
+                     precedes the string starting at i
+
+                  else
+                     the relative ordering of the strings starting
+                     at i and j has not yet been determined.
+               }
+      --*/
+      bigDone[ss] = True;
+
+      if (i < 255) {
+         Int32 bbStart  = ftab[ss << 8] & CLEARMASK;
+         Int32 bbSize   = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart;
+         Int32 shifts   = 0;
+
+         while ((bbSize >> shifts) > 65534) shifts++;
+
+         for (j = bbSize-1; j >= 0; j--) {
+            Int32 a2update     = ptr[bbStart + j];
+            UInt16 qVal        = (UInt16)(j >> shifts);
+            quadrant[a2update] = qVal;
+            if (a2update < BZ_N_OVERSHOOT)
+               quadrant[a2update + nblock] = qVal;
+         }
+         AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 );
+      }
+
+   }
+
+   if (verb >= 4)
+      VPrintf3 ( "        %d pointers, %d sorted, %d scanned\n",
+                 nblock, numQSorted, nblock - numQSorted );
+}
+
+#undef BIGFREQ
+#undef SETMASK
+#undef CLEARMASK
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      arr2 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)arr2)  [0 .. nblock-1] holds block
+      arr1 exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)arr2) [0 .. nblock-1] holds block
+      All other areas of block destroyed
+      ftab [ 0 .. 65536 ] destroyed
+      arr1 [0 .. nblock-1] holds sorted order
+*/
+void BZ2_blockSort ( EState* s )
+{
+   UInt32* ptr    = s->ptr; 
+   UChar*  block  = s->block;
+   UInt32* ftab   = s->ftab;
+   Int32   nblock = s->nblock;
+   Int32   verb   = s->verbosity;
+   Int32   wfact  = s->workFactor;
+   UInt16* quadrant;
+   Int32   budget;
+   Int32   budgetInit;
+   Int32   i;
+
+   if (nblock < 10000) {
+      fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+   } else {
+      /* Calculate the location for quadrant, remembering to get
+         the alignment right.  Assumes that &(block[0]) is at least
+         2-byte aligned -- this should be ok since block is really
+         the first section of arr2.
+      */
+      i = nblock+BZ_N_OVERSHOOT;
+      if (i & 1) i++;
+      quadrant = (UInt16*)(&(block[i]));
+
+      /* (wfact-1) / 3 puts the default-factor-30
+         transition point at very roughly the same place as 
+         with v0.1 and v0.9.0.  
+         Not that it particularly matters any more, since the
+         resulting compressed stream is now the same regardless
+         of whether or not we use the main sort or fallback sort.
+      */
+      if (wfact < 1  ) wfact = 1;
+      if (wfact > 100) wfact = 100;
+      budgetInit = nblock * ((wfact-1) / 3);
+      budget = budgetInit;
+
+      mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
+      if (verb >= 3) 
+         VPrintf3 ( "      %d work, %d block, ratio %5.2f\n",
+                    budgetInit - budget,
+                    nblock, 
+                    (float)(budgetInit - budget) /
+                    (float)(nblock==0 ? 1 : nblock) ); 
+      if (budget < 0) {
+         if (verb >= 2) 
+            VPrintf0 ( "    too repetitive; using fallback"
+                       " sorting algorithm\n" );
+         fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+      }
+   }
+
+   s->origPtr = -1;
+   for (i = 0; i < s->nblock; i++)
+      if (ptr[i] == 0)
+         { s->origPtr = i; break; };
+
+   AssertH( s->origPtr != -1, 1003 );
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                       blocksort.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/bz-common.xsl b/win32/3rdparty/bzip2/bz-common.xsl
new file mode 100644
index 000000000..66fcd6fe0
--- /dev/null
+++ b/win32/3rdparty/bzip2/bz-common.xsl
@@ -0,0 +1,39 @@
+ 
+
+
+
+ 
+
+
+
+ 
+ 
+   
+    
+      
+     
+  
+
+
+
+
+set       toc,title
+book      toc,title,figure,table,example,equation
+chapter   toc,title
+section   toc
+sect1     toc
+sect2     toc
+sect3     toc
+sect4     nop
+sect5     nop
+qandaset  toc
+qandadiv  nop
+appendix  toc,title
+article/appendix  nop
+article   toc,title
+preface   toc,title
+reference toc,title
+
+
+
diff --git a/win32/3rdparty/bzip2/bz-fo.xsl b/win32/3rdparty/bzip2/bz-fo.xsl
new file mode 100644
index 000000000..ba3e30123
--- /dev/null
+++ b/win32/3rdparty/bzip2/bz-fo.xsl
@@ -0,0 +1,276 @@
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+      
+     
+   
+
+
+
+
+ 
+
+
+
+
+
+
+  
+
+
+
+
+  blue
+
+
+
+
+  
+    
+  
+
+
+
+  
+    
+  
+
+
+
+
+  
+  
+  
+    
+      
+    
+  
+  
+    
+      
+        
+          
+          
+          
+        
+      
+    
+    
+          
+    
+  
+  
+    
+      
+        
+      
+    
+    
+      
+        
+      
+    
+  
+
+
+
+
+  
+  
+  
+    
+      
+        
+      
+    
+    
+          
+    
+  
+  
+    
+      
+        
+      
+    
+    
+      
+        
+      
+    
+  
+
+
+
+
+
+  
+    
+  
+    
+  
+  
+    
+      
+    
+  
+
+
+
+
+
+  
+  
+  
+  
+    
+      0pt
+    
+  
+  
+    
+      
+      
+      
+        
+          
+            baseline
+             
+               
+            
+          
+          
+            baseline
+            
+              
+                
+                
+                
+                
+              
+            
+          
+        
+      
+    
+  
+  
+  
+    
+      
+    
+    
+      
+    
+    
+      
+    
+  
+
+
+
+
+
+  
+  
+  
+  
+    
+      0pt
+    
+  
+  
+    
+      
+        
+        
+        
+      
+      
+      
+      
+        
+          
+            baseline
+            
+               
+            
+          
+          
+            baseline
+            
+              
+                
+                
+                
+                
+              
+            
+          
+        
+      
+    
+  
+  
+  
+    
+      
+    
+    
+      
+    
+    
+      
+    
+  
+
+
+
+
+
+
+  always
+  
+    
+  
+  
+    
+    pt
+  
+  
+    
+    pt
+  
+  false
+
+
+
+
diff --git a/win32/3rdparty/bzip2/bz-html.xsl b/win32/3rdparty/bzip2/bz-html.xsl
new file mode 100644
index 000000000..1785fffbc
--- /dev/null
+++ b/win32/3rdparty/bzip2/bz-html.xsl
@@ -0,0 +1,20 @@
+ 
+ ]>
+
+
+
+
+
+
+
+
+
+
+  
+  
+
+
+
diff --git a/win32/3rdparty/bzip2/bzdiff b/win32/3rdparty/bzip2/bzdiff
new file mode 100644
index 000000000..6fc38f92d
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzdiff
@@ -0,0 +1,76 @@
+#!/bin/sh
+# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
+
+# Bzcmp/diff wrapped for bzip2, 
+# adapted from zdiff by Philippe Troin  for Debian GNU/Linux.
+
+# Bzcmp and bzdiff are used to invoke the cmp or the  diff  pro-
+# gram  on compressed files.  All options specified are passed
+# directly to cmp or diff.  If only 1 file is specified,  then
+# the  files  compared  are file1 and an uncompressed file1.gz.
+# If two files are specified, then they are  uncompressed  (if
+# necessary) and fed to cmp or diff.  The exit status from cmp
+# or diff is preserved.
+
+PATH="/usr/bin:/bin:$PATH"; export PATH
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+  *cmp) comp=${CMP-cmp}   ;;
+  *)    comp=${DIFF-diff} ;;
+esac
+
+OPTIONS=
+FILES=
+for ARG
+do
+    case "$ARG" in
+    -*)	OPTIONS="$OPTIONS $ARG";;
+     *)	if test -f "$ARG"; then
+            FILES="$FILES $ARG"
+        else
+            echo "${prog}: $ARG not found or not a regular file"
+	    exit 1
+        fi ;;
+    esac
+done
+if test -z "$FILES"; then
+	echo "Usage: $prog [${comp}_options] file [file]"
+	exit 1
+fi
+tmp=`mktemp ${TMPDIR:-/tmp}/bzdiff.XXXXXXXXXX` || {
+      echo 'cannot create a temporary file' >&2
+      exit 1
+}
+set $FILES
+if test $# -eq 1; then
+	FILE=`echo "$1" | sed 's/.bz2$//'`
+	bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
+	STAT="$?"
+
+elif test $# -eq 2; then
+	case "$1" in
+        *.bz2)
+                case "$2" in
+	        *.bz2)
+			F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
+                        bzip2 -cdfq "$2" > $tmp
+                        bzip2 -cdfq "$1" | $comp $OPTIONS - $tmp
+                        STAT="$?"
+			/bin/rm -f $tmp;;
+
+                *)      bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
+                        STAT="$?";;
+                esac;;
+        *)      case "$2" in
+	        *.bz2)
+                        bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
+                        STAT="$?";;
+                *)      $comp $OPTIONS "$1" "$2"
+                        STAT="$?";;
+                esac;;
+	esac
+        exit "$STAT"
+else
+	echo "Usage: $prog [${comp}_options] file [file]"
+	exit 1
+fi
diff --git a/win32/3rdparty/bzip2/bzdiff.1 b/win32/3rdparty/bzip2/bzdiff.1
new file mode 100644
index 000000000..adb7a8e72
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzdiff.1
@@ -0,0 +1,47 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin 
+\"for Debian GNU/Linux
+.TH BZDIFF 1
+.SH NAME
+bzcmp, bzdiff \- compare bzip2 compressed files
+.SH SYNOPSIS
+.B bzcmp
+[ cmp_options ] file1
+[ file2 ]
+.br
+.B bzdiff
+[ diff_options ] file1
+[ file2 ]
+.SH DESCRIPTION
+.I  Bzcmp
+and 
+.I bzdiff
+are used to invoke the
+.I cmp
+or the
+.I diff
+program on bzip2 compressed files.  All options specified are passed
+directly to
+.I cmp
+or
+.IR diff "."
+If only 1 file is specified, then the files compared are
+.I file1
+and an uncompressed
+.IR file1 ".bz2."
+If two files are specified, then they are uncompressed if necessary and fed to
+.I cmp
+or
+.IR diff "."
+The exit status from 
+.I cmp
+or
+.I diff
+is preserved.
+.SH "SEE ALSO"
+cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
+.SH BUGS
+Messages from the
+.I cmp
+or
+.I diff
+programs refer to temporary filenames instead of those specified.
diff --git a/win32/3rdparty/bzip2/bzgrep b/win32/3rdparty/bzip2/bzgrep
new file mode 100644
index 000000000..9a04b8337
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzgrep
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+# Bzgrep wrapped for bzip2, 
+# adapted from zgrep by Philippe Troin  for Debian GNU/Linux.
+## zgrep notice:
+## zgrep -- a wrapper around a grep program that decompresses files as needed
+## Adapted from a version sent by Charles Levert 
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+	*egrep)	grep=${EGREP-egrep}	;;
+	*fgrep)	grep=${FGREP-fgrep}	;;
+	*)	grep=${GREP-grep}	;;
+esac
+pat=""
+while test $# -ne 0; do
+  case "$1" in
+  -e | -f) opt="$opt $1"; shift; pat="$1"
+           if test "$grep" = grep; then  # grep is buggy with -e on SVR4
+             grep=egrep
+           fi;;
+  -A | -B) opt="$opt $1 $2"; shift;;
+  -*)	   opt="$opt $1";;
+   *)      if test -z "$pat"; then
+	     pat="$1"
+	   else
+	     break;
+           fi;;
+  esac
+  shift
+done
+
+if test -z "$pat"; then
+  echo "grep through bzip2 files"
+  echo "usage: $prog [grep_options] pattern [files]"
+  exit 1
+fi
+
+list=0
+silent=0
+op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$op" in
+  *l*) list=1
+esac
+case "$op" in
+  *h*) silent=1
+esac
+
+if test $# -eq 0; then
+  bzip2 -cdfq | $grep $opt "$pat"
+  exit $?
+fi
+
+res=0
+for i do
+  if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
+  if test $list -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
+    r=$?
+  elif test $# -eq 1 -o $silent -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat"
+    r=$?
+  else
+    j=${i//\\/\\\\}
+    j=${j//|/\\|}
+    j=${j//&/\\&}
+    j=`printf "%s" "$j" | tr '\n' ' '`
+    bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
+    r=$?
+  fi
+  test "$r" -ne 0 && res="$r"
+done
+exit $res
diff --git a/win32/3rdparty/bzip2/bzgrep.1 b/win32/3rdparty/bzip2/bzgrep.1
new file mode 100644
index 000000000..930af8c7f
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzgrep.1
@@ -0,0 +1,56 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin 
+\"for Debian GNU/Linux
+.TH BZGREP 1
+.SH NAME
+bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
+.SH SYNOPSIS
+.B bzgrep
+[ grep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzegrep
+[ egrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzfgrep
+[ fgrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.SH DESCRIPTION
+.IR  Bzgrep
+is used to invoke the
+.I grep
+on bzip2-compressed files. All options specified are passed directly to
+.I grep.
+If no file is specified, then the standard input is decompressed
+if necessary and fed to grep.
+Otherwise the given files are uncompressed if necessary and fed to
+.I grep.
+.PP
+If
+.I bzgrep
+is invoked as
+.I bzegrep
+or
+.I bzfgrep
+then
+.I egrep
+or
+.I fgrep
+is used instead of
+.I grep.
+If the GREP environment variable is set,
+.I bzgrep
+uses it as the
+.I grep
+program to be invoked. For example:
+
+    for sh:  GREP=fgrep  bzgrep string files
+    for csh: (setenv GREP fgrep; bzgrep string files)
+.SH AUTHOR
+Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
+Troin  for Debian GNU/Linux.
+.SH "SEE ALSO"
+grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
diff --git a/win32/3rdparty/bzip2/bzip.css b/win32/3rdparty/bzip2/bzip.css
new file mode 100644
index 000000000..43193d8db
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzip.css
@@ -0,0 +1,74 @@
+/* Colours:
+#74240f  dark brown      h1, h2, h3, h4
+#336699  medium blue     links
+#339999  turquoise       link hover colour
+#202020  almost black    general text
+#761596  purple          md5sum text
+#626262  dark gray       pre border
+#eeeeee  very light gray pre background
+#f2f2f9  very light blue nav table background
+#3366cc  medium blue     nav table border
+*/
+
+a, a:link, a:visited, a:active { color: #336699; }
+a:hover { color: #339999; }
+
+body { font: 80%/126% sans-serif; }
+h1, h2, h3, h4 { color: #74240f; }
+
+dt { color: #336699; font-weight: bold }
+dd { 
+ margin-left: 1.5em; 
+ padding-bottom: 0.8em;
+}
+
+/* -- ruler -- */
+div.hr_blue { 
+  height:  3px; 
+  background:#ffffff url("/images/hr_blue.png") repeat-x; }
+div.hr_blue hr { display:none; }
+
+/* release styles */
+#release p { margin-top: 0.4em; }
+#release .md5sum { color: #761596; }
+
+
+/* ------ styles for docs|manuals|howto ------ */
+/* -- lists -- */
+ul  { 
+ margin:     0px 4px 16px 16px;
+ padding:    0px;
+ list-style: url("/images/li-blue.png"); 
+}
+ul li { 
+ margin-bottom: 10px;
+}
+ul ul	{ 
+ list-style-type:  none; 
+ list-style-image: none; 
+ margin-left:      0px; 
+}
+
+/* header / footer nav tables */
+table.nav {
+ border:     solid 1px #3366cc;
+ background: #f2f2f9;
+ background-color: #f2f2f9;
+ margin-bottom: 0.5em;
+}
+/* don't have underlined links in chunked nav menus */
+table.nav a { text-decoration: none; }
+table.nav a:hover { text-decoration: underline; }
+table.nav td { font-size: 85%; }
+
+code, tt, pre { font-size: 120%; }
+code, tt { color: #761596; }
+
+div.literallayout, pre.programlisting, pre.screen {
+ color:      #000000;
+ padding:    0.5em;
+ background: #eeeeee;
+ border:     1px solid #626262;
+ background-color: #eeeeee;
+ margin: 4px 0px 4px 0px; 
+}
diff --git a/win32/3rdparty/bzip2/bzip2.1 b/win32/3rdparty/bzip2/bzip2.1
new file mode 100644
index 000000000..a313f2d5b
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzip2.1
@@ -0,0 +1,454 @@
+.PU
+.TH bzip2 1
+.SH NAME
+bzip2, bunzip2 \- a block-sorting file compressor, v1.0.4
+.br
+bzcat \- decompresses files to stdout
+.br
+bzip2recover \- recovers data from damaged bzip2 files
+
+.SH SYNOPSIS
+.ll +8
+.B bzip2
+.RB [ " \-cdfkqstvzVL123456789 " ]
+[
+.I "filenames \&..."
+]
+.ll -8
+.br
+.B bunzip2
+.RB [ " \-fkvsVL " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzcat
+.RB [ " \-s " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzip2recover
+.I "filename"
+
+.SH DESCRIPTION
+.I bzip2
+compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding.  Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+
+The command-line options are deliberately very similar to 
+those of 
+.I GNU gzip, 
+but they are not identical.
+
+.I bzip2
+expects a list of file names to accompany the
+command-line flags.  Each file is replaced by a compressed version of
+itself, with the name "original_name.bz2".  
+Each compressed file
+has the same modification date, permissions, and, when possible,
+ownership as the corresponding original, so that these properties can
+be correctly restored at decompression time.  File name handling is
+naive in the sense that there is no mechanism for preserving original
+file names, permissions, ownerships or dates in filesystems which lack
+these concepts, or have serious file name length restrictions, such as
+MS-DOS.
+
+.I bzip2
+and
+.I bunzip2
+will by default not overwrite existing
+files.  If you want this to happen, specify the \-f flag.
+
+If no file names are specified,
+.I bzip2
+compresses from standard
+input to standard output.  In this case,
+.I bzip2
+will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+.I bunzip2
+(or
+.I bzip2 \-d) 
+decompresses all
+specified files.  Files which were not created by 
+.I bzip2
+will be detected and ignored, and a warning issued.  
+.I bzip2
+attempts to guess the filename for the decompressed file 
+from that of the compressed file as follows:
+
+       filename.bz2    becomes   filename
+       filename.bz     becomes   filename
+       filename.tbz2   becomes   filename.tar
+       filename.tbz    becomes   filename.tar
+       anyothername    becomes   anyothername.out
+
+If the file does not end in one of the recognised endings, 
+.I .bz2, 
+.I .bz, 
+.I .tbz2
+or
+.I .tbz, 
+.I bzip2 
+complains that it cannot
+guess the name of the original file, and uses the original name
+with
+.I .out
+appended.
+
+As with compression, supplying no
+filenames causes decompression from 
+standard input to standard output.
+
+.I bunzip2 
+will correctly decompress a file which is the
+concatenation of two or more compressed files.  The result is the
+concatenation of the corresponding uncompressed files.  Integrity
+testing (\-t) 
+of concatenated 
+compressed files is also supported.
+
+You can also compress or decompress files to the standard output by
+giving the \-c flag.  Multiple files may be compressed and
+decompressed like this.  The resulting outputs are fed sequentially to
+stdout.  Compression of multiple files 
+in this manner generates a stream
+containing multiple compressed file representations.  Such a stream
+can be decompressed correctly only by
+.I bzip2 
+version 0.9.0 or
+later.  Earlier versions of
+.I bzip2
+will stop after decompressing
+the first file in the stream.
+
+.I bzcat
+(or
+.I bzip2 -dc) 
+decompresses all specified files to
+the standard output.
+
+.I bzip2
+will read arguments from the environment variables
+.I BZIP2
+and
+.I BZIP,
+in that order, and will process them
+before any arguments read from the command line.  This gives a 
+convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed 
+file is slightly
+larger than the original.  Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes.  Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+
+As a self-check for your protection, 
+.I 
+bzip2
+uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data, and
+against undetected bugs in
+.I bzip2
+(hopefully very unlikely).  The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed.  Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong.  It can't help you 
+recover the original uncompressed
+data.  You can use 
+.I bzip2recover
+to try to recover data from
+damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused
+.I bzip2
+to panic.
+
+.SH OPTIONS
+.TP
+.B \-c --stdout
+Compress or decompress to standard output.
+.TP
+.B \-d --decompress
+Force decompression.  
+.I bzip2, 
+.I bunzip2 
+and
+.I bzcat 
+are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used.  This flag overrides that
+mechanism, and forces 
+.I bzip2
+to decompress.
+.TP
+.B \-z --compress
+The complement to \-d: forces compression, regardless of the
+invocation name.
+.TP
+.B \-t --test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+.TP
+.B \-f --force
+Force overwrite of output files.  Normally,
+.I bzip2 
+will not overwrite
+existing output files.  Also forces 
+.I bzip2 
+to break hard links
+to files, which it otherwise wouldn't do.
+
+bzip2 normally declines to decompress files which don't have the
+correct magic header bytes.  If forced (-f), however, it will pass
+such files through unmodified.  This is how GNU gzip behaves.
+.TP
+.B \-k --keep
+Keep (don't delete) input files during compression
+or decompression.
+.TP
+.B \-s --small
+Reduce memory usage, for compression, decompression and testing.  Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte.  This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+
+During compression, \-s selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio.  In short, if your machine is low on memory (8 megabytes or
+less), use \-s for everything.  See MEMORY MANAGEMENT below.
+.TP
+.B \-q --quiet
+Suppress non-essential warning messages.  Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+.TP
+.B \-v --verbose
+Verbose mode -- show the compression ratio for each file processed.
+Further \-v's increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+.TP
+.B \-L --license -V --version
+Display the software version, license terms and conditions.
+.TP
+.B \-1 (or \-\-fast) to \-9 (or \-\-best)
+Set the block size to 100 k, 200 k ..  900 k when compressing.  Has no
+effect when decompressing.  See MEMORY MANAGEMENT below.
+The \-\-fast and \-\-best aliases are primarily for GNU gzip 
+compatibility.  In particular, \-\-fast doesn't make things
+significantly faster.  
+And \-\-best merely selects the default behaviour.
+.TP
+.B \--
+Treats all subsequent arguments as file names, even if they start
+with a dash.  This is so you can handle files with names beginning
+with a dash, for example: bzip2 \-- \-myfilename.
+.TP
+.B \--repetitive-fast --repetitive-best
+These flags are redundant in versions 0.9.5 and above.  They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful.  0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+
+.SH MEMORY MANAGEMENT
+.I bzip2 
+compresses large files in blocks.  The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression.  The flags \-1 through \-9
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+.I bunzip2
+then allocates itself just enough memory to decompress
+the file.  Since block sizes are stored in compressed files, it follows
+that the flags \-1 to \-9 are irrelevant to and so ignored
+during decompression.
+
+Compression and decompression requirements, 
+in bytes, can be estimated as:
+
+       Compression:   400k + ( 8 x block size )
+
+       Decompression: 100k + ( 4 x block size ), or
+                      100k + ( 2.5 x block size )
+
+Larger block sizes give rapidly diminishing marginal returns.  Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using
+.I bzip2
+on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+
+For files compressed with the default 900k block size,
+.I bunzip2
+will require about 3700 kbytes to decompress.  To support decompression
+of any file on a 4 megabyte machine, 
+.I bunzip2
+has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes.  Decompression speed is also halved, so you should use this
+option only where necessary.  The relevant flag is -s.
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved.  Compression and
+decompression speed are virtually unaffected by block size.
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size.  The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block.  For example, compressing a file
+20,000 bytes long with the flag -9 will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it.  Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+
+Here is a table which summarises the maximum memory usage for different
+block sizes.  Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes.  This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+
+           Compress   Decompress   Decompress   Corpus
+    Flag     usage      usage       -s usage     Size
+
+     -1      1200k       500k         350k      914704
+     -2      2000k       900k         600k      877703
+     -3      2800k      1300k         850k      860338
+     -4      3600k      1700k        1100k      846899
+     -5      4400k      2100k        1350k      845160
+     -6      5200k      2500k        1600k      838626
+     -7      6100k      2900k        1850k      834096
+     -8      6800k      3300k        2100k      828642
+     -9      7600k      3700k        2350k      828642
+
+.SH RECOVERING DATA FROM DAMAGED FILES
+.I bzip2
+compresses files in blocks, usually 900kbytes long.  Each
+block is handled independently.  If a media or transmission error causes
+a multi-block .bz2
+file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty.  Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+
+.I bzip2recover
+is a simple program whose purpose is to search for
+blocks in .bz2 files, and write each block out into its own .bz2 
+file.  You can then use
+.I bzip2 
+\-t
+to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+
+.I bzip2recover
+takes a single argument, the name of the damaged file, 
+and writes a number of files "rec00001file.bz2",
+"rec00002file.bz2", etc, containing the  extracted  blocks.
+The  output  filenames  are  designed  so  that the use of
+wildcards in subsequent processing -- for example,  
+"bzip2 -dc  rec*file.bz2 > recovered_data" -- processes the files in
+the correct order.
+
+.I bzip2recover
+should be of most use dealing with large .bz2
+files,  as  these will contain many blocks.  It is clearly
+futile to use it on damaged single-block  files,  since  a
+damaged  block  cannot  be recovered.  If you wish to minimise 
+any potential data loss through media  or  transmission errors, 
+you might consider compressing with a smaller
+block size.
+
+.SH PERFORMANCE NOTES
+The sorting phase of compression gathers together similar strings in the
+file.  Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..."  (repeated several hundred times) may
+compress more slowly than normal.  Versions 0.9.5 and above fare much
+better than previous versions in this respect.  The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1.  You can use the
+\-vvvv option to monitor progress in great detail, if you want.
+
+Decompression speed is unaffected by these phenomena.
+
+.I bzip2
+usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion.  This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine 
+.I bzip2
+will perform best on machines with very large caches.
+
+.SH CAVEATS
+I/O error messages are not as helpful as they could be.
+.I bzip2
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+
+This manual page pertains to version 1.0.4 of
+.I bzip2.  
+Compressed data created by this version is entirely forwards and
+backwards compatible with the previous public releases, versions
+0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and 1.0.3, but with the following
+exception: 0.9.0 and above can correctly decompress multiple
+concatenated compressed files.  0.1pl2 cannot do this; it will stop
+after decompressing just the first file in the stream.
+
+.I bzip2recover
+versions prior to 1.0.2 used 32-bit integers to represent
+bit positions in compressed files, so they could not handle compressed
+files more than 512 megabytes long.  Versions 1.0.2 and above use
+64-bit ints on some platforms which support them (GNU supported
+targets, and Windows).  To establish whether or not bzip2recover was
+built with such a limitation, run it without arguments.  In any event
+you can build yourself an unlimited version if you can recompile it
+with MaybeUInt64 set to be an unsigned 64-bit integer.
+
+
+
+.SH AUTHOR
+Julian Seward, jsewardbzip.org.
+
+http://www.bzip.org
+
+The ideas embodied in
+.I bzip2
+are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original
+.I bzip,
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+.I bzip).  
+I am much
+indebted for their help, support and advice.  See the manual in the
+source distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression.  Bela Lubkin encouraged me to improve the
+worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+The bz* scripts are derived from those of GNU gzip.
+Many people sent patches, helped
+with portability problems, lent machines, gave advice and were generally
+helpful.
diff --git a/win32/3rdparty/bzip2/bzip2.1.preformatted b/win32/3rdparty/bzip2/bzip2.1.preformatted
new file mode 100644
index 000000000..15e16e50a
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzip2.1.preformatted
@@ -0,0 +1,399 @@
+bzip2(1)                                                 bzip2(1)
+
+
+
+NNAAMMEE
+       bzip2, bunzip2 − a block‐sorting file compressor, v1.0.4
+       bzcat − decompresses files to stdout
+       bzip2recover − recovers data from damaged bzip2 files
+
+
+SSYYNNOOPPSSIISS
+       bbzziipp22 [ −−ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbuunnzziipp22 [ −−ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzzccaatt [ −−ss ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
+
+
+DDEESSCCRRIIPPTTIIOONN
+       _b_z_i_p_2  compresses  files  using  the Burrows‐Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78‐based compressors,
+       and  approaches  the performance of the PPM family of sta­
+       tistical compressors.
+
+       The command‐line options are deliberately very similar  to
+       those of _G_N_U _g_z_i_p_, but they are not identical.
+
+       _b_z_i_p_2  expects  a list of file names to accompany the com­
+       mand‐line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per­
+       missions, and, when possible, ownership as the correspond­
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv­
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MS‐DOS.
+
+       _b_z_i_p_2  and  _b_u_n_z_i_p_2 will by default not overwrite existing
+       files.  If you want this to happen, specify the −f flag.
+
+       If no file names  are  specified,  _b_z_i_p_2  compresses  from
+       standard  input  to  standard output.  In this case, _b_z_i_p_2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       _b_u_n_z_i_p_2 (or _b_z_i_p_2 _−_d_) decompresses  all  specified  files.
+       Files which were not created by _b_z_i_p_2 will be detected and
+       ignored, and a warning issued.  _b_z_i_p_2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       _._b_z_2_,  _._b_z_,  _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with _._o_u_t appended.
+
+       As  with compression, supplying no filenames causes decom­
+       pression from standard input to standard output.
+
+       _b_u_n_z_i_p_2 will correctly decompress a file which is the con­
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (−t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the −c flag.  Multiple files may be com­
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi­
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  _b_z_i_p_2  version  0.9.0  or
+       later.   Earlier  versions of _b_z_i_p_2 will stop after decom­
+       pressing the first file in the stream.
+
+       _b_z_c_a_t (or _b_z_i_p_2 _‐_d_c_) decompresses all specified  files  to
+       the standard output.
+
+       _b_z_i_p_2  will  read arguments from the environment variables
+       _B_Z_I_P_2 and _B_Z_I_P_, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a self‐check for your  protection,  _b_z_i_p_2  uses  32‐bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup­
+       tion  of  the compressed data, and against undetected bugs
+       in _b_z_i_p_2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can’t  help
+       you  recover  the original uncompressed data.  You can use
+       _b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
+
+
+OOPPTTIIOONNSS
+       −−cc ‐‐‐‐ssttddoouutt
+              Compress or decompress to standard output.
+
+       −−dd ‐‐‐‐ddeeccoommpprreessss
+              Force  decompression.  _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces _b_z_i_p_2 to decompress.
+
+       −−zz ‐‐‐‐ccoommpprreessss
+              The   complement   to   −d:   forces   compression,
+              regardless of the invocation name.
+
+       −−tt ‐‐‐‐tteesstt
+              Check integrity of the specified file(s), but don’t
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       −−ff ‐‐‐‐ffoorrccee
+              Force overwrite of output files.   Normally,  _b_z_i_p_2
+              will  not  overwrite  existing  output files.  Also
+              forces _b_z_i_p_2 to break hard links to files, which it
+              otherwise wouldn’t do.
+
+              bzip2  normally  declines to decompress files which
+              don’t have the  correct  magic  header  bytes.   If
+              forced  (‐f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       −−kk ‐‐‐‐kkeeeepp
+              Keep  (don’t delete) input files during compression
+              or decompression.
+
+       −−ss ‐‐‐‐ssmmaallll
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  −s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  −s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       −−qq ‐‐‐‐qquuiieett
+              Suppress non‐essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       −−vv ‐‐‐‐vveerrbboossee
+              Verbose mode ‐‐ show the compression ratio for each
+              file  processed.   Further  −v’s  increase the ver­
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       −−LL ‐‐‐‐lliicceennssee ‐‐VV ‐‐‐‐vveerrssiioonn
+              Display  the  software  version,  license terms and
+              conditions.
+
+       −−11 ((oorr −−−−ffaasstt)) ttoo −−99 ((oorr −−−−bbeesstt))
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The −−fast and −−best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, −−fast doesn’t make things  signifi­
+              cantly  faster.   And  −−best  merely  selects  the
+              default behaviour.
+
+       −−‐‐     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han­
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 −‐ −myfilename.
+
+       −−‐‐rreeppeettiittiivvee‐‐ffaasstt ‐‐‐‐rreeppeettiittiivvee‐‐bbeesstt
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver­
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
+       _b_z_i_p_2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  −1  through  −9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec­
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags −1 to −9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using _b_z_i_p_2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       _b_u_n_z_i_p_2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       _b_u_n_z_i_p_2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres­
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is ‐s.
+
+       In general, try and use the largest block size memory con­
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu­
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  ‐‐  that  means  most files you’d encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag ‐9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres­
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi­
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       ‐s usage     Size
+
+            ‐1      1200k       500k         350k      914704
+            ‐2      2000k       900k         600k      877703
+            ‐3      2800k      1300k         850k      860338
+            ‐4      3600k      1700k        1100k      846899
+            ‐5      4400k      2100k        1350k      845160
+            ‐6      5200k      2500k        1600k      838626
+            ‐7      6100k      2900k        1850k      834096
+            ‐8      6800k      3300k        2100k      828642
+            ‐9      7600k      3700k        2350k      828642
+
+
+RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
+       _b_z_i_p_2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans­
+       mission error causes a multi‐block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48‐bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32‐bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use _b_z_i_p_2 −t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam­
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro­
+       cessing  ‐‐ for example, "bzip2 ‐dc  rec*file.bz2 > recov­
+       ered_data" ‐‐ processes the files in the correct order.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged single‐block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min­
+       imise any potential data loss through media  or  transmis­
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PPEERRFFOORRMMAANNCCEE NNOOTTEESS
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worst‐case and average‐case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the −vvvv option to mon­
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       _b_z_i_p_2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran­
+       dom  fashion.   This means that performance, both for com­
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine _b_z_i_p_2 will per­
+       form best on machines with very large caches.
+
+
+CCAAVVEEAATTSS
+       I/O  error  messages  are not as helpful as they could be.
+       _b_z_i_p_2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.4 of _b_z_i_p_2_.  Com­
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1, 
+       1.0.2 and 1.0.3, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop 
+       after  decompressing just the first file in the stream.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r  versions prior to 1.0.2 used 32‐bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64‐bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64‐bit integer.
+
+
+
+
+AAUUTTHHOORR
+       Julian Seward, jsewardbzip.org.
+
+       http://www.bzip.org
+
+       The ideas embodied in _b_z_i_p_2 are due to (at least) the fol­
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod­
+       ing model in the original _b_z_i_p_, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  _b_z_i_p_)_.   I  am  much
+       indebted for their help, support and advice.  See the man­
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres­
+       sion.  Bela Lubkin encouraged me to improve the worst‐case
+       compression performance.  Donna Robinson XMLised the docu­
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
+
+
+                                                         bzip2(1)
diff --git a/win32/3rdparty/bzip2/bzip2.c b/win32/3rdparty/bzip2/bzip2.c
new file mode 100644
index 000000000..390410735
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzip2.c
@@ -0,0 +1,2034 @@
+
+/*-----------------------------------------------------------*/
+/*--- A block-sorting, lossless compressor        bzip2.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* Place a 1 beside your platform, and 0 elsewhere.
+   Generic 32-bit Unix.
+   Also works on 64-bit Unix boxes.
+   This is the default.
+*/
+#define BZ_UNIX      1
+
+/*--
+  Win32, as seen by Jacob Navia's excellent
+  port of (Chris Fraser & David Hanson)'s excellent
+  lcc compiler.  Or with MS Visual C.
+  This is selected automatically if compiled by a compiler which
+  defines _WIN32, not including the Cygwin GCC.
+--*/
+#define BZ_LCCWIN32  0
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#undef  BZ_LCCWIN32
+#define BZ_LCCWIN32 1
+#undef  BZ_UNIX
+#define BZ_UNIX 0
+#endif
+
+
+/*---------------------------------------------*/
+/*--
+  Some stuff for all platforms.
+--*/
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "bzlib.h"
+
+#define ERROR_IF_EOF(i)       { if ((i) == EOF)  ioError(); }
+#define ERROR_IF_NOT_ZERO(i)  { if ((i) != 0)    ioError(); }
+#define ERROR_IF_MINUS_ONE(i) { if ((i) == (-1)) ioError(); }
+
+
+/*---------------------------------------------*/
+/*--
+   Platform-specific stuff.
+--*/
+
+#if BZ_UNIX
+#   include 
+#   include 
+#   include 
+#   include 
+#   include 
+#   include 
+
+#   define PATH_SEP    '/'
+#   define MY_LSTAT    lstat
+#   define MY_STAT     stat
+#   define MY_S_ISREG  S_ISREG
+#   define MY_S_ISDIR  S_ISDIR
+
+#   define APPEND_FILESPEC(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define SET_BINARY_MODE(fd) /**/
+
+#   ifdef __GNUC__
+#      define NORETURN __attribute__ ((noreturn))
+#   else
+#      define NORETURN /**/
+#   endif
+
+#   ifdef __DJGPP__
+#     include 
+#     include 
+#     undef MY_LSTAT
+#     undef MY_STAT
+#     define MY_LSTAT stat
+#     define MY_STAT stat
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+
+#   ifdef __CYGWIN__
+#     include 
+#     include 
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+#endif /* BZ_UNIX */
+
+
+
+#if BZ_LCCWIN32
+#   include 
+#   include 
+#   include 
+
+#   define NORETURN       /**/
+#   define PATH_SEP       '\\'
+#   define MY_LSTAT       _stat
+#   define MY_STAT        _stat
+#   define MY_S_ISREG(x)  ((x) & _S_IFREG)
+#   define MY_S_ISDIR(x)  ((x) & _S_IFDIR)
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FILESPEC(root, name)                \
+      root = snocString ((root), (name))
+
+#   define SET_BINARY_MODE(fd)                        \
+      do {                                            \
+         int retVal = setmode ( fileno ( fd ),        \
+                                O_BINARY );           \
+         ERROR_IF_MINUS_ONE ( retVal );               \
+      } while ( 0 )
+
+#endif /* BZ_LCCWIN32 */
+
+
+/*---------------------------------------------*/
+/*--
+  Some more stuff for all platforms :-)
+--*/
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+                                       
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+/*--
+  IntNative is your platform's `native' int size.
+  Only here to avoid probs with 64-bit platforms.
+--*/
+typedef int IntNative;
+
+
+/*---------------------------------------------------*/
+/*--- Misc (file handling) data decls             ---*/
+/*---------------------------------------------------*/
+
+Int32   verbosity;
+Bool    keepInputFiles, smallMode, deleteOutputOnInterrupt;
+Bool    forceOverwrite, testFailsExist, unzFailsExist, noisy;
+Int32   numFileNames, numFilesProcessed, blockSize100k;
+Int32   exitValue;
+
+/*-- source modes; F==file, I==stdin, O==stdout --*/
+#define SM_I2O           1
+#define SM_F2O           2
+#define SM_F2F           3
+
+/*-- operation modes --*/
+#define OM_Z             1
+#define OM_UNZ           2
+#define OM_TEST          3
+
+Int32   opMode;
+Int32   srcMode;
+
+#define FILE_NAME_LEN 1034
+
+Int32   longestFileName;
+Char    inName [FILE_NAME_LEN];
+Char    outName[FILE_NAME_LEN];
+Char    tmpName[FILE_NAME_LEN];
+Char    *progName;
+Char    progNameReally[FILE_NAME_LEN];
+FILE    *outputHandleJustInCase;
+Int32   workFactor;
+
+static void    panic                 ( const Char* ) NORETURN;
+static void    ioError               ( void )        NORETURN;
+static void    outOfMemory           ( void )        NORETURN;
+static void    configError           ( void )        NORETURN;
+static void    crcError              ( void )        NORETURN;
+static void    cleanUpAndFail        ( Int32 )       NORETURN;
+static void    compressedStreamEOF   ( void )        NORETURN;
+
+static void    copyFileName ( Char*, Char* );
+static void*   myMalloc     ( Int32 );
+static void    applySavedFileAttrToOutputFile ( IntNative fd );
+
+
+
+/*---------------------------------------------------*/
+/*--- An implementation of 64-bit ints.  Sigh.    ---*/
+/*--- Roll on widespread deployment of ANSI C9X ! ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct { UChar b[8]; } 
+   UInt64;
+
+
+static
+void uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
+{
+   n->b[7] = (UChar)((hi32 >> 24) & 0xFF);
+   n->b[6] = (UChar)((hi32 >> 16) & 0xFF);
+   n->b[5] = (UChar)((hi32 >> 8)  & 0xFF);
+   n->b[4] = (UChar) (hi32        & 0xFF);
+   n->b[3] = (UChar)((lo32 >> 24) & 0xFF);
+   n->b[2] = (UChar)((lo32 >> 16) & 0xFF);
+   n->b[1] = (UChar)((lo32 >> 8)  & 0xFF);
+   n->b[0] = (UChar) (lo32        & 0xFF);
+}
+
+
+static
+double uInt64_to_double ( UInt64* n )
+{
+   Int32  i;
+   double base = 1.0;
+   double sum  = 0.0;
+   for (i = 0; i < 8; i++) {
+      sum  += base * (double)(n->b[i]);
+      base *= 256.0;
+   }
+   return sum;
+}
+
+
+static
+Bool uInt64_isZero ( UInt64* n )
+{
+   Int32 i;
+   for (i = 0; i < 8; i++)
+      if (n->b[i] != 0) return 0;
+   return 1;
+}
+
+
+/* Divide *n by 10, and return the remainder.  */
+static 
+Int32 uInt64_qrm10 ( UInt64* n )
+{
+   UInt32 rem, tmp;
+   Int32  i;
+   rem = 0;
+   for (i = 7; i >= 0; i--) {
+      tmp = rem * 256 + n->b[i];
+      n->b[i] = tmp / 10;
+      rem = tmp % 10;
+   }
+   return rem;
+}
+
+
+/* ... and the Whole Entire Point of all this UInt64 stuff is
+   so that we can supply the following function.
+*/
+static
+void uInt64_toAscii ( char* outbuf, UInt64* n )
+{
+   Int32  i, q;
+   UChar  buf[32];
+   Int32  nBuf   = 0;
+   UInt64 n_copy = *n;
+   do {
+      q = uInt64_qrm10 ( &n_copy );
+      buf[nBuf] = q + '0';
+      nBuf++;
+   } while (!uInt64_isZero(&n_copy));
+   outbuf[nBuf] = 0;
+   for (i = 0; i < nBuf; i++) 
+      outbuf[i] = buf[nBuf-i-1];
+}
+
+
+/*---------------------------------------------------*/
+/*--- Processing of complete files and streams    ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressStream ( FILE *stream, FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   UChar   ibuf[5000];
+   Int32   nIbuf;
+   UInt32  nbytes_in_lo32, nbytes_in_hi32;
+   UInt32  nbytes_out_lo32, nbytes_out_hi32;
+   Int32   bzerr, bzerr_dummy, ret;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   bzf = BZ2_bzWriteOpen ( &bzerr, zStream, 
+                           blockSize100k, verbosity, workFactor );   
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n" );
+
+   while (True) {
+
+      if (myfeof(stream)) break;
+      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
+      if (ferror(stream)) goto errhandler_io;
+      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
+      if (bzerr != BZ_OK) goto errhandler;
+
+   }
+
+   BZ2_bzWriteClose64 ( &bzerr, bzf, 0, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fflush ( zStream );
+   if (ret == EOF) goto errhandler_io;
+   if (zStream != stdout) {
+      Int32 fd = fileno ( zStream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+      ret = fclose ( zStream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (ferror(stream)) goto errhandler_io;
+   ret = fclose ( stream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 1) {
+      if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
+	 fprintf ( stderr, " no data compressed.\n");
+      } else {
+	 Char   buf_nin[32], buf_nout[32];
+	 UInt64 nbytes_in,   nbytes_out;
+	 double nbytes_in_d, nbytes_out_d;
+	 uInt64_from_UInt32s ( &nbytes_in, 
+			       nbytes_in_lo32, nbytes_in_hi32 );
+	 uInt64_from_UInt32s ( &nbytes_out, 
+			       nbytes_out_lo32, nbytes_out_hi32 );
+	 nbytes_in_d  = uInt64_to_double ( &nbytes_in );
+	 nbytes_out_d = uInt64_to_double ( &nbytes_out );
+	 uInt64_toAscii ( buf_nin, &nbytes_in );
+	 uInt64_toAscii ( buf_nout, &nbytes_out );
+	 fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+		   "%5.2f%% saved, %s in, %s out.\n",
+		   nbytes_in_d / nbytes_out_d,
+		   (8.0 * nbytes_out_d) / nbytes_in_d,
+		   100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+		   buf_nin,
+		   buf_nout
+		 );
+      }
+   }
+
+   return;
+
+   errhandler:
+   BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_MEM_ERROR:
+         outOfMemory (); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      default:
+         panic ( "compress:unexpected error" );
+   }
+
+   panic ( "compress:end" );
+   /*notreached*/
+}
+
+
+
+/*---------------------------------------------*/
+static 
+Bool uncompressStream ( FILE *zStream, FILE *stream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
+         if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
+            fwrite ( obuf, sizeof(UChar), nread, stream );
+         if (ferror(stream)) goto errhandler_io;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      if (nUnused == 0 && myfeof(zStream)) break;
+   }
+
+   closeok:
+   if (ferror(zStream)) goto errhandler_io;
+   if (stream != stdout) {
+      Int32 fd = fileno ( stream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+   }
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (ferror(stream)) goto errhandler_io;
+   ret = fflush ( stream );
+   if (ret != 0) goto errhandler_io;
+   if (stream != stdout) {
+      ret = fclose ( stream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   trycat: 
+   if (forceOverwrite) {
+      rewind(zStream);
+      while (True) {
+      	 if (myfeof(zStream)) break;
+      	 nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+      	 if (ferror(zStream)) goto errhandler_io;
+      	 if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+      	 if (ferror(stream)) goto errhandler_io;
+      }
+      goto closeok;
+   }
+  
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         crcError();
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         compressedStreamEOF();
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (stream != stdout) fclose(stream);
+         if (streamNo == 1) {
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "\n%s: %s: trailing garbage after EOF ignored\n",
+                      progName, inName );
+            return True;       
+         }
+      default:
+         panic ( "decompress:unexpected error" );
+   }
+
+   panic ( "decompress:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool testStream ( FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(zStream);
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+      if (nUnused == 0 && myfeof(zStream)) break;
+
+   }
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   if (verbosity == 0) 
+      fprintf ( stderr, "%s: %s: ", progName, inName );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         fprintf ( stderr,
+                   "data integrity (CRC) error in data\n" );
+         return False;
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         fprintf ( stderr,
+                   "file ends unexpectedly\n" );
+         return False;
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (streamNo == 1) {
+          fprintf ( stderr, 
+                    "bad magic number (file not created by bzip2)\n" );
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "trailing garbage after EOF ignored\n" );
+            return True;       
+         }
+      default:
+         panic ( "test:unexpected error" );
+   }
+
+   panic ( "test:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------------*/
+/*--- Error [non-] handling grunge                ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+void setExit ( Int32 v )
+{
+   if (v > exitValue) exitValue = v;
+}
+
+
+/*---------------------------------------------*/
+static 
+void cadvise ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\nIt is possible that the compressed file(s) have become corrupted.\n"
+        "You can use the -tvv option to test integrity of such files.\n\n"
+        "You can use the `bzip2recover' program to attempt to recover\n"
+        "data from undamaged sections of corrupted files.\n\n"
+    );
+}
+
+
+/*---------------------------------------------*/
+static 
+void showFileNames ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\tInput file = %s, output file = %s\n",
+      inName, outName 
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void cleanUpAndFail ( Int32 ec )
+{
+   IntNative      retVal;
+   struct MY_STAT statBuf;
+
+   if ( srcMode == SM_F2F 
+        && opMode != OM_TEST
+        && deleteOutputOnInterrupt ) {
+
+      /* Check whether input file still exists.  Delete output file
+         only if input exists to avoid loss of data.  Joerg Prante, 5
+         January 2002.  (JRS 06-Jan-2002: other changes in 1.0.2 mean
+         this is less likely to happen.  But to be ultra-paranoid, we
+         do the check anyway.)  */
+      retVal = MY_STAT ( inName, &statBuf );
+      if (retVal == 0) {
+         if (noisy)
+            fprintf ( stderr, 
+                      "%s: Deleting output file %s, if it exists.\n",
+                      progName, outName );
+         if (outputHandleJustInCase != NULL)
+            fclose ( outputHandleJustInCase );
+         retVal = remove ( outName );
+         if (retVal != 0)
+            fprintf ( stderr,
+                      "%s: WARNING: deletion of output file "
+                      "(apparently) failed.\n",
+                      progName );
+      } else {
+         fprintf ( stderr,
+                   "%s: WARNING: deletion of output file suppressed\n",
+                    progName );
+         fprintf ( stderr,
+                   "%s:    since input file no longer exists.  Output file\n",
+                   progName );
+         fprintf ( stderr,
+                   "%s:    `%s' may be incomplete.\n",
+                   progName, outName );
+         fprintf ( stderr, 
+                   "%s:    I suggest doing an integrity test (bzip2 -tv)"
+                   " of it.\n",
+                   progName );
+      }
+   }
+
+   if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
+      fprintf ( stderr, 
+                "%s: WARNING: some files have not been processed:\n"
+                "%s:    %d specified on command line, %d not processed yet.\n\n",
+                progName, progName,
+                numFileNames, numFileNames - numFilesProcessed );
+   }
+   setExit(ec);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------*/
+static 
+void panic ( const Char* s )
+{
+   fprintf ( stderr,
+             "\n%s: PANIC -- internal consistency error:\n"
+             "\t%s\n"
+             "\tThis is a BUG.  Please report it to me at:\n"
+             "\tjseward@bzip.org\n",
+             progName, s );
+   showFileNames();
+   cleanUpAndFail( 3 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void crcError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: Data integrity error when decompressing.\n",
+             progName );
+   showFileNames();
+   cadvise();
+   cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressedStreamEOF ( void )
+{
+  if (noisy) {
+    fprintf ( stderr,
+	      "\n%s: Compressed file ends unexpectedly;\n\t"
+	      "perhaps it is corrupted?  *Possible* reason follows.\n",
+	      progName );
+    perror ( progName );
+    showFileNames();
+    cadvise();
+  }
+  cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void ioError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: I/O or other error, bailing out.  "
+             "Possible reason follows.\n",
+             progName );
+   perror ( progName );
+   showFileNames();
+   cleanUpAndFail( 1 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySignalCatcher ( IntNative n )
+{
+   fprintf ( stderr,
+             "\n%s: Control-C or similar caught, quitting.\n",
+             progName );
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySIGSEGVorSIGBUScatcher ( IntNative n )
+{
+   if (opMode == OM_Z)
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (2) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (3) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (1) and (2).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (1)\n"
+      "   or (2), feel free to report it to me at: jseward@bzip.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+      else
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) The compressed data is corrupted, and bzip2's usual checks\n"
+      "       failed to detect this.  Try bzip2 -tvv my_file.bz2.\n"
+      "   (2) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (3) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (4) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (2) and (3).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (2)\n"
+      "   or (3), feel free to report it to me at: jseward@bzip.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+
+   showFileNames();
+   if (opMode == OM_Z)
+      cleanUpAndFail( 3 ); else
+      { cadvise(); cleanUpAndFail( 2 ); }
+}
+
+
+/*---------------------------------------------*/
+static 
+void outOfMemory ( void )
+{
+   fprintf ( stderr,
+             "\n%s: couldn't allocate enough memory\n",
+             progName );
+   showFileNames();
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void configError ( void )
+{
+   fprintf ( stderr,
+             "bzip2: I'm not configured correctly for this platform!\n"
+             "\tI require Int32, Int16 and Char to have sizes\n"
+             "\tof 4, 2 and 1 bytes to run properly, and they don't.\n"
+             "\tProbably you can fix this by defining them correctly,\n"
+             "\tand recompiling.  Bye!\n" );
+   setExit(3);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------------*/
+/*--- The main driver machinery                   ---*/
+/*---------------------------------------------------*/
+
+/* All rather crufty.  The main problem is that input files
+   are stat()d multiple times before use.  This should be
+   cleaned up. 
+*/
+
+/*---------------------------------------------*/
+static 
+void pad ( Char *s )
+{
+   Int32 i;
+   if ( (Int32)strlen(s) >= longestFileName ) return;
+   for (i = 1; i <= longestFileName - (Int32)strlen(s); i++)
+      fprintf ( stderr, " " );
+}
+
+
+/*---------------------------------------------*/
+static 
+void copyFileName ( Char* to, Char* from ) 
+{
+   if ( strlen(from) > FILE_NAME_LEN-10 )  {
+      fprintf (
+         stderr,
+         "bzip2: file name\n`%s'\n"
+         "is suspiciously (more than %d chars) long.\n"
+         "Try using a reasonable file name instead.  Sorry! :-)\n",
+         from, FILE_NAME_LEN-10
+      );
+      setExit(1);
+      exit(exitValue);
+   }
+
+  strncpy(to,from,FILE_NAME_LEN-10);
+  to[FILE_NAME_LEN-10]='\0';
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool fileExists ( Char* name )
+{
+   FILE *tmp   = fopen ( name, "rb" );
+   Bool exists = (tmp != NULL);
+   if (tmp != NULL) fclose ( tmp );
+   return exists;
+}
+
+
+/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions.
+   This avoids a race condition in versions < 1.0.2, in which
+   the file was first opened and then had its interim permissions
+   set safely.  We instead use open() to create the file with
+   the interim permissions required. (--- --- rw-).
+
+   For non-Unix platforms, if we are not worrying about
+   security issues, simple this simply behaves like fopen.
+*/
+static
+FILE* fopen_output_safely ( Char* name, const char* mode )
+{
+#  if BZ_UNIX
+   FILE*     fp;
+   IntNative fh;
+   fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
+   if (fh == -1) return NULL;
+   fp = fdopen(fh, mode);
+   if (fp == NULL) close(fh);
+   return fp;
+#  else
+   return fopen(name, mode);
+#  endif
+}
+
+
+/*---------------------------------------------*/
+/*--
+  if in doubt, return True
+--*/
+static 
+Bool notAStandardFile ( Char* name )
+{
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return True;
+   if (MY_S_ISREG(statBuf.st_mode)) return False;
+   return True;
+}
+
+
+/*---------------------------------------------*/
+/*--
+  rac 11/21/98 see if file has hard links to it
+--*/
+static 
+Int32 countHardLinks ( Char* name )
+{  
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return 0;
+   return (statBuf.st_nlink - 1);
+}
+
+
+/*---------------------------------------------*/
+/* Copy modification date, access date, permissions and owner from the
+   source to destination file.  We have to copy this meta-info off
+   into fileMetaInfo before starting to compress / decompress it,
+   because doing it afterwards means we get the wrong access time.
+
+   To complicate matters, in compress() and decompress() below, the
+   sequence of tests preceding the call to saveInputFileMetaInfo()
+   involves calling fileExists(), which in turn establishes its result
+   by attempting to fopen() the file, and if successful, immediately
+   fclose()ing it again.  So we have to assume that the fopen() call
+   does not cause the access time field to be updated.
+
+   Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
+   to imply that merely doing open() will not affect the access time.
+   Therefore we merely need to hope that the C library only does
+   open() as a result of fopen(), and not any kind of read()-ahead
+   cleverness.
+
+   It sounds pretty fragile to me.  Whether this carries across
+   robustly to arbitrary Unix-like platforms (or even works robustly
+   on this one, RedHat 7.2) is unknown to me.  Nevertheless ...  
+*/
+#if BZ_UNIX
+static 
+struct MY_STAT fileMetaInfo;
+#endif
+
+static 
+void saveInputFileMetaInfo ( Char *srcName )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+   /* Note use of stat here, not lstat. */
+   retVal = MY_STAT( srcName, &fileMetaInfo );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+
+static 
+void applySavedTimeInfoToOutputFile ( Char *dstName )
+{
+#  if BZ_UNIX
+   IntNative      retVal;
+   struct utimbuf uTimBuf;
+
+   uTimBuf.actime = fileMetaInfo.st_atime;
+   uTimBuf.modtime = fileMetaInfo.st_mtime;
+
+   retVal = utime ( dstName, &uTimBuf );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+static 
+void applySavedFileAttrToOutputFile ( IntNative fd )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+
+   retVal = fchmod ( fd, fileMetaInfo.st_mode );
+   ERROR_IF_NOT_ZERO ( retVal );
+
+   (void) fchown ( fd, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
+   /* chown() will in many cases return with EPERM, which can
+      be safely ignored.
+   */
+#  endif
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool containsDubiousChars ( Char* name )
+{
+#  if BZ_UNIX
+   /* On unix, files can contain any characters and the file expansion
+    * is performed by the shell.
+    */
+   return False;
+#  else /* ! BZ_UNIX */
+   /* On non-unix (Win* platforms), wildcard characters are not allowed in 
+    * filenames.
+    */
+   for (; *name != '\0'; name++)
+      if (*name == '?' || *name == '*') return True;
+   return False;
+#  endif /* BZ_UNIX */
+}
+
+
+/*---------------------------------------------*/
+#define BZ_N_SUFFIX_PAIRS 4
+
+const Char* zSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { ".bz2", ".bz", ".tbz2", ".tbz" };
+const Char* unzSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { "", "", ".tar", ".tar" };
+
+static 
+Bool hasSuffix ( Char* s, const Char* suffix )
+{
+   Int32 ns = strlen(s);
+   Int32 nx = strlen(suffix);
+   if (ns < nx) return False;
+   if (strcmp(s + ns - nx, suffix) == 0) return True;
+   return False;
+}
+
+static 
+Bool mapSuffix ( Char* name, 
+                 const Char* oldSuffix, 
+                 const Char* newSuffix )
+{
+   if (!hasSuffix(name,oldSuffix)) return False;
+   name[strlen(name)-strlen(oldSuffix)] = 0;
+   strcat ( name, newSuffix );
+   return True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "compress: bad modes\n" );
+
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         strcat ( outName, ".bz2" ); 
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++) {
+      if (hasSuffix(inName, zSuffix[i])) {
+         if (noisy)
+         fprintf ( stderr, 
+                   "%s: Input file %s already has %s suffix.\n",
+                   progName, inName, zSuffix[i] );
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+	 remove(outName);
+      } else {
+	 fprintf ( stderr, "%s: Output file %s already exists.\n",
+		   progName, outName );
+	 setExit(1);
+	 return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName )) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "compress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr,  "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   compressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( srcMode == SM_F2F ) {
+      applySavedTimeInfoToOutputFile ( outName );
+      deleteOutputOnInterrupt = False;
+      if ( !keepInputFiles ) {
+         IntNative retVal = remove ( inName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+
+   deleteOutputOnInterrupt = False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void uncompress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   Bool  magicNumberOK;
+   Bool  cantGuess;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "uncompress: bad modes\n" );
+
+   cantGuess = False;
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++)
+            if (mapSuffix(outName,zSuffix[i],unzSuffix[i]))
+               goto zzz; 
+         cantGuess = True;
+         strcat ( outName, ".out" );
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   zzz:
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( /* srcMode == SM_F2F implied && */ cantGuess ) {
+      if (noisy)
+      fprintf ( stderr, 
+                "%s: Can't guess original name for %s -- using %s\n",
+                progName, inName, outName );
+      /* just a warning, no return */
+   }   
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+	remove(outName);
+      } else {
+        fprintf ( stderr, "%s: Output file %s already exists.\n",
+                  progName, outName );
+        setExit(1);
+        return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName ) ) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "uncompress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   magicNumberOK = uncompressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( magicNumberOK ) {
+      if ( srcMode == SM_F2F ) {
+         applySavedTimeInfoToOutputFile ( outName );
+         deleteOutputOnInterrupt = False;
+         if ( !keepInputFiles ) {
+            IntNative retVal = remove ( inName );
+            ERROR_IF_NOT_ZERO ( retVal );
+         }
+      }
+   } else {
+      unzFailsExist = True;
+      deleteOutputOnInterrupt = False;
+      if ( srcMode == SM_F2F ) {
+         IntNative retVal = remove ( outName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+   deleteOutputOnInterrupt = False;
+
+   if ( magicNumberOK ) {
+      if (verbosity >= 1)
+         fprintf ( stderr, "done\n" );
+   } else {
+      setExit(2);
+      if (verbosity >= 1)
+         fprintf ( stderr, "not a bzip2 file.\n" ); else
+         fprintf ( stderr,
+                   "%s: %s is not a bzip2 file.\n",
+                   progName, inName );
+   }
+
+}
+
+
+/*---------------------------------------------*/
+static 
+void testf ( Char *name )
+{
+   FILE *inStr;
+   Bool allOK;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "testf: bad modes\n" );
+
+   copyFileName ( outName, (Char*)"(none)" );
+   switch (srcMode) {
+      case SM_I2O: copyFileName ( inName, (Char*)"(stdin)" ); break;
+      case SM_F2F: copyFileName ( inName, name ); break;
+      case SM_F2O: copyFileName ( inName, name ); break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         inStr = stdin;
+         break;
+
+      case SM_F2O: case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "testf: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input handle is sane.  Do the Biz. ---*/
+   outputHandleJustInCase = NULL;
+   allOK = testStream ( inStr );
+
+   if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
+   if (!allOK) testFailsExist = True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void license ( void )
+{
+   fprintf ( stderr,
+
+    "bzip2, a block-sorting file compressor.  "
+    "Version %s.\n"
+    "   \n"
+    "   Copyright (C) 1996-2007 by Julian Seward.\n"
+    "   \n"
+    "   This program is free software; you can redistribute it and/or modify\n"
+    "   it under the terms set out in the LICENSE file, which is included\n"
+    "   in the bzip2-1.0.5 source distribution.\n"
+    "   \n"
+    "   This program is distributed in the hope that it will be useful,\n"
+    "   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+    "   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+    "   LICENSE file for more details.\n"
+    "   \n",
+    BZ2_bzlibVersion()
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void usage ( Char *fullProgName )
+{
+   fprintf (
+      stderr,
+      "bzip2, a block-sorting file compressor.  "
+      "Version %s.\n"
+      "\n   usage: %s [flags and input files in any order]\n"
+      "\n"
+      "   -h --help           print this message\n"
+      "   -d --decompress     force decompression\n"
+      "   -z --compress       force compression\n"
+      "   -k --keep           keep (don't delete) input files\n"
+      "   -f --force          overwrite existing output files\n"
+      "   -t --test           test compressed file integrity\n"
+      "   -c --stdout         output to standard out\n"
+      "   -q --quiet          suppress noncritical error messages\n"
+      "   -v --verbose        be verbose (a 2nd -v gives more)\n"
+      "   -L --license        display software version & license\n"
+      "   -V --version        display software version & license\n"
+      "   -s --small          use less memory (at most 2500k)\n"
+      "   -1 .. -9            set block size to 100k .. 900k\n"
+      "   --fast              alias for -1\n"
+      "   --best              alias for -9\n"
+      "\n"
+      "   If invoked as `bzip2', default action is to compress.\n"
+      "              as `bunzip2',  default action is to decompress.\n"
+      "              as `bzcat', default action is to decompress to stdout.\n"
+      "\n"
+      "   If no file names are given, bzip2 compresses or decompresses\n"
+      "   from standard input to standard output.  You can combine\n"
+      "   short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
+#     if BZ_UNIX
+      "\n"
+#     endif
+      ,
+
+      BZ2_bzlibVersion(),
+      fullProgName
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void redundant ( Char* flag )
+{
+   fprintf ( 
+      stderr, 
+      "%s: %s is redundant in versions 0.9.5 and above\n",
+      progName, flag );
+}
+
+
+/*---------------------------------------------*/
+/*--
+  All the garbage from here to main() is purely to
+  implement a linked list of command-line arguments,
+  into which main() copies argv[1 .. argc-1].
+
+  The purpose of this exercise is to facilitate 
+  the expansion of wildcard characters * and ? in 
+  filenames for OSs which don't know how to do it
+  themselves, like MSDOS, Windows 95 and NT.
+
+  The actual Dirty Work is done by the platform-
+  specific macro APPEND_FILESPEC.
+--*/
+
+typedef
+   struct zzzz {
+      Char        *name;
+      struct zzzz *link;
+   }
+   Cell;
+
+
+/*---------------------------------------------*/
+static 
+void *myMalloc ( Int32 n )
+{
+   void* p;
+
+   p = malloc ( (size_t)n );
+   if (p == NULL) outOfMemory ();
+   return p;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *mkCell ( void )
+{
+   Cell *c;
+
+   c = (Cell*) myMalloc ( sizeof ( Cell ) );
+   c->name = NULL;
+   c->link = NULL;
+   return c;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *snocString ( Cell *root, Char *name )
+{
+   if (root == NULL) {
+      Cell *tmp = mkCell();
+      tmp->name = (Char*) myMalloc ( 5 + strlen(name) );
+      strcpy ( tmp->name, name );
+      return tmp;
+   } else {
+      Cell *tmp = root;
+      while (tmp->link != NULL) tmp = tmp->link;
+      tmp->link = snocString ( tmp->link, name );
+      return root;
+   }
+}
+
+
+/*---------------------------------------------*/
+static 
+void addFlagsFromEnvVar ( Cell** argList, Char* varName ) 
+{
+   Int32 i, j, k;
+   Char *envbase, *p;
+
+   envbase = getenv(varName);
+   if (envbase != NULL) {
+      p = envbase;
+      i = 0;
+      while (True) {
+         if (p[i] == 0) break;
+         p += i;
+         i = 0;
+         while (isspace((Int32)(p[0]))) p++;
+         while (p[i] != 0 && !isspace((Int32)(p[i]))) i++;
+         if (i > 0) {
+            k = i; if (k > FILE_NAME_LEN-10) k = FILE_NAME_LEN-10;
+            for (j = 0; j < k; j++) tmpName[j] = p[j];
+            tmpName[k] = 0;
+            APPEND_FLAG(*argList, tmpName);
+         }
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+#define ISFLAG(s) (strcmp(aa->name, (s))==0)
+
+IntNative main ( IntNative argc, Char *argv[] )
+{
+   Int32  i, j;
+   Char   *tmp;
+   Cell   *argList;
+   Cell   *aa;
+   Bool   decode;
+
+   /*-- Be really really really paranoid :-) --*/
+   if (sizeof(Int32) != 4 || sizeof(UInt32) != 4  ||
+       sizeof(Int16) != 2 || sizeof(UInt16) != 2  ||
+       sizeof(Char)  != 1 || sizeof(UChar)  != 1)
+      configError();
+
+   /*-- Initialise --*/
+   outputHandleJustInCase  = NULL;
+   smallMode               = False;
+   keepInputFiles          = False;
+   forceOverwrite          = False;
+   noisy                   = True;
+   verbosity               = 0;
+   blockSize100k           = 9;
+   testFailsExist          = False;
+   unzFailsExist           = False;
+   numFileNames            = 0;
+   numFilesProcessed       = 0;
+   workFactor              = 30;
+   deleteOutputOnInterrupt = False;
+   exitValue               = 0;
+   i = j = 0; /* avoid bogus warning from egcs-1.1.X */
+
+   /*-- Set up signal handlers for mem access errors --*/
+   signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
+#  if BZ_UNIX
+#  ifndef __DJGPP__
+   signal (SIGBUS,  mySIGSEGVorSIGBUScatcher);
+#  endif
+#  endif
+
+   copyFileName ( inName,  (Char*)"(none)" );
+   copyFileName ( outName, (Char*)"(none)" );
+
+   copyFileName ( progNameReally, argv[0] );
+   progName = &progNameReally[0];
+   for (tmp = &progNameReally[0]; *tmp != '\0'; tmp++)
+      if (*tmp == PATH_SEP) progName = tmp + 1;
+
+
+   /*-- Copy flags from env var BZIP2, and 
+        expand filename wildcards in arg list.
+   --*/
+   argList = NULL;
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP2" );
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP" );
+   for (i = 1; i <= argc-1; i++)
+      APPEND_FILESPEC(argList, argv[i]);
+
+
+   /*-- Find the length of the longest filename --*/
+   longestFileName = 7;
+   numFileNames    = 0;
+   decode          = True;
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) { decode = False; continue; }
+      if (aa->name[0] == '-' && decode) continue;
+      numFileNames++;
+      if (longestFileName < (Int32)strlen(aa->name) )
+         longestFileName = (Int32)strlen(aa->name);
+   }
+
+
+   /*-- Determine source modes; flag handling may change this too. --*/
+   if (numFileNames == 0)
+      srcMode = SM_I2O; else srcMode = SM_F2F;
+
+
+   /*-- Determine what to do (compress/uncompress/test/cat). --*/
+   /*-- Note that subsequent flag handling may change this. --*/
+   opMode = OM_Z;
+
+   if ( (strstr ( progName, "unzip" ) != 0) ||
+        (strstr ( progName, "UNZIP" ) != 0) )
+      opMode = OM_UNZ;
+
+   if ( (strstr ( progName, "z2cat" ) != 0) ||
+        (strstr ( progName, "Z2CAT" ) != 0) ||
+        (strstr ( progName, "zcat" ) != 0)  ||
+        (strstr ( progName, "ZCAT" ) != 0) )  {
+      opMode = OM_UNZ;
+      srcMode = (numFileNames == 0) ? SM_I2O : SM_F2O;
+   }
+
+
+   /*-- Look at the flags. --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (aa->name[0] == '-' && aa->name[1] != '-') {
+         for (j = 1; aa->name[j] != '\0'; j++) {
+            switch (aa->name[j]) {
+               case 'c': srcMode          = SM_F2O; break;
+               case 'd': opMode           = OM_UNZ; break;
+               case 'z': opMode           = OM_Z; break;
+               case 'f': forceOverwrite   = True; break;
+               case 't': opMode           = OM_TEST; break;
+               case 'k': keepInputFiles   = True; break;
+               case 's': smallMode        = True; break;
+               case 'q': noisy            = False; break;
+               case '1': blockSize100k    = 1; break;
+               case '2': blockSize100k    = 2; break;
+               case '3': blockSize100k    = 3; break;
+               case '4': blockSize100k    = 4; break;
+               case '5': blockSize100k    = 5; break;
+               case '6': blockSize100k    = 6; break;
+               case '7': blockSize100k    = 7; break;
+               case '8': blockSize100k    = 8; break;
+               case '9': blockSize100k    = 9; break;
+               case 'V':
+               case 'L': license();            break;
+               case 'v': verbosity++; break;
+               case 'h': usage ( progName );
+                         exit ( 0 );
+                         break;
+               default:  fprintf ( stderr, "%s: Bad flag `%s'\n",
+                                   progName, aa->name );
+                         usage ( progName );
+                         exit ( 1 );
+                         break;
+            }
+         }
+      }
+   }
+   
+   /*-- And again ... --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (ISFLAG("--stdout"))            srcMode          = SM_F2O;  else
+      if (ISFLAG("--decompress"))        opMode           = OM_UNZ;  else
+      if (ISFLAG("--compress"))          opMode           = OM_Z;    else
+      if (ISFLAG("--force"))             forceOverwrite   = True;    else
+      if (ISFLAG("--test"))              opMode           = OM_TEST; else
+      if (ISFLAG("--keep"))              keepInputFiles   = True;    else
+      if (ISFLAG("--small"))             smallMode        = True;    else
+      if (ISFLAG("--quiet"))             noisy            = False;   else
+      if (ISFLAG("--version"))           license();                  else
+      if (ISFLAG("--license"))           license();                  else
+      if (ISFLAG("--exponential"))       workFactor = 1;             else 
+      if (ISFLAG("--repetitive-best"))   redundant(aa->name);        else
+      if (ISFLAG("--repetitive-fast"))   redundant(aa->name);        else
+      if (ISFLAG("--fast"))              blockSize100k = 1;          else
+      if (ISFLAG("--best"))              blockSize100k = 9;          else
+      if (ISFLAG("--verbose"))           verbosity++;                else
+      if (ISFLAG("--help"))              { usage ( progName ); exit ( 0 ); }
+         else
+         if (strncmp ( aa->name, "--", 2) == 0) {
+            fprintf ( stderr, "%s: Bad flag `%s'\n", progName, aa->name );
+            usage ( progName );
+            exit ( 1 );
+         }
+   }
+
+   if (verbosity > 4) verbosity = 4;
+   if (opMode == OM_Z && smallMode && blockSize100k > 2) 
+      blockSize100k = 2;
+
+   if (opMode == OM_TEST && srcMode == SM_F2O) {
+      fprintf ( stderr, "%s: -c and -t cannot be used together.\n",
+                progName );
+      exit ( 1 );
+   }
+
+   if (srcMode == SM_F2O && numFileNames == 0)
+      srcMode = SM_I2O;
+
+   if (opMode != OM_Z) blockSize100k = 0;
+
+   if (srcMode == SM_F2F) {
+      signal (SIGINT,  mySignalCatcher);
+      signal (SIGTERM, mySignalCatcher);
+#     if BZ_UNIX
+      signal (SIGHUP,  mySignalCatcher);
+#     endif
+   }
+
+   if (opMode == OM_Z) {
+     if (srcMode == SM_I2O) {
+        compress ( NULL );
+     } else {
+        decode = True;
+        for (aa = argList; aa != NULL; aa = aa->link) {
+           if (ISFLAG("--")) { decode = False; continue; }
+           if (aa->name[0] == '-' && decode) continue;
+           numFilesProcessed++;
+           compress ( aa->name );
+        }
+     }
+   } 
+   else
+
+   if (opMode == OM_UNZ) {
+      unzFailsExist = False;
+      if (srcMode == SM_I2O) {
+         uncompress ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+            if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            uncompress ( aa->name );
+         }      
+      }
+      if (unzFailsExist) { 
+         setExit(2); 
+         exit(exitValue);
+      }
+   } 
+
+   else {
+      testFailsExist = False;
+      if (srcMode == SM_I2O) {
+         testf ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+	    if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            testf ( aa->name );
+	 }
+      }
+      if (testFailsExist && noisy) {
+         fprintf ( stderr,
+           "\n"
+           "You can use the `bzip2recover' program to attempt to recover\n"
+           "data from undamaged sections of corrupted files.\n\n"
+         );
+         setExit(2);
+         exit(exitValue);
+      }
+   }
+
+   /* Free the argument list memory to mollify leak detectors 
+      (eg) Purify, Checker.  Serves no other useful purpose.
+   */
+   aa = argList;
+   while (aa != NULL) {
+      Cell* aa2 = aa->link;
+      if (aa->name != NULL) free(aa->name);
+      free(aa);
+      aa = aa2;
+   }
+
+   return exitValue;
+}
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                         bzip2.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/bzip2.txt b/win32/3rdparty/bzip2/bzip2.txt
new file mode 100644
index 000000000..4fb9c7435
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzip2.txt
@@ -0,0 +1,391 @@
+
+NAME
+       bzip2, bunzip2 - a block-sorting file compressor, v1.0.4
+       bzcat - decompresses files to stdout
+       bzip2recover - recovers data from damaged bzip2 files
+
+
+SYNOPSIS
+       bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ...  ]
+       bunzip2 [ -fkvsVL ] [ filenames ...  ]
+       bzcat [ -s ] [ filenames ...  ]
+       bzip2recover filename
+
+
+DESCRIPTION
+       bzip2  compresses  files  using  the Burrows-Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78-based compressors,
+       and  approaches  the performance of the PPM family of sta-
+       tistical compressors.
+
+       The command-line options are deliberately very similar  to
+       those of GNU gzip, but they are not identical.
+
+       bzip2  expects  a list of file names to accompany the com-
+       mand-line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per-
+       missions, and, when possible, ownership as the correspond-
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv-
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MS-DOS.
+
+       bzip2  and  bunzip2 will by default not overwrite existing
+       files.  If you want this to happen, specify the -f flag.
+
+       If no file names  are  specified,  bzip2  compresses  from
+       standard  input  to  standard output.  In this case, bzip2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       bunzip2 (or bzip2 -d) decompresses  all  specified  files.
+       Files which were not created by bzip2 will be detected and
+       ignored, and a warning issued.  bzip2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       .bz2,  .bz,  .tbz2 or .tbz, bzip2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with .out appended.
+
+       As  with compression, supplying no filenames causes decom-
+       pression from standard input to standard output.
+
+       bunzip2 will correctly decompress a file which is the con-
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (-t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the -c flag.  Multiple files may be com-
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi-
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  bzip2  version  0.9.0  or
+       later.   Earlier  versions of bzip2 will stop after decom-
+       pressing the first file in the stream.
+
+       bzcat (or bzip2 -dc) decompresses all specified  files  to
+       the standard output.
+
+       bzip2  will  read arguments from the environment variables
+       BZIP2 and BZIP, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a self-check for your  protection,  bzip2  uses  32-bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup-
+       tion  of  the compressed data, and against undetected bugs
+       in bzip2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can't  help
+       you  recover  the original uncompressed data.  You can use
+       bzip2recover to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused bzip2 to panic.
+
+
+OPTIONS
+       -c --stdout
+              Compress or decompress to standard output.
+
+       -d --decompress
+              Force  decompression.  bzip2, bunzip2 and bzcat are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces bzip2 to decompress.
+
+       -z --compress
+              The   complement   to   -d:   forces   compression,
+              regardless of the invocation name.
+
+       -t --test
+              Check integrity of the specified file(s), but don't
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       -f --force
+              Force overwrite of output files.   Normally,  bzip2
+              will  not  overwrite  existing  output files.  Also
+              forces bzip2 to break hard links to files, which it
+              otherwise wouldn't do.
+
+              bzip2  normally  declines to decompress files which
+              don't have the  correct  magic  header  bytes.   If
+              forced  (-f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       -k --keep
+              Keep  (don't delete) input files during compression
+              or decompression.
+
+       -s --small
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  -s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  -s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       -q --quiet
+              Suppress non-essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       -v --verbose
+              Verbose mode -- show the compression ratio for each
+              file  processed.   Further  -v's  increase the ver-
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       -L --license -V --version
+              Display  the  software  version,  license terms and
+              conditions.
+
+       -1 (or --fast) to -9 (or --best)
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The --fast and --best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, --fast doesn't make things  signifi-
+              cantly  faster.   And  --best  merely  selects  the
+              default behaviour.
+
+       --     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han-
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 -- -myfilename.
+
+       --repetitive-fast --repetitive-best
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver-
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MEMORY MANAGEMENT
+       bzip2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  -1  through  -9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec-
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and bunzip2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags -1 to -9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using bzip2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       bunzip2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       bunzip2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres-
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is -s.
+
+       In general, try and use the largest block size memory con-
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu-
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  --  that  means  most files you'd encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag -9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres-
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi-
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       -s usage     Size
+
+            -1      1200k       500k         350k      914704
+            -2      2000k       900k         600k      877703
+            -3      2800k      1300k         850k      860338
+            -4      3600k      1700k        1100k      846899
+            -5      4400k      2100k        1350k      845160
+            -6      5200k      2500k        1600k      838626
+            -7      6100k      2900k        1850k      834096
+            -8      6800k      3300k        2100k      828642
+            -9      7600k      3700k        2350k      828642
+
+
+RECOVERING DATA FROM DAMAGED FILES
+       bzip2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans-
+       mission error causes a multi-block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48-bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32-bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       bzip2recover is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use bzip2 -t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       bzip2recover takes a single argument, the name of the dam-
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro-
+       cessing  -- for example, "bzip2 -dc  rec*file.bz2 > recov-
+       ered_data" -- processes the files in the correct order.
+
+       bzip2recover should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged single-block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min-
+       imise any potential data loss through media  or  transmis-
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PERFORMANCE NOTES
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worst-case and average-case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the -vvvv option to mon-
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       bzip2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran-
+       dom  fashion.   This means that performance, both for com-
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine bzip2 will per-
+       form best on machines with very large caches.
+
+
+CAVEATS
+       I/O  error  messages  are not as helpful as they could be.
+       bzip2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.4 of bzip2.  Com-
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1,
+       1.0.2 and 1.0.3, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop
+       after  decompressing just the first file in the stream.
+
+       bzip2recover  versions prior to 1.0.2 used 32-bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64-bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64-bit integer.
+
+
+AUTHOR
+       Julian Seward, jsewardbzip.org.
+
+       http://www.bzip.org
+
+       The ideas embodied in bzip2 are due to (at least) the fol-
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod-
+       ing model in the original bzip, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  bzip).   I  am  much
+       indebted for their help, support and advice.  See the man-
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres-
+       sion.  Bela Lubkin encouraged me to improve the worst-case
+       compression performance.  Donna Robinson XMLised the docu-
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
diff --git a/win32/3rdparty/bzip2/bzip2recover.c b/win32/3rdparty/bzip2/bzip2recover.c
new file mode 100644
index 000000000..5f6d62180
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzip2recover.c
@@ -0,0 +1,514 @@
+/*-----------------------------------------------------------*/
+/*--- Block recoverer program for bzip2                   ---*/
+/*---                                      bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* This program is a complete hack and should be rewritten properly.
+	 It isn't very complicated. */
+
+#include 
+#include 
+#include 
+#include 
+
+
+/* This program records bit locations in the file to be recovered.
+   That means that if 64-bit ints are not supported, we will not
+   be able to recover .bz2 files over 512MB (2^32 bits) long.
+   On GNU supported platforms, we take advantage of the 64-bit
+   int support to circumvent this problem.  Ditto MSVC.
+
+   This change occurred in version 1.0.2; all prior versions have
+   the 512MB limitation.
+*/
+#ifdef __GNUC__
+   typedef  unsigned long long int  MaybeUInt64;
+#  define MaybeUInt64_FMT "%Lu"
+#else
+#ifdef _MSC_VER
+   typedef  unsigned __int64  MaybeUInt64;
+#  define MaybeUInt64_FMT "%I64u"
+#else
+   typedef  unsigned int   MaybeUInt64;
+#  define MaybeUInt64_FMT "%u"
+#endif
+#endif
+
+typedef  unsigned int   UInt32;
+typedef  int            Int32;
+typedef  unsigned char  UChar;
+typedef  char           Char;
+typedef  unsigned char  Bool;
+#define True    ((Bool)1)
+#define False   ((Bool)0)
+
+
+#define BZ_MAX_FILENAME 2000
+
+Char inFileName[BZ_MAX_FILENAME];
+Char outFileName[BZ_MAX_FILENAME];
+Char progName[BZ_MAX_FILENAME];
+
+MaybeUInt64 bytesOut = 0;
+MaybeUInt64 bytesIn  = 0;
+
+
+/*---------------------------------------------------*/
+/*--- Header bytes                                ---*/
+/*---------------------------------------------------*/
+
+#define BZ_HDR_B 0x42                         /* 'B' */
+#define BZ_HDR_Z 0x5a                         /* 'Z' */
+#define BZ_HDR_h 0x68                         /* 'h' */
+#define BZ_HDR_0 0x30                         /* '0' */
+ 
+
+/*---------------------------------------------------*/
+/*--- I/O errors                                  ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static void readError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void writeError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void mallocFail ( Int32 n )
+{
+   fprintf ( stderr,
+             "%s: malloc failed on request for %d bytes.\n",
+            progName, n );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void tooManyBlocks ( Int32 max_handled_blocks )
+{
+   fprintf ( stderr,
+             "%s: `%s' appears to contain more than %d blocks\n",
+            progName, inFileName, max_handled_blocks );
+   fprintf ( stderr,
+             "%s: and cannot be handled.  To fix, increase\n",
+             progName );
+   fprintf ( stderr, 
+             "%s: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct {
+      FILE*  handle;
+      Int32  buffer;
+      Int32  buffLive;
+      Char   mode;
+   }
+   BitStream;
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenReadStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'r';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenWriteStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'w';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static void bsPutBit ( BitStream* bs, Int32 bit )
+{
+   if (bs->buffLive == 8) {
+      Int32 retVal = putc ( (UChar) bs->buffer, bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      bs->buffLive = 1;
+      bs->buffer = bit & 0x1;
+   } else {
+      bs->buffer = ( (bs->buffer << 1) | (bit & 0x1) );
+      bs->buffLive++;
+   };
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Returns 0 or 1, or 2 to indicate EOF.
+--*/
+static Int32 bsGetBit ( BitStream* bs )
+{
+   if (bs->buffLive > 0) {
+      bs->buffLive --;
+      return ( ((bs->buffer) >> (bs->buffLive)) & 0x1 );
+   } else {
+      Int32 retVal = getc ( bs->handle );
+      if ( retVal == EOF ) {
+         if (errno != 0) readError();
+         return 2;
+      }
+      bs->buffLive = 7;
+      bs->buffer = retVal;
+      return ( ((bs->buffer) >> 7) & 0x1 );
+   }
+}
+
+
+/*---------------------------------------------*/
+static void bsClose ( BitStream* bs )
+{
+   Int32 retVal;
+
+   if ( bs->mode == 'w' ) {
+      while ( bs->buffLive < 8 ) {
+         bs->buffLive++;
+         bs->buffer <<= 1;
+      };
+      retVal = putc ( (UChar) (bs->buffer), bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      retVal = fflush ( bs->handle );
+      if (retVal == EOF) writeError();
+   }
+   retVal = fclose ( bs->handle );
+   if (retVal == EOF) {
+      if (bs->mode == 'w') writeError(); else readError();
+   }
+   free ( bs );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUChar ( BitStream* bs, UChar c )
+{
+   Int32 i;
+   for (i = 7; i >= 0; i--)
+      bsPutBit ( bs, (((UInt32) c) >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUInt32 ( BitStream* bs, UInt32 c )
+{
+   Int32 i;
+
+   for (i = 31; i >= 0; i--)
+      bsPutBit ( bs, (c >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static Bool endsInBz2 ( Char* name )
+{
+   Int32 n = strlen ( name );
+   if (n <= 4) return False;
+   return
+      (name[n-4] == '.' &&
+       name[n-3] == 'b' &&
+       name[n-2] == 'z' &&
+       name[n-1] == '2');
+}
+
+
+/*---------------------------------------------------*/
+/*---                                             ---*/
+/*---------------------------------------------------*/
+
+/* This logic isn't really right when it comes to Cygwin. */
+#ifdef _WIN32
+#  define  BZ_SPLIT_SYM  '\\'  /* path splitter on Windows platform */
+#else
+#  define  BZ_SPLIT_SYM  '/'   /* path splitter on Unix platform */
+#endif
+
+#define BLOCK_HEADER_HI  0x00003141UL
+#define BLOCK_HEADER_LO  0x59265359UL
+
+#define BLOCK_ENDMARK_HI 0x00001772UL
+#define BLOCK_ENDMARK_LO 0x45385090UL
+
+/* Increase if necessary.  However, a .bz2 file with > 50000 blocks
+   would have an uncompressed size of at least 40GB, so the chances
+   are low you'll need to up this.
+*/
+#define BZ_MAX_HANDLED_BLOCKS 50000
+
+MaybeUInt64 bStart [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 bEnd   [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbStart[BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbEnd  [BZ_MAX_HANDLED_BLOCKS];
+
+Int32 main ( Int32 argc, Char** argv )
+{
+   FILE*       inFile;
+   FILE*       outFile;
+   BitStream*  bsIn, *bsWr;
+   Int32       b, wrBlock, currBlock, rbCtr;
+   MaybeUInt64 bitsRead;
+
+   UInt32      buffHi, buffLo, blockCRC;
+   Char*       p;
+
+   strcpy ( progName, argv[0] );
+   inFileName[0] = outFileName[0] = 0;
+
+   fprintf ( stderr, 
+             "bzip2recover 1.0.5: extracts blocks from damaged .bz2 files.\n" );
+
+   if (argc != 2) {
+      fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
+                        progName, progName );
+      switch (sizeof(MaybeUInt64)) {
+         case 8:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: None\n");
+            break;
+         case 4:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: 512 MB\n");
+            fprintf(stderr, 
+                    "\tto circumvent, recompile with MaybeUInt64 as an\n"
+                    "\tunsigned 64-bit int.\n");
+            break;
+         default:
+            fprintf(stderr, 
+                    "\tsizeof(MaybeUInt64) is not 4 or 8 -- "
+                    "configuration error.\n");
+            break;
+      }
+      exit(1);
+   }
+
+   if (strlen(argv[1]) >= BZ_MAX_FILENAME-20) {
+      fprintf ( stderr, 
+                "%s: supplied filename is suspiciously (>= %d chars) long.  Bye!\n",
+                progName, (int)strlen(argv[1]) );
+      exit(1);
+   }
+
+   strcpy ( inFileName, argv[1] );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't read `%s'\n", progName, inFileName );
+      exit(1);
+   }
+
+   bsIn = bsOpenReadStream ( inFile );
+   fprintf ( stderr, "%s: searching for block boundaries ...\n", progName );
+
+   bitsRead = 0;
+   buffHi = buffLo = 0;
+   currBlock = 0;
+   bStart[currBlock] = 0;
+
+   rbCtr = 0;
+
+   while (True) {
+      b = bsGetBit ( bsIn );
+      bitsRead++;
+      if (b == 2) {
+         if (bitsRead >= bStart[currBlock] &&
+            (bitsRead - bStart[currBlock]) >= 40) {
+            bEnd[currBlock] = bitsRead-1;
+            if (currBlock > 0)
+               fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                                 " to " MaybeUInt64_FMT " (incomplete)\n",
+                         currBlock,  bStart[currBlock], bEnd[currBlock] );
+         } else
+            currBlock--;
+         break;
+      }
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if ( ( (buffHi & 0x0000ffff) == BLOCK_HEADER_HI 
+             && buffLo == BLOCK_HEADER_LO)
+           || 
+           ( (buffHi & 0x0000ffff) == BLOCK_ENDMARK_HI 
+             && buffLo == BLOCK_ENDMARK_LO)
+         ) {
+         if (bitsRead > 49) {
+            bEnd[currBlock] = bitsRead-49;
+         } else {
+            bEnd[currBlock] = 0;
+         }
+         if (currBlock > 0 &&
+	     (bEnd[currBlock] - bStart[currBlock]) >= 130) {
+            fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                              " to " MaybeUInt64_FMT "\n",
+                      rbCtr+1,  bStart[currBlock], bEnd[currBlock] );
+            rbStart[rbCtr] = bStart[currBlock];
+            rbEnd[rbCtr] = bEnd[currBlock];
+            rbCtr++;
+         }
+         if (currBlock >= BZ_MAX_HANDLED_BLOCKS)
+            tooManyBlocks(BZ_MAX_HANDLED_BLOCKS);
+         currBlock++;
+
+         bStart[currBlock] = bitsRead;
+      }
+   }
+
+   bsClose ( bsIn );
+
+   /*-- identified blocks run from 1 to rbCtr inclusive. --*/
+
+   if (rbCtr < 1) {
+      fprintf ( stderr,
+                "%s: sorry, I couldn't find any block boundaries.\n",
+                progName );
+      exit(1);
+   };
+
+   fprintf ( stderr, "%s: splitting into blocks\n", progName );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't open `%s'\n", progName, inFileName );
+      exit(1);
+   }
+   bsIn = bsOpenReadStream ( inFile );
+
+   /*-- placate gcc's dataflow analyser --*/
+   blockCRC = 0; bsWr = 0;
+
+   bitsRead = 0;
+   outFile = NULL;
+   wrBlock = 0;
+   while (True) {
+      b = bsGetBit(bsIn);
+      if (b == 2) break;
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if (bitsRead == 47+rbStart[wrBlock]) 
+         blockCRC = (buffHi << 16) | (buffLo >> 16);
+
+      if (outFile != NULL && bitsRead >= rbStart[wrBlock]
+                          && bitsRead <= rbEnd[wrBlock]) {
+         bsPutBit ( bsWr, b );
+      }
+
+      bitsRead++;
+
+      if (bitsRead == rbEnd[wrBlock]+1) {
+         if (outFile != NULL) {
+            bsPutUChar ( bsWr, 0x17 ); bsPutUChar ( bsWr, 0x72 );
+            bsPutUChar ( bsWr, 0x45 ); bsPutUChar ( bsWr, 0x38 );
+            bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
+            bsPutUInt32 ( bsWr, blockCRC );
+            bsClose ( bsWr );
+         }
+         if (wrBlock >= rbCtr) break;
+         wrBlock++;
+      } else
+      if (bitsRead == rbStart[wrBlock]) {
+         /* Create the output file name, correctly handling leading paths. 
+            (31.10.2001 by Sergey E. Kusikov) */
+         Char* split;
+         Int32 ofs, k;
+         for (k = 0; k < BZ_MAX_FILENAME; k++) 
+            outFileName[k] = 0;
+         strcpy (outFileName, inFileName);
+         split = strrchr (outFileName, BZ_SPLIT_SYM);
+         if (split == NULL) {
+            split = outFileName;
+         } else {
+            ++split;
+	 }
+	 /* Now split points to the start of the basename. */
+         ofs  = split - outFileName;
+         sprintf (split, "rec%5d", wrBlock+1);
+         for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
+         strcat (outFileName, inFileName + ofs);
+
+         if ( !endsInBz2(outFileName)) strcat ( outFileName, ".bz2" );
+
+         fprintf ( stderr, "   writing block %d to `%s' ...\n",
+                           wrBlock+1, outFileName );
+
+         outFile = fopen ( outFileName, "wb" );
+         if (outFile == NULL) {
+            fprintf ( stderr, "%s: can't write `%s'\n",
+                      progName, outFileName );
+            exit(1);
+         }
+         bsWr = bsOpenWriteStream ( outFile );
+         bsPutUChar ( bsWr, BZ_HDR_B );    
+         bsPutUChar ( bsWr, BZ_HDR_Z );    
+         bsPutUChar ( bsWr, BZ_HDR_h );    
+         bsPutUChar ( bsWr, BZ_HDR_0 + 9 );
+         bsPutUChar ( bsWr, 0x31 ); bsPutUChar ( bsWr, 0x41 );
+         bsPutUChar ( bsWr, 0x59 ); bsPutUChar ( bsWr, 0x26 );
+         bsPutUChar ( bsWr, 0x53 ); bsPutUChar ( bsWr, 0x59 );
+      }
+   }
+
+   fprintf ( stderr, "%s: finished\n", progName );
+   return 0;
+}
+
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                  bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/bzlib.c b/win32/3rdparty/bzip2/bzlib.c
new file mode 100644
index 000000000..ef86c91e6
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzlib.c
@@ -0,0 +1,1572 @@
+
+/*-------------------------------------------------------------*/
+/*--- Library top-level functions.                          ---*/
+/*---                                               bzlib.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* CHANGES
+   0.9.0    -- original version.
+   0.9.0a/b -- no changes in this file.
+   0.9.0c   -- made zero-length BZ_FLUSH work correctly in bzCompress().
+     fixed bzWrite/bzRead to ignore zero-length requests.
+     fixed bzread to correctly handle read requests after EOF.
+     wrong parameter order in call to bzDecompressInit in
+     bzBuffToBuffDecompress.  Fixed.
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Compression stuff                           ---*/
+/*---------------------------------------------------*/
+
+
+/*---------------------------------------------------*/
+#ifndef BZ_NO_STDIO
+void BZ2_bz__AssertH__fail ( int errcode )
+{
+   fprintf(stderr, 
+      "\n\nbzip2/libbzip2: internal error number %d.\n"
+      "This is a bug in bzip2/libbzip2, %s.\n"
+      "Please report it to me at: jseward@bzip.org.  If this happened\n"
+      "when you were using some program which uses libbzip2 as a\n"
+      "component, you should also report this bug to the author(s)\n"
+      "of that program.  Please make an effort to report this bug;\n"
+      "timely and accurate bug reports eventually lead to higher\n"
+      "quality software.  Thanks.  Julian Seward, 10 December 2007.\n\n",
+      errcode,
+      BZ2_bzlibVersion()
+   );
+
+   if (errcode == 1007) {
+   fprintf(stderr,
+      "\n*** A special note about internal error number 1007 ***\n"
+      "\n"
+      "Experience suggests that a common cause of i.e. 1007\n"
+      "is unreliable memory or other hardware.  The 1007 assertion\n"
+      "just happens to cross-check the results of huge numbers of\n"
+      "memory reads/writes, and so acts (unintendedly) as a stress\n"
+      "test of your memory system.\n"
+      "\n"
+      "I suggest the following: try compressing the file again,\n"
+      "possibly monitoring progress in detail with the -vv flag.\n"
+      "\n"
+      "* If the error cannot be reproduced, and/or happens at different\n"
+      "  points in compression, you may have a flaky memory system.\n"
+      "  Try a memory-test program.  I have used Memtest86\n"
+      "  (www.memtest86.com).  At the time of writing it is free (GPLd).\n"
+      "  Memtest86 tests memory much more thorougly than your BIOSs\n"
+      "  power-on test, and may find failures that the BIOS doesn't.\n"
+      "\n"
+      "* If the error can be repeatably reproduced, this is a bug in\n"
+      "  bzip2, and I would very much like to hear about it.  Please\n"
+      "  let me know, and, ideally, save a copy of the file causing the\n"
+      "  problem -- without which I will be unable to investigate it.\n"
+      "\n"
+   );
+   }
+
+   exit(3);
+}
+#endif
+
+
+/*---------------------------------------------------*/
+static
+int bz_config_ok ( void )
+{
+   if (sizeof(int)   != 4) return 0;
+   if (sizeof(short) != 2) return 0;
+   if (sizeof(char)  != 1) return 0;
+   return 1;
+}
+
+
+/*---------------------------------------------------*/
+static
+void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
+{
+   void* v = malloc ( items * size );
+   return v;
+}
+
+static
+void default_bzfree ( void* opaque, void* addr )
+{
+   if (addr != NULL) free ( addr );
+}
+
+
+/*---------------------------------------------------*/
+static
+void prepare_new_block ( EState* s )
+{
+   Int32 i;
+   s->nblock = 0;
+   s->numZ = 0;
+   s->state_out_pos = 0;
+   BZ_INITIALISE_CRC ( s->blockCRC );
+   for (i = 0; i < 256; i++) s->inUse[i] = False;
+   s->blockNo++;
+}
+
+
+/*---------------------------------------------------*/
+static
+void init_RL ( EState* s )
+{
+   s->state_in_ch  = 256;
+   s->state_in_len = 0;
+}
+
+
+static
+Bool isempty_RL ( EState* s )
+{
+   if (s->state_in_ch < 256 && s->state_in_len > 0)
+      return False; else
+      return True;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressInit) 
+                    ( bz_stream* strm, 
+                     int        blockSize100k,
+                     int        verbosity,
+                     int        workFactor )
+{
+   Int32   n;
+   EState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL || 
+       blockSize100k < 1 || blockSize100k > 9 ||
+       workFactor < 0 || workFactor > 250)
+     return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(EState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm = strm;
+
+   s->arr1 = NULL;
+   s->arr2 = NULL;
+   s->ftab = NULL;
+
+   n       = 100000 * blockSize100k;
+   s->arr1 = BZALLOC( n                  * sizeof(UInt32) );
+   s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
+   s->ftab = BZALLOC( 65537              * sizeof(UInt32) );
+
+   if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
+      if (s->arr1 != NULL) BZFREE(s->arr1);
+      if (s->arr2 != NULL) BZFREE(s->arr2);
+      if (s->ftab != NULL) BZFREE(s->ftab);
+      if (s       != NULL) BZFREE(s);
+      return BZ_MEM_ERROR;
+   }
+
+   s->blockNo           = 0;
+   s->state             = BZ_S_INPUT;
+   s->mode              = BZ_M_RUNNING;
+   s->combinedCRC       = 0;
+   s->blockSize100k     = blockSize100k;
+   s->nblockMAX         = 100000 * blockSize100k - 19;
+   s->verbosity         = verbosity;
+   s->workFactor        = workFactor;
+
+   s->block             = (UChar*)s->arr2;
+   s->mtfv              = (UInt16*)s->arr1;
+   s->zbits             = NULL;
+   s->ptr               = (UInt32*)s->arr1;
+
+   strm->state          = s;
+   strm->total_in_lo32  = 0;
+   strm->total_in_hi32  = 0;
+   strm->total_out_lo32 = 0;
+   strm->total_out_hi32 = 0;
+   init_RL ( s );
+   prepare_new_block ( s );
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+static
+void add_pair_to_block ( EState* s )
+{
+   Int32 i;
+   UChar ch = (UChar)(s->state_in_ch);
+   for (i = 0; i < s->state_in_len; i++) {
+      BZ_UPDATE_CRC( s->blockCRC, ch );
+   }
+   s->inUse[s->state_in_ch] = True;
+   switch (s->state_in_len) {
+      case 1:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 2:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 3:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      default:
+         s->inUse[s->state_in_len-4] = True;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = ((UChar)(s->state_in_len-4));
+         s->nblock++;
+         break;
+   }
+}
+
+
+/*---------------------------------------------------*/
+static
+void flush_RL ( EState* s )
+{
+   if (s->state_in_ch < 256) add_pair_to_block ( s );
+   init_RL ( s );
+}
+
+
+/*---------------------------------------------------*/
+#define ADD_CHAR_TO_BLOCK(zs,zchh0)               \
+{                                                 \
+   UInt32 zchh = (UInt32)(zchh0);                 \
+   /*-- fast track the common case --*/           \
+   if (zchh != zs->state_in_ch &&                 \
+       zs->state_in_len == 1) {                   \
+      UChar ch = (UChar)(zs->state_in_ch);        \
+      BZ_UPDATE_CRC( zs->blockCRC, ch );          \
+      zs->inUse[zs->state_in_ch] = True;          \
+      zs->block[zs->nblock] = (UChar)ch;          \
+      zs->nblock++;                               \
+      zs->state_in_ch = zchh;                     \
+   }                                              \
+   else                                           \
+   /*-- general, uncommon cases --*/              \
+   if (zchh != zs->state_in_ch ||                 \
+      zs->state_in_len == 255) {                  \
+      if (zs->state_in_ch < 256)                  \
+         add_pair_to_block ( zs );                \
+      zs->state_in_ch = zchh;                     \
+      zs->state_in_len = 1;                       \
+   } else {                                       \
+      zs->state_in_len++;                         \
+   }                                              \
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_input_until_stop ( EState* s )
+{
+   Bool progress_in = False;
+
+   if (s->mode == BZ_M_RUNNING) {
+
+      /*-- fast track the common case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         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++;
+      }
+
+   } else {
+
+      /*-- general, uncommon case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         /*-- flush/finish end? --*/
+         if (s->avail_in_expect == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         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++;
+         s->avail_in_expect--;
+      }
+   }
+   return progress_in;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_output_until_stop ( EState* s )
+{
+   Bool progress_out = False;
+
+   while (True) {
+
+      /*-- no output space? --*/
+      if (s->strm->avail_out == 0) break;
+
+      /*-- block done? --*/
+      if (s->state_out_pos >= s->numZ) break;
+
+      progress_out = True;
+      *(s->strm->next_out) = s->zbits[s->state_out_pos];
+      s->state_out_pos++;
+      s->strm->avail_out--;
+      s->strm->next_out++;
+      s->strm->total_out_lo32++;
+      if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+   }
+
+   return progress_out;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool handle_compress ( bz_stream* strm )
+{
+   Bool progress_in  = False;
+   Bool progress_out = False;
+   EState* s = strm->state;
+   
+   while (True) {
+
+      if (s->state == BZ_S_OUTPUT) {
+         progress_out |= copy_output_until_stop ( s );
+         if (s->state_out_pos < s->numZ) break;
+         if (s->mode == BZ_M_FINISHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+         prepare_new_block ( s );
+         s->state = BZ_S_INPUT;
+         if (s->mode == BZ_M_FLUSHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+      }
+
+      if (s->state == BZ_S_INPUT) {
+         progress_in |= copy_input_until_stop ( s );
+         if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
+            flush_RL ( s );
+            BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->nblock >= s->nblockMAX) {
+            BZ2_compressBlock ( s, False );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->strm->avail_in == 0) {
+            break;
+         }
+      }
+
+   }
+
+   return progress_in || progress_out;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
+{
+   Bool progress;
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   preswitch:
+   switch (s->mode) {
+
+      case BZ_M_IDLE:
+         return BZ_SEQUENCE_ERROR;
+
+      case BZ_M_RUNNING:
+         if (action == BZ_RUN) {
+            progress = handle_compress ( strm );
+            return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
+         } 
+         else
+	 if (action == BZ_FLUSH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FLUSHING;
+            goto preswitch;
+         }
+         else
+         if (action == BZ_FINISH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FINISHING;
+            goto preswitch;
+         }
+         else 
+            return BZ_PARAM_ERROR;
+
+      case BZ_M_FLUSHING:
+         if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
+         s->mode = BZ_M_RUNNING;
+         return BZ_RUN_OK;
+
+      case BZ_M_FINISHING:
+         if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (!progress) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FINISH_OK;
+         s->mode = BZ_M_IDLE;
+         return BZ_STREAM_END;
+   }
+   return BZ_OK; /*--not reached--*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressEnd)  ( bz_stream *strm )
+{
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->arr1 != NULL) BZFREE(s->arr1);
+   if (s->arr2 != NULL) BZFREE(s->arr2);
+   if (s->ftab != NULL) BZFREE(s->ftab);
+   BZFREE(strm->state);
+
+   strm->state = NULL;   
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/*--- Decompression stuff                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressInit) 
+                     ( bz_stream* strm, 
+                       int        verbosity,
+                       int        small )
+{
+   DState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   if (small != 0 && small != 1) return BZ_PARAM_ERROR;
+   if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
+
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(DState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm                  = strm;
+   strm->state              = s;
+   s->state                 = BZ_X_MAGIC_1;
+   s->bsLive                = 0;
+   s->bsBuff                = 0;
+   s->calculatedCombinedCRC = 0;
+   strm->total_in_lo32      = 0;
+   strm->total_in_hi32      = 0;
+   strm->total_out_lo32     = 0;
+   strm->total_out_hi32     = 0;
+   s->smallDecompress       = (Bool)small;
+   s->ll4                   = NULL;
+   s->ll16                  = NULL;
+   s->tt                    = NULL;
+   s->currBlockNo           = 0;
+   s->verbosity             = verbosity;
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_FAST ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+               
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      /* restore */
+      UInt32        c_calculatedBlockCRC = s->calculatedBlockCRC;
+      UChar         c_state_out_ch       = s->state_out_ch;
+      Int32         c_state_out_len      = s->state_out_len;
+      Int32         c_nblock_used        = s->nblock_used;
+      Int32         c_k0                 = s->k0;
+      UInt32*       c_tt                 = s->tt;
+      UInt32        c_tPos               = s->tPos;
+      char*         cs_next_out          = s->strm->next_out;
+      unsigned int  cs_avail_out         = s->strm->avail_out;
+      Int32         ro_blockSize100k     = s->blockSize100k;
+      /* end restore */
+
+      UInt32       avail_out_INIT = cs_avail_out;
+      Int32        s_save_nblockPP = s->save_nblock+1;
+      unsigned int total_out_lo32_old;
+
+      while (True) {
+
+         /* try to finish existing run */
+         if (c_state_out_len > 0) {
+            while (True) {
+               if (cs_avail_out == 0) goto return_notr;
+               if (c_state_out_len == 1) break;
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               c_state_out_len--;
+               cs_next_out++;
+               cs_avail_out--;
+            }
+            s_state_out_len_eq_one:
+            {
+               if (cs_avail_out == 0) { 
+                  c_state_out_len = 1; goto return_notr;
+               };
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               cs_next_out++;
+               cs_avail_out--;
+            }
+         }   
+         /* Only caused by corrupt data stream? */
+         if (c_nblock_used > s_save_nblockPP)
+            return True;
+
+         /* can a new run be started? */
+         if (c_nblock_used == s_save_nblockPP) {
+            c_state_out_len = 0; goto return_notr;
+         };   
+         c_state_out_ch = c_k0;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (k1 != c_k0) { 
+            c_k0 = k1; goto s_state_out_len_eq_one; 
+         };
+         if (c_nblock_used == s_save_nblockPP) 
+            goto s_state_out_len_eq_one;
+   
+         c_state_out_len = 2;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         c_state_out_len = 3;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         c_state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST_C(c_k0); c_nblock_used++;
+      }
+
+      return_notr:
+      total_out_lo32_old = s->strm->total_out_lo32;
+      s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
+      if (s->strm->total_out_lo32 < total_out_lo32_old)
+         s->strm->total_out_hi32++;
+
+      /* save */
+      s->calculatedBlockCRC = c_calculatedBlockCRC;
+      s->state_out_ch       = c_state_out_ch;
+      s->state_out_len      = c_state_out_len;
+      s->nblock_used        = c_nblock_used;
+      s->k0                 = c_k0;
+      s->tt                 = c_tt;
+      s->tPos               = c_tPos;
+      s->strm->next_out     = cs_next_out;
+      s->strm->avail_out    = cs_avail_out;
+      /* end save */
+   }
+   return False;
+}
+
+
+
+/*---------------------------------------------------*/
+__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
+{
+   Int32 nb, na, mid;
+   nb = 0;
+   na = 256;
+   do {
+      mid = (nb + na) >> 1;
+      if (indx >= cftab[mid]) nb = mid; else na = mid;
+   }
+   while (na - nb != 1);
+   return nb;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_SMALL ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); s->nblock_used++;
+      }
+
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
+{
+   Bool    corrupt;
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   while (True) {
+      if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
+      if (s->state == BZ_X_OUTPUT) {
+         if (s->smallDecompress)
+            corrupt = unRLE_obuf_to_output_SMALL ( s ); else
+            corrupt = unRLE_obuf_to_output_FAST  ( s );
+         if (corrupt) return BZ_DATA_ERROR;
+         if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
+            BZ_FINALISE_CRC ( s->calculatedBlockCRC );
+            if (s->verbosity >= 3) 
+               VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, 
+                          s->calculatedBlockCRC );
+            if (s->verbosity >= 2) VPrintf0 ( "]" );
+            if (s->calculatedBlockCRC != s->storedBlockCRC)
+               return BZ_DATA_ERROR;
+            s->calculatedCombinedCRC 
+               = (s->calculatedCombinedCRC << 1) | 
+                    (s->calculatedCombinedCRC >> 31);
+            s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
+            s->state = BZ_X_BLKHDR_1;
+         } else {
+            return BZ_OK;
+         }
+      }
+      if (s->state >= BZ_X_MAGIC_1) {
+         Int32 r = BZ2_decompress ( s );
+         if (r == BZ_STREAM_END) {
+            if (s->verbosity >= 3)
+               VPrintf2 ( "\n    combined CRCs: stored = 0x%08x, computed = 0x%08x", 
+                          s->storedCombinedCRC, s->calculatedCombinedCRC );
+            if (s->calculatedCombinedCRC != s->storedCombinedCRC)
+               return BZ_DATA_ERROR;
+            return r;
+         }
+         if (s->state != BZ_X_OUTPUT) return r;
+      }
+   }
+
+   AssertH ( 0, 6001 );
+
+   return 0;  /*NOTREACHED*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressEnd)  ( bz_stream *strm )
+{
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->tt   != NULL) BZFREE(s->tt);
+   if (s->ll16 != NULL) BZFREE(s->ll16);
+   if (s->ll4  != NULL) BZFREE(s->ll4);
+
+   BZFREE(strm->state);
+   strm->state = NULL;
+
+   return BZ_OK;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+/*--- File I/O stuff                              ---*/
+/*---------------------------------------------------*/
+
+#define BZ_SETERR(eee)                    \
+{                                         \
+   if (bzerror != NULL) *bzerror = eee;   \
+   if (bzf != NULL) bzf->lastErr = eee;   \
+}
+
+typedef 
+   struct {
+      FILE*     handle;
+      Char      buf[BZ_MAX_UNUSED];
+      Int32     bufN;
+      Bool      writing;
+      bz_stream strm;
+      Int32     lastErr;
+      Bool      initialisedOk;
+   }
+   bzFile;
+
+
+/*---------------------------------------------*/
+static Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzWriteOpen) 
+                    ( int*  bzerror,      
+                      FILE* f, 
+                      int   blockSize100k, 
+                      int   verbosity,
+                      int   workFactor )
+{
+   Int32   ret;
+   bzFile* bzf = NULL;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL ||
+       (blockSize100k < 1 || blockSize100k > 9) ||
+       (workFactor < 0 || workFactor > 250) ||
+       (verbosity < 0 || verbosity > 4))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+   bzf->initialisedOk = False;
+   bzf->bufN          = 0;
+   bzf->handle        = f;
+   bzf->writing       = True;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+
+   if (workFactor == 0) workFactor = 30;
+   ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = 0;
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWrite)
+             ( int*    bzerror, 
+               BZFILE* b, 
+               void*   buf, 
+               int     len )
+{
+   Int32 n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return; };
+
+   bzf->strm.avail_in = len;
+   bzf->strm.next_in  = buf;
+
+   while (True) {
+      bzf->strm.avail_out = BZ_MAX_UNUSED;
+      bzf->strm.next_out = bzf->buf;
+      ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
+      if (ret != BZ_RUN_OK)
+         { BZ_SETERR(ret); return; };
+
+      if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+         n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+         n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                       n, bzf->handle );
+         if (n != n2 || ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return; };
+      }
+
+      if (bzf->strm.avail_in == 0)
+         { BZ_SETERR(BZ_OK); return; };
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWriteClose)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in,
+                    unsigned int* nbytes_out )
+{
+   BZ2_bzWriteClose64 ( bzerror, b, abandon, 
+                        nbytes_in, NULL, nbytes_out, NULL );
+}
+
+
+void BZ_API(BZ2_bzWriteClose64)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in_lo32,
+                    unsigned int* nbytes_in_hi32,
+                    unsigned int* nbytes_out_lo32,
+                    unsigned int* nbytes_out_hi32 )
+{
+   Int32   n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
+   if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
+   if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
+   if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
+
+   if ((!abandon) && bzf->lastErr == BZ_OK) {
+      while (True) {
+         bzf->strm.avail_out = BZ_MAX_UNUSED;
+         bzf->strm.next_out = bzf->buf;
+         ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
+         if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
+            { BZ_SETERR(ret); return; };
+
+         if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+            n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+            n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                          n, bzf->handle );
+            if (n != n2 || ferror(bzf->handle))
+               { BZ_SETERR(BZ_IO_ERROR); return; };
+         }
+
+         if (ret == BZ_STREAM_END) break;
+      }
+   }
+
+   if ( !abandon && !ferror ( bzf->handle ) ) {
+      fflush ( bzf->handle );
+      if (ferror(bzf->handle))
+         { BZ_SETERR(BZ_IO_ERROR); return; };
+   }
+
+   if (nbytes_in_lo32 != NULL)
+      *nbytes_in_lo32 = bzf->strm.total_in_lo32;
+   if (nbytes_in_hi32 != NULL)
+      *nbytes_in_hi32 = bzf->strm.total_in_hi32;
+   if (nbytes_out_lo32 != NULL)
+      *nbytes_out_lo32 = bzf->strm.total_out_lo32;
+   if (nbytes_out_hi32 != NULL)
+      *nbytes_out_hi32 = bzf->strm.total_out_hi32;
+
+   BZ_SETERR(BZ_OK);
+   BZ2_bzCompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzReadOpen) 
+                   ( int*  bzerror, 
+                     FILE* f, 
+                     int   verbosity,
+                     int   small,
+                     void* unused,
+                     int   nUnused )
+{
+   bzFile* bzf = NULL;
+   int     ret;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL || 
+       (small != 0 && small != 1) ||
+       (verbosity < 0 || verbosity > 4) ||
+       (unused == NULL && nUnused != 0) ||
+       (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL) 
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+
+   bzf->initialisedOk = False;
+   bzf->handle        = f;
+   bzf->bufN          = 0;
+   bzf->writing       = False;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+   
+   while (nUnused > 0) {
+      bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
+      unused = ((void*)( 1 + ((UChar*)(unused))  ));
+      nUnused--;
+   }
+
+   ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = bzf->bufN;
+   bzf->strm.next_in  = bzf->buf;
+
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
+{
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+
+   if (bzf->initialisedOk)
+      (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzRead) 
+           ( int*    bzerror, 
+             BZFILE* b, 
+             void*   buf, 
+             int     len )
+{
+   Int32   n, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return 0; };
+
+   bzf->strm.avail_out = len;
+   bzf->strm.next_out = buf;
+
+   while (True) {
+
+      if (ferror(bzf->handle)) 
+         { BZ_SETERR(BZ_IO_ERROR); return 0; };
+
+      if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) {
+         n = fread ( bzf->buf, sizeof(UChar), 
+                     BZ_MAX_UNUSED, bzf->handle );
+         if (ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return 0; };
+         bzf->bufN = n;
+         bzf->strm.avail_in = bzf->bufN;
+         bzf->strm.next_in = bzf->buf;
+      }
+
+      ret = BZ2_bzDecompress ( &(bzf->strm) );
+
+      if (ret != BZ_OK && ret != BZ_STREAM_END)
+         { BZ_SETERR(ret); return 0; };
+
+      if (ret == BZ_OK && myfeof(bzf->handle) && 
+          bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
+         { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
+
+      if (ret == BZ_STREAM_END)
+         { BZ_SETERR(BZ_STREAM_END);
+           return len - bzf->strm.avail_out; };
+      if (bzf->strm.avail_out == 0)
+         { BZ_SETERR(BZ_OK); return len; };
+      
+   }
+
+   return 0; /*not reached*/
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadGetUnused) 
+                     ( int*    bzerror, 
+                       BZFILE* b, 
+                       void**  unused, 
+                       int*    nUnused )
+{
+   bzFile* bzf = (bzFile*)b;
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (bzf->lastErr != BZ_STREAM_END)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (unused == NULL || nUnused == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+
+   BZ_SETERR(BZ_OK);
+   *nUnused = bzf->strm.avail_in;
+   *unused = bzf->strm.next_in;
+}
+#endif
+
+
+/*---------------------------------------------------*/
+/*--- Misc convenience stuff                      ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffCompress) 
+                         ( char*         dest, 
+                           unsigned int* destLen,
+                           char*         source, 
+                           unsigned int  sourceLen,
+                           int           blockSize100k, 
+                           int           verbosity, 
+                           int           workFactor )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       blockSize100k < 1 || blockSize100k > 9 ||
+       verbosity < 0 || verbosity > 4 ||
+       workFactor < 0 || workFactor > 250) 
+      return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzCompressInit ( &strm, blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzCompress ( &strm, BZ_FINISH );
+   if (ret == BZ_FINISH_OK) goto output_overflow;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;   
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow:
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OUTBUFF_FULL;
+
+   errhandler:
+   BZ2_bzCompressEnd ( &strm );
+   return ret;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffDecompress) 
+                           ( char*         dest, 
+                             unsigned int* destLen,
+                             char*         source, 
+                             unsigned int  sourceLen,
+                             int           small,
+                             int           verbosity )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       (small != 0 && small != 1) ||
+       verbosity < 0 || verbosity > 4) 
+          return BZ_PARAM_ERROR;
+
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzDecompressInit ( &strm, verbosity, small );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzDecompress ( &strm );
+   if (ret == BZ_OK) goto output_overflow_or_eof;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;
+   BZ2_bzDecompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow_or_eof:
+   if (strm.avail_out > 0) {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_UNEXPECTED_EOF;
+   } else {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_OUTBUFF_FULL;
+   };      
+
+   errhandler:
+   BZ2_bzDecompressEnd ( &strm );
+   return ret; 
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+/*--
+   return version like "0.9.5d, 4-Sept-1999".
+--*/
+const char * BZ_API(BZ2_bzlibVersion)(void)
+{
+   return BZ_VERSION;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+
+#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
+#   include 
+#   include 
+#   define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
+#else
+#   define SET_BINARY_MODE(file)
+#endif
+static
+BZFILE * bzopen_or_bzdopen
+               ( const char *path,   /* no use when bzdopen */
+                 int fd,             /* no use when bzdopen */
+                 const char *mode,
+                 int open_mode)      /* bzopen: 0, bzdopen:1 */
+{
+   int    bzerr;
+   char   unused[BZ_MAX_UNUSED];
+   int    blockSize100k = 9;
+   int    writing       = 0;
+   char   mode2[10]     = "";
+   FILE   *fp           = NULL;
+   BZFILE *bzfp         = NULL;
+   int    verbosity     = 0;
+   int    workFactor    = 30;
+   int    smallMode     = 0;
+   int    nUnused       = 0; 
+
+   if (mode == NULL) return NULL;
+   while (*mode) {
+      switch (*mode) {
+      case 'r':
+         writing = 0; break;
+      case 'w':
+         writing = 1; break;
+      case 's':
+         smallMode = 1; break;
+      default:
+         if (isdigit((int)(*mode))) {
+            blockSize100k = *mode-BZ_HDR_0;
+         }
+      }
+      mode++;
+   }
+   strcat(mode2, writing ? "w" : "r" );
+   strcat(mode2,"b");   /* binary mode */
+
+   if (open_mode==0) {
+      if (path==NULL || strcmp(path,"")==0) {
+        fp = (writing ? stdout : stdin);
+        SET_BINARY_MODE(fp);
+      } else {
+        fp = fopen(path,mode2);
+      }
+   } else {
+#ifdef BZ_STRICT_ANSI
+      fp = NULL;
+#else
+      fp = fdopen(fd,mode2);
+#endif
+   }
+   if (fp == NULL) return NULL;
+
+   if (writing) {
+      /* Guard against total chaos and anarchy -- JRS */
+      if (blockSize100k < 1) blockSize100k = 1;
+      if (blockSize100k > 9) blockSize100k = 9; 
+      bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
+                             verbosity,workFactor);
+   } else {
+      bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
+                            unused,nUnused);
+   }
+   if (bzfp == NULL) {
+      if (fp != stdin && fp != stdout) fclose(fp);
+      return NULL;
+   }
+   return bzfp;
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   open file for read or write.
+      ex) bzopen("file","w9")
+      case path="" or NULL => use stdin or stdout.
+--*/
+BZFILE * BZ_API(BZ2_bzopen)
+               ( const char *path,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
+}
+
+
+/*---------------------------------------------------*/
+BZFILE * BZ_API(BZ2_bzdopen)
+               ( int fd,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
+{
+   int bzerr, nread;
+   if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
+   nread = BZ2_bzRead(&bzerr,b,buf,len);
+   if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
+      return nread;
+   } else {
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
+{
+   int bzerr;
+
+   BZ2_bzWrite(&bzerr,b,buf,len);
+   if(bzerr == BZ_OK){
+      return len;
+   }else{
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzflush) (BZFILE *b)
+{
+   /* do nothing now... */
+   return 0;
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzclose) (BZFILE* b)
+{
+   int bzerr;
+   FILE *fp;
+   
+   if (b==NULL) {return;}
+   fp = ((bzFile *)b)->handle;
+   if(((bzFile*)b)->writing){
+      BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
+      if(bzerr != BZ_OK){
+         BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
+      }
+   }else{
+      BZ2_bzReadClose(&bzerr,b);
+   }
+   if(fp!=stdin && fp!=stdout){
+      fclose(fp);
+   }
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   return last error code 
+--*/
+static const char *bzerrorstrings[] = {
+       "OK"
+      ,"SEQUENCE_ERROR"
+      ,"PARAM_ERROR"
+      ,"MEM_ERROR"
+      ,"DATA_ERROR"
+      ,"DATA_ERROR_MAGIC"
+      ,"IO_ERROR"
+      ,"UNEXPECTED_EOF"
+      ,"OUTBUFF_FULL"
+      ,"CONFIG_ERROR"
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+};
+
+
+const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
+{
+   int err = ((bzFile *)b)->lastErr;
+
+   if(err>0) err = 0;
+   *errnum = err;
+   return bzerrorstrings[err*-1];
+}
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/bzlib.h b/win32/3rdparty/bzip2/bzlib.h
new file mode 100644
index 000000000..c5b75d6d8
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzlib.h
@@ -0,0 +1,282 @@
+
+/*-------------------------------------------------------------*/
+/*--- Public header file for the library.                   ---*/
+/*---                                               bzlib.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_H
+#define _BZLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BZ_RUN               0
+#define BZ_FLUSH             1
+#define BZ_FINISH            2
+
+#define BZ_OK                0
+#define BZ_RUN_OK            1
+#define BZ_FLUSH_OK          2
+#define BZ_FINISH_OK         3
+#define BZ_STREAM_END        4
+#define BZ_SEQUENCE_ERROR    (-1)
+#define BZ_PARAM_ERROR       (-2)
+#define BZ_MEM_ERROR         (-3)
+#define BZ_DATA_ERROR        (-4)
+#define BZ_DATA_ERROR_MAGIC  (-5)
+#define BZ_IO_ERROR          (-6)
+#define BZ_UNEXPECTED_EOF    (-7)
+#define BZ_OUTBUFF_FULL      (-8)
+#define BZ_CONFIG_ERROR      (-9)
+
+typedef 
+   struct {
+      char *next_in;
+      unsigned int avail_in;
+      unsigned int total_in_lo32;
+      unsigned int total_in_hi32;
+
+      char *next_out;
+      unsigned int avail_out;
+      unsigned int total_out_lo32;
+      unsigned int total_out_hi32;
+
+      void *state;
+
+      void *(*bzalloc)(void *,int,int);
+      void (*bzfree)(void *,void *);
+      void *opaque;
+   } 
+   bz_stream;
+
+
+#ifndef BZ_IMPORT
+#define BZ_EXPORT
+#endif
+
+#ifndef BZ_NO_STDIO
+/* Need a definitition for FILE */
+#include 
+#endif
+
+#ifdef _WIN32
+#   include 
+#   ifdef small
+      /* windows.h define small to char */
+#      undef small
+#   endif
+#   ifdef BZ_EXPORT
+#   define BZ_API(func) WINAPI func
+#   define BZ_EXTERN extern
+#   else
+   /* import windows dll dynamically */
+#   define BZ_API(func) (WINAPI * func)
+#   define BZ_EXTERN
+#   endif
+#else
+#   define BZ_API(func) func
+#   define BZ_EXTERN extern
+#endif
+
+
+/*-- Core (low-level) library functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( 
+      bz_stream* strm, 
+      int        blockSize100k, 
+      int        verbosity, 
+      int        workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompress) ( 
+      bz_stream* strm, 
+      int action 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( 
+      bz_stream *strm, 
+      int       verbosity, 
+      int       small
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( 
+      bz_stream *strm 
+   );
+
+
+
+/*-- High(er) level library functions --*/
+
+#ifndef BZ_NO_STDIO
+#define BZ_MAX_UNUSED 5000
+
+typedef void BZFILE;
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( 
+      int*  bzerror,   
+      FILE* f, 
+      int   verbosity, 
+      int   small,
+      void* unused,    
+      int   nUnused 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( 
+      int*    bzerror, 
+      BZFILE* b 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void**  unused,  
+      int*    nUnused 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzRead) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( 
+      int*  bzerror,      
+      FILE* f, 
+      int   blockSize100k, 
+      int   verbosity, 
+      int   workFactor 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWrite) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in, 
+      unsigned int* nbytes_out 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in_lo32, 
+      unsigned int* nbytes_in_hi32, 
+      unsigned int* nbytes_out_lo32, 
+      unsigned int* nbytes_out_hi32
+   );
+#endif
+
+
+/*-- Utility functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           blockSize100k, 
+      int           verbosity, 
+      int           workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           small, 
+      int           verbosity 
+   );
+
+
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+
+BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
+      void
+   );
+
+#ifndef BZ_NO_STDIO
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
+      const char *path,
+      const char *mode
+   );
+
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
+      int        fd,
+      const char *mode
+   );
+         
+BZ_EXTERN int BZ_API(BZ2_bzread) (
+      BZFILE* b, 
+      void* buf, 
+      int len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzwrite) (
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzflush) (
+      BZFILE* b
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzclose) (
+      BZFILE* b
+   );
+
+BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
+      BZFILE *b, 
+      int    *errnum
+   );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/bzlib_private.h b/win32/3rdparty/bzip2/bzlib_private.h
new file mode 100644
index 000000000..23427879b
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzlib_private.h
@@ -0,0 +1,509 @@
+
+/*-------------------------------------------------------------*/
+/*--- Private header file for the library.                  ---*/
+/*---                                       bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_PRIVATE_H
+#define _BZLIB_PRIVATE_H
+
+#include 
+
+#ifndef BZ_NO_STDIO
+#include 
+#include 
+#include 
+#endif
+
+#include "bzlib.h"
+
+
+
+/*-- General stuff. --*/
+
+#define BZ_VERSION  "1.0.5, 10-Dec-2007"
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+#ifndef __GNUC__
+#define __inline__  /* */
+#endif 
+
+#ifndef BZ_NO_STDIO
+
+extern void BZ2_bz__AssertH__fail ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
+
+#if BZ_DEBUG
+#define AssertD(cond,msg) \
+   { if (!(cond)) {       \
+      fprintf ( stderr,   \
+        "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
+      exit(1); \
+   }}
+#else
+#define AssertD(cond,msg) /* */
+#endif
+
+#define VPrintf0(zf) \
+   fprintf(stderr,zf)
+#define VPrintf1(zf,za1) \
+   fprintf(stderr,zf,za1)
+#define VPrintf2(zf,za1,za2) \
+   fprintf(stderr,zf,za1,za2)
+#define VPrintf3(zf,za1,za2,za3) \
+   fprintf(stderr,zf,za1,za2,za3)
+#define VPrintf4(zf,za1,za2,za3,za4) \
+   fprintf(stderr,zf,za1,za2,za3,za4)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) \
+   fprintf(stderr,zf,za1,za2,za3,za4,za5)
+
+#else
+
+extern void bz_internal_error ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) bz_internal_error ( errcode ); }
+#define AssertD(cond,msg)                do { } while (0)
+#define VPrintf0(zf)                     do { } while (0)
+#define VPrintf1(zf,za1)                 do { } while (0)
+#define VPrintf2(zf,za1,za2)             do { } while (0)
+#define VPrintf3(zf,za1,za2,za3)         do { } while (0)
+#define VPrintf4(zf,za1,za2,za3,za4)     do { } while (0)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0)
+
+#endif
+
+
+#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
+#define BZFREE(ppp)  (strm->bzfree)(strm->opaque,(ppp))
+
+
+/*-- Header bytes. --*/
+
+#define BZ_HDR_B 0x42   /* 'B' */
+#define BZ_HDR_Z 0x5a   /* 'Z' */
+#define BZ_HDR_h 0x68   /* 'h' */
+#define BZ_HDR_0 0x30   /* '0' */
+  
+/*-- Constants for the back end. --*/
+
+#define BZ_MAX_ALPHA_SIZE 258
+#define BZ_MAX_CODE_LEN    23
+
+#define BZ_RUNA 0
+#define BZ_RUNB 1
+
+#define BZ_N_GROUPS 6
+#define BZ_G_SIZE   50
+#define BZ_N_ITERS  4
+
+#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
+
+
+
+/*-- Stuff for randomising repetitive blocks. --*/
+
+extern Int32 BZ2_rNums[512];
+
+#define BZ_RAND_DECLS                          \
+   Int32 rNToGo;                               \
+   Int32 rTPos                                 \
+
+#define BZ_RAND_INIT_MASK                      \
+   s->rNToGo = 0;                              \
+   s->rTPos  = 0                               \
+
+#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
+
+#define BZ_RAND_UPD_MASK                       \
+   if (s->rNToGo == 0) {                       \
+      s->rNToGo = BZ2_rNums[s->rTPos];         \
+      s->rTPos++;                              \
+      if (s->rTPos == 512) s->rTPos = 0;       \
+   }                                           \
+   s->rNToGo--;
+
+
+
+/*-- Stuff for doing CRCs. --*/
+
+extern UInt32 BZ2_crc32Table[256];
+
+#define BZ_INITIALISE_CRC(crcVar)              \
+{                                              \
+   crcVar = 0xffffffffL;                       \
+}
+
+#define BZ_FINALISE_CRC(crcVar)                \
+{                                              \
+   crcVar = ~(crcVar);                         \
+}
+
+#define BZ_UPDATE_CRC(crcVar,cha)              \
+{                                              \
+   crcVar = (crcVar << 8) ^                    \
+            BZ2_crc32Table[(crcVar >> 24) ^    \
+                           ((UChar)cha)];      \
+}
+
+
+
+/*-- States and modes for compression. --*/
+
+#define BZ_M_IDLE      1
+#define BZ_M_RUNNING   2
+#define BZ_M_FLUSHING  3
+#define BZ_M_FINISHING 4
+
+#define BZ_S_OUTPUT    1
+#define BZ_S_INPUT     2
+
+#define BZ_N_RADIX 2
+#define BZ_N_QSORT 12
+#define BZ_N_SHELL 18
+#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
+
+
+
+
+/*-- Structure holding all the compression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* mode this stream is in, and whether inputting */
+      /* or outputting data */
+      Int32    mode;
+      Int32    state;
+
+      /* remembers avail_in when flush/finish requested */
+      UInt32   avail_in_expect;
+
+      /* for doing the block sorting */
+      UInt32*  arr1;
+      UInt32*  arr2;
+      UInt32*  ftab;
+      Int32    origPtr;
+
+      /* aliases for arr1 and arr2 */
+      UInt32*  ptr;
+      UChar*   block;
+      UInt16*  mtfv;
+      UChar*   zbits;
+
+      /* for deciding when to use the fallback sorting algorithm */
+      Int32    workFactor;
+
+      /* run-length-encoding of the input */
+      UInt32   state_in_ch;
+      Int32    state_in_len;
+      BZ_RAND_DECLS;
+
+      /* input and output limits and current posns */
+      Int32    nblock;
+      Int32    nblockMAX;
+      Int32    numZ;
+      Int32    state_out_pos;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      UChar    unseqToSeq[256];
+
+      /* the buffer for bit stream creation */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* block and combined CRCs */
+      UInt32   blockCRC;
+      UInt32   combinedCRC;
+
+      /* misc administratium */
+      Int32    verbosity;
+      Int32    blockNo;
+      Int32    blockSize100k;
+
+      /* stuff for coding the MTF values */
+      Int32    nMTF;
+      Int32    mtfFreq    [BZ_MAX_ALPHA_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+
+      UChar    len     [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    code    [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    rfreq   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      /* second dimension: only 3 needed; 4 makes index calculations faster */
+      UInt32   len_pack[BZ_MAX_ALPHA_SIZE][4];
+
+   }
+   EState;
+
+
+
+/*-- externs for compression. --*/
+
+extern void 
+BZ2_blockSort ( EState* );
+
+extern void 
+BZ2_compressBlock ( EState*, Bool );
+
+extern void 
+BZ2_bsInitWrite ( EState* );
+
+extern void 
+BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
+
+extern void 
+BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
+
+
+
+/*-- states for decompression. --*/
+
+#define BZ_X_IDLE        1
+#define BZ_X_OUTPUT      2
+
+#define BZ_X_MAGIC_1     10
+#define BZ_X_MAGIC_2     11
+#define BZ_X_MAGIC_3     12
+#define BZ_X_MAGIC_4     13
+#define BZ_X_BLKHDR_1    14
+#define BZ_X_BLKHDR_2    15
+#define BZ_X_BLKHDR_3    16
+#define BZ_X_BLKHDR_4    17
+#define BZ_X_BLKHDR_5    18
+#define BZ_X_BLKHDR_6    19
+#define BZ_X_BCRC_1      20
+#define BZ_X_BCRC_2      21
+#define BZ_X_BCRC_3      22
+#define BZ_X_BCRC_4      23
+#define BZ_X_RANDBIT     24
+#define BZ_X_ORIGPTR_1   25
+#define BZ_X_ORIGPTR_2   26
+#define BZ_X_ORIGPTR_3   27
+#define BZ_X_MAPPING_1   28
+#define BZ_X_MAPPING_2   29
+#define BZ_X_SELECTOR_1  30
+#define BZ_X_SELECTOR_2  31
+#define BZ_X_SELECTOR_3  32
+#define BZ_X_CODING_1    33
+#define BZ_X_CODING_2    34
+#define BZ_X_CODING_3    35
+#define BZ_X_MTF_1       36
+#define BZ_X_MTF_2       37
+#define BZ_X_MTF_3       38
+#define BZ_X_MTF_4       39
+#define BZ_X_MTF_5       40
+#define BZ_X_MTF_6       41
+#define BZ_X_ENDHDR_2    42
+#define BZ_X_ENDHDR_3    43
+#define BZ_X_ENDHDR_4    44
+#define BZ_X_ENDHDR_5    45
+#define BZ_X_ENDHDR_6    46
+#define BZ_X_CCRC_1      47
+#define BZ_X_CCRC_2      48
+#define BZ_X_CCRC_3      49
+#define BZ_X_CCRC_4      50
+
+
+
+/*-- Constants for the fast MTF decoder. --*/
+
+#define MTFA_SIZE 4096
+#define MTFL_SIZE 16
+
+
+
+/*-- Structure holding all the decompression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* state indicator for this stream */
+      Int32    state;
+
+      /* for doing the final run-length decoding */
+      UChar    state_out_ch;
+      Int32    state_out_len;
+      Bool     blockRandomised;
+      BZ_RAND_DECLS;
+
+      /* the buffer for bit stream reading */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* misc administratium */
+      Int32    blockSize100k;
+      Bool     smallDecompress;
+      Int32    currBlockNo;
+      Int32    verbosity;
+
+      /* for undoing the Burrows-Wheeler transform */
+      Int32    origPtr;
+      UInt32   tPos;
+      Int32    k0;
+      Int32    unzftab[256];
+      Int32    nblock_used;
+      Int32    cftab[257];
+      Int32    cftabCopy[257];
+
+      /* for undoing the Burrows-Wheeler transform (FAST) */
+      UInt32   *tt;
+
+      /* for undoing the Burrows-Wheeler transform (SMALL) */
+      UInt16   *ll16;
+      UChar    *ll4;
+
+      /* stored and calculated CRCs */
+      UInt32   storedBlockCRC;
+      UInt32   storedCombinedCRC;
+      UInt32   calculatedBlockCRC;
+      UInt32   calculatedCombinedCRC;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      Bool     inUse16[16];
+      UChar    seqToUnseq[256];
+
+      /* for decoding the MTF values */
+      UChar    mtfa   [MTFA_SIZE];
+      Int32    mtfbase[256 / MTFL_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+      UChar    len  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+
+      Int32    limit  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    base   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    perm   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    minLens[BZ_N_GROUPS];
+
+      /* save area for scalars in the main decompress code */
+      Int32    save_i;
+      Int32    save_j;
+      Int32    save_t;
+      Int32    save_alphaSize;
+      Int32    save_nGroups;
+      Int32    save_nSelectors;
+      Int32    save_EOB;
+      Int32    save_groupNo;
+      Int32    save_groupPos;
+      Int32    save_nextSym;
+      Int32    save_nblockMAX;
+      Int32    save_nblock;
+      Int32    save_es;
+      Int32    save_N;
+      Int32    save_curr;
+      Int32    save_zt;
+      Int32    save_zn; 
+      Int32    save_zvec;
+      Int32    save_zj;
+      Int32    save_gSel;
+      Int32    save_gMinlen;
+      Int32*   save_gLimit;
+      Int32*   save_gBase;
+      Int32*   save_gPerm;
+
+   }
+   DState;
+
+
+
+/*-- Macros for decompression. --*/
+
+#define BZ_GET_FAST(cccc)                     \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    s->tPos = s->tt[s->tPos];                 \
+    cccc = (UChar)(s->tPos & 0xff);           \
+    s->tPos >>= 8;
+
+#define BZ_GET_FAST_C(cccc)                   \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \
+    c_tPos = c_tt[c_tPos];                    \
+    cccc = (UChar)(c_tPos & 0xff);            \
+    c_tPos >>= 8;
+
+#define SET_LL4(i,n)                                          \
+   { if (((i) & 0x1) == 0)                                    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4);  \
+   }
+
+#define GET_LL4(i)                             \
+   ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
+
+#define SET_LL(i,n)                          \
+   { s->ll16[i] = (UInt16)(n & 0x0000ffff);  \
+     SET_LL4(i, n >> 16);                    \
+   }
+
+#define GET_LL(i) \
+   (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
+
+#define BZ_GET_SMALL(cccc)                            \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    cccc = BZ2_indexIntoF ( s->tPos, s->cftab );    \
+    s->tPos = GET_LL(s->tPos);
+
+
+/*-- externs for decompression. --*/
+
+extern Int32 
+BZ2_indexIntoF ( Int32, Int32* );
+
+extern Int32 
+BZ2_decompress ( DState* );
+
+extern void 
+BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
+                           Int32,  Int32, Int32 );
+
+
+#endif
+
+
+/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
+
+#ifdef BZ_NO_STDIO
+#ifndef NULL
+#define NULL 0
+#endif
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                   bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/bzmore b/win32/3rdparty/bzip2/bzmore
new file mode 100644
index 000000000..d31404340
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzmore
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+# Bzmore wrapped for bzip2, 
+# adapted from zmore by Philippe Troin  for Debian GNU/Linux.
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+	*less)	more=less	;;
+	*)	more=more       ;;
+esac
+
+if test "`echo -n a`" = "-n a"; then
+  # looks like a SysV system:
+  n1=''; n2='\c'
+else
+  n1='-n'; n2=''
+fi
+oldtty=`stty -g 2>/dev/null`
+if stty -cbreak 2>/dev/null; then
+  cb='cbreak'; ncb='-cbreak'
+else
+  # 'stty min 1' resets eof to ^a on both SunOS and SysV!
+  cb='min 1 -icanon'; ncb='icanon eof ^d'
+fi
+if test $? -eq 0 -a -n "$oldtty"; then
+   trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
+else
+   trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
+fi
+
+if test $# = 0; then
+    if test -t 0; then
+	echo usage: $prog files...
+    else
+	bzip2 -cdfq | eval $more
+    fi
+else
+    FIRST=1
+    for FILE
+    do
+	if test $FIRST -eq 0; then
+		echo $n1 "--More--(Next file: $FILE)$n2"
+		stty $cb -echo 2>/dev/null
+		ANS=`dd bs=1 count=1 2>/dev/null` 
+		stty $ncb echo 2>/dev/null
+		echo " "
+		if test "$ANS" = 'e' -o "$ANS" = 'q'; then
+			exit
+		fi
+	fi
+	if test "$ANS" != 's'; then
+		echo "------> $FILE <------"
+		bzip2 -cdfq "$FILE" | eval $more
+	fi
+	if test -t; then
+		FIRST=0
+	fi
+    done
+fi
diff --git a/win32/3rdparty/bzip2/bzmore.1 b/win32/3rdparty/bzip2/bzmore.1
new file mode 100644
index 000000000..b437d3b03
--- /dev/null
+++ b/win32/3rdparty/bzip2/bzmore.1
@@ -0,0 +1,152 @@
+.\"Shamelessly copied from zmore.1 by Philippe Troin 
+.\"for Debian GNU/Linux
+.TH BZMORE 1
+.SH NAME
+bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
+.SH SYNOPSIS
+.B bzmore
+[ name ...  ]
+.br
+.B bzless
+[ name ...  ]
+.SH NOTE
+In the following description,
+.I bzless
+and
+.I less
+can be used interchangeably with
+.I bzmore
+and
+.I more.
+.SH DESCRIPTION
+.I  Bzmore
+is a filter which allows examination of compressed or plain text files
+one screenful at a time on a soft-copy terminal.
+.I bzmore
+works on files compressed with
+.I bzip2
+and also on uncompressed files.
+If a file does not exist,
+.I bzmore
+looks for a file of the same name with the addition of a .bz2 suffix.
+.PP
+.I Bzmore
+normally pauses after each screenful, printing --More--
+at the bottom of the screen.
+If the user then types a carriage return, one more line is displayed.
+If the user hits a space,
+another screenful is displayed.  Other possibilities are enumerated later.
+.PP
+.I Bzmore
+looks in the file
+.I /etc/termcap
+to determine terminal characteristics,
+and to determine the default window size.
+On a terminal capable of displaying 24 lines,
+the default window size is 22 lines.
+Other sequences which may be typed when
+.I bzmore
+pauses, and their effects, are as follows (\fIi\fP is an optional integer
+argument, defaulting to 1) :
+.PP
+.IP \fIi\|\fP
+display
+.I i
+more lines, (or another screenful if no argument is given)
+.PP
+.IP ^D
+display 11 more lines (a ``scroll'').
+If
+.I i
+is given, then the scroll size is set to \fIi\|\fP.
+.PP
+.IP d
+same as ^D (control-D)
+.PP
+.IP \fIi\|\fPz
+same as typing a space except that \fIi\|\fP, if present, becomes the new
+window size.  Note that the window size reverts back to the default at the
+end of the current file.
+.PP
+.IP \fIi\|\fPs
+skip \fIi\|\fP lines and print a screenful of lines
+.PP
+.IP \fIi\|\fPf
+skip \fIi\fP screenfuls and print a screenful of lines
+.PP
+.IP "q or Q"
+quit reading the current file; go on to the next (if any)
+.PP
+.IP "e or q"
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to exit.
+.PP
+.IP s
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to skip the next file and continue.
+.PP 
+.IP =
+Display the current line number.
+.PP
+.IP \fIi\|\fP/expr
+search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
+If the pattern is not found,
+.I bzmore
+goes on to the next file (if any).
+Otherwise, a screenful is displayed, starting two lines before the place
+where the expression was found.
+The user's erase and kill characters may be used to edit the regular
+expression.
+Erasing back past the first column cancels the search command.
+.PP
+.IP \fIi\|\fPn
+search for the \fIi\|\fP-th occurrence of the last regular expression entered.
+.PP
+.IP !command
+invoke a shell with \fIcommand\|\fP. 
+The character `!' in "command" are replaced with the
+previous shell command.  The sequence "\\!" is replaced by "!".
+.PP
+.IP ":q or :Q"
+quit reading the current file; go on to the next (if any)
+(same as q or Q).
+.PP
+.IP .
+(dot) repeat the previous command.
+.PP
+The commands take effect immediately, i.e., it is not necessary to
+type a carriage return.
+Up to the time when the command character itself is given,
+the user may hit the line kill character to cancel the numerical
+argument being formed.
+In addition, the user may hit the erase character to redisplay the
+--More-- message.
+.PP
+At any time when output is being sent to the terminal, the user can
+hit the quit key (normally control\-\\).
+.I Bzmore
+will stop sending output, and will display the usual --More--
+prompt.
+The user may then enter one of the above commands in the normal manner.
+Unfortunately, some output is lost when this is done, due to the
+fact that any characters waiting in the terminal's output queue
+are flushed when the quit signal occurs.
+.PP
+The terminal is set to
+.I noecho
+mode by this program so that the output can be continuous.
+What you type will thus not show on your terminal, except for the / and !
+commands.
+.PP
+If the standard output is not a teletype, then
+.I bzmore
+acts just like
+.I bzcat,
+except that a header is printed before each file.
+.SH FILES
+.DT
+/etc/termcap		Terminal data base
+.SH "SEE ALSO"
+more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
diff --git a/win32/3rdparty/bzip2/compress.c b/win32/3rdparty/bzip2/compress.c
new file mode 100644
index 000000000..8c80a0797
--- /dev/null
+++ b/win32/3rdparty/bzip2/compress.c
@@ -0,0 +1,672 @@
+
+/*-------------------------------------------------------------*/
+/*--- Compression machinery (not incl block sorting)        ---*/
+/*---                                            compress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* CHANGES
+    0.9.0    -- original version.
+    0.9.0a/b -- no changes in this file.
+    0.9.0c   -- changed setting of nGroups in sendMTFValues() 
+                so as to do a bit better on small files
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+void BZ2_bsInitWrite ( EState* s )
+{
+   s->bsLive = 0;
+   s->bsBuff = 0;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsFinishWrite ( EState* s )
+{
+   while (s->bsLive > 0) {
+      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
+      s->numZ++;
+      s->bsBuff <<= 8;
+      s->bsLive -= 8;
+   }
+}
+
+
+/*---------------------------------------------------*/
+#define bsNEEDW(nz)                           \
+{                                             \
+   while (s->bsLive >= 8) {                   \
+      s->zbits[s->numZ]                       \
+         = (UChar)(s->bsBuff >> 24);          \
+      s->numZ++;                              \
+      s->bsBuff <<= 8;                        \
+      s->bsLive -= 8;                         \
+   }                                          \
+}
+
+
+/*---------------------------------------------------*/
+static
+__inline__
+void bsW ( EState* s, Int32 n, UInt32 v )
+{
+   bsNEEDW ( n );
+   s->bsBuff |= (v << (32 - s->bsLive - n));
+   s->bsLive += n;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUInt32 ( EState* s, UInt32 u )
+{
+   bsW ( s, 8, (u >> 24) & 0xffL );
+   bsW ( s, 8, (u >> 16) & 0xffL );
+   bsW ( s, 8, (u >>  8) & 0xffL );
+   bsW ( s, 8,  u        & 0xffL );
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUChar ( EState* s, UChar c )
+{
+   bsW( s, 8, (UInt32)c );
+}
+
+
+/*---------------------------------------------------*/
+/*--- The back end proper                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+static
+void makeMaps_e ( EState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->unseqToSeq[i] = s->nInUse;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+static
+void generateMTFValues ( EState* s )
+{
+   UChar   yy[256];
+   Int32   i, j;
+   Int32   zPend;
+   Int32   wr;
+   Int32   EOB;
+
+   /* 
+      After sorting (eg, here),
+         s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
+         and
+         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 
+         holds the original block data.
+
+      The first thing to do is generate the MTF values,
+      and put them in
+         ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
+      Because there are strictly fewer or equal MTF values
+      than block values, ptr values in this area are overwritten
+      with MTF values only when they are no longer needed.
+
+      The final compressed bitstream is generated into the
+      area starting at
+         (UChar*) (&((UChar*)s->arr2)[s->nblock])
+
+      These storage aliases are set up in bzCompressInit(),
+      except for the last one, which is arranged in 
+      compressBlock().
+   */
+   UInt32* ptr   = s->ptr;
+   UChar* block  = s->block;
+   UInt16* mtfv  = s->mtfv;
+
+   makeMaps_e ( s );
+   EOB = s->nInUse+1;
+
+   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
+
+   wr = 0;
+   zPend = 0;
+   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
+
+   for (i = 0; i < s->nblock; i++) {
+      UChar ll_i;
+      AssertD ( wr <= i, "generateMTFValues(1)" );
+      j = ptr[i]-1; if (j < 0) j += s->nblock;
+      ll_i = s->unseqToSeq[block[j]];
+      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
+
+      if (yy[0] == ll_i) { 
+         zPend++;
+      } else {
+
+         if (zPend > 0) {
+            zPend--;
+            while (True) {
+               if (zPend & 1) {
+                  mtfv[wr] = BZ_RUNB; wr++; 
+                  s->mtfFreq[BZ_RUNB]++; 
+               } else {
+                  mtfv[wr] = BZ_RUNA; wr++; 
+                  s->mtfFreq[BZ_RUNA]++; 
+               }
+               if (zPend < 2) break;
+               zPend = (zPend - 2) / 2;
+            };
+            zPend = 0;
+         }
+         {
+            register UChar  rtmp;
+            register UChar* ryy_j;
+            register UChar  rll_i;
+            rtmp  = yy[1];
+            yy[1] = yy[0];
+            ryy_j = &(yy[1]);
+            rll_i = ll_i;
+            while ( rll_i != rtmp ) {
+               register UChar rtmp2;
+               ryy_j++;
+               rtmp2  = rtmp;
+               rtmp   = *ryy_j;
+               *ryy_j = rtmp2;
+            };
+            yy[0] = rtmp;
+            j = ryy_j - &(yy[0]);
+            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
+         }
+
+      }
+   }
+
+   if (zPend > 0) {
+      zPend--;
+      while (True) {
+         if (zPend & 1) {
+            mtfv[wr] = BZ_RUNB; wr++; 
+            s->mtfFreq[BZ_RUNB]++; 
+         } else {
+            mtfv[wr] = BZ_RUNA; wr++; 
+            s->mtfFreq[BZ_RUNA]++; 
+         }
+         if (zPend < 2) break;
+         zPend = (zPend - 2) / 2;
+      };
+      zPend = 0;
+   }
+
+   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
+
+   s->nMTF = wr;
+}
+
+
+/*---------------------------------------------------*/
+#define BZ_LESSER_ICOST  0
+#define BZ_GREATER_ICOST 15
+
+static
+void sendMTFValues ( EState* s )
+{
+   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
+   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
+   Int32 nGroups, nBytes;
+
+   /*--
+   UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   is a global since the decoder also needs it.
+
+   Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   are also globals only used in this proc.
+   Made global to keep stack frame size small.
+   --*/
+
+
+   UInt16 cost[BZ_N_GROUPS];
+   Int32  fave[BZ_N_GROUPS];
+
+   UInt16* mtfv = s->mtfv;
+
+   if (s->verbosity >= 3)
+      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
+                "%d+2 syms in use\n", 
+                s->nblock, s->nMTF, s->nInUse );
+
+   alphaSize = s->nInUse+2;
+   for (t = 0; t < BZ_N_GROUPS; t++)
+      for (v = 0; v < alphaSize; v++)
+         s->len[t][v] = BZ_GREATER_ICOST;
+
+   /*--- Decide how many coding tables to use ---*/
+   AssertH ( s->nMTF > 0, 3001 );
+   if (s->nMTF < 200)  nGroups = 2; else
+   if (s->nMTF < 600)  nGroups = 3; else
+   if (s->nMTF < 1200) nGroups = 4; else
+   if (s->nMTF < 2400) nGroups = 5; else
+                       nGroups = 6;
+
+   /*--- Generate an initial set of coding tables ---*/
+   { 
+      Int32 nPart, remF, tFreq, aFreq;
+
+      nPart = nGroups;
+      remF  = s->nMTF;
+      gs = 0;
+      while (nPart > 0) {
+         tFreq = remF / nPart;
+         ge = gs-1;
+         aFreq = 0;
+         while (aFreq < tFreq && ge < alphaSize-1) {
+            ge++;
+            aFreq += s->mtfFreq[ge];
+         }
+
+         if (ge > gs 
+             && nPart != nGroups && nPart != 1 
+             && ((nGroups-nPart) % 2 == 1)) {
+            aFreq -= s->mtfFreq[ge];
+            ge--;
+         }
+
+         if (s->verbosity >= 3)
+            VPrintf5( "      initial group %d, [%d .. %d], "
+                      "has %d syms (%4.1f%%)\n",
+                      nPart, gs, ge, aFreq, 
+                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
+ 
+         for (v = 0; v < alphaSize; v++)
+            if (v >= gs && v <= ge) 
+               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
+               s->len[nPart-1][v] = BZ_GREATER_ICOST;
+ 
+         nPart--;
+         gs = ge+1;
+         remF -= aFreq;
+      }
+   }
+
+   /*--- 
+      Iterate up to BZ_N_ITERS times to improve the tables.
+   ---*/
+   for (iter = 0; iter < BZ_N_ITERS; iter++) {
+
+      for (t = 0; t < nGroups; t++) fave[t] = 0;
+
+      for (t = 0; t < nGroups; t++)
+         for (v = 0; v < alphaSize; v++)
+            s->rfreq[t][v] = 0;
+
+      /*---
+        Set up an auxiliary length table which is used to fast-track
+	the common case (nGroups == 6). 
+      ---*/
+      if (nGroups == 6) {
+         for (v = 0; v < alphaSize; v++) {
+            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
+            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
+            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
+	 }
+      }
+
+      nSelectors = 0;
+      totc = 0;
+      gs = 0;
+      while (True) {
+
+         /*--- Set group start & end marks. --*/
+         if (gs >= s->nMTF) break;
+         ge = gs + BZ_G_SIZE - 1; 
+         if (ge >= s->nMTF) ge = s->nMTF-1;
+
+         /*-- 
+            Calculate the cost of this group as coded
+            by each of the coding tables.
+         --*/
+         for (t = 0; t < nGroups; t++) cost[t] = 0;
+
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            register UInt32 cost01, cost23, cost45;
+            register UInt16 icv;
+            cost01 = cost23 = cost45 = 0;
+
+#           define BZ_ITER(nn)                \
+               icv = mtfv[gs+(nn)];           \
+               cost01 += s->len_pack[icv][0]; \
+               cost23 += s->len_pack[icv][1]; \
+               cost45 += s->len_pack[icv][2]; \
+
+            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
+            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
+            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
+            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
+            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
+            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
+            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
+            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
+            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
+            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
+
+#           undef BZ_ITER
+
+            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
+            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
+            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
+
+         } else {
+	    /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++) { 
+               UInt16 icv = mtfv[i];
+               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
+            }
+         }
+ 
+         /*-- 
+            Find the coding table which is best for this group,
+            and record its identity in the selector table.
+         --*/
+         bc = 999999999; bt = -1;
+         for (t = 0; t < nGroups; t++)
+            if (cost[t] < bc) { bc = cost[t]; bt = t; };
+         totc += bc;
+         fave[bt]++;
+         s->selector[nSelectors] = bt;
+         nSelectors++;
+
+         /*-- 
+            Increment the symbol frequencies for the selected table.
+          --*/
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+
+#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
+
+            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
+            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
+            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
+            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
+            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
+            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
+            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
+            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
+            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
+            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
+
+#           undef BZ_ITUR
+
+         } else {
+	    /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++)
+               s->rfreq[bt][ mtfv[i] ]++;
+         }
+
+         gs = ge+1;
+      }
+      if (s->verbosity >= 3) {
+         VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
+                   iter+1, totc/8 );
+         for (t = 0; t < nGroups; t++)
+            VPrintf1 ( "%d ", fave[t] );
+         VPrintf0 ( "\n" );
+      }
+
+      /*--
+        Recompute the tables based on the accumulated frequencies.
+      --*/
+      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See 
+         comment in huffman.c for details. */
+      for (t = 0; t < nGroups; t++)
+         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
+                                 alphaSize, 17 /*20*/ );
+   }
+
+
+   AssertH( nGroups < 8, 3002 );
+   AssertH( nSelectors < 32768 &&
+            nSelectors <= (2 + (900000 / BZ_G_SIZE)),
+            3003 );
+
+
+   /*--- Compute MTF values for the selectors. ---*/
+   {
+      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
+      for (i = 0; i < nGroups; i++) pos[i] = i;
+      for (i = 0; i < nSelectors; i++) {
+         ll_i = s->selector[i];
+         j = 0;
+         tmp = pos[j];
+         while ( ll_i != tmp ) {
+            j++;
+            tmp2 = tmp;
+            tmp = pos[j];
+            pos[j] = tmp2;
+         };
+         pos[0] = tmp;
+         s->selectorMtf[i] = j;
+      }
+   };
+
+   /*--- Assign actual codes for the tables. --*/
+   for (t = 0; t < nGroups; t++) {
+      minLen = 32;
+      maxLen = 0;
+      for (i = 0; i < alphaSize; i++) {
+         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+         if (s->len[t][i] < minLen) minLen = s->len[t][i];
+      }
+      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
+      AssertH ( !(minLen < 1),  3005 );
+      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
+                          minLen, maxLen, alphaSize );
+   }
+
+   /*--- Transmit the mapping table. ---*/
+   { 
+      Bool inUse16[16];
+      for (i = 0; i < 16; i++) {
+          inUse16[i] = False;
+          for (j = 0; j < 16; j++)
+             if (s->inUse[i * 16 + j]) inUse16[i] = True;
+      }
+     
+      nBytes = s->numZ;
+      for (i = 0; i < 16; i++)
+         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
+
+      for (i = 0; i < 16; i++)
+         if (inUse16[i])
+            for (j = 0; j < 16; j++) {
+               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
+            }
+
+      if (s->verbosity >= 3) 
+         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
+   }
+
+   /*--- Now the selectors. ---*/
+   nBytes = s->numZ;
+   bsW ( s, 3, nGroups );
+   bsW ( s, 15, nSelectors );
+   for (i = 0; i < nSelectors; i++) { 
+      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
+      bsW(s,1,0);
+   }
+   if (s->verbosity >= 3)
+      VPrintf1( "selectors %d, ", s->numZ-nBytes );
+
+   /*--- Now the coding tables. ---*/
+   nBytes = s->numZ;
+
+   for (t = 0; t < nGroups; t++) {
+      Int32 curr = s->len[t][0];
+      bsW ( s, 5, curr );
+      for (i = 0; i < alphaSize; i++) {
+         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
+         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
+         bsW ( s, 1, 0 );
+      }
+   }
+
+   if (s->verbosity >= 3)
+      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
+
+   /*--- And finally, the block data proper ---*/
+   nBytes = s->numZ;
+   selCtr = 0;
+   gs = 0;
+   while (True) {
+      if (gs >= s->nMTF) break;
+      ge = gs + BZ_G_SIZE - 1; 
+      if (ge >= s->nMTF) ge = s->nMTF-1;
+      AssertH ( s->selector[selCtr] < nGroups, 3006 );
+
+      if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            UInt16 mtfv_i;
+            UChar* s_len_sel_selCtr 
+               = &(s->len[s->selector[selCtr]][0]);
+            Int32* s_code_sel_selCtr
+               = &(s->code[s->selector[selCtr]][0]);
+
+#           define BZ_ITAH(nn)                      \
+               mtfv_i = mtfv[gs+(nn)];              \
+               bsW ( s,                             \
+                     s_len_sel_selCtr[mtfv_i],      \
+                     s_code_sel_selCtr[mtfv_i] )
+
+            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
+            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
+            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
+            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
+            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
+            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
+            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
+            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
+            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
+            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
+
+#           undef BZ_ITAH
+
+      } else {
+	 /*--- slow version which correctly handles all situations ---*/
+         for (i = gs; i <= ge; i++) {
+            bsW ( s, 
+                  s->len  [s->selector[selCtr]] [mtfv[i]],
+                  s->code [s->selector[selCtr]] [mtfv[i]] );
+         }
+      }
+
+
+      gs = ge+1;
+      selCtr++;
+   }
+   AssertH( selCtr == nSelectors, 3007 );
+
+   if (s->verbosity >= 3)
+      VPrintf1( "codes %d\n", s->numZ-nBytes );
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_compressBlock ( EState* s, Bool is_last_block )
+{
+   if (s->nblock > 0) {
+
+      BZ_FINALISE_CRC ( s->blockCRC );
+      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
+      s->combinedCRC ^= s->blockCRC;
+      if (s->blockNo > 1) s->numZ = 0;
+
+      if (s->verbosity >= 2)
+         VPrintf4( "    block %d: crc = 0x%08x, "
+                   "combined CRC = 0x%08x, size = %d\n",
+                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
+
+      BZ2_blockSort ( s );
+   }
+
+   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
+
+   /*-- If this is the first block, create the stream header. --*/
+   if (s->blockNo == 1) {
+      BZ2_bsInitWrite ( s );
+      bsPutUChar ( s, BZ_HDR_B );
+      bsPutUChar ( s, BZ_HDR_Z );
+      bsPutUChar ( s, BZ_HDR_h );
+      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
+   }
+
+   if (s->nblock > 0) {
+
+      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
+      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
+      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
+
+      /*-- Now the block's CRC, so it is in a known place. --*/
+      bsPutUInt32 ( s, s->blockCRC );
+
+      /*-- 
+         Now a single bit indicating (non-)randomisation. 
+         As of version 0.9.5, we use a better sorting algorithm
+         which makes randomisation unnecessary.  So always set
+         the randomised bit to 'no'.  Of course, the decoder
+         still needs to be able to handle randomised blocks
+         so as to maintain backwards compatibility with
+         older versions of bzip2.
+      --*/
+      bsW(s,1,0);
+
+      bsW ( s, 24, s->origPtr );
+      generateMTFValues ( s );
+      sendMTFValues ( s );
+   }
+
+
+   /*-- If this is the last block, add the stream trailer. --*/
+   if (is_last_block) {
+
+      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
+      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
+      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
+      bsPutUInt32 ( s, s->combinedCRC );
+      if (s->verbosity >= 2)
+         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
+      bsFinishWrite ( s );
+   }
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        compress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/crctable.c b/win32/3rdparty/bzip2/crctable.c
new file mode 100644
index 000000000..215687b2c
--- /dev/null
+++ b/win32/3rdparty/bzip2/crctable.c
@@ -0,0 +1,104 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for doing CRCs                                  ---*/
+/*---                                            crctable.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*--
+  I think this is an implementation of the AUTODIN-II,
+  Ethernet & FDDI 32-bit CRC standard.  Vaguely derived
+  from code by Rob Warnock, in Section 51 of the
+  comp.compression FAQ.
+--*/
+
+UInt32 BZ2_crc32Table[256] = {
+
+   /*-- Ugly, innit? --*/
+
+   0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
+   0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
+   0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
+   0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
+   0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
+   0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
+   0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
+   0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
+   0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
+   0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
+   0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
+   0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
+   0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
+   0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
+   0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
+   0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
+   0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
+   0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
+   0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
+   0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
+   0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
+   0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
+   0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
+   0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
+   0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
+   0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
+   0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
+   0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
+   0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
+   0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
+   0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
+   0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
+   0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
+   0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
+   0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
+   0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
+   0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
+   0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
+   0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
+   0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
+   0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
+   0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
+   0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
+   0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
+   0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
+   0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
+   0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
+   0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
+   0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
+   0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
+   0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
+   0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
+   0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
+   0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
+   0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
+   0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
+   0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
+   0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
+   0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
+   0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
+   0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
+   0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
+   0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
+   0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        crctable.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/decompress.c b/win32/3rdparty/bzip2/decompress.c
new file mode 100644
index 000000000..bba5e0fa3
--- /dev/null
+++ b/win32/3rdparty/bzip2/decompress.c
@@ -0,0 +1,626 @@
+
+/*-------------------------------------------------------------*/
+/*--- Decompression machinery                               ---*/
+/*---                                          decompress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+static
+void makeMaps_d ( DState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->seqToUnseq[s->nInUse] = i;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+#define RETURN(rrr)                               \
+   { retVal = rrr; goto save_state_and_return; };
+
+#define GET_BITS(lll,vvv,nnn)                     \
+   case lll: s->state = lll;                      \
+   while (True) {                                 \
+      if (s->bsLive >= nnn) {                     \
+         UInt32 v;                                \
+         v = (s->bsBuff >>                        \
+             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
+         s->bsLive -= nnn;                        \
+         vvv = v;                                 \
+         break;                                   \
+      }                                           \
+      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
+      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++;                \
+   }
+
+#define GET_UCHAR(lll,uuu)                        \
+   GET_BITS(lll,uuu,8)
+
+#define GET_BIT(lll,uuu)                          \
+   GET_BITS(lll,uuu,1)
+
+/*---------------------------------------------------*/
+#define GET_MTF_VAL(label1,label2,lval)           \
+{                                                 \
+   if (groupPos == 0) {                           \
+      groupNo++;                                  \
+      if (groupNo >= nSelectors)                  \
+         RETURN(BZ_DATA_ERROR);                   \
+      groupPos = BZ_G_SIZE;                       \
+      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;                                  \
+   GET_BITS(label1, zvec, zn);                    \
+   while (1) {                                    \
+      if (zn > 20 /* the longest code */)         \
+         RETURN(BZ_DATA_ERROR);                   \
+      if (zvec <= gLimit[zn]) break;              \
+      zn++;                                       \
+      GET_BIT(label2, zj);                        \
+      zvec = (zvec << 1) | zj;                    \
+   };                                             \
+   if (zvec - gBase[zn] < 0                       \
+       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
+      RETURN(BZ_DATA_ERROR);                      \
+   lval = gPerm[zvec - gBase[zn]];                \
+}
+
+
+/*---------------------------------------------------*/
+Int32 BZ2_decompress ( DState* s )
+{
+   UChar      uc;
+   Int32      retVal;
+   Int32      minLen, maxLen;
+   bz_stream* strm = s->strm;
+
+   /* stuff that needs to be saved/restored */
+   Int32  i;
+   Int32  j;
+   Int32  t;
+   Int32  alphaSize;
+   Int32  nGroups;
+   Int32  nSelectors;
+   Int32  EOB;
+   Int32  groupNo;
+   Int32  groupPos;
+   Int32  nextSym;
+   Int32  nblockMAX;
+   Int32  nblock;
+   Int32  es;
+   Int32  N;
+   Int32  curr;
+   Int32  zt;
+   Int32  zn; 
+   Int32  zvec;
+   Int32  zj;
+   Int32  gSel;
+   Int32  gMinlen;
+   Int32* gLimit;
+   Int32* gBase;
+   Int32* gPerm;
+
+   if (s->state == BZ_X_MAGIC_1) {
+      /*initialise the save area*/
+      s->save_i           = 0;
+      s->save_j           = 0;
+      s->save_t           = 0;
+      s->save_alphaSize   = 0;
+      s->save_nGroups     = 0;
+      s->save_nSelectors  = 0;
+      s->save_EOB         = 0;
+      s->save_groupNo     = 0;
+      s->save_groupPos    = 0;
+      s->save_nextSym     = 0;
+      s->save_nblockMAX   = 0;
+      s->save_nblock      = 0;
+      s->save_es          = 0;
+      s->save_N           = 0;
+      s->save_curr        = 0;
+      s->save_zt          = 0;
+      s->save_zn          = 0;
+      s->save_zvec        = 0;
+      s->save_zj          = 0;
+      s->save_gSel        = 0;
+      s->save_gMinlen     = 0;
+      s->save_gLimit      = NULL;
+      s->save_gBase       = NULL;
+      s->save_gPerm       = NULL;
+   }
+
+   /*restore from the save area*/
+   i           = s->save_i;
+   j           = s->save_j;
+   t           = s->save_t;
+   alphaSize   = s->save_alphaSize;
+   nGroups     = s->save_nGroups;
+   nSelectors  = s->save_nSelectors;
+   EOB         = s->save_EOB;
+   groupNo     = s->save_groupNo;
+   groupPos    = s->save_groupPos;
+   nextSym     = s->save_nextSym;
+   nblockMAX   = s->save_nblockMAX;
+   nblock      = s->save_nblock;
+   es          = s->save_es;
+   N           = s->save_N;
+   curr        = s->save_curr;
+   zt          = s->save_zt;
+   zn          = s->save_zn; 
+   zvec        = s->save_zvec;
+   zj          = s->save_zj;
+   gSel        = s->save_gSel;
+   gMinlen     = s->save_gMinlen;
+   gLimit      = s->save_gLimit;
+   gBase       = s->save_gBase;
+   gPerm       = s->save_gPerm;
+
+   retVal = BZ_OK;
+
+   switch (s->state) {
+
+      GET_UCHAR(BZ_X_MAGIC_1, uc);
+      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_2, uc);
+      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_3, uc)
+      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
+      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
+          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
+      s->blockSize100k -= BZ_HDR_0;
+
+      if (s->smallDecompress) {
+         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
+         s->ll4  = BZALLOC( 
+                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
+                   );
+         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
+      } else {
+         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
+         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
+      }
+
+      GET_UCHAR(BZ_X_BLKHDR_1, uc);
+
+      if (uc == 0x17) goto endhdr_2;
+      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_2, uc);
+      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_3, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_4, uc);
+      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_5, uc);
+      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_6, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+
+      s->currBlockNo++;
+      if (s->verbosity >= 2)
+         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
+ 
+      s->storedBlockCRC = 0;
+      GET_UCHAR(BZ_X_BCRC_1, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_2, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_3, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_4, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+
+      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
+
+      s->origPtr = 0;
+      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+
+      if (s->origPtr < 0)
+         RETURN(BZ_DATA_ERROR);
+      if (s->origPtr > 10 + 100000*s->blockSize100k) 
+         RETURN(BZ_DATA_ERROR);
+
+      /*--- Receive the mapping table ---*/
+      for (i = 0; i < 16; i++) {
+         GET_BIT(BZ_X_MAPPING_1, uc);
+         if (uc == 1) 
+            s->inUse16[i] = True; else 
+            s->inUse16[i] = False;
+      }
+
+      for (i = 0; i < 256; i++) s->inUse[i] = False;
+
+      for (i = 0; i < 16; i++)
+         if (s->inUse16[i])
+            for (j = 0; j < 16; j++) {
+               GET_BIT(BZ_X_MAPPING_2, uc);
+               if (uc == 1) s->inUse[i * 16 + j] = True;
+            }
+      makeMaps_d ( s );
+      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
+      alphaSize = s->nInUse+2;
+
+      /*--- Now the selectors ---*/
+      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
+      if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
+      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
+      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
+      for (i = 0; i < nSelectors; i++) {
+         j = 0;
+         while (True) {
+            GET_BIT(BZ_X_SELECTOR_3, uc);
+            if (uc == 0) break;
+            j++;
+            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
+         }
+         s->selectorMtf[i] = j;
+      }
+
+      /*--- Undo the MTF values for the selectors. ---*/
+      {
+         UChar pos[BZ_N_GROUPS], tmp, v;
+         for (v = 0; v < nGroups; v++) pos[v] = v;
+   
+         for (i = 0; i < nSelectors; i++) {
+            v = s->selectorMtf[i];
+            tmp = pos[v];
+            while (v > 0) { pos[v] = pos[v-1]; v--; }
+            pos[0] = tmp;
+            s->selector[i] = tmp;
+         }
+      }
+
+      /*--- Now the coding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         GET_BITS(BZ_X_CODING_1, curr, 5);
+         for (i = 0; i < alphaSize; i++) {
+            while (True) {
+               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
+               GET_BIT(BZ_X_CODING_2, uc);
+               if (uc == 0) break;
+               GET_BIT(BZ_X_CODING_3, uc);
+               if (uc == 0) curr++; else curr--;
+            }
+            s->len[t][i] = curr;
+         }
+      }
+
+      /*--- Create the Huffman decoding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         minLen = 32;
+         maxLen = 0;
+         for (i = 0; i < alphaSize; i++) {
+            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+            if (s->len[t][i] < minLen) minLen = s->len[t][i];
+         }
+         BZ2_hbCreateDecodeTables ( 
+            &(s->limit[t][0]), 
+            &(s->base[t][0]), 
+            &(s->perm[t][0]), 
+            &(s->len[t][0]),
+            minLen, maxLen, alphaSize
+         );
+         s->minLens[t] = minLen;
+      }
+
+      /*--- Now the MTF values ---*/
+
+      EOB      = s->nInUse+1;
+      nblockMAX = 100000 * s->blockSize100k;
+      groupNo  = -1;
+      groupPos = 0;
+
+      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
+
+      /*-- MTF init --*/
+      {
+         Int32 ii, jj, kk;
+         kk = MTFA_SIZE-1;
+         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
+            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
+               kk--;
+            }
+            s->mtfbase[ii] = kk + 1;
+         }
+      }
+      /*-- end MTF init --*/
+
+      nblock = 0;
+      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
+
+      while (True) {
+
+         if (nextSym == EOB) break;
+
+         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
+
+            es = -1;
+            N = 1;
+            do {
+               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
+               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
+               N = N * 2;
+               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
+            }
+               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
+
+            es++;
+            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
+            s->unzftab[uc] += es;
+
+            if (s->smallDecompress)
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->ll16[nblock] = (UInt16)uc;
+                  nblock++;
+                  es--;
+               }
+            else
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->tt[nblock] = (UInt32)uc;
+                  nblock++;
+                  es--;
+               };
+
+            continue;
+
+         } else {
+
+            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+
+            /*-- uc = MTF ( nextSym-1 ) --*/
+            {
+               Int32 ii, jj, kk, pp, lno, off;
+               UInt32 nn;
+               nn = (UInt32)(nextSym - 1);
+
+               if (nn < MTFL_SIZE) {
+                  /* avoid general-case expense */
+                  pp = s->mtfbase[0];
+                  uc = s->mtfa[pp+nn];
+                  while (nn > 3) {
+                     Int32 z = pp+nn;
+                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
+                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
+                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
+                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
+                     nn -= 4;
+                  }
+                  while (nn > 0) { 
+                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
+                  };
+                  s->mtfa[pp] = uc;
+               } else { 
+                  /* general case */
+                  lno = nn / MTFL_SIZE;
+                  off = nn % MTFL_SIZE;
+                  pp = s->mtfbase[lno] + off;
+                  uc = s->mtfa[pp];
+                  while (pp > s->mtfbase[lno]) { 
+                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
+                  };
+                  s->mtfbase[lno]++;
+                  while (lno > 0) {
+                     s->mtfbase[lno]--;
+                     s->mtfa[s->mtfbase[lno]] 
+                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
+                     lno--;
+                  }
+                  s->mtfbase[0]--;
+                  s->mtfa[s->mtfbase[0]] = uc;
+                  if (s->mtfbase[0] == 0) {
+                     kk = MTFA_SIZE-1;
+                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
+                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
+                           kk--;
+                        }
+                        s->mtfbase[ii] = kk + 1;
+                     }
+                  }
+               }
+            }
+            /*-- end uc = MTF ( nextSym-1 ) --*/
+
+            s->unzftab[s->seqToUnseq[uc]]++;
+            if (s->smallDecompress)
+               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
+               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
+            nblock++;
+
+            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
+            continue;
+         }
+      }
+
+      /* Now we know what nblock is, we can do a better sanity
+         check on s->origPtr.
+      */
+      if (s->origPtr < 0 || s->origPtr >= nblock)
+         RETURN(BZ_DATA_ERROR);
+
+      /*-- Set up cftab to facilitate generation of T^(-1) --*/
+      s->cftab[0] = 0;
+      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
+      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
+      for (i = 0; i <= 256; i++) {
+         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
+            /* s->cftab[i] can legitimately be == nblock */
+            RETURN(BZ_DATA_ERROR);
+         }
+      }
+
+      s->state_out_len = 0;
+      s->state_out_ch  = 0;
+      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
+      s->state = BZ_X_OUTPUT;
+      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
+
+      if (s->smallDecompress) {
+
+         /*-- Make a copy of cftab, used in generation of T --*/
+         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
+
+         /*-- compute the T vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->ll16[i]);
+            SET_LL(i, s->cftabCopy[uc]);
+            s->cftabCopy[uc]++;
+         }
+
+         /*-- Compute T^(-1) by pointer reversal on T --*/
+         i = s->origPtr;
+         j = GET_LL(i);
+         do {
+            Int32 tmp = GET_LL(j);
+            SET_LL(j, i);
+            i = j;
+            j = tmp;
+         }
+            while (i != s->origPtr);
+
+         s->tPos = s->origPtr;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+         }
+
+      } else {
+
+         /*-- compute the T^(-1) vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->tt[i] & 0xff);
+            s->tt[s->cftab[uc]] |= (i << 8);
+            s->cftab[uc]++;
+         }
+
+         s->tPos = s->tt[s->origPtr] >> 8;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+         }
+
+      }
+
+      RETURN(BZ_OK);
+
+
+
+    endhdr_2:
+
+      GET_UCHAR(BZ_X_ENDHDR_2, uc);
+      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_3, uc);
+      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_4, uc);
+      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_5, uc);
+      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_6, uc);
+      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
+
+      s->storedCombinedCRC = 0;
+      GET_UCHAR(BZ_X_CCRC_1, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_2, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_3, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_4, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+
+      s->state = BZ_X_IDLE;
+      RETURN(BZ_STREAM_END);
+
+      default: AssertH ( False, 4001 );
+   }
+
+   AssertH ( False, 4002 );
+
+   save_state_and_return:
+
+   s->save_i           = i;
+   s->save_j           = j;
+   s->save_t           = t;
+   s->save_alphaSize   = alphaSize;
+   s->save_nGroups     = nGroups;
+   s->save_nSelectors  = nSelectors;
+   s->save_EOB         = EOB;
+   s->save_groupNo     = groupNo;
+   s->save_groupPos    = groupPos;
+   s->save_nextSym     = nextSym;
+   s->save_nblockMAX   = nblockMAX;
+   s->save_nblock      = nblock;
+   s->save_es          = es;
+   s->save_N           = N;
+   s->save_curr        = curr;
+   s->save_zt          = zt;
+   s->save_zn          = zn;
+   s->save_zvec        = zvec;
+   s->save_zj          = zj;
+   s->save_gSel        = gSel;
+   s->save_gMinlen     = gMinlen;
+   s->save_gLimit      = gLimit;
+   s->save_gBase       = gBase;
+   s->save_gPerm       = gPerm;
+
+   return retVal;   
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                      decompress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/dlltest.c b/win32/3rdparty/bzip2/dlltest.c
new file mode 100644
index 000000000..03fa14620
--- /dev/null
+++ b/win32/3rdparty/bzip2/dlltest.c
@@ -0,0 +1,175 @@
+/*
+   minibz2
+      libbz2.dll test program.
+      by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+      This file is Public Domain.  Welcome any email to me.
+
+   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
+*/
+
+#define BZ_IMPORT
+#include 
+#include 
+#include "bzlib.h"
+#ifdef _WIN32
+#include 
+#endif
+
+
+#ifdef _WIN32
+
+#define BZ2_LIBNAME "libbz2-1.0.2.DLL" 
+
+#include 
+static int BZ2DLLLoaded = 0;
+static HINSTANCE BZ2DLLhLib;
+int BZ2DLLLoadLibrary(void)
+{
+   HINSTANCE hLib;
+
+   if(BZ2DLLLoaded==1){return 0;}
+   hLib=LoadLibrary(BZ2_LIBNAME);
+   if(hLib == NULL){
+      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
+      return -1;
+   }
+   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
+   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
+   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
+   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
+   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
+   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
+   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
+   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
+
+   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
+       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
+       || !BZ2_bzclose || !BZ2_bzerror) {
+      fprintf(stderr,"GetProcAddress failed.\n");
+      return -1;
+   }
+   BZ2DLLLoaded=1;
+   BZ2DLLhLib=hLib;
+   return 0;
+
+}
+int BZ2DLLFreeLibrary(void)
+{
+   if(BZ2DLLLoaded==0){return 0;}
+   FreeLibrary(BZ2DLLhLib);
+   BZ2DLLLoaded=0;
+}
+#endif /* WIN32 */
+
+void usage(void)
+{
+   puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
+}
+
+int main(int argc,char *argv[])
+{
+   int decompress = 0;
+   int level = 9;
+   char *fn_r = NULL;
+   char *fn_w = NULL;
+
+#ifdef _WIN32
+   if(BZ2DLLLoadLibrary()<0){
+      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
+      exit(1);
+   }
+   printf("Loading of %s succeeded.  Library version is %s.\n",
+          BZ2_LIBNAME, BZ2_bzlibVersion() );
+#endif
+   while(++argv,--argc){
+      if(**argv =='-' || **argv=='/'){
+         char *p;
+
+         for(p=*argv+1;*p;p++){
+            if(*p=='d'){
+               decompress = 1;
+            }else if('1'<=*p && *p<='9'){
+               level = *p - '0';
+            }else{
+               usage();
+               exit(1);
+            }
+         }
+      }else{
+         break;
+      }
+   }
+   if(argc>=1){
+      fn_r = *argv;
+      argc--;argv++;
+   }else{
+      fn_r = NULL;
+   }
+   if(argc>=1){
+      fn_w = *argv;
+      argc--;argv++;
+   }else{
+      fn_w = NULL;
+   }
+   {
+      int len;
+      char buff[0x1000];
+      char mode[10];
+
+      if(decompress){
+         BZFILE *BZ2fp_r = NULL;
+         FILE *fp_w = NULL;
+
+         if(fn_w){
+            if((fp_w = fopen(fn_w,"wb"))==NULL){
+               printf("can't open [%s]\n",fn_w);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_w = stdout;
+         }
+         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
+            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
+            fwrite(buff,1,len,fp_w);
+         }
+         BZ2_bzclose(BZ2fp_r);
+         if(fp_w != stdout) fclose(fp_w);
+      }else{
+         BZFILE *BZ2fp_w = NULL;
+         FILE *fp_r = NULL;
+
+         if(fn_r){
+            if((fp_r = fopen(fn_r,"rb"))==NULL){
+               printf("can't open [%s]\n",fn_r);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_r = stdin;
+         }
+         mode[0]='w';
+         mode[1] = '0' + level;
+         mode[2] = '\0';
+
+         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
+            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=fread(buff,1,0x1000,fp_r))>0){
+            BZ2_bzwrite(BZ2fp_w,buff,len);
+         }
+         BZ2_bzclose(BZ2fp_w);
+         if(fp_r!=stdin)fclose(fp_r);
+      }
+   }
+#ifdef _WIN32
+   BZ2DLLFreeLibrary();
+#endif
+   return 0;
+}
diff --git a/win32/3rdparty/bzip2/dlltest.dsp b/win32/3rdparty/bzip2/dlltest.dsp
new file mode 100644
index 000000000..4b1615edc
--- /dev/null
+++ b/win32/3rdparty/bzip2/dlltest.dsp
@@ -0,0 +1,93 @@
+# Microsoft Developer Studio Project File - Name="dlltest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** ҏWȂł **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=dlltest - Win32 Debug
+!MESSAGE ͗LҲ̧قł͂܂B ۼުĂނ邽߂ɂ NMAKE gpĂB
+!MESSAGE [Ҳ̧ق̴߰] ނgpĎsĂ
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak".
+!MESSAGE 
+!MESSAGE NMAKE ̎sɍ\wł܂
+!MESSAGE  ײݏϸۂ̐ݒ`܂B:
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak" CFG="dlltest - Win32 Debug"
+!MESSAGE 
+!MESSAGE I”\ Ӱ:
+!MESSAGE 
+!MESSAGE "dlltest - Win32 Release" ("Win32 (x86) Console Application" p)
+!MESSAGE "dlltest - Win32 Debug" ("Win32 (x86) Console Application" p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "dlltest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"minibz2.exe"
+
+!ELSEIF  "$(CFG)" == "dlltest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "dlltest_"
+# PROP BASE Intermediate_Dir "dlltest_"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "dlltest_"
+# PROP Intermediate_Dir "dlltest_"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"minibz2.exe" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "dlltest - Win32 Release"
+# Name "dlltest - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dlltest.c
+# End Source File
+# End Target
+# End Project
diff --git a/win32/3rdparty/bzip2/entities.xml b/win32/3rdparty/bzip2/entities.xml
new file mode 100644
index 000000000..e9e0553b7
--- /dev/null
+++ b/win32/3rdparty/bzip2/entities.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/win32/3rdparty/bzip2/format.pl b/win32/3rdparty/bzip2/format.pl
new file mode 100644
index 000000000..1928d1573
--- /dev/null
+++ b/win32/3rdparty/bzip2/format.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+#
+# ------------------------------------------------------------------
+# This file is part of bzip2/libbzip2, a program and library for
+# lossless, block-sorting data compression.
+#
+# bzip2/libbzip2 version 1.0.5 of 10 December 2007
+# Copyright (C) 1996-2007 Julian Seward 
+#
+# Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+# README file.
+#
+# This program is released under the terms of the license contained
+# in the file LICENSE.
+# ------------------------------------------------------------------
+#
+use strict;
+
+# get command line values:
+if ( $#ARGV !=1 ) {
+    die "Usage:  $0 xml_infile xml_outfile\n";
+}
+
+my $infile = shift;
+# check infile exists
+die "Can't find file \"$infile\""
+  unless -f $infile;
+# check we can read infile
+if (! -r $infile) {
+    die "Can't read input $infile\n";
+}
+# check we can open infile
+open( INFILE,"<$infile" ) or 
+    die "Can't input $infile $!";
+
+#my $outfile = 'fmt-manual.xml';
+my $outfile = shift;
+#print "Infile: $infile, Outfile: $outfile\n";
+# check we can write to outfile
+open( OUTFILE,">$outfile" ) or 
+    die "Can't output $outfile $! for writing";
+
+my ($prev, $curr, $str);
+$prev = ''; $curr = '';
+while (  ) {
+
+		print OUTFILE $prev;
+    $prev = $curr;
+    $curr = $_;
+    $str = '';
+
+    if ( $prev =~ /$|$/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "|<\/screen>/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "]]>", $curr );
+				$prev = '';
+        next;
+    }
+}
+print OUTFILE $curr;
+close INFILE;
+close OUTFILE;
+exit;
diff --git a/win32/3rdparty/bzip2/huffman.c b/win32/3rdparty/bzip2/huffman.c
new file mode 100644
index 000000000..87e79e38a
--- /dev/null
+++ b/win32/3rdparty/bzip2/huffman.c
@@ -0,0 +1,205 @@
+
+/*-------------------------------------------------------------*/
+/*--- Huffman coding low-level stuff                        ---*/
+/*---                                             huffman.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.5 of 10 December 2007
+   Copyright (C) 1996-2007 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------------*/
+#define WEIGHTOF(zz0)  ((zz0) & 0xffffff00)
+#define DEPTHOF(zz1)   ((zz1) & 0x000000ff)
+#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
+
+#define ADDWEIGHTS(zw1,zw2)                           \
+   (WEIGHTOF(zw1)+WEIGHTOF(zw2)) |                    \
+   (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
+
+#define UPHEAP(z)                                     \
+{                                                     \
+   Int32 zz, tmp;                                     \
+   zz = z; tmp = heap[zz];                            \
+   while (weight[tmp] < weight[heap[zz >> 1]]) {      \
+      heap[zz] = heap[zz >> 1];                       \
+      zz >>= 1;                                       \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+#define DOWNHEAP(z)                                   \
+{                                                     \
+   Int32 zz, yy, tmp;                                 \
+   zz = z; tmp = heap[zz];                            \
+   while (True) {                                     \
+      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;                                    \
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbMakeCodeLengths ( UChar *len, 
+                             Int32 *freq,
+                             Int32 alphaSize,
+                             Int32 maxLen )
+{
+   /*--
+      Nodes and heap entries run from 1.  Entry 0
+      for both the heap and nodes is a sentinel.
+   --*/
+   Int32 nNodes, nHeap, n1, n2, i, j, k;
+   Bool  tooLong;
+
+   Int32 heap   [ BZ_MAX_ALPHA_SIZE + 2 ];
+   Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
+   Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; 
+
+   for (i = 0; i < alphaSize; i++)
+      weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
+
+   while (True) {
+
+      nNodes = alphaSize;
+      nHeap = 0;
+
+      heap[0] = 0;
+      weight[0] = 0;
+      parent[0] = -2;
+
+      for (i = 1; i <= alphaSize; i++) {
+         parent[i] = -1;
+         nHeap++;
+         heap[nHeap] = i;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
+   
+      while (nHeap > 1) {
+         n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         nNodes++;
+         parent[n1] = parent[n2] = nNodes;
+         weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
+         parent[nNodes] = -1;
+         nHeap++;
+         heap[nHeap] = nNodes;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
+
+      tooLong = False;
+      for (i = 1; i <= alphaSize; i++) {
+         j = 0;
+         k = i;
+         while (parent[k] >= 0) { k = parent[k]; j++; }
+         len[i-1] = j;
+         if (j > maxLen) tooLong = True;
+      }
+      
+      if (! tooLong) break;
+
+      /* 17 Oct 04: keep-going condition for the following loop used
+         to be 'i < alphaSize', which missed the last element,
+         theoretically leading to the possibility of the compressor
+         looping.  However, this count-scaling step is only needed if
+         one of the generated Huffman code words is longer than
+         maxLen, which up to and including version 1.0.2 was 20 bits,
+         which is extremely unlikely.  In version 1.0.3 maxLen was
+         changed to 17 bits, which has minimal effect on compression
+         ratio, but does mean this scaling step is used from time to
+         time, enough to verify that it works.
+
+         This means that bzip2-1.0.3 and later will only produce
+         Huffman codes with a maximum length of 17 bits.  However, in
+         order to preserve backwards compatibility with bitstreams
+         produced by versions pre-1.0.3, the decompressor must still
+         handle lengths of up to 20. */
+
+      for (i = 1; i <= alphaSize; i++) {
+         j = weight[i] >> 8;
+         j = 1 + (j / 2);
+         weight[i] = j << 8;
+      }
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbAssignCodes ( Int32 *code,
+                         UChar *length,
+                         Int32 minLen,
+                         Int32 maxLen,
+                         Int32 alphaSize )
+{
+   Int32 n, vec, i;
+
+   vec = 0;
+   for (n = minLen; n <= maxLen; n++) {
+      for (i = 0; i < alphaSize; i++)
+         if (length[i] == n) { code[i] = vec; vec++; };
+      vec <<= 1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbCreateDecodeTables ( Int32 *limit,
+                                Int32 *base,
+                                Int32 *perm,
+                                UChar *length,
+                                Int32 minLen,
+                                Int32 maxLen,
+                                Int32 alphaSize )
+{
+   Int32 pp, i, j, vec;
+
+   pp = 0;
+   for (i = minLen; i <= maxLen; i++)
+      for (j = 0; j < alphaSize; j++)
+         if (length[j] == i) { perm[pp] = j; pp++; };
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
+   for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
+
+   for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
+   vec = 0;
+
+   for (i = minLen; i <= maxLen; i++) {
+      vec += (base[i+1] - base[i]);
+      limit[i] = vec-1;
+      vec <<= 1;
+   }
+   for (i = minLen + 1; i <= maxLen; i++)
+      base[i] = ((limit[i-1] + 1) << 1) - base[i];
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                         huffman.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/win32/3rdparty/bzip2/libbz2.def b/win32/3rdparty/bzip2/libbz2.def
new file mode 100644
index 000000000..2dc0dd891
--- /dev/null
+++ b/win32/3rdparty/bzip2/libbz2.def
@@ -0,0 +1,27 @@
+LIBRARY			LIBBZ2
+DESCRIPTION		"libbzip2: library for data compression"
+EXPORTS
+	BZ2_bzCompressInit
+	BZ2_bzCompress
+	BZ2_bzCompressEnd
+	BZ2_bzDecompressInit
+	BZ2_bzDecompress
+	BZ2_bzDecompressEnd
+	BZ2_bzReadOpen
+	BZ2_bzReadClose
+	BZ2_bzReadGetUnused
+	BZ2_bzRead
+	BZ2_bzWriteOpen
+	BZ2_bzWrite
+	BZ2_bzWriteClose
+	BZ2_bzWriteClose64
+	BZ2_bzBuffToBuffCompress
+	BZ2_bzBuffToBuffDecompress
+	BZ2_bzlibVersion
+	BZ2_bzopen
+	BZ2_bzdopen
+	BZ2_bzread
+	BZ2_bzwrite
+	BZ2_bzflush
+	BZ2_bzclose
+	BZ2_bzerror
diff --git a/win32/3rdparty/bzip2/libbz2.dsp b/win32/3rdparty/bzip2/libbz2.dsp
new file mode 100644
index 000000000..a21a20f75
--- /dev/null
+++ b/win32/3rdparty/bzip2/libbz2.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="libbz2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** ҏWȂł **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libbz2 - Win32 Debug
+!MESSAGE ͗LҲ̧قł͂܂B ۼުĂނ邽߂ɂ NMAKE gpĂB
+!MESSAGE [Ҳ̧ق̴߰] ނgpĎsĂ
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak".
+!MESSAGE 
+!MESSAGE NMAKE ̎sɍ\wł܂
+!MESSAGE  ײݏϸۂ̐ݒ`܂B:
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak" CFG="libbz2 - Win32 Debug"
+!MESSAGE 
+!MESSAGE I”\ Ӱ:
+!MESSAGE 
+!MESSAGE "libbz2 - Win32 Release" ("Win32 (x86) Dynamic-Link Library" p)
+!MESSAGE "libbz2 - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libbz2 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"libbz2.dll"
+
+!ELSEIF  "$(CFG)" == "libbz2 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"libbz2.dll" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libbz2 - Win32 Release"
+# Name "libbz2 - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\blocksort.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib_private.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\crctable.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\decompress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\libbz2.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\randtable.c
+# End Source File
+# End Target
+# End Project
diff --git a/win32/3rdparty/bzip2/makefile.msc b/win32/3rdparty/bzip2/makefile.msc
new file mode 100644
index 000000000..799a18a5f
--- /dev/null
+++ b/win32/3rdparty/bzip2/makefile.msc
@@ -0,0 +1,63 @@
+# Makefile for Microsoft Visual C++ 6.0
+# usage: nmake -f makefile.msc
+# K.M. Syring (syring@gsf.de)
+# Fixed up by JRS for bzip2-0.9.5d release.
+
+CC=cl
+CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo
+
+OBJS= blocksort.obj  \
+      huffman.obj    \
+      crctable.obj   \
+      randtable.obj  \
+      compress.obj   \
+      decompress.obj \
+      bzlib.obj
+
+all: lib bzip2 test
+
+bzip2: lib
+	$(CC) $(CFLAGS) -o bzip2 bzip2.c libbz2.lib setargv.obj
+	$(CC) $(CFLAGS) -o bzip2recover bzip2recover.c
+
+lib: $(OBJS)
+	lib /out:libbz2.lib $(OBJS)
+
+test: bzip2
+	type words1
+	.\\bzip2 -1  < sample1.ref > sample1.rb2
+	.\\bzip2 -2  < sample2.ref > sample2.rb2
+	.\\bzip2 -3  < sample3.ref > sample3.rb2
+	.\\bzip2 -d  < sample1.bz2 > sample1.tst
+	.\\bzip2 -d  < sample2.bz2 > sample2.tst
+	.\\bzip2 -ds < sample3.bz2 > sample3.tst
+	@echo All six of the fc's should find no differences.
+	@echo If fc finds an error on sample3.bz2, this could be
+	@echo because WinZip's 'TAR file smart CR/LF conversion'
+	@echo is too clever for its own good.  Disable this option.
+	@echo The correct size for sample3.ref is 120,244.  If it
+	@echo is 150,251, WinZip has messed it up.
+	fc sample1.bz2 sample1.rb2 
+	fc sample2.bz2 sample2.rb2
+	fc sample3.bz2 sample3.rb2
+	fc sample1.tst sample1.ref
+	fc sample2.tst sample2.ref
+	fc sample3.tst sample3.ref
+
+
+
+clean: 
+	del *.obj
+	del libbz2.lib 
+	del bzip2.exe
+	del bzip2recover.exe
+	del sample1.rb2 
+	del sample2.rb2 
+	del sample3.rb2
+	del sample1.tst 
+	del sample2.tst
+	del sample3.tst
+
+.c.obj: 
+	$(CC) $(CFLAGS) -c $*.c -o $*.obj
+
diff --git a/win32/3rdparty/bzip2/manual.html b/win32/3rdparty/bzip2/manual.html
new file mode 100644
index 000000000..bd9eac859
--- /dev/null
+++ b/win32/3rdparty/bzip2/manual.html
@@ -0,0 +1,2540 @@
+
+
+
+bzip2 and libbzip2, version 1.0.5
+
+
+
+
+
+
+

+bzip2 and libbzip2, version 1.0.5

+

A program and library for data compression

+
+

+Julian Seward +

+
http://www.bzip.org
+
+

Version 1.0.5 of 10 December 2007

+
+
+

This program, bzip2, the + associated library libbzip2, and + all documentation, are copyright 1996-2007 Julian Seward. + All rights reserved.

+

Redistribution and use in source and binary forms, with + or without modification, are permitted provided that the + following conditions are met:

+
    +
  • Redistributions of source code must retain the + above copyright notice, this list of conditions and the + following disclaimer.

  • +
  • The origin of this software must not be + misrepresented; you must not claim that you wrote the original + software. If you use this software in a product, an + acknowledgment in the product documentation would be + appreciated but is not required.

  • +
  • Altered source versions must be plainly marked + as such, and must not be misrepresented as being the original + software.

  • +
  • The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission.

  • +
+

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE.

+

PATENTS: To the best of my knowledge, + bzip2 and + libbzip2 do not use any patented + algorithms. However, I do not have the resources to carry + out a patent search. Therefore I cannot give any guarantee of + the above statement. +

+
+
+
+
+ +
+

+1.Introduction

+

bzip2 compresses files +using the Burrows-Wheeler block-sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors.

+

bzip2 is built on top of +libbzip2, a flexible library for +handling compressed data in the +bzip2 format. This manual +describes both how to use the program and how to work with the +library interface. Most of the manual is devoted to this +library, not the program, which is good news if your interest is +only in the program.

+
    +
  • How to use bzip2 describes how to use + bzip2; this is the only part + you need to read if you just want to know how to operate the + program.

  • +
  • Programming with libbzip2 describes the + programming interfaces in detail, and

  • +
  • Miscellanea records some + miscellaneous notes which I thought ought to be recorded + somewhere.

  • +
+
+
+

+2.How to use bzip2

+ +

This chapter contains a copy of the +bzip2 man page, and nothing +else.

+
+

+2.1.NAME

+
    +
  • bzip2, + bunzip2 - a block-sorting file + compressor, v1.0.4

  • +
  • bzcat - + decompresses files to stdout

  • +
  • bzip2recover - + recovers data from damaged bzip2 files

  • +
+
+
+

+2.2.SYNOPSIS

+
    +
  • bzip2 [ + -cdfkqstvzVL123456789 ] [ filenames ... ]

  • +
  • bunzip2 [ + -fkvsVL ] [ filenames ... ]

  • +
  • bzcat [ -s ] [ + filenames ... ]

  • +
  • bzip2recover + filename

  • +
+
+
+

+2.3.DESCRIPTION

+

bzip2 compresses files +using the Burrows-Wheeler block sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors.

+

The command-line options are deliberately very similar to +those of GNU gzip, but they are +not identical.

+

bzip2 expects a list of +file names to accompany the command-line flags. Each file is +replaced by a compressed version of itself, with the name +original_name.bz2. Each +compressed file has the same modification date, permissions, and, +when possible, ownership as the corresponding original, so that +these properties can be correctly restored at decompression time. +File name handling is naive in the sense that there is no +mechanism for preserving original file names, permissions, +ownerships or dates in filesystems which lack these concepts, or +have serious file name length restrictions, such as +MS-DOS.

+

bzip2 and +bunzip2 will by default not +overwrite existing files. If you want this to happen, specify +the -f flag.

+

If no file names are specified, +bzip2 compresses from standard +input to standard output. In this case, +bzip2 will decline to write +compressed output to a terminal, as this would be entirely +incomprehensible and therefore pointless.

+

bunzip2 (or +bzip2 -d) decompresses all +specified files. Files which were not created by +bzip2 will be detected and +ignored, and a warning issued. +bzip2 attempts to guess the +filename for the decompressed file from that of the compressed +file as follows:

+
    +
  • filename.bz2 + becomes + filename

  • +
  • filename.bz + becomes + filename

  • +
  • filename.tbz2 + becomes + filename.tar

  • +
  • filename.tbz + becomes + filename.tar

  • +
  • anyothername + becomes + anyothername.out

  • +
+

If the file does not end in one of the recognised endings, +.bz2, +.bz, +.tbz2 or +.tbz, +bzip2 complains that it cannot +guess the name of the original file, and uses the original name +with .out appended.

+

As with compression, supplying no filenames causes +decompression from standard input to standard output.

+

bunzip2 will correctly +decompress a file which is the concatenation of two or more +compressed files. The result is the concatenation of the +corresponding uncompressed files. Integrity testing +(-t) of concatenated compressed +files is also supported.

+

You can also compress or decompress files to the standard +output by giving the -c flag. +Multiple files may be compressed and decompressed like this. The +resulting outputs are fed sequentially to stdout. Compression of +multiple files in this manner generates a stream containing +multiple compressed file representations. Such a stream can be +decompressed correctly only by +bzip2 version 0.9.0 or later. +Earlier versions of bzip2 will +stop after decompressing the first file in the stream.

+

bzcat (or +bzip2 -dc) decompresses all +specified files to the standard output.

+

bzip2 will read arguments +from the environment variables +BZIP2 and +BZIP, in that order, and will +process them before any arguments read from the command line. +This gives a convenient way to supply default arguments.

+

Compression is always performed, even if the compressed +file is slightly larger than the original. Files of less than +about one hundred bytes tend to get larger, since the compression +mechanism has a constant overhead in the region of 50 bytes. +Random data (including the output of most file compressors) is +coded at about 8.05 bits per byte, giving an expansion of around +0.5%.

+

As a self-check for your protection, +bzip2 uses 32-bit CRCs to make +sure that the decompressed version of a file is identical to the +original. This guards against corruption of the compressed data, +and against undetected bugs in +bzip2 (hopefully very unlikely). +The chances of data corruption going undetected is microscopic, +about one chance in four billion for each file processed. Be +aware, though, that the check occurs upon decompression, so it +can only tell you that something is wrong. It can't help you +recover the original uncompressed data. You can use +bzip2recover to try to recover +data from damaged files.

+

Return values: 0 for a normal exit, 1 for environmental +problems (file not found, invalid flags, I/O errors, etc.), 2 +to indicate a corrupt compressed file, 3 for an internal +consistency error (eg, bug) which caused +bzip2 to panic.

+
+
+

+2.4.OPTIONS

+
+
-c --stdout
+

Compress or decompress to standard + output.

+
-d --decompress
+

Force decompression. + bzip2, + bunzip2 and + bzcat are really the same + program, and the decision about what actions to take is done on + the basis of which name is used. This flag overrides that + mechanism, and forces bzip2 to decompress.

+
-z --compress
+

The complement to + -d: forces compression, + regardless of the invokation name.

+
-t --test
+

Check integrity of the specified file(s), but + don't decompress them. This really performs a trial + decompression and throws away the result.

+
-f --force
+
+

Force overwrite of output files. Normally, + bzip2 will not overwrite + existing output files. Also forces + bzip2 to break hard links to + files, which it otherwise wouldn't do.

+

bzip2 normally declines + to decompress files which don't have the correct magic header + bytes. If forced (-f), + however, it will pass such files through unmodified. This is + how GNU gzip behaves.

+
+
-k --keep
+

Keep (don't delete) input files during + compression or decompression.

+
-s --small
+
+

Reduce memory usage, for compression, + decompression and testing. Files are decompressed and tested + using a modified algorithm which only requires 2.5 bytes per + block byte. This means any file can be decompressed in 2300k + of memory, albeit at about half the normal speed.

+

During compression, -s + selects a block size of 200k, which limits memory use to around + the same figure, at the expense of your compression ratio. In + short, if your machine is low on memory (8 megabytes or less), + use -s for everything. See + MEMORY MANAGEMENT below.

+
+
-q --quiet
+

Suppress non-essential warning messages. + Messages pertaining to I/O errors and other critical events + will not be suppressed.

+
-v --verbose
+

Verbose mode -- show the compression ratio for + each file processed. Further + -v's increase the verbosity + level, spewing out lots of information which is primarily of + interest for diagnostic purposes.

+
-L --license -V --version
+

Display the software version, license terms and + conditions.

+
-1 (or + --fast) to + -9 (or + -best)
+

Set the block size to 100 k, 200 k ... 900 k + when compressing. Has no effect when decompressing. See MEMORY MANAGEMENT below. The + --fast and + --best aliases are primarily + for GNU gzip compatibility. + In particular, --fast doesn't + make things significantly faster. And + --best merely selects the + default behaviour.

+
--
+

Treats all subsequent arguments as file names, + even if they start with a dash. This is so you can handle + files with names beginning with a dash, for example: + bzip2 -- + -myfilename.

+
+--repetitive-fast, --repetitive-best +
+

These flags are redundant in versions 0.9.5 and + above. They provided some coarse control over the behaviour of + the sorting algorithm in earlier versions, which was sometimes + useful. 0.9.5 and above have an improved algorithm which + renders these flags irrelevant.

+
+
+
+

+2.5.MEMORY MANAGEMENT

+

bzip2 compresses large +files in blocks. The block size affects both the compression +ratio achieved, and the amount of memory needed for compression +and decompression. The flags -1 +through -9 specify the block +size to be 100,000 bytes through 900,000 bytes (the default) +respectively. At decompression time, the block size used for +compression is read from the header of the compressed file, and +bunzip2 then allocates itself +just enough memory to decompress the file. Since block sizes are +stored in compressed files, it follows that the flags +-1 to +-9 are irrelevant to and so +ignored during decompression.

+

Compression and decompression requirements, in bytes, can be +estimated as:

+
Compression:   400k + ( 8 x block size )
+
+Decompression: 100k + ( 4 x block size ), or
+               100k + ( 2.5 x block size )
+

Larger block sizes give rapidly diminishing marginal +returns. Most of the compression comes from the first two or +three hundred k of block size, a fact worth bearing in mind when +using bzip2 on small machines. +It is also important to appreciate that the decompression memory +requirement is set at compression time by the choice of block +size.

+

For files compressed with the default 900k block size, +bunzip2 will require about 3700 +kbytes to decompress. To support decompression of any file on a +4 megabyte machine, bunzip2 has +an option to decompress using approximately half this amount of +memory, about 2300 kbytes. Decompression speed is also halved, +so you should use this option only where necessary. The relevant +flag is -s.

+

In general, try and use the largest block size memory +constraints allow, since that maximises the compression achieved. +Compression and decompression speed are virtually unaffected by +block size.

+

Another significant point applies to files which fit in a +single block -- that means most files you'd encounter using a +large block size. The amount of real memory touched is +proportional to the size of the file, since the file is smaller +than a block. For example, compressing a file 20,000 bytes long +with the flag -9 will cause the +compressor to allocate around 7600k of memory, but only touch +400k + 20000 * 8 = 560 kbytes of it. Similarly, the decompressor +will allocate 3700k but only touch 100k + 20000 * 4 = 180 +kbytes.

+

Here is a table which summarises the maximum memory usage +for different block sizes. Also recorded is the total compressed +size for 14 files of the Calgary Text Compression Corpus +totalling 3,141,622 bytes. This column gives some feel for how +compression varies with block size. These figures tend to +understate the advantage of larger block sizes for larger files, +since the Corpus is dominated by smaller files.

+
        Compress   Decompress   Decompress   Corpus
+Flag     usage      usage       -s usage     Size
+
+ -1      1200k       500k         350k      914704
+ -2      2000k       900k         600k      877703
+ -3      2800k      1300k         850k      860338
+ -4      3600k      1700k        1100k      846899
+ -5      4400k      2100k        1350k      845160
+ -6      5200k      2500k        1600k      838626
+ -7      6100k      2900k        1850k      834096
+ -8      6800k      3300k        2100k      828642
+ -9      7600k      3700k        2350k      828642
+
+
+

+2.6.RECOVERING DATA FROM DAMAGED FILES

+

bzip2 compresses files in +blocks, usually 900kbytes long. Each block is handled +independently. If a media or transmission error causes a +multi-block .bz2 file to become +damaged, it may be possible to recover data from the undamaged +blocks in the file.

+

The compressed representation of each block is delimited by +a 48-bit pattern, which makes it possible to find the block +boundaries with reasonable certainty. Each block also carries +its own 32-bit CRC, so damaged blocks can be distinguished from +undamaged ones.

+

bzip2recover is a simple +program whose purpose is to search for blocks in +.bz2 files, and write each block +out into its own .bz2 file. You +can then use bzip2 -t to test +the integrity of the resulting files, and decompress those which +are undamaged.

+

bzip2recover takes a +single argument, the name of the damaged file, and writes a +number of files rec0001file.bz2, +rec0002file.bz2, etc, containing +the extracted blocks. The output filenames are designed so that +the use of wildcards in subsequent processing -- for example, +bzip2 -dc rec*file.bz2 > +recovered_data -- lists the files in the correct +order.

+

bzip2recover should be of +most use dealing with large .bz2 +files, as these will contain many blocks. It is clearly futile +to use it on damaged single-block files, since a damaged block +cannot be recovered. If you wish to minimise any potential data +loss through media or transmission errors, you might consider +compressing with a smaller block size.

+
+
+

+2.7.PERFORMANCE NOTES

+

The sorting phase of compression gathers together similar +strings in the file. Because of this, files containing very long +runs of repeated symbols, like "aabaabaabaab ..." (repeated +several hundred times) may compress more slowly than normal. +Versions 0.9.5 and above fare much better than previous versions +in this respect. The ratio between worst-case and average-case +compression time is in the region of 10:1. For previous +versions, this figure was more like 100:1. You can use the +-vvvv option to monitor progress +in great detail, if you want.

+

Decompression speed is unaffected by these +phenomena.

+

bzip2 usually allocates +several megabytes of memory to operate in, and then charges all +over it in a fairly random fashion. This means that performance, +both for compressing and decompressing, is largely determined by +the speed at which your machine can service cache misses. +Because of this, small changes to the code to reduce the miss +rate have been observed to give disproportionately large +performance improvements. I imagine +bzip2 will perform best on +machines with very large caches.

+
+
+

+2.8.CAVEATS

+

I/O error messages are not as helpful as they could be. +bzip2 tries hard to detect I/O +errors and exit cleanly, but the details of what the problem is +sometimes seem rather misleading.

+

This manual page pertains to version 1.0.5 of +bzip2. Compressed data created by +this version is entirely forwards and backwards compatible with the +previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0, +1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and +above can correctly decompress multiple concatenated compressed files. +0.1pl2 cannot do this; it will stop after decompressing just the first +file in the stream.

+

bzip2recover versions +prior to 1.0.2 used 32-bit integers to represent bit positions in +compressed files, so it could not handle compressed files more +than 512 megabytes long. Versions 1.0.2 and above use 64-bit ints +on some platforms which support them (GNU supported targets, and +Windows). To establish whether or not +bzip2recover was built with such +a limitation, run it without arguments. In any event you can +build yourself an unlimited version if you can recompile it with +MaybeUInt64 set to be an +unsigned 64-bit integer.

+
+
+

+2.9.AUTHOR

+

Julian Seward, +jseward@bzip.org

+

The ideas embodied in +bzip2 are due to (at least) the +following people: Michael Burrows and David Wheeler (for the +block sorting transformation), David Wheeler (again, for the +Huffman coder), Peter Fenwick (for the structured coding model in +the original bzip, and many +refinements), and Alistair Moffat, Radford Neal and Ian Witten +(for the arithmetic coder in the original +bzip). I am much indebted for +their help, support and advice. See the manual in the source +distribution for pointers to sources of documentation. Christian +von Roques encouraged me to look for faster sorting algorithms, +so as to speed up compression. Bela Lubkin encouraged me to +improve the worst-case compression performance. +Donna Robinson XMLised the documentation. +Many people sent +patches, helped with portability problems, lent machines, gave +advice and were generally helpful.

+
+
+
+

+3. +Programming with libbzip2 +

+ +

This chapter describes the programming interface to +libbzip2.

+

For general background information, particularly about +memory use and performance aspects, you'd be well advised to read +How to use bzip2 as well.

+
+

+3.1.Top-level structure

+

libbzip2 is a flexible +library for compressing and decompressing data in the +bzip2 data format. Although +packaged as a single entity, it helps to regard the library as +three separate parts: the low level interface, and the high level +interface, and some utility functions.

+

The structure of +libbzip2's interfaces is similar +to that of Jean-loup Gailly's and Mark Adler's excellent +zlib library.

+

All externally visible symbols have names beginning +BZ2_. This is new in version +1.0. The intention is to minimise pollution of the namespaces of +library clients.

+

To use any part of the library, you need to +#include <bzlib.h> +into your sources.

+
+

+3.1.1.Low-level summary

+

This interface provides services for compressing and +decompressing data in memory. There's no provision for dealing +with files, streams or any other I/O mechanisms, just straight +memory-to-memory work. In fact, this part of the library can be +compiled without inclusion of +stdio.h, which may be helpful +for embedded applications.

+

The low-level part of the library has no global variables +and is therefore thread-safe.

+

Six routines make up the low level interface: +BZ2_bzCompressInit, +BZ2_bzCompress, and +BZ2_bzCompressEnd for +compression, and a corresponding trio +BZ2_bzDecompressInit, +BZ2_bzDecompress and +BZ2_bzDecompressEnd for +decompression. The *Init +functions allocate memory for compression/decompression and do +other initialisations, whilst the +*End functions close down +operations and release memory.

+

The real work is done by +BZ2_bzCompress and +BZ2_bzDecompress. These +compress and decompress data from a user-supplied input buffer to +a user-supplied output buffer. These buffers can be any size; +arbitrary quantities of data are handled by making repeated calls +to these functions. This is a flexible mechanism allowing a +consumer-pull style of activity, or producer-push, or a mixture +of both.

+
+
+

+3.1.2.High-level summary

+

This interface provides some handy wrappers around the +low-level interface to facilitate reading and writing +bzip2 format files +(.bz2 files). The routines +provide hooks to facilitate reading files in which the +bzip2 data stream is embedded +within some larger-scale file structure, or where there are +multiple bzip2 data streams +concatenated end-to-end.

+

For reading files, +BZ2_bzReadOpen, +BZ2_bzRead, +BZ2_bzReadClose and +BZ2_bzReadGetUnused are +supplied. For writing files, +BZ2_bzWriteOpen, +BZ2_bzWrite and +BZ2_bzWriteFinish are +available.

+

As with the low-level library, no global variables are used +so the library is per se thread-safe. However, if I/O errors +occur whilst reading or writing the underlying compressed files, +you may have to consult errno to +determine the cause of the error. In that case, you'd need a C +library which correctly supports +errno in a multithreaded +environment.

+

To make the library a little simpler and more portable, +BZ2_bzReadOpen and +BZ2_bzWriteOpen require you to +pass them file handles (FILE*s) +which have previously been opened for reading or writing +respectively. That avoids portability problems associated with +file operations and file attributes, whilst not being much of an +imposition on the programmer.

+
+
+

+3.1.3.Utility functions summary

+

For very simple needs, +BZ2_bzBuffToBuffCompress and +BZ2_bzBuffToBuffDecompress are +provided. These compress data in memory from one buffer to +another buffer in a single function call. You should assess +whether these functions fulfill your memory-to-memory +compression/decompression requirements before investing effort in +understanding the more general but more complex low-level +interface.

+

Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp) has +contributed some functions to give better +zlib compatibility. These +functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. You may find +these functions more convenient for simple file reading and +writing, than those in the high-level interface. These functions +are not (yet) officially part of the library, and are minimally +documented here. If they break, you get to keep all the pieces. +I hope to document them properly when time permits.

+

Yoshioka also contributed modifications to allow the +library to be built as a Windows DLL.

+
+
+
+

+3.2.Error handling

+

The library is designed to recover cleanly in all +situations, including the worst-case situation of decompressing +random data. I'm not 100% sure that it can always do this, so +you might want to add a signal handler to catch segmentation +violations during decompression if you are feeling especially +paranoid. I would be interested in hearing more about the +robustness of the library to corrupted compressed data.

+

Version 1.0.3 more robust in this respect than any +previous version. Investigations with Valgrind (a tool for detecting +problems with memory management) indicate +that, at least for the few files I tested, all single-bit errors +in the decompressed data are caught properly, with no +segmentation faults, no uses of uninitialised data, no out of +range reads or writes, and no infinite looping in the decompressor. +So it's certainly pretty robust, although +I wouldn't claim it to be totally bombproof.

+

The file bzlib.h contains +all definitions needed to use the library. In particular, you +should definitely not include +bzlib_private.h.

+

In bzlib.h, the various +return values are defined. The following list is not intended as +an exhaustive description of the circumstances in which a given +value may be returned -- those descriptions are given later. +Rather, it is intended to convey the rough meaning of each return +value. The first five actions are normal and not intended to +denote an error situation.

+
+
BZ_OK
+

The requested action was completed + successfully.

+
BZ_RUN_OK, BZ_FLUSH_OK, + BZ_FINISH_OK
+

In + BZ2_bzCompress, the requested + flush/finish/nothing-special action was completed + successfully.

+
BZ_STREAM_END
+

Compression of data was completed, or the + logical stream end was detected during + decompression.

+
+

The following return values indicate an error of some +kind.

+
+
BZ_CONFIG_ERROR
+

Indicates that the library has been improperly + compiled on your platform -- a major configuration error. + Specifically, it means that + sizeof(char), + sizeof(short) and + sizeof(int) are not 1, 2 and + 4 respectively, as they should be. Note that the library + should still work properly on 64-bit platforms which follow + the LP64 programming model -- that is, where + sizeof(long) and + sizeof(void*) are 8. Under + LP64, sizeof(int) is still 4, + so libbzip2, which doesn't + use the long type, is + OK.

+
BZ_SEQUENCE_ERROR
+

When using the library, it is important to call + the functions in the correct sequence and with data structures + (buffers etc) in the correct states. + libbzip2 checks as much as it + can to ensure this is happening, and returns + BZ_SEQUENCE_ERROR if not. + Code which complies precisely with the function semantics, as + detailed below, should never receive this value; such an event + denotes buggy code which you should + investigate.

+
BZ_PARAM_ERROR
+

Returned when a parameter to a function call is + out of range or otherwise manifestly incorrect. As with + BZ_SEQUENCE_ERROR, this + denotes a bug in the client code. The distinction between + BZ_PARAM_ERROR and + BZ_SEQUENCE_ERROR is a bit + hazy, but still worth making.

+
BZ_MEM_ERROR
+

Returned when a request to allocate memory + failed. Note that the quantity of memory needed to decompress + a stream cannot be determined until the stream's header has + been read. So + BZ2_bzDecompress and + BZ2_bzRead may return + BZ_MEM_ERROR even though some + of the compressed data has been read. The same is not true + for compression; once + BZ2_bzCompressInit or + BZ2_bzWriteOpen have + successfully completed, + BZ_MEM_ERROR cannot + occur.

+
BZ_DATA_ERROR
+

Returned when a data integrity error is + detected during decompression. Most importantly, this means + when stored and computed CRCs for the data do not match. This + value is also returned upon detection of any other anomaly in + the compressed data.

+
BZ_DATA_ERROR_MAGIC
+

As a special case of + BZ_DATA_ERROR, it is + sometimes useful to know when the compressed stream does not + start with the correct magic bytes ('B' 'Z' + 'h').

+
BZ_IO_ERROR
+

Returned by + BZ2_bzRead and + BZ2_bzWrite when there is an + error reading or writing in the compressed file, and by + BZ2_bzReadOpen and + BZ2_bzWriteOpen for attempts + to use a file for which the error indicator (viz, + ferror(f)) is set. On + receipt of BZ_IO_ERROR, the + caller should consult errno + and/or perror to acquire + operating-system specific information about the + problem.

+
BZ_UNEXPECTED_EOF
+

Returned by + BZ2_bzRead when the + compressed file finishes before the logical end of stream is + detected.

+
BZ_OUTBUFF_FULL
+

Returned by + BZ2_bzBuffToBuffCompress and + BZ2_bzBuffToBuffDecompress to + indicate that the output data will not fit into the output + buffer provided.

+
+
+
+

+3.3.Low-level interface

+
+

+3.3.1.BZ2_bzCompressInit

+
typedef struct {
+  char *next_in;
+  unsigned int avail_in;
+  unsigned int total_in_lo32;
+  unsigned int total_in_hi32;
+
+  char *next_out;
+  unsigned int avail_out;
+  unsigned int total_out_lo32;
+  unsigned int total_out_hi32;
+
+  void *state;
+
+  void *(*bzalloc)(void *,int,int);
+  void (*bzfree)(void *,void *);
+  void *opaque;
+} bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm, 
+                         int blockSize100k, 
+                         int verbosity,
+                         int workFactor );
+

Prepares for compression. The +bz_stream structure holds all +data pertaining to the compression activity. A +bz_stream structure should be +allocated and initialised prior to the call. The fields of +bz_stream comprise the entirety +of the user-visible data. state +is a pointer to the private data structures required for +compression.

+

Custom memory allocators are supported, via fields +bzalloc, +bzfree, and +opaque. The value +opaque is passed to as the first +argument to all calls to bzalloc +and bzfree, but is otherwise +ignored by the library. The call bzalloc ( +opaque, n, m ) is expected to return a pointer +p to n * +m bytes of memory, and bzfree ( +opaque, p ) should free that memory.

+

If you don't want to use a custom memory allocator, set +bzalloc, +bzfree and +opaque to +NULL, and the library will then +use the standard malloc / +free routines.

+

Before calling +BZ2_bzCompressInit, fields +bzalloc, +bzfree and +opaque should be filled +appropriately, as just described. Upon return, the internal +state will have been allocated and initialised, and +total_in_lo32, +total_in_hi32, +total_out_lo32 and +total_out_hi32 will have been +set to zero. These four fields are used by the library to inform +the caller of the total amount of data passed into and out of the +library, respectively. You should not try to change them. As of +version 1.0, 64-bit counts are maintained, even on 32-bit +platforms, using the _hi32 +fields to store the upper 32 bits of the count. So, for example, +the total amount of data in is (total_in_hi32 +<< 32) + total_in_lo32.

+

Parameter blockSize100k +specifies the block size to be used for compression. It should +be a value between 1 and 9 inclusive, and the actual block size +used is 100000 x this figure. 9 gives the best compression but +takes most memory.

+

Parameter verbosity should +be set to a number between 0 and 4 inclusive. 0 is silent, and +greater numbers give increasingly verbose monitoring/debugging +output. If the library has been compiled with +-DBZ_NO_STDIO, no such output +will appear for any verbosity setting.

+

Parameter workFactor +controls how the compression phase behaves when presented with +worst case, highly repetitive, input data. If compression runs +into difficulties caused by repetitive data, the library switches +from the standard sorting algorithm to a fallback algorithm. The +fallback is slower than the standard algorithm by perhaps a +factor of three, but always behaves reasonably, no matter how bad +the input.

+

Lower values of workFactor +reduce the amount of effort the standard algorithm will expend +before resorting to the fallback. You should set this parameter +carefully; too low, and many inputs will be handled by the +fallback algorithm and so compress rather slowly, too high, and +your average-to-worst case compression times can become very +large. The default value of 30 gives reasonable behaviour over a +wide range of circumstances.

+

Allowable values range from 0 to 250 inclusive. 0 is a +special case, equivalent to using the default value of 30.

+

Note that the compressed output generated is the same +regardless of whether or not the fallback algorithm is +used.

+

Be aware also that this parameter may disappear entirely in +future versions of the library. In principle it should be +possible to devise a good way to automatically choose which +algorithm to use. Such a mechanism would render the parameter +obsolete.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if strm is NULL 
+  or blockSize < 1 or blockSize > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR 
+  if not enough memory is available
+BZ_OK 
+  otherwise
+

Allowable next actions:

+
BZ2_bzCompress
+  if BZ_OK is returned
+  no specific action needed in case of error
+
+
+

+3.3.2.BZ2_bzCompress

+
int BZ2_bzCompress ( bz_stream *strm, int action );
+

Provides more input and/or output buffer space for the +library. The caller maintains input and output buffers, and +calls BZ2_bzCompress to transfer +data between them.

+

Before each call to +BZ2_bzCompress, +next_in should point at the data +to be compressed, and avail_in +should indicate how many bytes the library may read. +BZ2_bzCompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read.

+

Similarly, next_out should +point to a buffer in which the compressed data is to be placed, +with avail_out indicating how +much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output.

+

You may provide and remove as little or as much data as you +like on each call of +BZ2_bzCompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call.

+

A second purpose of +BZ2_bzCompress is to request a +change of mode of the compressed stream.

+

Conceptually, a compressed stream can be in one of four +states: IDLE, RUNNING, FLUSHING and FINISHING. Before +initialisation +(BZ2_bzCompressInit) and after +termination (BZ2_bzCompressEnd), +a stream is regarded as IDLE.

+

Upon initialisation +(BZ2_bzCompressInit), the stream +is placed in the RUNNING state. Subsequent calls to +BZ2_bzCompress should pass +BZ_RUN as the requested action; +other actions are illegal and will result in +BZ_SEQUENCE_ERROR.

+

At some point, the calling program will have provided all +the input data it wants to. It will then want to finish up -- in +effect, asking the library to process any data it might have +buffered internally. In this state, +BZ2_bzCompress will no longer +attempt to read data from +next_in, but it will want to +write data to next_out. Because +the output buffer supplied by the user can be arbitrarily small, +the finishing-up operation cannot necessarily be done with a +single call of +BZ2_bzCompress.

+

Instead, the calling program passes +BZ_FINISH as an action to +BZ2_bzCompress. This changes +the stream's state to FINISHING. Any remaining input (ie, +next_in[0 .. avail_in-1]) is +compressed and transferred to the output buffer. To do this, +BZ2_bzCompress must be called +repeatedly until all the output has been consumed. At that +point, BZ2_bzCompress returns +BZ_STREAM_END, and the stream's +state is set back to IDLE. +BZ2_bzCompressEnd should then be +called.

+

Just to make sure the calling program does not cheat, the +library makes a note of avail_in +at the time of the first call to +BZ2_bzCompress which has +BZ_FINISH as an action (ie, at +the time the program has announced its intention to not supply +any more input). By comparing this value with that of +avail_in over subsequent calls +to BZ2_bzCompress, the library +can detect any attempts to slip in more data to compress. Any +calls for which this is detected will return +BZ_SEQUENCE_ERROR. This +indicates a programming mistake which should be corrected.

+

Instead of asking to finish, the calling program may ask +BZ2_bzCompress to take all the +remaining input, compress it and terminate the current +(Burrows-Wheeler) compression block. This could be useful for +error control purposes. The mechanism is analogous to that for +finishing: call BZ2_bzCompress +with an action of BZ_FLUSH, +remove output data, and persist with the +BZ_FLUSH action until the value +BZ_RUN is returned. As with +finishing, BZ2_bzCompress +detects any attempt to provide more input data once the flush has +begun.

+

Once the flush is complete, the stream returns to the +normal RUNNING state.

+

This all sounds pretty complex, but isn't really. Here's a +table which shows which actions are allowable in each state, what +action will be taken, what the next state is, and what the +non-error return values are. Note that you can't explicitly ask +what state the stream is in, but nor do you need to -- it can be +inferred from the values returned by +BZ2_bzCompress.

+
IDLE/any
+  Illegal.  IDLE state only exists after BZ2_bzCompressEnd or
+  before BZ2_bzCompressInit.
+  Return value = BZ_SEQUENCE_ERROR
+
+RUNNING/BZ_RUN
+  Compress from next_in to next_out as much as possible.
+  Next state = RUNNING
+  Return value = BZ_RUN_OK
+
+RUNNING/BZ_FLUSH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FLUSHING
+  Return value = BZ_FLUSH_OK
+
+RUNNING/BZ_FINISH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FINISHING
+  Return value = BZ_FINISH_OK
+
+FLUSHING/BZ_FLUSH
+  Compress from next_in to next_out as much as possible, 
+  but do not accept any more input.
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = RUNNING; Return value = BZ_RUN_OK
+  else
+    Next state = FLUSHING; Return value = BZ_FLUSH_OK
+
+FLUSHING/other     
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+
+FINISHING/BZ_FINISH
+  Compress from next_in to next_out as much as possible,
+  but to not accept any more input.  
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = IDLE; Return value = BZ_STREAM_END
+  else
+    Next state = FINISHING; Return value = BZ_FINISH_OK
+
+FINISHING/other
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+

That still looks complicated? Well, fair enough. The +usual sequence of calls for compressing a load of data is:

+
    +
  1. Get started with + BZ2_bzCompressInit.

  2. +
  3. Shovel data in and shlurp out its compressed form + using zero or more calls of + BZ2_bzCompress with action = + BZ_RUN.

  4. +
  5. Finish up. Repeatedly call + BZ2_bzCompress with action = + BZ_FINISH, copying out the + compressed output, until + BZ_STREAM_END is + returned.

  6. +
  7. Close up and go home. Call + BZ2_bzCompressEnd.

  8. +
+

If the data you want to compress fits into your input +buffer all at once, you can skip the calls of +BZ2_bzCompress ( ..., BZ_RUN ) +and just do the BZ2_bzCompress ( ..., BZ_FINISH +) calls.

+

All required memory is allocated by +BZ2_bzCompressInit. The +compression library can accept any data at all (obviously). So +you shouldn't get any error return values from the +BZ2_bzCompress calls. If you +do, they will be +BZ_SEQUENCE_ERROR, and indicate +a bug in your programming.

+

Trivial other possible return values:

+
BZ_PARAM_ERROR
+  if strm is NULL, or strm->s is NULL
+
+
+

+3.3.3.BZ2_bzCompressEnd

+
int BZ2_bzCompressEnd ( bz_stream *strm );
+

Releases all memory associated with a compression +stream.

+

Possible return values:

+
BZ_PARAM_ERROR  if strm is NULL or strm->s is NULL
+BZ_OK           otherwise
+
+
+

+3.3.4.BZ2_bzDecompressInit

+
int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
+

Prepares for decompression. As with +BZ2_bzCompressInit, a +bz_stream record should be +allocated and initialised before the call. Fields +bzalloc, +bzfree and +opaque should be set if a custom +memory allocator is required, or made +NULL for the normal +malloc / +free routines. Upon return, the +internal state will have been initialised, and +total_in and +total_out will be zero.

+

For the meaning of parameter +verbosity, see +BZ2_bzCompressInit.

+

If small is nonzero, the +library will use an alternative decompression algorithm which +uses less memory but at the cost of decompressing more slowly +(roughly speaking, half the speed, but the maximum memory +requirement drops to around 2300k). See How to use bzip2 +for more information on memory management.

+

Note that the amount of memory needed to decompress a +stream cannot be determined until the stream's header has been +read, so even if +BZ2_bzDecompressInit succeeds, a +subsequent BZ2_bzDecompress +could fail with +BZ_MEM_ERROR.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if ( small != 0 && small != 1 )
+  or (verbosity <; 0 || verbosity > 4)
+BZ_MEM_ERROR
+  if insufficient memory is available
+

Allowable next actions:

+
BZ2_bzDecompress
+  if BZ_OK was returned
+  no specific action required in case of error
+
+
+

+3.3.5.BZ2_bzDecompress

+
int BZ2_bzDecompress ( bz_stream *strm );
+

Provides more input and/out output buffer space for the +library. The caller maintains input and output buffers, and uses +BZ2_bzDecompress to transfer +data between them.

+

Before each call to +BZ2_bzDecompress, +next_in should point at the +compressed data, and avail_in +should indicate how many bytes the library may read. +BZ2_bzDecompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read.

+

Similarly, next_out should +point to a buffer in which the uncompressed output is to be +placed, with avail_out +indicating how much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output.

+

You may provide and remove as little or as much data as you +like on each call of +BZ2_bzDecompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call.

+

Use of BZ2_bzDecompress is +simpler than +BZ2_bzCompress.

+

You should provide input and remove output as described +above, and repeatedly call +BZ2_bzDecompress until +BZ_STREAM_END is returned. +Appearance of BZ_STREAM_END +denotes that BZ2_bzDecompress +has detected the logical end of the compressed stream. +BZ2_bzDecompress will not +produce BZ_STREAM_END until all +output data has been placed into the output buffer, so once +BZ_STREAM_END appears, you are +guaranteed to have available all the decompressed output, and +BZ2_bzDecompressEnd can safely +be called.

+

If case of an error return value, you should call +BZ2_bzDecompressEnd to clean up +and release memory.

+

Possible return values:

+
BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+  or strm->avail_out < 1
+BZ_DATA_ERROR
+  if a data integrity error is detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the compressed stream doesn't begin with the right magic bytes
+BZ_MEM_ERROR
+  if there wasn't enough memory available
+BZ_STREAM_END
+  if the logical end of the data stream was detected and all
+  output in has been consumed, eg s-->avail_out > 0
+BZ_OK
+  otherwise
+

Allowable next actions:

+
BZ2_bzDecompress
+  if BZ_OK was returned
+BZ2_bzDecompressEnd
+  otherwise
+
+
+

+3.3.6.BZ2_bzDecompressEnd

+
int BZ2_bzDecompressEnd ( bz_stream *strm );
+

Releases all memory associated with a decompression +stream.

+

Possible return values:

+
BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+BZ_OK
+  otherwise
+

Allowable next actions:

+
  None.
+
+
+
+

+3.4.High-level interface

+

This interface provides functions for reading and writing +bzip2 format files. First, some +general points.

+
    +
  • All of the functions take an + int* first argument, + bzerror. After each call, + bzerror should be consulted + first to determine the outcome of the call. If + bzerror is + BZ_OK, the call completed + successfully, and only then should the return value of the + function (if any) be consulted. If + bzerror is + BZ_IO_ERROR, there was an + error reading/writing the underlying compressed file, and you + should then consult errno / + perror to determine the cause + of the difficulty. bzerror + may also be set to various other values; precise details are + given on a per-function basis below.

  • +
  • If bzerror indicates + an error (ie, anything except + BZ_OK and + BZ_STREAM_END), you should + immediately call + BZ2_bzReadClose (or + BZ2_bzWriteClose, depending on + whether you are attempting to read or to write) to free up all + resources associated with the stream. Once an error has been + indicated, behaviour of all calls except + BZ2_bzReadClose + (BZ2_bzWriteClose) is + undefined. The implication is that (1) + bzerror should be checked + after each call, and (2) if + bzerror indicates an error, + BZ2_bzReadClose + (BZ2_bzWriteClose) should then + be called to clean up.

  • +
  • The FILE* arguments + passed to BZ2_bzReadOpen / + BZ2_bzWriteOpen should be set + to binary mode. Most Unix systems will do this by default, but + other platforms, including Windows and Mac, will not. If you + omit this, you may encounter problems when moving code to new + platforms.

  • +
  • Memory allocation requests are handled by + malloc / + free. At present there is no + facility for user-defined memory allocators in the file I/O + functions (could easily be added, though).

  • +
+
+

+3.4.1.BZ2_bzReadOpen

+
typedef void BZFILE;
+
+BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, 
+                        int verbosity, int small,
+                        void *unused, int nUnused );
+

Prepare to read compressed data from file handle +f. +f should refer to a file which +has been opened for reading, and for which the error indicator +(ferror(f))is not set. If +small is 1, the library will try +to decompress using less memory, at the expense of speed.

+

For reasons explained below, +BZ2_bzRead will decompress the +nUnused bytes starting at +unused, before starting to read +from the file f. At most +BZ_MAX_UNUSED bytes may be +supplied like this. If this facility is not required, you should +pass NULL and +0 for +unused and +nUnused respectively.

+

For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit.

+

The amount of memory needed to decompress a file cannot be +determined until the file's header has been read. So it is +possible that BZ2_bzReadOpen +returns BZ_OK but a subsequent +call of BZ2_bzRead will return +BZ_MEM_ERROR.

+

Possible assignments to +bzerror:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or small is neither 0 nor 1
+  or ( unused == NULL && nUnused != 0 )
+  or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) )
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise.
+

Possible return values:

+
Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+

Allowable next actions:

+
BZ2_bzRead
+  if bzerror is BZ_OK
+BZ2_bzClose
+  otherwise
+
+
+

+3.4.2.BZ2_bzRead

+
int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
+

Reads up to len +(uncompressed) bytes from the compressed file +b into the buffer +buf. If the read was +successful, bzerror is set to +BZ_OK and the number of bytes +read is returned. If the logical end-of-stream was detected, +bzerror will be set to +BZ_STREAM_END, and the number of +bytes read is returned. All other +bzerror values denote an +error.

+

BZ2_bzRead will supply +len bytes, unless the logical +stream end is detected or an error occurs. Because of this, it +is possible to detect the stream end by observing when the number +of bytes returned is less than the number requested. +Nevertheless, this is regarded as inadvisable; you should instead +check bzerror after every call +and watch out for +BZ_STREAM_END.

+

Internally, BZ2_bzRead +copies data from the compressed file in chunks of size +BZ_MAX_UNUSED bytes before +decompressing it. If the file contains more bytes than strictly +needed to reach the logical end-of-stream, +BZ2_bzRead will almost certainly +read some of the trailing data before signalling +BZ_SEQUENCE_END. To collect the +read but unused data once +BZ_SEQUENCE_END has appeared, +call BZ2_bzReadGetUnused +immediately before +BZ2_bzReadClose.

+

Possible assignments to +bzerror:

+
BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzWriteOpen
+BZ_IO_ERROR
+  if there is an error reading from the compressed file
+BZ_UNEXPECTED_EOF
+  if the compressed file ended before 
+  the logical end-of-stream was detected
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the stream does not begin with the requisite header bytes 
+  (ie, is not a bzip2 data file).  This is really 
+  a special case of BZ_DATA_ERROR.
+BZ_MEM_ERROR
+  if insufficient memory was available
+BZ_STREAM_END
+  if the logical end of stream was detected.
+BZ_OK
+  otherwise.
+

Possible return values:

+
number of bytes read
+  if bzerror is BZ_OK or BZ_STREAM_END
+undefined
+  otherwise
+

Allowable next actions:

+
collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
+  if bzerror is BZ_OK
+collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
+  if bzerror is BZ_SEQUENCE_END
+BZ2_bzReadClose
+  otherwise
+
+
+

+3.4.3.BZ2_bzReadGetUnused

+
void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, 
+                          void** unused, int* nUnused );
+

Returns data which was read from the compressed file but +was not needed to get to the logical end-of-stream. +*unused is set to the address of +the data, and *nUnused to the +number of bytes. *nUnused will +be set to a value between 0 and +BZ_MAX_UNUSED inclusive.

+

This function may only be called once +BZ2_bzRead has signalled +BZ_STREAM_END but before +BZ2_bzReadClose.

+

Possible assignments to +bzerror:

+
BZ_PARAM_ERROR
+  if b is NULL
+  or unused is NULL or nUnused is NULL
+BZ_SEQUENCE_ERROR
+  if BZ_STREAM_END has not been signalled
+  or if b was opened with BZ2_bzWriteOpen
+BZ_OK
+  otherwise
+

Allowable next actions:

+
BZ2_bzReadClose
+
+
+

+3.4.4.BZ2_bzReadClose

+
void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
+

Releases all memory pertaining to the compressed file +b. +BZ2_bzReadClose does not call +fclose on the underlying file +handle, so you should do that yourself if appropriate. +BZ2_bzReadClose should be called +to clean up after all error situations.

+

Possible assignments to +bzerror:

+
BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzOpenWrite
+BZ_OK
+  otherwise
+

Allowable next actions:

+
none
+
+
+

+3.4.5.BZ2_bzWriteOpen

+
BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, 
+                         int blockSize100k, int verbosity,
+                         int workFactor );
+

Prepare to write compressed data to file handle +f. +f should refer to a file which +has been opened for writing, and for which the error indicator +(ferror(f))is not set.

+

For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit.

+

All required memory is allocated at this stage, so if the +call completes successfully, +BZ_MEM_ERROR cannot be signalled +by a subsequent call to +BZ2_bzWrite.

+

Possible assignments to +bzerror:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise
+

Possible return values:

+
Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+

Allowable next actions:

+
BZ2_bzWrite
+  if bzerror is BZ_OK
+  (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
+BZ2_bzWriteClose
+  otherwise
+
+
+

+3.4.6.BZ2_bzWrite

+
void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
+

Absorbs len bytes from the +buffer buf, eventually to be +compressed and written to the file.

+

Possible assignments to +bzerror:

+
BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file.
+BZ_OK
+  otherwise
+
+
+

+3.4.7.BZ2_bzWriteClose

+
void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
+                       int abandon,
+                       unsigned int* nbytes_in,
+                       unsigned int* nbytes_out );
+
+void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
+                         int abandon,
+                         unsigned int* nbytes_in_lo32,
+                         unsigned int* nbytes_in_hi32,
+                         unsigned int* nbytes_out_lo32,
+                         unsigned int* nbytes_out_hi32 );
+

Compresses and flushes to the compressed file all data so +far supplied by BZ2_bzWrite. +The logical end-of-stream markers are also written, so subsequent +calls to BZ2_bzWrite are +illegal. All memory associated with the compressed file +b is released. +fflush is called on the +compressed file, but it is not +fclose'd.

+

If BZ2_bzWriteClose is +called to clean up after an error, the only action is to release +the memory. The library records the error codes issued by +previous calls, so this situation will be detected automatically. +There is no attempt to complete the compression operation, nor to +fflush the compressed file. You +can force this behaviour to happen even in the case of no error, +by passing a nonzero value to +abandon.

+

If nbytes_in is non-null, +*nbytes_in will be set to be the +total volume of uncompressed data handled. Similarly, +nbytes_out will be set to the +total volume of compressed data written. For compatibility with +older versions of the library, +BZ2_bzWriteClose only yields the +lower 32 bits of these counts. Use +BZ2_bzWriteClose64 if you want +the full 64 bit counts. These two functions are otherwise +absolutely identical.

+

Possible assignments to +bzerror:

+
BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file
+BZ_OK
+  otherwise
+
+
+

+3.4.8.Handling embedded compressed data streams

+

The high-level library facilitates use of +bzip2 data streams which form +some part of a surrounding, larger data stream.

+
    +
  • For writing, the library takes an open file handle, + writes compressed data to it, + fflushes it but does not + fclose it. The calling + application can write its own data before and after the + compressed data stream, using that same file handle.

  • +
  • Reading is more complex, and the facilities are not as + general as they could be since generality is hard to reconcile + with efficiency. BZ2_bzRead + reads from the compressed file in blocks of size + BZ_MAX_UNUSED bytes, and in + doing so probably will overshoot the logical end of compressed + stream. To recover this data once decompression has ended, + call BZ2_bzReadGetUnused after + the last call of BZ2_bzRead + (the one returning + BZ_STREAM_END) but before + calling + BZ2_bzReadClose.

  • +
+

This mechanism makes it easy to decompress multiple +bzip2 streams placed end-to-end. +As the end of one stream, when +BZ2_bzRead returns +BZ_STREAM_END, call +BZ2_bzReadGetUnused to collect +the unused data (copy it into your own buffer somewhere). That +data forms the start of the next compressed stream. To start +uncompressing that next stream, call +BZ2_bzReadOpen again, feeding in +the unused data via the unused / +nUnused parameters. Keep doing +this until BZ_STREAM_END return +coincides with the physical end of file +(feof(f)). In this situation +BZ2_bzReadGetUnused will of +course return no data.

+

This should give some feel for how the high-level interface +can be used. If you require extra flexibility, you'll have to +bite the bullet and get to grips with the low-level +interface.

+
+
+

+3.4.9.Standard file-reading/writing code

+

Here's how you'd write data to a compressed file:

+
FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if ( !f ) {
+ /* handle error */
+}
+b = BZ2_bzWriteOpen( &bzerror, f, 9 );
+if (bzerror != BZ_OK) {
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+}
+
+while ( /* condition */ ) {
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) { 
+   BZ2_bzWriteClose ( &bzerror, b );
+   /* handle error */
+ }
+}
+
+BZ2_bzWriteClose( &bzerror, b );
+if (bzerror == BZ_IO_ERROR) {
+ /* handle error */
+}
+

And to read from a compressed file:

+
FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if ( !f ) {
+  /* handle error */
+}
+b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 );
+if ( bzerror != BZ_OK ) {
+  BZ2_bzReadClose ( &bzerror, b );
+  /* handle error */
+}
+
+bzerror = BZ_OK;
+while ( bzerror == BZ_OK && /* arbitrary other conditions */) {
+  nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ );
+  if ( bzerror == BZ_OK ) {
+    /* do something with buf[0 .. nBuf-1] */
+  }
+}
+if ( bzerror != BZ_STREAM_END ) {
+   BZ2_bzReadClose ( &bzerror, b );
+   /* handle error */
+} else {
+   BZ2_bzReadClose ( &bzerror, b );
+}
+
+
+
+

+3.5.Utility functions

+
+

+3.5.1.BZ2_bzBuffToBuffCompress

+
int BZ2_bzBuffToBuffCompress( char*         dest,
+                              unsigned int* destLen,
+                              char*         source,
+                              unsigned int  sourceLen,
+                              int           blockSize100k,
+                              int           verbosity,
+                              int           workFactor );
+

Attempts to compress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the compressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned.

+

Compression in this manner is a one-shot event, done with a +single call to this function. The resulting compressed data is a +complete bzip2 format data +stream. There is no mechanism for making additional calls to +provide extra input data. If you want that kind of mechanism, +use the low-level interface.

+

For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit.

+

To guarantee that the compressed data will fit in its +buffer, allocate an output buffer of size 1% larger than the +uncompressed data, plus six hundred extra bytes.

+

BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_OK
+  otherwise
+
+
+

+3.5.2.BZ2_bzBuffToBuffDecompress

+
int BZ2_bzBuffToBuffDecompress( char*         dest,
+                                unsigned int* destLen,
+                                char*         source,
+                                unsigned int  sourceLen,
+                                int           small,
+                                int           verbosity );
+

Attempts to decompress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the uncompressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned.

+

source is assumed to hold +a complete bzip2 format data +stream. +BZ2_bzBuffToBuffDecompress tries +to decompress the entirety of the stream into the output +buffer.

+

For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit.

+

Because the compression ratio of the compressed data cannot +be known in advance, there is no easy way to guarantee that the +output buffer will be big enough. You may of course make +arrangements in your code to record the size of the uncompressed +data, but such a mechanism is beyond the scope of this +library.

+

BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow.

+

Possible return values:

+
BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or small != 0 && small != 1
+  or verbosity < 0 or verbosity > 4
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed data
+BZ_DATA_ERROR_MAGIC
+  if the compressed data doesn't begin with the right magic bytes
+BZ_UNEXPECTED_EOF
+  if the compressed data ends unexpectedly
+BZ_OK
+  otherwise
+
+
+
+

+3.6.zlib compatibility functions

+

Yoshioka Tsuneo has contributed some functions to give +better zlib compatibility. +These functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. These +functions are not (yet) officially part of the library. If they +break, you get to keep all the pieces. Nevertheless, I think +they work ok.

+
typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );
+

Returns a string indicating the library version.

+
BZFILE * BZ2_bzopen  ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int        fd,    const char *mode );
+

Opens a .bz2 file for +reading or writing, using either its name or a pre-existing file +descriptor. Analogous to fopen +and fdopen.

+
int BZ2_bzread  ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
+

Reads/writes data from/to a previously opened +BZFILE. Analogous to +fread and +fwrite.

+
int  BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );
+

Flushes/closes a BZFILE. +BZ2_bzflush doesn't actually do +anything. Analogous to fflush +and fclose.

+
const char * BZ2_bzerror ( BZFILE *b, int *errnum )
+

Returns a string describing the more recent error status of +b, and also sets +*errnum to its numerical +value.

+
+
+

+3.7.Using the library in a stdio-free environment

+
+

+3.7.1.Getting rid of stdio

+

In a deeply embedded application, you might want to use +just the memory-to-memory functions. You can do this +conveniently by compiling the library with preprocessor symbol +BZ_NO_STDIO defined. Doing this +gives you a library containing only the following eight +functions:

+

BZ2_bzCompressInit, +BZ2_bzCompress, +BZ2_bzCompressEnd +BZ2_bzDecompressInit, +BZ2_bzDecompress, +BZ2_bzDecompressEnd +BZ2_bzBuffToBuffCompress, +BZ2_bzBuffToBuffDecompress

+

When compiled like this, all functions will ignore +verbosity settings.

+
+
+

+3.7.2.Critical error handling

+

libbzip2 contains a number +of internal assertion checks which should, needless to say, never +be activated. Nevertheless, if an assertion should fail, +behaviour depends on whether or not the library was compiled with +BZ_NO_STDIO set.

+

For a normal compile, an assertion failure yields the +message:

+
+

bzip2/libbzip2: internal error number N.

+

This is a bug in bzip2/libbzip2, 1.0.5 of 10 December 2007. +Please report it to me at: jseward@bzip.org. If this happened +when you were using some program which uses libbzip2 as a +component, you should also report this bug to the author(s) +of that program. Please make an effort to report this bug; +timely and accurate bug reports eventually lead to higher +quality software. Thanks. Julian Seward, 10 December 2007. +

+
+

where N is some error code +number. If N == 1007, it also +prints some extra text advising the reader that unreliable memory +is often associated with internal error 1007. (This is a +frequently-observed-phenomenon with versions 1.0.0/1.0.1).

+

exit(3) is then +called.

+

For a stdio-free library, +assertion failures result in a call to a function declared +as:

+
extern void bz_internal_error ( int errcode );
+

The relevant code is passed as a parameter. You should +supply such a function.

+

In either case, once an assertion failure has occurred, any +bz_stream records involved can +be regarded as invalid. You should not attempt to resume normal +operation with them.

+

You may, of course, change critical error handling to suit +your needs. As I said above, critical errors indicate bugs in +the library and should not occur. All "normal" error situations +are indicated via error return codes from functions, and can be +recovered from.

+
+
+
+

+3.8.Making a Windows DLL

+

Everything related to Windows has been contributed by +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp), so +you should send your queries to him (but perhaps Cc: me, +jseward@bzip.org).

+

My vague understanding of what to do is: using Visual C++ +5.0, open the project file +libbz2.dsp, and build. That's +all.

+

If you can't open the project file for some reason, make a +new one, naming these files: +blocksort.c, +bzlib.c, +compress.c, +crctable.c, +decompress.c, +huffman.c, +randtable.c and +libbz2.def. You will also need +to name the header files bzlib.h +and bzlib_private.h.

+

If you don't use VC++, you may need to define the +proprocessor symbol +_WIN32.

+

Finally, dlltest.c is a +sample program using the DLL. It has a project file, +dlltest.dsp.

+

If you just want a makefile for Visual C, have a look at +makefile.msc.

+

Be aware that if you compile +bzip2 itself on Win32, you must +set BZ_UNIX to 0 and +BZ_LCCWIN32 to 1, in the file +bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly.

+

I haven't tried any of this stuff myself, but it all looks +plausible.

+
+
+
+

+4.Miscellanea

+ +

These are just some random thoughts of mine. Your mileage +may vary.

+
+

+4.1.Limitations of the compressed file format

+

bzip2-1.0.X, +0.9.5 and +0.9.0 use exactly the same file +format as the original version, +bzip2-0.1. This decision was +made in the interests of stability. Creating yet another +incompatible compressed file format would create further +confusion and disruption for users.

+

Nevertheless, this is not a painless decision. Development +work since the release of +bzip2-0.1 in August 1997 has +shown complexities in the file format which slow down +decompression and, in retrospect, are unnecessary. These +are:

+
    +
  • The run-length encoder, which is the first of the + compression transformations, is entirely irrelevant. The + original purpose was to protect the sorting algorithm from the + very worst case input: a string of repeated symbols. But + algorithm steps Q6a and Q6b in the original Burrows-Wheeler + technical report (SRC-124) show how repeats can be handled + without difficulty in block sorting.

  • +
  • +

    The randomisation mechanism doesn't really need to be + there. Udi Manber and Gene Myers published a suffix array + construction algorithm a few years back, which can be employed + to sort any block, no matter how repetitive, in O(N log N) + time. Subsequent work by Kunihiko Sadakane has produced a + derivative O(N (log N)^2) algorithm which usually outperforms + the Manber-Myers algorithm.

    +

    I could have changed to Sadakane's algorithm, but I find + it to be slower than bzip2's + existing algorithm for most inputs, and the randomisation + mechanism protects adequately against bad cases. I didn't + think it was a good tradeoff to make. Partly this is due to + the fact that I was not flooded with email complaints about + bzip2-0.1's performance on + repetitive data, so perhaps it isn't a problem for real + inputs.

    +

    Probably the best long-term solution, and the one I have + incorporated into 0.9.5 and above, is to use the existing + sorting algorithm initially, and fall back to a O(N (log N)^2) + algorithm if the standard algorithm gets into + difficulties.

    +
  • +
  • The compressed file format was never designed to be + handled by a library, and I have had to jump though some hoops + to produce an efficient implementation of decompression. It's + a bit hairy. Try passing + decompress.c through the C + preprocessor and you'll see what I mean. Much of this + complexity could have been avoided if the compressed size of + each block of data was recorded in the data stream.

  • +
  • An Adler-32 checksum, rather than a CRC32 checksum, + would be faster to compute.

  • +
+

It would be fair to say that the +bzip2 format was frozen before I +properly and fully understood the performance consequences of +doing so.

+

Improvements which I was able to incorporate into 0.9.0, +despite using the same file format, are:

+
    +
  • Single array implementation of the inverse BWT. This + significantly speeds up decompression, presumably because it + reduces the number of cache misses.

  • +
  • Faster inverse MTF transform for large MTF values. + The new implementation is based on the notion of sliding blocks + of values.

  • +
  • bzip2-0.9.0 now reads + and writes files with fread + and fwrite; version 0.1 used + putc and + getc. Duh! Well, you live + and learn.

  • +
+

Further ahead, it would be nice to be able to do random +access into files. This will require some careful design of +compressed file formats.

+
+
+

+4.2.Portability issues

+

After some consideration, I have decided not to use GNU +autoconf to configure 0.9.5 or +1.0.

+

autoconf, admirable and +wonderful though it is, mainly assists with portability problems +between Unix-like platforms. But +bzip2 doesn't have much in the +way of portability problems on Unix; most of the difficulties +appear when porting to the Mac, or to Microsoft's operating +systems. autoconf doesn't help +in those cases, and brings in a whole load of new +complexity.

+

Most people should be able to compile the library and +program under Unix straight out-of-the-box, so to speak, +especially if you have a version of GNU C available.

+

There are a couple of +__inline__ directives in the +code. GNU C (gcc) should be +able to handle them. If you're not using GNU C, your C compiler +shouldn't see them at all. If your compiler does, for some +reason, see them and doesn't like them, just +#define +__inline__ to be +/* */. One easy way to do this +is to compile with the flag +-D__inline__=, which should be +understood by most Unix compilers.

+

If you still have difficulties, try compiling with the +macro BZ_STRICT_ANSI defined. +This should enable you to build the library in a strictly ANSI +compliant environment. Building the program itself like this is +dangerous and not supported, since you remove +bzip2's checks against +compressing directories, symbolic links, devices, and other +not-really-a-file entities. This could cause filesystem +corruption!

+

One other thing: if you create a +bzip2 binary for public distribution, +please consider linking it statically (gcc +-static). This avoids all sorts of library-version +issues that others may encounter later on.

+

If you build bzip2 on +Win32, you must set BZ_UNIX to 0 +and BZ_LCCWIN32 to 1, in the +file bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly.

+
+
+

+4.3.Reporting bugs

+

I tried pretty hard to make sure +bzip2 is bug free, both by +design and by testing. Hopefully you'll never need to read this +section for real.

+

Nevertheless, if bzip2 dies +with a segmentation fault, a bus error or an internal assertion +failure, it will ask you to email me a bug report. Experience from +years of feedback of bzip2 users indicates that almost all these +problems can be traced to either compiler bugs or hardware +problems.

+
    +
  • +

    Recompile the program with no optimisation, and + see if it works. And/or try a different compiler. I heard all + sorts of stories about various flavours of GNU C (and other + compilers) generating bad code for + bzip2, and I've run across two + such examples myself.

    +

    2.7.X versions of GNU C are known to generate bad code + from time to time, at high optimisation levels. If you get + problems, try using the flags + -O2 + -fomit-frame-pointer + -fno-strength-reduce. You + should specifically not use + -funroll-loops.

    +

    You may notice that the Makefile runs six tests as part + of the build process. If the program passes all of these, it's + a pretty good (but not 100%) indication that the compiler has + done its job correctly.

    +
  • +
  • +

    If bzip2 + crashes randomly, and the crashes are not repeatable, you may + have a flaky memory subsystem. + bzip2 really hammers your + memory hierarchy, and if it's a bit marginal, you may get these + problems. Ditto if your disk or I/O subsystem is slowly + failing. Yup, this really does happen.

    +

    Try using a different machine of the same type, and see + if you can repeat the problem.

    +
  • +
  • This isn't really a bug, but ... If + bzip2 tells you your file is + corrupted on decompression, and you obtained the file via FTP, + there is a possibility that you forgot to tell FTP to do a + binary mode transfer. That absolutely will cause the file to + be non-decompressible. You'll have to transfer it + again.

  • +
+

If you've incorporated +libbzip2 into your own program +and are getting problems, please, please, please, check that the +parameters you are passing in calls to the library, are correct, +and in accordance with what the documentation says is allowable. +I have tried to make the library robust against such problems, +but I'm sure I haven't succeeded.

+

Finally, if the above comments don't help, you'll have to +send me a bug report. Now, it's just amazing how many people +will send me a bug report saying something like:

+
bzip2 crashed with segmentation fault on my machine
+

and absolutely nothing else. Needless to say, a such a +report is totally, utterly, completely and +comprehensively 100% useless; a waste of your time, my time, and +net bandwidth. With no details at all, there's no way +I can possibly begin to figure out what the problem is.

+

The rules of the game are: facts, facts, facts. Don't omit +them because "oh, they won't be relevant". At the bare +minimum:

+
Machine type.  Operating system version.  
+Exact version of bzip2 (do bzip2 -V).  
+Exact version of the compiler used.  
+Flags passed to the compiler.
+

However, the most important single thing that will help me +is the file that you were trying to compress or decompress at the +time the problem happened. Without that, my ability to do +anything more than speculate about the cause, is limited.

+
+
+

+4.4.Did you get the right package?

+

bzip2 is a resource hog. +It soaks up large amounts of CPU cycles and memory. Also, it +gives very large latencies. In the worst case, you can feed many +megabytes of uncompressed data into the library before getting +any compressed output, so this probably rules out applications +requiring interactive behaviour.

+

These aren't faults of my implementation, I hope, but more +an intrinsic property of the Burrows-Wheeler transform +(unfortunately). Maybe this isn't what you want.

+

If you want a compressor and/or library which is faster, +uses less memory but gets pretty good compression, and has +minimal latency, consider Jean-loup Gailly's and Mark Adler's +work, zlib-1.2.1 and +gzip-1.2.4. Look for them at +http://www.zlib.org and +http://www.gzip.org +respectively.

+

For something faster and lighter still, you might try Markus F +X J Oberhumer's LZO real-time +compression/decompression library, at +http://www.oberhumer.com/opensource.

+
+
+

+4.5.Further Reading

+

bzip2 is not research +work, in the sense that it doesn't present any new ideas. +Rather, it's an engineering exercise based on existing +ideas.

+

Four documents describe essentially all the ideas behind +bzip2:

+

MichaelBurrowsandD.J.Wheeler:
+"Ablock-sortinglosslessdatacompressionalgorithm"
+10thMay1994.
+DigitalSRCResearchReport124.
+ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz
+Ifyouhavetroublefindingit,trysearchingatthe
+NewZealandDigitalLibrary,http://www.nzdl.org.
+
+DanielS.HirschbergandDebraA.LeLewer
+"EfficientDecodingofPrefixCodes"
+CommunicationsoftheACM,April1990,Vol33,Number4.
+Youmightbeabletogetanelectroniccopyofthis
+fromtheACMDigitalLibrary.
+
+DavidJ.Wheeler
+Programbred3.candaccompanyingdocumentbred3.ps.
+Thiscontainstheideabehindthemulti-tableHuffmancodingscheme.
+ftp://ftp.cl.cam.ac.uk/users/djw3/
+
+JonL.BentleyandRobertSedgewick
+"FastAlgorithmsforSortingandSearchingStrings"
+AvailablefromSedgewick'swebpage,
+www.cs.princeton.edu/~rs
+

+

The following paper gives valuable additional insights into +the algorithm, but is not immediately the basis of any code used +in bzip2.

+

PeterFenwick:
+BlockSortingTextCompression
+Proceedingsofthe19thAustralasianComputerScienceConference,
+Melbourne,Australia.Jan31-Feb2,1996.
+ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps

+

Kunihiko Sadakane's sorting algorithm, mentioned above, is +available from:

+

http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz
+

+

The Manber-Myers suffix array construction algorithm is +described in a paper available from:

+

http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps
+

+

Finally, the following papers document some +investigations I made into the performance of sorting +and decompression algorithms:

+

JulianSeward
+OnthePerformanceofBWTSortingAlgorithms
+ProceedingsoftheIEEEDataCompressionConference2000
+Snowbird,Utah.28-30March2000.
+
+JulianSeward
+Space-timeTradeoffsintheInverseB-WTransform
+ProceedingsoftheIEEEDataCompressionConference2001
+Snowbird,Utah.27-29March2001.
+

+
+
+
+ diff --git a/win32/3rdparty/bzip2/manual.ps b/win32/3rdparty/bzip2/manual.ps new file mode 100644 index 000000000..b8b610c81 --- /dev/null +++ b/win32/3rdparty/bzip2/manual.ps @@ -0,0 +1,82900 @@ +%!PS-Adobe-3.0 +%%Creator: xpdf/pdftops 3.01 +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%DocumentMedia: plain 612 792 0 () () +%%BoundingBox: 0 0 612 792 +%%Pages: 38 +%%EndComments +%%BeginDefaults +%%PageMedia: plain +%%EndDefaults +%%BeginProlog +%%BeginResource: procset xpdf 3.01 0 +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + 3 1 roll 2 array astore + /setpagedevice where { + pop 3 dict begin + /PageSize exch def + /ImagingBBox null def + /Policies 1 dict dup begin /PageSize 3 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/cshow where { + pop + /cshow2 { + dup { + pop pop + 1 string dup 0 3 index put 3 index exec + } exch cshow + pop pop + } def +}{ + /cshow2 { + currentfont /FontType get 0 eq { + 0 2 2 index length 1 sub { + 2 copy get exch 1 add 2 index exch get + 2 copy exch 256 mul add + 2 string dup 0 6 5 roll put dup 1 5 4 roll put + 3 index exec + } for + } { + dup { + 1 string dup 0 3 index put 3 index exec + } forall + } ifelse + pop pop + } def +} ifelse +/awcp { + exch { + false charpath + 5 index 5 index rmoveto + 6 index eq { 7 index 7 index rmoveto } if + } exch cshow2 + 6 {pop} repeat +} def +/Tj { + fCol + 1 index stringwidth pdfTextMat idtransform pop + sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16 { + fCol + 2 index stringwidth pdfTextMat idtransform pop + sub exch div + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16V { + fCol + 2 index stringwidth pdfTextMat idtransform exch pop + sub exch div + 0 pdfWordSpacing pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing add 0 exch + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj1 { + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 8 2 roll + pdfTextRender 1 and 0 eq { + 6 copy awidthshow + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 7 index 7 index moveto + 6 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + false awcp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 8 6 roll moveto + false awcp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + 8 {pop} repeat + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { pdfFontSize 0.001 mul mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { pdfFontSize 0.001 mul mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +% Level 2 image operators +/pdfImBuf 100 string def +/pdfIm { + image + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfImM { + fCol imagemask + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add axialCol sc + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h f* + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%BeginResource: font DTUUHP+NimbusSanL-Bold +%!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Sans L Bold) readonly def +/FamilyName (Nimbus Sans L) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -155 def +/UnderlineThickness 69 def +end readonly def +/FontName /DTUUHP+NimbusSanL-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-173 -307 1003 949} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8d62a63193c4ae94c086c1 +552833ddd8f116b5df33205ae709b3aa63da7bebb165b67281827b48fb5edbed +02a1a5c0784fc57d3487daa59520bada1be3fb9795669924321ce4f466cd8e3f +7e8ec2494aee80e2dd7a48a6861af5b9f0ccaa4a2fe2b03498eacacd6b9c39c6 +a8f2e39e06bbb061cf2ec380a32efad0b790974bb5cc3daf0992471456967362 +77de34813f27abe99302f86bb4d293a37f84667e7f3dfee4cfe9d1a676a5728c +aeb5222ff50da97e74b2cdebf725fbca7015a188891c8a376b9dd8a642c4b184 +b1bbf3f376a6d6e31ef1c8354ddf8039cb20faabcb34d4749b3c8c8d6972ceb1 +06b8a5aae3ae40a91f1f2b1155681a9cc933f87528c99a2b0268b43a3e829e7f +3bd863cb52950773bd9b0731dc4992541d7de7a055ca65ddd2317f1705c20d1f +93291bcc254cbaba425c032b3b15050d41da14ffe1b3d684eea428095a01e931 +98d4f849b239ad9d79f4502f0271affb0c297f2f347bfb9c137782646f648f77 +0076b85f5a929fcdea2703333f6918b8f125627f8b505c688e30f258ded1aecf +2c86edcd88c29249a8081731737195fab7adbb54743bd66511194dee2516959b +a20701e2d97342248297425491f6c9471ec9a98e630d734dac19721f0b324432 +c8d7a0b751453f89f7008ba37bc48e0831ee3ecbd8a0a292d63cfc890b28f695 +9e29ac3b4ddb78a6883b9272ce34a012a82adec0b6b641e3940a438a098ccfbf +c50544b94facfd9d7ae09ad0632015f81d2f77fc6d80a42ec11d67d8a91c376c +13c8e3444cdfde4d2a1ed021410f4d6a4e97804ae949bd913094d23108c9d384 +56f11025e2d24939114b6bcf579a0315c52f3ca1bcc2860fc1a0b9fb8a37ae2f +c20c0fd44d215fc2af737fd0339b070d54e664021240071c665de4170dfa182d +4e385685fb41a2d85888b1149e9a766cb4f309b4e2baa28cf1f8cc12c4b19e33 +f046ce97b53deb549fea96cf6ce66357c4904b7932f5b1ce03cfe3a10c976b9c +c9ad11d7a02816f8e11666ca8b3ee1411df2ca94172659bad929e3e3e5248f48 +0690cec6d8f7061608cf2672f65abdc96b4fca84d5c847440cf9523d3bf23f6b +d4365582e4b187b6a1a0282ed323bf221edd0a4ce11ce7eda738d1af48b2e19f +eb3da1664de99c447c35dfd45069fded1fcd70b4a6855e91ffbd7146efe88012 +0bff1d6d1acb53d5e07fb5795f561a4a3e953bba7c03a9762adae18e58dce6b3 +b1a703122ef3b16963ac7cb9682ce60e17947e7e675d19901c7e8272ce4c9fdf +536abdffa429b820a82aee9a73d7dcf77dde4d8e251cb3b3a5b0a91c0fcd7fbb +ead7a812ff194fd049f28b82f4c2d73e41cc73c1c9f668931a2c7eba5400a1b9 +0902efe6792f207136e1e16b41794e6cbf7316889a602d35c37ef36dec95af26 +e9bb0900456f2ebf2705ecce7b2ed90343d23e006ecb282d4b3629bb0c3892f3 +ff9c17fe6c5fab68358e1cd44aff021948ac9fb8410a3de22e0a01e367c52470 +2a8cfd284cf9e8f505d5dbd7bbe242fe071fea0094a55ed1cd7c9be6b7c56c98 +16ad1985fb7624f5e48cf6c0c2ed85b466f64c52f017b20cdabb85d24452e086 +3942362e764a2bda0f6c1b24426e302ddc4403a087efb2850cf3275c7b24275a +ae270f212831f4c4a5d95deab61923ca126e587e8f5ed4f2d5738f06e8c4f911 +b346b8ecdac481dedd2f546305a7cd63cb67d40093c618fbbdf498c8d7ead8c7 +1f5f022d0bbcfaa8670e3b3b999a1697c947af38d7e1a360e3f0825a9aa77840 +d7a9dfd575ce2f04d308f7c553ebf569ac84f2c12aa0869ce107c713a3cce624 +5059bfb3f5aa27d10e337086144ab09286be3825a3482c5422454c6a9cbbf205 +833316780eb88302796fc427a0fb9e53a7bf24577feb3fa5d85cb6344f908007 +183522d3c760c11fc7da8d14bb5dd800576a6b4d1b991c1bf3db0f9ca2ac5d22 +91079a199f2f6e6dc68213d33ea893b74f6aff30ed1b51f8b53a015ffd4d2076 +b71f73225b151cfcf11e2a2917cf1b3f60e2b4d442307c394e1625f7e60eb12a +f2eb9ca7b17b082f1664d09cb7a3f38aea99a13f659089426126f47fad5b6dc7 +64101cd437da3c22bc43e7a8de07253eb371470ee1e4e42a5d1fa2c4db5565ad +79d6271ae28e8fde5d4cb24064c145de44ed486a1e7df2df921f2b1be5fdb120 +d8b781c3655ea72dc22a2a2d37579f0af60b42320ab25c8d769124352448a154 +7a381b388a4d9a54e82f199ba35f1a3981823ab698e3f87d38d32addd4f13832 +77fcc9acee7fbd3285f689a85b76d0feb9e70f09bad0ce144770a6cc203ce40e +15912de0e3465dbc7918e3ea49ade57ee8c48c75937f5d25498c45170693067e +6902937c9b43ab6080111663d5dc6d88f72a39c5e7bad677229498323a3e7a22 +2fe2552b00cb91ce2848a1a53538b7af2503a3671903e10df0e9641dbb70577a +e828dd3cae98fa9e1a74f4377f908d3cd79461408ed29832bc4c9865550ccb00 +45359282255057a4bd4859915cf1e45ecdb7329f90bbf63e0a22a54b05c5acd1 +9c7c4dfc25482a27a20c7ab908546c3577e87ade93ea46436314a0a7c524b892 +4b012239e77cd65ae2949bbf7e46a5a2269b7ffb1cf8a5bc7eea1944d2b0bf37 +bfc36adad9a599fa133f77935f24ef518819d054345df144731dd2332b0f7f5e +84c46af486941cf1293e86ee719c9bab6263470c7009c3933f1857b0a863e36c +288d37e6ac85e6a1b4e6e91c0a9fe367bec427ea3713e8d1f0523ecff6067717 +244ca21c177968583815f023420a660f7aa4cdc8bf25ac3b3e429942b9f5123d +84234c186d9226487c76dfef5d26165771c0e75f0ace7e3882e49de831b46c12 +e30dc37395241d7619c05abc40f5a36f8042b461fb6c3a5181f77b14e9e6d978 +37356b4b31fac3850df1869063724316104c799b6a2f42c361a375e4d29eba7f +850fe29efbc2cef627a25db549a4d4c48f9fc9a2f32fa50c1ce6b5a545a95f7e +bf2e9ed710ae91ace1281a44e49aee4133ccc04926a6dba24b721c21188c89a5 +2a49745501cfaa4364cf49e3ec2a59d9ee46f33362634f9758827b199fd07dba +939bd7387124656831862f70a97c5a05959572c74865f5902e95093fecdbea3b +bba9b47dace807262de0c7ef04843259f58a323471237cd573298c5d0a0650ad +2acabd71cb44c63675192845e3d01b3b28af871f347d4a460cc28d9e94409443 +30e893d27b06132063ab727a38f447a2a4633d29adac01bdccc7634e64dfdc55 +9141f69e1202c4a0fd48479b0ed95a7605c94901373e1100a6cbfc113fcce445 +e0317cc94a8507dd637c37676954b9d34c6727aacf17285876db16dd0e11384c +2b996e85e82fd8fd2b8f9b83bccb398b997364f0ddb71e60ccc50cdd5d122eec +c36b86a89fbbb5bfb227fba3a7b7de7c907e58780fc276c24ff066982691a97a +50d14362d27d790375a47162decc53c5c11e8a7499788dfd86aefffe7e674aed +26706e2d079e9a571c6a32accc8c0dcf23508f58477d05f9a1fc679c0da64254 +27ae33293d02c9eca01daf2d0a1b07e5515d36e18caa3ab1b6c5736dfdefe384 +dbcd244f0c11087a873c4501c6de2a5a57e346fd3f92a0451e63fff6b99c6dfc +64ed8673dc54ef6509d0d043925bce39072fc64ddf2c49b8602d1a51ee822f19 +d7b2135aa84626bfe3ff321a6bec3a003ad97e7699cfa34bf41f9c2b38df4794 +cb5ae36c95f42b44212de67a96ca9d047587998636673a031c4eb03cf1a55326 +f5d94dde75086b44f095ede0068fb6b9d256759041cda04ecacbd8d7784159af +ae31a9c637d9a5c0c6840dd9e30eacc66d4d6fd6f12a603aa2db3e9866693070 +0d69cddc416d4b76cf6b835c7bebf914816b87edcd5a24e346eba2dded30f5a0 +dc033e93b040a6ee7f8ab3c44c61017c758c11c2e2fe3c4f18996287a48fa9f8 +fd068c42d0d3384ff27c5a88ef630125562663ee95a66b7b588b417b20d3ae84 +6ecf2693940d4733f9e70b0455b6097e73553eed34df8da712c29d76326670b7 +13f19d4b5ada1833d46fd6cfb92b85eb946cc74252718cc5e605cd6c3c5a46e8 +51536cddcc3cb244c78e629fab784fd76372ca9417fa67f292a7e780b78186d7 +f391cd91b6222e88c0bcff66208814965511967b2ed0d075c77b57701608b647 +b4e462d3e56e06c0403f858582a754dcbf8841fe81d39359d8c5a77c8ae6b795 +c11b84f702de09f22498a189a4c69d726a63260784066562a50544e5d07aebb5 +8265c1c6607bfc6008f2edfc9d0de71646548e59bb374996a4412ac22ab47dc8 +357153c7c9061e95952a729a80fb45f3650fb0c84a07c1956dcc0856d7b0fa71 +3f09c1b995b0c48c57c9367c0601a46cdaefd0460735682d5aafe8545cba587b +ca6e8144ff14a25b2fce9b23d8ebf715c5a544bd646d5460d2f8cbd44b6d8203 +54e4b7377db351ff26b7b9336a7dca3a610d3a92541054c544064447ac6d1a15 +cf1d1a3797cfe85fb55b56ac01fbb6f47e9c8e5c2929bdc7ee14f6d868464493 +df4759cc80405ef270a816607f248c5c1d5c56035a8ffc1fc1b5f69aabe2f964 +cba4c0ed5416a20f102c82bdfe59ddb4a16140c85d55af2aa52c92ee85c37881 +9c95865704b3cc39da6270dfaca8c3611edbb6da767bb50a03d6a06ed9890104 +da2a575ea45e16da2e1fdcd603c91af6beb934ea33023152c25c27c3c771b553 +1a9aa1ae684e1539e549972c97321fa0710759b6d4b9e55ef1b41bda01d77786 +87c22cb79310a9000bade74a8ac97b3eb2ff024bfd60c0ad7fdedb23c805f64e +fd139e015e0d1d3591be5930c356e6b8c1a4f0ad9af94eded4ee9aaa436d4cf9 +58c5897d06b7c97cdec22745c46e7b37695a8c66140f7f8421138892f4851c3f +d355b1de1d32145d39243d0590a90f1c4ec2c246d3f3779b319c38d4221576be +fd17d8bc8819cf8ec30075305f8637d1ddf0f7255ad456cc290f10ec39ddc2f5 +290092718e7d268531aaeb377701dafa933b94ce763c1954ef0cce19d77c9208 +157c38b279c578c56b7e523afccc91fe6819483de18ceebbe74b81844ddb84c6 +22d4f29661e89e5417ce43c28028e9e1c54063afd716088b6e8fe0cd1702c2c3 +31273573f5c3d760c8a2c7cbb362ed650ea8ff54f19e097f14af9739885af15b +46ed31cdef73db671b22efd41ff3f6bbd29625fae7571f9542fc06c77e28d2f6 +3ba2c9cf89da564de3a6fb3f0ff981c5c482a1e1de730041b7f1c890c4528bf1 +8e79f2fa4ed8a738f09a68a5b53edf6cbcf8861003917a89989146af7ab2e5a2 +836279643900c27a90463679a22f0ca5077728f6ae8a28324f9adcc19fa493b5 +e2465c6d98cb608f8dc52cdd6c52bad1a1502779b638df9336e12f035b3c310c +b92b3add047365f2d25b0ec7e05cc46f31c0575eaf4ebea0b660aa20d9e7edf9 +0aa077e3000e25176038ccc92d4f9fdbae6b05aa2e17ad004e13308464a20cdd +0271ed0f964e73cb11f18c2b795dba31c3ffd5648c63dab395238ba7c0cc7db6 +b206e6179c6ad7c2534c46a2b9c1d7fe6bc693df35118b708933677ab3a76cee +9ac0303c2c0967d718a1691f6a922abb6b37625fc01908c10242731b79a1a82c +fce9efbd1c6bd483fd867bc2938609ee52c0271a7ed1fde1b8667b98e22fd450 +86f515fd2ac2c11c50fce95f3e506ac6518dd4e532ddb100d87a9240bdcdafc2 +0c8bec467d76261165e9d8bdac9197ec798c81cfe80e3619f432674cadf44ff4 +3f61089abeb13d665e7901f4a1ba84115333210009d55e051b692aebee9d9bf3 +d0219c290191c17f7317aaf402b88ba353c25f126e2d32bef73d528c65af0840 +3ed4086daff574762531794fdbf637b765273911297b75338691e9ef4d2ad452 +22454c6a9cbbf205039d6d35c09a0ce284e9a776773a98e09e6a816dd71d80c3 +d80abcb006353b4b7c48c76bd9c1ed9db78bf62e9ad2222e5bee9fde0281f0e6 +11fd6f899938cee729a184be7cbdb0b84fc9c380d6c69cdd6e0f3f6780af684b +cec6361673853b400f47e00177ff1ee7f9eb8c285a49e137e08d5d7663df71ab +71ca71adc0857055686a04777a2e1408ce629e018c97524af5588991be92e4fa +4a27745aa950a72d479c48d6f8c30d4258a882f199b4359f92a963fc650230c5 +79edf743f2cfe86a197296dd675bf05f25ed969de77bfdd0b518cbb5c30b4e42 +27c5117f235b34f7fc32413a980a38968ff9b8151280a0259214790e421d0f39 +eeebe98adba820401c2d47d4132cc68cae0f59b049d7489f62259bfc55091c81 +89e2480dcb77f689965151b7f6706af675a871370d2195b07457af8809f7abfe +7d3672d76a74f55ec749ef40f755a3eed96cce000644ca0c497afaab7294afdc +13c3239f54f3eeee809bcd936ff447277d2f3613936e7b39e683f25b60505f2b +f4343ed0902badeb62495cef53789b9e74baf866be33efe66c1c5faa95f60ac9 +156a26bb9f72cb73e891ee4b905f72845b3ae05e025879f07a7b91fd06204148 +60832d64b6bd5abe0472aa7aff07fa05d23a01238b6f624ae8db25bb71ddd893 +1fc6003f23292a428a5a99df5861e0ae858c398d66d027a32a71d6e62d62b6a1 +a1db86b1ea3005a201618f22899cb1e7d70f65fdcfbf7962ee0d0d15412d006c +cfebd0e0892888f26238bd1f7f090de03c41ee4ba53548f469fda2d94f6b3da8 +a606fcc3554e3f261b8490a3b8cde3ee846542668ce3b371318f9864c45a4223 +fa2a86e12034bba867c4abeb461c609c8d47e184703bd6c891f39076ee06bfd3 +bffa679de07d8c8eed9b4b24ff74c6db2cf84108f28e4f0fdb78e0e726a9bd3f +2a1b94daee18fd20f2c902cbeba13c1b281d0a11a96b20800e4cf939dd32bda8 +25aa63d9f86f380af4dd379d80441dc4fbc0719a69ebc16e1617940a19eb0b44 +96581982d45b08e512000e3915490a1a79b908e1e63ae129750fa45dd33c0e9e +2e767a89c6f11e33f193da18dc6c820dbed8d370492c19ad9d6407e50cb62446 +d3ab009d9e8f3c51eac2139ab64ffa19b70405813652fbbe33fbe5bc95d40b5f +9ef833a4b1b51e56065abfef1036eeab8e04f096aac0d2813c2e721e0db97368 +c17f0cc971c9ca18a2db11745f67d42ce5148e2e8b2c0e13e4bb16a2789f0c4c +e7b65be454ea623212bb2ce5afc6b5b3ad5bfed65063354becbc1531389977e4 +6599896d9ddbdf3ad6fdd8a44b14ec8cc9f131d73cba91e28cb54b37655e4b44 +db0457ae7bfd3c6b73bacf09861a7fe4b664928230fa03cb99ebb763703ff8d2 +68877c3a3b1cf915891578aec60c1f7d1e447fc777d8eb3573ba2a9ce47c99ca +a9d52f2f12b101fe48658edc7543ef85dfe01b72dc4dda597951ea4298fd444a +ee33b14ff2f91b7297922daa7e346493080868f56aaa2176c9f2c1284e4b2672 +a3b75face39df1c8b7a825a3a5c25871d190e48574e1d03a5fb094d418c47ac1 +687e8347036cc44fed3d84fe5d4b84a61fac9968b8d004c28539a3681476ac45 +56538901ff2764c1c46f5ffe048cd3a7eafc6a9fe98ff9b3cfdf3ac035a9d3f6 +8d75440d43a1842cc1e8b6b9b6d49a9bd093620735c9c7c11c21652a5262a86f +c10413a373a9e02a488bd9a16a51fb51b027b2c5cde35cb1aed91ce58703e1e9 +ebdc1a161d754ee437412182f7d532426841e2455add22c031a2171426881bbe +4090d1cbfc498ef46749308b73ebf4dc5a06adde6f83bfb368388bf7c2d900cf +57932ba4c9db0f15faff7cbd701050a1db98bdc9a5f9f428980ecfb1e999f460 +231e59b5c62c7879278f10f6a61f79cc9da24d35a2d26996d8a4a106e081b8c8 +3fcc015b775acb00f78953a834018c146c65cd715bfb5f90c03feac01839c6ba +156e327c97350d2851dd77e8263b967742472dc1e3b8f0e980de9f1815007cea +51619d84375b777d5cf32a144affd8ef0f4fee2df1f839b2a5d900ec8e76363d +c829f1d03d211175ab982226616b19c51800e4b5d4b28aba82980eaac6131940 +026e3c2297e197fb8f130fb15d2c4098b97c84074d4e50b5c6606bb0f3230931 +52b39a58964b4ca44caf45f63af49b330ab3dd863f5ebfa8ab0db6cc37838a64 +72c601c215037e94ac89420fea13d52174ed5c933e8c8525f88e6ce482661861 +58b904ba7fdb864cfe04bd7ce6070fc5ef576b1de985a8c4eeca7fe32b90d320 +9091d8931bc21c6f969288b1cab44bc53755d8d8f257466803dfd5725dbb5830 +4be6c784fb6f8c5e66802028759c0597246fc103eb63b58f361b144668713570 +8c6be071b51fde425a0aa5724986ca67e87eacb8f517fb3103e52595ba002e02 +82e54cb82b04c993d991d70b5eaac7a639213ec0f82a1d7750f3f6e94d8ac7a0 +8a586b816a9fbe78ff96bf1e3cd52798089f279a0a0d93e0314883988bba0f78 +7ce5745f8b07eb3b750c1d0a13fa4b0338346220ff9ff10cfe04f29e2c24aef0 +f77f6748b63b0c6d53461536034450820c73116cc66feb9c7f7d08e0a47d4c92 +ec61c5342099c27d93a79d9c9f278142ba03b51d6e1e03944abe063baac32629 +1b5dc30de8512f0cb3a973cc43afc2be532ed012c3eb58266cbeebf611f91aa1 +489d0174e713b976f3a0b36c575df597a3d8b12d4c5441e3a478f0933eb129ea +e44484e084bdde7d2d9ba23a6bf1bbdd51d96ba4a5207af1044e917186b7e66d +accde1295b615f37f1395827e29e3a1711fb2b6c50374df468be421cc531eae4 +b3cd2473c979d11c11beaf14aa9b6cce4acc8208f22f9fbb6713bb8306e5b5a4 +d46d11e604114d9a5a4be0615a843d10de54ad62d582302fffcfab7f785b11c4 +83081286cfa04302f7b92f64dbb42f3f97cde0c047662be6a3e58986c54b7c3e +2ac1b0d19bc1490311150931aed3497abaa74303d3f0a3f3af8667c4b0b91385 +cdc9bd2ae98ac32a2d943e0583a0f3c74fcb803559fea211098b48385d3d8d32 +9e2cda61d7589e5383fa32abfcac50355549f1e819eb31531dadc47f5e759790 +d355444f1efa6b1dfc7713d446008225808fffbdc81a3b1b374c7f2901e27e2c +41c477de0e52e9005288b7175117b32c326b3ad2b9f9342865d0bdd0ba6044ac +395c2c69bf82a7aa9b77842a3bc7b4a675b0c32a4e4504d2a9fe8762170f54c3 +4dc3620cdea9d1877f274559ac6d37aa83f90346130472775858c18746db4558 +4f2fa7698926c4fb2eef0951579dae63c2d3c7b9e1fc811ee5dda4dc5b5e61fd +c0ed21724902532087dbef11b1fd0d71eca9f271a3d1bf8ded5df19db6761547 +97d0a12f94147d64bade52704f880d0fcb89f4958547c6839c9e111892797f29 +4e65f7a54e14ea3d3f50712979f84852e57b9c1d70474a3593d53f21603e00e0 +e79ff355914f9a3d4ab1e14410eac9926928e714248535b178d6fe9e0e84ce99 +59f66fb52f37a4e3dfa5488b76d9ae2f62d4495bca11cc148dc20e29a694fabd +e65c7629ebc40ff0c0fa109631655d3ef9848e16aa7c73cfd4aed02f8f125ab5 +0d628ce52fcae577c7ef0ab688a2f4fa9a0e2a9b10b93130f0b357f4679c1f7c +9bd270f34f0bfd86459b402c74224a621dfad6ed316d05e15d31707fae7a9b62 +f8f75537326742f1e9d0c7483489f4f4fa38e0f327f24fbfb26307ead2720bd9 +678f45875eb05036341ba38660630b7d005304d4388ff7eb3be9c2635c21af0a +02d12fd19a4e52181a9c7f2356b2a16eae4e8ed5b1ea0c01565c26856787fdfc +2aaaf11958ff3414ab62ca19e947db6b78030e2c528f3d1c0215cadbb0c34f72 +6751da03c604bae7b97f379864bb54be9799bd387e88d6c7053f83dbae1cfb04 +f2ac87d12dcbe17a5183780fab4589e8b0d70934e856f11629a91e6d13da7704 +73cc80e0b80bdd42a71eee5f43a4dab994ee7cfeff83d08169aa298c98a85477 +dfc729ed6db098b4ae47a25b8ae7587b8cb2d59cc0989c06129fc201e7c9b763 +f8b3f651a5c735edc975cec4ce461e81ac9d5e3b08a708fc536b46b9566a58c3 +0402aafd2b6018dd063877b880f85e09895dd4c9d89b5f264ad72cbea438c153 +054e1a5ece2091e1d4105f46b047b75ff3be86491e694c1e2e03bff36812d148 +d9923f5d89a28fbc4f45fbc3db74cc37bf3cf41b070d72a4cd571524fa6df788 +3153e77818641287ae22b1c72331fbff019ccecbc1709615ad749dc77cb6b331 +30ca3d0fa05cc47447c17d96cf6ded782ff6b505193915aebe31f1f7b95dc9fd +91a124f9551224117174ae1e05754dedcec813a8aa4934b73de1b20d7c10a20d +83a8b085cc2d431b87397e5f8286c0a80704101475ec9845b2bf7ecb9ae457fd +abad09e4e8ee411d4a20518597b08d5dd66afebba03f632ff2ed520270893f00 +35cf0716f4a092faf8a0c2a3f73ca46afd2a825eee041bbc2b649330fe821807 +707a06ed91847b434d34742844947d54e80422f5b5b56f6dbda934089c32ad12 +375b31af9aa91329c253fafd3cff4858c39ae5efbed4d590819d2f5963b7e08a +99e157ca1c18b20c62a8f7bd278f560e871b6126d9cdcec52c6839417bc70dd2 +49fa373ca6dd557540906729f2fc5476c38595d958ab2b6c14629f9e16a2a9ce +9f6e2dd760e55a38a3432e74126135364cec00a7b6dbf0cd48555df9f31e71aa +9d573bb077085030aa3146d0693fe683884ab380f052c38b31b0e3483d122c4d +d15a6a93eafec3523f4b2744935de9d1660fb4d8a76d82045862b59ea2183961 +f9868bf03e4a71db61e03fae93bea1092ac5ec83d71dad123d5663149d4bd0be +e643435aabc919942bbc60d4ab56ecdecad30d270589775a3ff718cef0e2ea46 +b8c75fa911752ef13410185e5cea25aee6fae74489355d3328e0cbe8d4c55d46 +4114b4a4c85309dff4f2a5c2b14fc4f4779f4e3a8bd29076baec35cd59ecadca +09e93d8dd4786052d970484ea3cb45b37c4a6f74249e9f5eb7583b018dcdabfe +67259769ae1a904f20b3ef352cd191bbed998f4b2c06465d7355e82ffa718e08 +9dfa5c8fdaac95d8e05cf8b5a899b8484c5ea104eef3e5b21436ed396662222c +8cfd00b5a854ba9338da205f16e5c0f451bc1c6cf34f0da069af5ccfb460cccb +b6f393a99f6138e0ece299e0c0f7f1d0c83e0b936cac2dc38f08292245e7afdc +6538c4fecc7d712ef83997088f73ae6ff0ab83d0ae76a7811cc07b41a57d1d34 +04681526d327b489094dd961f2f60a0c6c275f09f0a171e88056f58735d2f502 +65a167d12ff3395df58c3b901a68f0d96f8ef54ac5548086229adac495fbc256 +afe832991f1839aeddf1a87abc217835e58af4199823165fb9899fc831b47bfe +4c3c1f5a2696e9a5f310afb8138eea06fda0688e0d0d7cd1ceff93a72c57289d +332525c3bc60e51ab25526a4876affb2c64657caf14b34fca46a78e41b0c1955 +01fa1a0c0d77d5f7026234af489b316872e64b4d449efc540fb0da553063a71b +d8ee44b0f9a20adb9f60b99803f1760c0cde357784e87042133aa085e9a37a5b +b5685e73354ca0e9a48d886fd12841674bc0713d43301883f1c2f6190b47a4b9 +996c0e528b6572c96232ecbc57c57073463ae36b5b2974163cff75828a20c47f +926e99faab51f19fdbe0f89bb71ffba9eb95a82b3a712b54578f665a89edf193 +d575ed95bb883f9d6797029ff0cc8a75459fac0cca4530e17d93c9834a8d9c9b +376d3e40f3e44e6e895f25c90a803cf8b0f3056037809e3ed618475c199f43cb +a7eeff84d38f49aafa4e469aa78cddb87ea76a87da1b888c38e225499d1bb089 +32d599918227c97b1e4de521460f1a175ff2fc500bb95574d9eac64cd00896f6 +27589fe5351f46a46d1fe8ae16fdc945decb08c0b7d841c5516535ab65b84724 +04796bd7b7083a606977316dffaeec0e8681c10df4deef6335403e5b08889558 +48bfb1b8708a5c41c5147fbed3942ac26ce66357c4904b79147dca55f039b648 +ae18d0d6d330a621301e3c1d6e478fc6fcee4c3382d463491a167596ff51f17d +1afdd4ee7ab8f1b27b4ef2b665cb6818637b5e982447f6d7ab2806f769d254f9 +f5981812a9458a39f51366773a8980c7c6dced448d878af3bc088237815d2727 +40093cb7c3a4e6e86ec6cd61fa8ad13b20e270f97ee5be1799f2966a0ca2a7c9 +32de08bb021adf9466f1b88ffef315b818954057877d3d59f173c1b1874fffdd +e3749a0dba7d62d70483b1a7c7720c1e95c59faeed0c8be1913177c6dbaa6905 +a6bd1a153906aa1b6919ebd1befb9a54d9b84cd9d548b1abe83933670ea719b8 +6337d01283b95306db92fe059da52d107ec47819bd163b3830c989df4052614a +9866b057aeaed455fc9864df1960e97806cf95011394e2052861152024969836 +77be8008c246f14aea1c26e620fb331f96cd32a23b1c87d534d678181a198758 +4bffe069fb5a0c6b63ca8a9cfb6c3fd6ecf07c5bc59712ec7d02a5b988c3fbbf +695fc7068a644d8885ccd88987532539e5cefc64fb97ec1376ef0a97970db510 +4c19b7a64a1b4f7eedfec2515996238dadbbfa8afd8004f12867de20912c2774 +1ceca6f2956b340ccb5e30f2b1f5f6376e6d3a272be05c29125f6d74bbee7879 +8836ee673971ab724dc89867d5a939da0cb41678fbb8d8ed35efa28de86728f7 +953c9c5896b867e4b7df3322563aff8a31cca8901b5542af2c7254547c7c09d0 +15baa7cbdc7352960ac650a543f05e290341d245ddd331a556ac7fc0ee7eb246 +718b71073b9a32776f6215fd8fa2297a2e9be23728cbb24c53ea10a4544ddfb5 +7d6292640840c77bf03728c3e5d2665ed7db7410c9ecb32c249a45664f72f8f4 +2e81a2e086b535f6473b1a3319d134317edbd1864cba7b79f89ef99d16c8871a +28fbc4cb45f982bac6de81ef637a7e1022a5579f73867e40e31ec8903632e33f +b24abe53b1f3a3097779b977bbeb41c21857909d3e25f7bc88e6d3fe6f183da0 +0133a99ae39080012df8498b9ce322ea9b76343c2e8be3676f08602470da2761 +ed9de407fba38be82de624e1552be40a0e10b55ad74367b91c80b8bc5cf59f64 +b79072369d9e492ee6b9f9df0b91ae608a44020ed6874038974ccc9afa88d6b7 +8114af4de09e77e4b0a1a1fb27e226a62385b969bbebb657ea927fd86e050ff1 +3ebd001a022333f8caca13c54f9b345cd5b6553c90b4f7fb949d7d65d9bf9fd9 +46a3c7c531f6a6479aab0d5a7015b56959777892feea7990edbd2b423f6e9ce4 +583caac124c268628a9cb703dd96aacd35b1031e08a741d02adfd579267df790 +5ef26af14b2bbdc22a1eb33b58719a1e8463f28784f4c15cb3c25cfb2e20a508 +7854a53f4ab398b02177de500a049d6c9faa13fd40c19178e878f1cc26221c59 +b40545f5f4442abba06656ead5afd938adeb3ea50c699862d48e767c223c1f22 +246e58c5694d1e23511710817a9fd18a1620cc651345e6d3302d85139f7a5734 +7e423be145e165baf46019fe831f97602ec87b3cdfb8fea12869c98f115d1b66 +5aa588fa82484acded7ca2c13a17bda305f63ee226ee1f37cf247f1aea9ff92e +2fa4c1e0448a5dde45294699a9490a5ea94cf81c53491fc19e2ade5af005c300 +a5fc99b893ed1d469788e94de823006f8848dc9d021f19b934278d44e8c73da9 +3728f389563e10ae6017c5caf3b4b340be1d7d2b7f24a8cfcc1ed1eb920cd366 +6fa12f35e45673fb12b45a6ed7e84937576e5327c82d7f27f6c0255f75ef4b02 +cd492b23ec1f346bdf8e007042a82ab730ab2805569d7b978a4b114577514548 +0d426dc4a8ad86de85b23ab5aa8a50a30bbdd8ef5e9ff8e7954a69987fb5401e +a9d039d5e05ef245e3c70a85236969f32bd1e5d29d71a2013493945e803838dc +7241a73c4c1f14548eaadcba64aebc29fd2253fa59b6b039bb2edc9e4a7c8e83 +317ec39a07b8c8297e4b08d4e6f01a53e3d690f1d1db49f19640c16441be6ae8 +d1cbdf853394cf665f741938733fbc700e8d82c4cf1d72456008a0fe55c8b677 +a4f3e197aac9b976343923dd4c5a181454319fc509d499bf14740ef1387f354d +d71c3bc5b9d4d2d9e0e7a3bc60c79c8e6d344bebeb3b2dc2c3605fdf1002f061 +d52f718b57d1f6c1406b1fdf2ce37ee45693ba72284c5652b2d88b29ad55d9bd +78032a76ae6427c19749ca1503fdfa6eda4861f0b0c72684589efe6c01d9c964 +1201b79c5ce03520510e13bc5461fa3d2897e2b7c65ebb571e2d0ce319248d4a +fcde6d70c38d25f6bbf0c09b64553c3fdadc64c293deda6e2ed8c191d7f432ac +5bcc1ac3183c92d545abbd4da7e768140b9f5a5077b08dc8eae64727eade3e5c +05e07036b08c31ba5ae366c642f816b5fa60e148795d3d4ce050f09c443d6fe0 +d44f8859d43da39643d4fb8c5e2e34f1b32142ddef07b1c02c09f4cc9509eabe +99350ccd3a9d2d6fb809016dbe0c1a29fd1d25cc83125ba7d0143e09203f9e34 +99c6d07cc78bfdb82f72c577aff1045cd2ce2e3de0300283ae5ac540d498e467 +0e3718e3dac6dcdf1c7ab2d5f75c5b6e56bc32d8ddace4ce7f9272aae188f3b7 +d6d31b380592cfc0de45eabdd87cfaa15143cce738ede40bd9a06db0b3d5f570 +be5b21b328b3ac4ff46abb190ec17e73d31af389dc8e887280f84caf7b317c27 +38593005aa586b3c4918fa95a9435e45db40bb52d2f6034686463c87280b8085 +877297a871dd11fa1d782568fe813cbdab6daba828c1c264c3db809cb9da6635 +640c3e991dc41cb1841ea1556b7560d47526bdc012a8f1dacb30f38ed0f4721b +b98b107526258d66804fb0dd4c52d827850d8f0a764a53cd81f66269a8cc114c +06482a5b2b752416707d28e88291bca02b7746161794437f61e7e3353ecc92c4 +151af9a2f0b0e0e7b8be3106fa8b455e60d1b8e7a30a45922fe00f7ac9031be3 +b9e1dcae83017ffa27f196e1b8da6cff1bc25c0d776dbf675838c24c57a3078c +d2f6dad8722aa8997078f22bfab7e8f995538174d577c28d1660e5484270e63b +90ff29111a71bcfdda204034ad6df026ba9fe61c02bc99e0553cae82fc1f84a6 +f8c744cf34a92b3fa239b23fa2aa469c5765c02abeea272fc928d24714c14ea1 +2dc6871a82973f1b57a2063379dc471f0dd0684ab5ce9ab8088512b548c0e96c +59f314ee81f9ba0a793072325d5b2a478eca04739746 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F122_0 /DTUUHP+NimbusSanL-Bold 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font VXAMRV+NimbusRomNo9L-Regu +%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Roman No9 L Regular) readonly def +/FamilyName (Nimbus Roman No9 L) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /VXAMRV+NimbusRomNo9L-Regu def +/PaintType 0 def +/WMode 0 def +/FontBBox {-168 -281 1000 924} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e152a40e590419249f2e4 +c36159f8e54b532468e36965a38646781ab0b7f6a3e851fd10caa49adfc1e546 +2fd2ec6150dc6e19523050f6148348a561ad8d2e2721eff8a570cb33460a745b +926c889304c09753c2d78fb0ca95dc6de5b8c524752c83601e7e9f73df660674 +f05ad83a166da9be89f22feabd4b2665960f6fb5bc32928e1230c212e5d69cee +0b3311a1738a11747ae263106916d8e95f25b25b4bc6afb03b79abb95dda518b +41a49458111d2a1433c043627ef9460d324ffe22935f4f6da88b8b91ae95b34e +08408a34ec8eac3f65b6ae3e3e2524867ee9d29068f81e4372f4470beeb4d6be +ee4df956becc0cb77f8490117b22b2fb75c938ed0a5e208d88bc38b2ab8b9cfb +f1d53084b6f43df336481eca0aa2d5317bc83fc0e1d4db01d0b7707eef217e94 +a7f985102ded27d8e8b009f7ef6db91b91e78bfae7bd688e10b3dc9ac77cdee8 +47aa4dc8ec78241e593d26ec7a60696151a2ae5325d736e99e01bdcbde69579f +92eeec224b6757eedc64a75455bb665df42a0e4ce7b99bf3e7d66f8ffc8c13f9 +d7a1ff7a9d5ff7ac43396779f11c9b008c33a2043d48b61b88b03104b1425f09 +675b559ca4302c001ee80d2b739cc0fd1023bf4f1ff9c01e892e59cca7c26011 +b8e0b6d29cc29fc72792fda5e7d5d88ef98f9dba960c96534c399c54865eab86 +0fa2e0d6c7c44b553eac1574d55e7970744d4792fffbdce6fb4365bdbc2965bb +2e9edad9e0ebf0b620db415ad98297f5ae83d9c710436657e74d26e83957c745 +89834337035a7501803947f6880b70e56a3a404c62d57b849d28804cbe0f5884 +435a0e12dcc9ba414abb732bfbae237001f557dea5e972ba0838a3c7c9eb75aa +4a050da0a529bdffbf9011c360564fd17a02c18860af6b86efd4e2c125686c9a +5e114e95c71fc89a5de9c589bfe5ac0480cff716345265d2435edae67cfc4801 +5bc08e7a48d683acdb91e05f469c0c8919d73a5d07a1ccb173e30e76680acb09 +02a40a3e11916198bd69f1a26e88330f50692d0d5917e99e7a01b327413e24aa +e98ea484e45897e6ae4d6997b6e8bbf61c9406e916d56985cb2bd297e8acfc6e +cf2d2281ad84696b7c6cb584bd85cc20ba14add3bc3e25db91124c0acf22e902 +3cfbf04cc40de331991e9075d22ab5ee0e849b340050e6c417c664a782d05549 +db2ef572f193b1c12b4635c2b358747046de5858ec32b3b2e79d42750657977f +acdd2ee5a7c9320d907438dba63aa05ed410fc7000f53549091be71be45da4ab +a315f95b724a60f17c70833e889cfe7ea206a7abc4393cb6ef47be3700ba5638 +6831391809ef8384aea8c22735e8062a9f9101add125a321fb65399cbcd9c9e6 +0f46fbf271b2b1ec80832cc054bab5ca80d4561da0a380d56d5cb3d90ae89a19 +48cd824eb1e7ac6127a6dba3e8ea40f00add89749d77ec0eebe26fd6ea5d8cce +f7239681b3d94898236ae92ff3912e0afe84b6c7e08134c158b640b4aecab5f2 +a90028e67d33df31b461a2846f83d90979bb22618e2a17c5d159fb59d5177e12 +edf1320f596e7a4c379329adb367f92bf2869a9a97398e0c20f5f017ca9db7ba +b3bab72b87a7b6bf4febd03132f9075c271f2054078396df8403dc91461325f6 +12cf1421f3099ccd799c2c099492c4f071336d985c0c360b2f5a5877fd00b6f9 +2e5911dddfb31d17a60124ee8da6cbda94196d7ed42804610e4f730daf2f2d5a +b767c320c62543e26534314facae006ba2064623902c8ac479eeebb609e8c3e4 +1516ce412cb410bd026231e22a9cd0f664d769e4e45cbb75b7341f06d8e37285 +beaa9ab71aabe3cbfe5a348681aa246047ca29ca6b442feade254c7582d32d3c +71b5e645c82e92f057eb5f859bee23daa95c575edaaf9896d6c10980a09db34e +084c8a754e31b618c6991baa856cb86877044e10c2f189b284e3195a2db6b910 +2574e2461d2fae65b7321c0093a2a34996c0b77123503e9edc623dd02c44fb76 +3c550840bdf969582d226510ebf89944e59684eb2e2c463e69702266fbcf8d1d +4c0be400495e227b9cb21c8086f328782ca7294dcf3ecdc1a62714143a4c1b98 +e5de1dd554fba60571188a58f0354a6b9ef580689b78a0c8515ca05a35832616 +7e0a90f68f3c306ab60aab20872fb167673f41e8e87ff0111f579cbd0da68b56 +3e35d2ebf9f28b104082e36187373efc7a33f62d3fe4a390b63a76e9b2531871 +6bd59861f51b561dcc115192a6fc22d15a5af03ba09cdfa66b660cf4288e9d79 +26e797256659b0ff64bb5d900990c3cb588e1e18810bcb009a91e5f4f8d9db1a +f2a063bdabd9c3332f4bdb701bb94b4fd24570b440ae74b8d924e48e7c2defb0 +53a19e5b4df39abf4f6fc6160b5fcca00608422a3091cd03e726b1ea1d203b3f +c44173460b490498eda3121881ebd21cb5b571d21a6228cc0a1b035ebe97f26b +0b58179bd22ac950ec3a98458051a874297cd6bfe731c5b413819503111f1f6e +ebfb5628c955f5fcaed76f2402ce351f77e471d1c9821dad627ff25131590577 +5ff9335dd28d85a11bf155765632b34a3aa1df9c01134bd8fe927e0064319951 +e2c1d374c9acfc30932712a5c3e0fe3c7e355e3356e9135a143f1b4e2738e208 +8f44633dd9300bafc770625a64b2bd20d4f672701310e5d1d5b2dd502802539a +65344601924c473b7618f9b87bf6eb49474fe62891097b9b381dfc9dd22f6ceb +340efd950b74e614a2908eea7b0d395e15943d0a9072e2c0e6c91d9141c84281 +6a59f02111333723db78c2c287675d73152ee3c63397f5ea6203c707568137e0 +12438b86ead16d71a0a56d00e6ace9d80aff646b05d829dcf08dce2fed1a17d3 +83a7c9e7c2a5caeb38bda802e6696bab17a5d1e5d6c51b6371c642d5588a2945 +1f3c8b0cd56806531579f7c0d10a9fbe254ea910522d955c86ddd693b8660bbd +17b2b23fea57af15b1720e42c6de537074c071c50c114ac54c45ba2fee00d13a +2573bb9243648a1be2569cf68ff78e4cacacdb34dad918a30005c31f17781633 +6b74af8b9931bec0c1892780020c1a92470e3ad7f1bb6ef26c835f13a9c56ded +51df4a7847c993b88b9fda9a8955d8bdbf6ba773d06645e292ce26d9df4bbd4f +3d20f52161853827837c837f33425990818b958adcc3ae79b5791ff04daa32fe +54050aa9d34606f16c7763de770cc33c9acb60e5354d5a27a687ca6e0fd74a4b +5cffeadf6ad0ba87b906c09201ff65ce6c3f620bbfaaccbe54da884b87e906b5 +f5285d3841ecf78f0a1ee4a80724da3a4fd49ffbaa66be3402a2480a6f8fc164 +343a369e2b8947fd5f58a4697234c742685421ce3d57398c5ed6f6b049fdf39f +6870236751d9ef2210e680b4d8a6daab758bd7fa7da9680604e5bf85d1826611 +2ca08e8922a1d46ac853f4bdca37f7fe80d2d27854012e4a8f70bd854ea4c189 +ea6939096b56168aeb971aaafe1bca667137a76761cba2fbffceafe3e98d5590 +db3dbc44b3f9d4ef0419cae23086898bb25a222eea19c1a760389672933ea7c2 +8b31025619bd108b79d51d54e23f401f42165f0d513bb2409ce66ba3e83fc000 +4372873eb8b4405a8f5bd88cc2f21d2d60fa4024707869c5fd40d94028ed13b2 +5762cc7924d100d3ce0dd32cfca124ec1fce4cce8c137070a18f05cd73809449 +bcdeb0ac24dcf63679d46aa8b3a4a5d0dbfa9342716619cd3683dfa7a9d6683e +5a7a03ddb47833fdff8935f2f004f58ede6447adce4fda1b734c75c52d16c406 +9428cdf68855946014584f7fe49b03f896e0054cffff5da4728bf4ce1d892052 +701b48b81f58f5ea344e8ebfe13baa70cb43ce4a979d8225ed78417648672e61 +07eb7b31f81cf52b4136288200e640654e83534eadf05301faf2f3a859772c3a +545fc20429119ff00c259aa582af4e3cde1c99769f4e433d9b178edcecf142ad +ffaa6da004a90f53e70048aa8d15a26bfcf7b02ed70bc262d165e99f87ca7424 +0eb98f3d7fc0d4926ae43c8d322bb9eca24a4c45f7dbb0feaa9a900e3521d6b3 +87b52a30acb29c914b06793f19a1efbe3be7d0b8e20cad99d292c315b12376d5 +655121189a833132715762ca7118685814f71aaa08b89e466c7468bca01bd98b +63ec7cc3ac41dd06c5bbda86227afcc1f7796b5f878946c135bfa75a98db1b57 +0f38c49770ae23986ffaedbf6644df58a252c29ac821f4584b96b5ddafa9b3a1 +aa0ef6d17fc1e75916753bc8c799497e1279ec783ea86df307cd54b58c2b3ebb +fd722006d127834b089670e5f1e7ba8bc4a0f6181bb4efbb8f99e4475181449f +2fcb255da4233f7ab097ef0108ba3fc12cda0618870eacb9fe4195dfab182242 +bae0956d09e388d10da2f940186e25c9926886e9806c70105dc75259fb1e5da2 +675e4e114f84862e6b822a10a9d364b1cd13dca3d385b83499c715ecd7598766 +b215910f002358d592fc36d0bd482ee9cc338378ea1566839526a5783f250818 +078b97d73b1d62a1aad3d5a9753bfef23f7b3e6d5bd318c463aa04490b9063a0 +e83e3e68109b182720d2b1c13b498f8f495661c0f4e6455b96a6a92ff806f1cb +3b1c6eac82d9a687b83c572c42df22beae31d1239719186f14ef637fe4e7c7b1 +fe8f4f1bd8367d76d467be95c394a818198d922bcaeeee371fe17e396b27cec5 +f0554778587fc7d78acdf317a8efdfc82c2f57b6411b3ab68f96e3e7cd321a6d +4783435056ab5a0095726435be6885bf2784fb2cbeffc0f8248dcd594d34b21c +98e67de50b6876c3d6d4d4ca7ce0b9013ebe754b104dcfc0719a10cdd9985e19 +2cdf4e88876c2dd4e79e23afa70ab5b4758af32ee87b8415b881ac15c5c3e1bc +d17a5b961efb3a8dc987deded6f28a240d66f004ad05ce1c551e29b45668db2b +305c9b1af5cd5388a0802d80f18e0f4bc8065baf393ffab9a4d674312c2033d2 +7c78b5e9461fb09b9b2caaab70ceb3afa574c89bc620328211c85656f63a8ddd +97c827297327b7980c2fe0acb1c34866aa3c5d7408e257eba3c53de8338bdf96 +cb7ba55fe31bddbf7807148c0a132bdbbe8a2c21a23e11889da13e429914f7f5 +7132936359a0cc65e5993caf52902f76f75d6cb46dd20a3c0be80d45f2c746bf +236733462080fbdc8c5c1dbe9781f45aba74af8033a6ef2bdb16f7b0930d6b6e +7ca7fac8cfb2dfab8c063d961077585d24e8fbb5e0b0bee9c4509b23361dd06a +dd25767833b9a770780b311f608cae7adde000297a2672211f0de8cf7f5fbc62 +78faba25d035fe3a7cc3a4743c0efe1c4a5e9cadf1e05bc7982648d5c9fb2992 +4a9ee1570ba2ab068cce168552299361d62a2bc2c0da48ee94d1cedf1e2d29bb +43864ab5b770a14c98a432ab76c17998904f052a50ef845100533ba5cfb24c84 +da53581ec4f2201ca9fdae76ef365515188ace4cfc939ad6d193413ca7ee225b +0137f4637f09952213be725cc7aec579b2fe85f7c6af18d70c4fda0557567e64 +d430f09aca7bf28984977ba0f5849a5a86729d5640bbe4c30b17ab03262a02bd +8ee077ead7fdaefd37af16007d83714aca07fcf882adc4792583aabb279579df +6741f637cdf8598fb5827528771444b0aa82dd5e00e70edefa7405a1d8a7797b +ef021a53ba68c7ff6780c94f1393d1745ab1fd7c728c6112766a3c2e21dff002 +9e45a5c5668f8b084f22cd6a6cfb056cf0f402a73b2c02118259352eff6d680b +877ce3024c37d532c186f3d4a97603704cc0ddb25cac00aeb4cf601f6fb45655 +8939ab962cb9e16a2400938d226056535ebe5707cf0a8678b54e6e3a103b2eff +0bb7306d7c7c3f523b2aec267a5f1e3f99208d8ec9ab27d658c26f635c2984ab +5a4d214768c6dc775bcc616838159aa10d5bd93cfc8b2d836eae5ed480fb6ddb +24253a62a1b798bfa51b068b6888b76d2233b6fb11794f166254cb3ac8cfb650 +429866dbeb8d09e6d03889899a4e8bfc9a855ea4660f928d0aae8247eec1668c +8e798398d53e52a5684caa59c47cb38c8f1009a8aa12a269a587593874c2dc78 +0ba989078910f3d70211147751e9f7264d6e64f1b05410ed3427bb7d0704443e +f2baeb0fb9e3f1c1c14b178e716feb4644240447a3f02211350e36e1a586a042 +9ab336c6b44c0d2977294e704e8695b6daf079bca033b6bd3485eb7a78582fb9 +373716136c63eadbab3a2577738f553f81135829f9118f4bfe20cd51190bd7c5 +17035ebe97f26b0b58973ea9b5e0d111d9eacf2fa54b223c4f40c139ab891a41 +c7d5ba5338bfd58090ea727c3fd9d0c0217c05798787881d07cefe019518ccdd +a7ad72305f06a98717cda80c5daaafc50e3c6d78d2b5d851beec46731a6c29ed +ddcb9089de5cc2ddb696d3b7de3b67f066527ae22cc1ae6285dd1ad42e0809ee +65812268d28e7105859262e9368a3aa7fd0207d47de5ea5591927f5e568386d3 +a61fcbe872945a272c75384be1e85b26aa094704715f1957de37a2fde2577ba3 +85000d0708fc918d52360cda828cedd17cb7d625155ceb6931a29025b44ec8fc +3678fa08027b20fb9649d07f01484f2fd2e1746f290e32434fcd4d15acf0708b +ee3fe9948d3ae141749b47810558d71d592735c1c86ee375be7413b2cf462660 +0b115cd043ede5612ab895cee0909da8d165408cd5c4c34114ee4d7fab4c37b6 +a31cb829c4bab2dd04b1a7097dec24c6429c13482667116522f94edc99de551c +a693362be4d277e12829bc466e13d09841b5d9af504be4ea59e9c2459eea5ac2 +c678e3fa30cdfc5ab855d56c1ad8374f9769a6b575a1dee5aaaab4f716dcebe0 +0fab8b0b5522294ce3164f8446679fcc7aff5bf49062cea58f5c661a895ae753 +8891536066f8416ff5e357fc34cc34d6b68abe2fb2c540a7123bbf90d2671f65 +90515b96cdd1bd2c1396bc15503caa4ccd3ce28e0361801bdc5da98887b2c39d +b84a0a4de7859c7da394acc497641ece12ad8a7d62ac5f8e6bda0577fe64d581 +35390a37a1570cb25b23b747b236f3f2606a3ff6e487a78069a068e7af13a8e9 +315016ebb2552f644065408a69f1bb6fed50486b2a05d403cd56ec5d3671c9ce +091995d384491b65eeaf33078529238342c32a4b81788c31e62ba0614bafcf9c +3c1cd422c605740a8939487e26bb9233d4cde68afe7a0cadc3aecd739c9c425d +09cb50b4b4be28115ba7fc59b541513cd6fd08039cf40a1f5b90a8bd1263806f +ec35aaa4100ecc05416ece2f061cfdbc321cf3324f1eda91976cabb8d2d9acc9 +b93c575c363fa691e18215311431841de8187a20d6664348c7a8adb06e867d02 +07bd48fe8067168c4412fc80cdba62f8b9209f5407670a26db1f7f5d67c4d227 +90bcd0f1e8640e5f9288c410487290808b88f9421d506386ac95cd959fd1ed07 +778de2f62958ff409d37332aa4ba88c735f2a56e4e746ee98b9667072874b21a +5f98225aeecabf5cc818f3fa54edde178b40a1b1d6e2f900365e2b503346b213 +ddb43a269c5a973d303dbf615ac3caabfc39fe2144681e7cd633056bc77d95a9 +16f54291575aff7a3a4c13eca61a8d261b3a74307aac38b50c0e55222626e717 +db6e122547b3b8a766fb877deeea52ece2e74ba02ca7676f0e037cffaf287340 +c19bbfd9378d8e898225eda3fbf814ad51f976241a7285dbcc62610fe998ebc9 +7dc5961af9d70a6786e8922e7932a539f1606101440c6855f2284eb34a895cae +44637b6a0b1c6386c21f11f2e7ee2adf012ea6ff35314981226505bd4b0ea25d +371be9fb6fc0425d8f374cc51fcb15600ff7a49a4104bc29a369c8336438bd4a +45b7c8fd52577a49acdb394cbbc16c844ad99f85b5af1e8018900d50862d7c7b +045ee4bf7972eb05aa5696a004f3ec9be95c4c14180c7c8098a3a0443c0dfaad +91e9c3a37509b29066af112db77107b9daf2e45e72dcd78660d5d56018cdf1e4 +ca787593c31a2d6ef925e37e4ee77e687e149bf506664975ccbf5fdc20b5c306 +984208ffb9ec2f79e76a7a029cf5981fd2d07176083d7fa0d9fa7b1e6c6da9fe +423bf29011478ba39fbdc7e77ba230ee7b89728c9312602dda359f1ee65ba362 +d1f36657943255d62f0c84fe8a630204a8e64d8f940e9ddaf3c2ddc16fd131c7 +f302a2f9fb65ecccad4616977b2ec724fc6a4c39417962e0de1dcfa69aec8a02 +07179266935b655d20af3d45228ac3796fd2b7b6e0580904a27fe0c8023f4fa0 +fd70e469e5f309690c6ab737e9e0dd1db57fb312362b64ff1955401395b42086 +07e7f9449a8953149f324b4d5785c2a0a4c28eb487fd0bfd65462a1a4a741be1 +b1876330912edefcace1dfacea7628d16a4716d3989e1b31830cbc2bf9fce144 +9f0e80bdcbcfcf477a2c30a72ec227b20a0af16fcb8356bc205f18c6088c1d6d +c579f1dcd23ffa147d72821b7a63fc011d5718fed41b16ea1d83ecd8d2ade289 +54eaa105f82f777b6635c160d0e3d67fbff2080db2a99d489a070d865c39ac9d +2a88ab5fbce010919edc0ab213a09038fac6d3c81a4972e3c5683f49480fa5fe +b8cd3279398028dab63ef7e8e1df85a63f93273f187f8f8619c14ab824c97c3c +70d06fbc0a1b4be1b2b7f11ef469adef71617b304b51c462ab3c6c0e831c9ad3 +cb80c5e0d0fafd079d7f4f245d542ea892c6fe3c3d6d1ac2c92371b7a33aab5a +ab8375b4cae9661c9d314999093b2a04ea1cb671c9f07ecefba615e023cb0f72 +b6eed231ad31b1f4d03e807e56c1e1663986eed65e3ee47a2dd11c1211236973 +4b4607a6570f534debc72ac06dbb2149f9efb793a917b3b604271fb764fab871 +f7aa5a5fcc54533951454fe7afa29cddef96e951aaa9b8eeb3f9b418bd132974 +c601b6fa29471dc34814fc81a1e1a5155951c12022aadce5826302220b18dfc3 +d30b2277d08e7cc7a87bf1b8ec4507b43cefb117119d86de3be51bf870390ea3 +d8daa3f74ccd3712d1c00261e853dc3078dd411189872a50d85d58cee8fffb1f +0288029490412f3e58f83dada08fa695b18efd0a4f289705385a411fcb2d7a47 +ffe38977fce18188c0043c448d27e160ee752be0d44d0f83b6bf642c694aa530 +e223aefa3fdb17ee7aeaba75b9a86d7cb0f50ad4d5ce68d4ed48cb0c188f9dc4 +34548b48403078f63079bce8529f910ab280ebcae7df9f824dca756f9d647dc4 +d42da412230a6231307e7495424f98c9f129cc4a326a3dd8e476e18d666f94fe +53edc87e47f6d84abb643ff3b4084437da26b4a298f819f4b6823eddac11bc85 +b9f5c5d0aa1e7b0ddca82c8e01944b3ea48978c1b8f4ff47779a5523f600d33b +896b659c31f4f6f7decbae0fe1f83dde18f77f53db140a36b0f6f4b883ebcbb2 +b6d353bf2ca6102173b6dfba0f452d011f6cf7d661a470c3c5dd189c1e83fc4b +9372ed67ef4ed9a5b98f85c8d73d490133b7362ab976a385cec705a2eb89d7f3 +2fbd60c08b86a30219aa2988f79e6386062be839c1f9d30affde82cade3494ee +13041755e76cc07ccb3a4a701461290b5b79728eddfc63b2ed5cd4bbe0c4c365 +75488d590258ce2084f898d7c58b3f65b09dea2f8d4f71e80b2a2f8f31d5fcef +7a7744b64d7baa701e473b85c65814b0a93e3ffbd7b2af85e00ffbfab9bb7766 +f444709a47902c919bd2a4becdce07b64053aea1058e26024b46153d6bb92c0b +59861b2ddaf3d38dbea5bfedcc49938eb98188a3c4dceefa1f308559f7712ccf +288219c6a3d4eefb81a2c5f154990fd8f09713a0531017d74b47e1f97aa6f0f3 +92ce5bb7475c676247d57bb14ff676f11a4b5b564ac26bfa9d85c9cb0414fafb +c35b46eacf74dd964fbddab28fd7bb304b9bf4e12cd15b3bbb163dd66e89f24e +6485c6ea63365d29907f6ba96d313f9b2ab7d175d549f4235653ef979a5c63cb +6ee50cc333387a0ed88d30d9fd2197d31a0894ed0a47b15d92dca463a8c84b3a +986d396e6530b2e9ba127bb5662ca948a8f0c563b9c868644b8d01064db6aa72 +090dda0521e6d778192a8c6d4d4639e80e309194cb76fc5d4615f396dd85b06f +71dfc7f39a259e322c5e7d28646310eac92e5f6afdd6071b21e6664e1cdd3848 +c864ce0e380fdc48b251d52b5094ead64d380b6818e2c8b1a4eb8f9c18adde6d +6e4ce1def2ae8f2649f1e5aaa05720a358a74e181568a10b536f68b7a0292787 +12c34acfa5bbafc4aa3eaa4d8ebb26e20bb00d228b4eac4a163e0b72899874a3 +f85e82c396d9e2891d8e0d6e5571d4ef116879cd2f5485dde4b9d40f638a3a95 +de5ddd14adbe72f5bbadf0d9950a195f64fd3209c6d47b46b7708f855da96cb5 +e9e1260f6699d945a611a7ea348db3c86be4b32fc2687f15c4c86957018d428d +f6244a1fb6a99122bf89d7add01c80f2b2bb2c7168b02c400bfc98d65394948d +c736741f9e0244fe096571f087c5d6d7d022c726a4cecf37cf2ddeb1e9d77098 +60c5d43121bc2e4b72a2d895a5ad2f449196aefe8c01784323de3804363b88c9 +1c86124f431e6dd0744c3d073fff4bbc2b98bdef713bdefc2da4e0e22eda76d0 +34424ce13529bc04c078dfbf8b3efd96cf662c4e151f15d4f8ea52641689d4a0 +5f7c9ec4efa5119db9e3a61e4a669c29348a1e71382c093499cd35d7d1227a5f +5bc3db96823c167100074c70040a55142148196567c20c7eecbb25ed6e31f563 +9add24d52aceea4b88114eb6dba9461c2e5262fb9529e9f6f0bde20d3e209a8f +0c9fd81b99b00d268f764593baa894f7ae50634766c922f751ed183aacaec03d +b7d96d012cd0d111904245be9537edb0f8769ad1a8abbd8d1cbbe5e79c53c00d +983c69d8865e93b6495a2f15ad9ab1da7503bd5b85ebe27aba01f71e56482be9 +d4342ac2562d8e6d1e4146447561ef5068d17306d66a52fa41644897a9b161c8 +5dd4161aa3d956e7961aa8020467e76a833e01c974e32aa2b8cf27d62fc81ee4 +d74649bf9530306481f430a539a95dcc2502f712947f6a68dda00589ef404132 +1dbc8b94afd827bbd5f77820353fddec5d98fdd256e858581054789781ab090a +816e65ad3dc4a68b4ef2356e7cd2f906a859dad680d649457bae159f91805d52 +fb6dcfa5d0ac6373fa8325a817563bc9ed89a17d8cdee9b7516f38908e426f05 +1517eec7941cbadb22390e3e2e17d62ca67f37d01377c5a1e09bef5b795b4446 +54b383193351e05ed8bbd8b0b138cf62a428c78744582eec90a41c3bd44a4e73 +c9b32ea4936c211269ba5f883d45b16681f8afa0646a4031ef69cf4936305336 +5758f50534e6974342f4d232b5024dba0eb297e3aa3e9ef0935bd47998370420 +ead844c7e336288356715ceb8cb8492ecdc8fd8f1183360fa32850051442f4d7 +c0250d658c633de21048f4676a1875df6a8a61f0fc7c25dd5acd0220798ca70e +f09a72b19595172afb9085b9a5971ad1b9a3a2508884a3bce88c984f58389620 +95584866c59f89120c7f491cde35b9d179f11db0d3c30370138852050cf14b18 +c06dadc218335bb465dd88304f1c1cd11062ca72649491fdc62d571c082cc816 +261444906d399760159f6b1e6df4b42a7a84750aa61c034b11a6e7eddcdeb54d +e1f5151042a8e9f6a23a81a235fbc3908a85a6b05d8162bbdf3a672715b6fcce +554e98df1f4583e03e456469890f07f83bc0a8954fc5edc7898f21f6917d30fa +36faee98f622ef313cc8431931d83d271cef880dba07b832a01384994e964233 +f2e29de305c3863191f877dfba44214da68bdbfbde1e3b8b9659d7800df5bd19 +28bb1425a51abc317efdda09d29e04ec8b17bd3b78085595120b58fb421916c6 +af4b92776ef8a8211cc376a37566422bf2e2a840be57a357ab9b9adaa20600d5 +c49f228d2f7bb606fcfa867342884fcd426a72ca4c5d09612bbe26a2d9d3c8fe +15a55e095b6705f2a2f2a00c9f1cbae16b91e13798b96d5ae66b5a8d1cd751cc +9747bd951a55ec3fcc11f58f8afb40913166ab60a01b697507fe0753d085e5a8 +8153cfcbb70e29b7073ab33f7be2b6bd070ed974d0cfe4d41f7f57f05cef38c4 +251aa826e4a1d37459212c1b411b6b51faa564da0ff48ee6402b3c9fb77d502f +61feeb32602da2b5fa880c537f60e1394571392c3fba4d110ff47a42d923c153 +f7a83bc1ffe67cd11ff1a763950f2d7b6d9575f45562c3a9de6d4ebf59482d7a +716f39eca97fd68be71aa73987d570ce2ddf953c6ec97cbb76b147ceb8973564 +7ee159434e3af6588f47ff9722b7e90f4d9fd0c5b9e9f3a14f9bfba60ca6556b +0473dc073a961731d322161500e15ada373d503552c0b76fc6576088e630cf29 +b9b0c82cb348259edd482520a84965a53cd673138aa57c32e41fcf50fe24a447 +4ed23401f43f5206de7fb3b6d1750223115919d85b54eae8298a19212e5c66e0 +c05c6dd7d7f8dd877123205b7e391a189e11fc30fdc6532fca87770985b357a4 +fbf9c5d261a4c998e2fe8eb96e27dac9daf1d3f0ec7422a85d9c7b241857209c +f372c03c1100d8ebf3ce4ab3c0efc1f979c5999bac6d4abb6abab1d059c53f7e +34f972f56df329bdb8485e39cc98cbf20ccb70a2a3cfdad4deb3267578b02f0b +0340f42bac749465951198d2ea2bf7995852a50b5876597e55e1a1977b9e2f0b +8a8fb0f03839dcf6bd5542827208d443ed4b9c0145e4522274a02e4420f738e7 +962c6d9fee17520ecf6d6772e5e77d6ed395304699dd65d7a610d793e38ce3dc +e461843d5af1e27bed5652bb84d5e85622b48bec72e1622ab11506ade702cb2e +8ca3ffb8add5c2470207bed74f2b34faf8cb61dd5e0bf54f2b8e1c7ea1fee81e +0e0a16747443630b04990ee1be9db5764a580222b27332072e74a60ab7b789da +aee741eb538e3ac7e38b333c7f6dadcad5b9383ab433359862dcb30ba53a413b +5e9947eb637e78eedc4b8b17cec6b82f4cb8d2d71a37921e69d428723823ec95 +0f683a6bfb55d22dfb161e1d6b6db49dacece6e43ad2c51a70e6342a85169fde +f8060d7da7e20b4db176bb862c29749077d7104bcb313e5c886a01cb16f11f62 +984c5f853516c1419df929d29eaf4490a3aebd24358eac006a594afcb839778f +d0925e2daabe74c7ddcce9a4f454633b52b445fea99105fb0699485956fc737f +25625d53dcf0b9e2386bbf0900e0e011e8adfe162d5876a850a6507512690d2d +d1f00992f4dbbca2c63cd70b16dce15d1c128b9d6881f3f7ffeb68d7174ae769 +3b6f5e02523c7f046de294e18255b689d2ef529e6dfe489956afc909284a4d43 +b0ca1d9f8b9be4e4da535522cd9b6e64841c81138ee358ef6768e7f78af8033a +6885457da6ba42cb4bdd4f35233b8e5ac02b7d8fbf2092bb8ce890decb6e99ca +152d2aa56c5ab4179ba7936c74dd6c342a392131fb96c14c3b24d9f0e4d8b1cb +862ea5e7b13e204c914bf95f55ff32e4308fe5b2949fa454560e8dec474ef52b +65bbbed017d5eaed0d89a3c86fc63bf01d3a6a10a5fe389b1af013ebcbff2a17 +7f6e854dfec5dbf19d4e977a07a42287a2dbd42a78e589a002cca47eb865bd5e +601a98bb3a8572f20ef1c0a2b3500f615b1b8f9b04215f91acec454312ec1dce +08f413b9e2ddddcfd2bd85125dc5a043a45c0b9d3c86ac30b21f34cae2d347a1 +e93586eb95fdd3d1db7157b21b7ed1702d31876a1cfce58d619a66df8ccc3116 +319854a57965fe23d2d2d7e02f4d95d810e8a13d29872274fa6f48b7333b743c +7af418c1fdaf467acd5483a47c5e99a7bd81e18ef98763ecc08820176a109145 +af183870faf171a3c24f603654896e2d1b0ac6224cfc765bf747e194cd18c740 +6c61fd10b6b7dce9c0a6577a87ae840e88f99cbf1c1d6cc83623d2fe80bd710c +ec79256f89f26b45f75281d3de9636a134f63e244df4a623c63a895fe66e1464 +1959655f235bd056d65e3a50f55a041447594422eeffacce6af7cc9768f72158 +18ed408e47358ad45fce20e4848cc38f70943755e9233ac711e663f2c7d77b46 +c878e70669ad30ed18b6f832e4d7f54a23c837ed440ae97883348a0b5fe95232 +779187e429b6f855ed7cffccc8d6784d8bcd92548e3257ac87231c36f119ddfb +f28ab8dc8b253a1fa09f016887fc29b6659b40bf3dd9db6ead8c8c3e504b10f8 +37dac82a816e06722397867df32fa25da0713e92ede9e4d41577ef58ac70b402 +a4427a7c86f7c1d7f378b62db43ca4bc3a8669f6e924d719f18799d1a9e5969d +76bde4fc976074f2d623721d38e3f5c73428d6824049dea9416a450be02dcb55 +908e37faf4a56a36519311ddb3d1cb66837c2964a2dd0d34a23dde43eb30c88d +b6ea541956b904db911d009f0b209bfdc139f48878c811ec38a21692f9b866c0 +a59d9d736d429de0db4b0526463d0348157019a262b2c3e0bf54095d06110593 +3646fcd24134d6b3a2a906a891187692967e93f69a54ff3ab8050418585ed1f5 +9822b134f8841589fe146d05ab00c8e22651c43723216c053851a5d1f9bdfaf8 +59c55523acf1e394d27500a1cdd551c773c9a6d7b3882f31f29c281fb6c6250d +8a1c3c8dd110c1910014da6fd1d57b8ae102b261fb65a3019bd75e81ccebde3f +3e23764e9a5dbe640ca98585da2a4af9de5a5045598a905ee7b82bbaabdd0d92 +bb5351d3a0b3071e8666fce45202af6000790c1c1d0a5bf0c4623b9815b8d3b7 +7c39970a509db6a4a0fface38a60e2dccab7f5b7ad1c0f42a74da16147589a2d +3dadde9bb1a63a4047ea20dde1109f8856bb81184f4256994b5005d654e49086 +7bb8396fc8d807ebdefbb74e9894bf0ec793699f0e68263885581a17c87d7082 +371d3d4884b50e1295c517fc56b91ebb6b4c23b150d542cd0768924232a5ac00 +8a98f5ce9adc8dd3e65f085b35640919767237d0f9703cbd691a987a0aa0444a +5ea0d887837482a7248865cd78b6f665301cb67cceb1f689198821227c1acd81 +3d0a50674832bd33b2672756d5186c89528180e190d1525c3e806caddc1e4157 +46055910cee4f60f40b1065f435be8a39eb454d88f5bc45ba818e5b006e5a38d +29974f68ee1962448f7a9fd83c7f107c7788eb8975dedee759a2bbca40c811b9 +d857cf8e510376d48abd60567f307d6ec471f99b03cc7b5e8140dc0450af3832 +242a353515b5b347774f32b8b6c033adc43b2bf7185480e47c868308f3906bee +e44131b11b2b14e77f33686307842337cd1f9695491bbbdf271b5345c44d6a75 +58c59d6d5bf8b24af38248368644e331a88cf73d0eba9dfa6f80f11af0293bb8 +40d9755540afd18fb03e0b26b6432277434166123d80044808f6f1115ca55b87 +60f82520eb81166f8363b150bac7f45983d1f4ea0b503fa8d041261e2fd14caa +c7db8e5b1bdb04a65cbb660526d8b21eeff68105486474803acc96e7b882bc9f +5a1d5f1e333b2b2aacf4272a05a41aea04b2c18a82b1c66a40753a3690aef089 +b9fe83dd0d86fb7b7045f041b690928b7b2b67162a1f5564117652fa7899a444 +bccc231189c60ceb72abb4038d7d0ab5a027bea7ee75542416b12a16ee00900c +db94b2c89b2345d209cd68307e101cd06dbb79e76c725dc7180becca0eab9f8c +ae1714c57bee7e7f54c84e7a2ab9a2b1ddd4d160cb4825b69c1bf5ee26b18391 +acd6fab3f890d8cbff5ba3666b8d7853652da2bd5db79ad8de358e55a5e02270 +e1a2d09adfed75088a71593ff0f54d5c527518cc767584e4380b8fce58b04ca2 +05a69ee280da655169029a16a3df3b86fc4ab635300397767c7d9ec3b3fbd60a +bbf51ad4a3cb348539fb9b7eb072ece9afb2b3c00e2b91bb40a82d2ddfa58e9d +f40699038c9a7bf930a83996afe9580c5338405108ac04fd713bb22ca2024475 +f540fe14290ab1818d9bb19483aba2f39a958ea417ec73792233ab538cb70e0a +455c6b7e0bc86eab1df73eec1e16a6f95cd23b8f695fd2b919dd282bd1129baa +93fb68080d90c29776bf27fa42dc0721e380ecf88286484417664e41c5b257ca +bd4835c1d64318507de5dc2f1060644b2b125f17aff1b95a37b9b667906d48c0 +9fa7d875d59cb6f7fef2e37ec418540f8f13c2d70cbe9566299dfb80c06df99e +b045dd3baefd87b24316700fa1c9f72157b927052cda3fd2b480df750298d645 +7c412ca39f6325d66c77be38bd8e491d8f710c5f91f432e13f89056940029532 +db065329782579b79d9f6ba60552dbd6a302e628f75e0d3582d25eb03e7deb33 +54790b02521553eb0c286cb415cde225b5d65cb79db060d13afe862d5885b567 +2430481620475f50546ac782370e3ea1c95600a524d288b5d4028be7cfbea855 +528953e607721b7488f7d7f9dd5ad14332b32bbef72240036a3e1646fe5418a7 +1fd206ad3fc75b7dcd9813caf5d29ddbb12d7ff94e37bccd72ba1086dc431b5b +713ed14ab7e9f1bff7dddfa9bf22624e4caf3cc0d4194f0b6a36b1c67e43f117 +4bb23054ed01209d28bc55224028648a4a3073d56835afa9e004fb999372f29a +d76db663c2a29b5638567058904a4933be88e75ca1f365739a65c27bdc195e7e +09cfb2426fa829ca3859306b556d1bfadb5d9493c66e34dd7f63583e4532a075 +532cee2d8976f785d7909093787e8aa5fc7912ca8fa89d346634ef71f98c9fa3 +cdfd931ccc699caa314c402ebcd6bbcfcd3ef7ede19e6c8b5ea9bbe73ae35b72 +e214974b2bbb26a115750327d20732b6f6795c25e4c0b1a63b5054383d428d2b +85ac1f719ce35a18de6f4753cb615aec6212a272d89b3750863536fcf5f791db +3b7b39a66ebbe9fb1876bb089ec2cba092d291aac88f09c720aac4dd8fdc22d6 +4367c4c5330d4e0ed7d454728af2b4801618edada4fa3e5357fb91458dc13288 +7650401bbca16d73bea8cd5127797f92c8b5314663e02cefabd1edd89e4486ba +4d371138ea6a07ce358d31bc9ecae64f409546e9101fff7ec710b45f910510aa +b51eb2374992009a28262a370d42109a0aa5ebbc16d2ec5d58e0a5e7e6f80a02 +5cf8a581f3bbf98752edf64feba585fbeb56b27a79384a22c868693c05084423 +f7cd396cb48e68f76bab6512f76da2772f3d137881ebaf1d3ca6e1c98d54732a +fc24bfe29efcd703c489dd8dcc69da4b86b5650788bfeab8bf66c5c1df7697af +ab33d0c14caf16b9810ea74c32ccb5bbac2613c6a3d946436ccf934a20b81cfe +5e712765d1983bd77cc45612a31c893a5583238c944f91f2d6d1069386621108 +108b0e65b4f6d76bfd0e1158005e8ba53ab48e865e9f6d07835d4e9e124b01b6 +41baaa6cff413e7ef8eed73f1cccaef55a87d71afb309ba162d3e15dda6f04da +2de8db583beabac1e5680df43bc063095de043b2ad4c8600ef63a8090b64785e +5288892b63a87d8c805d1000b6524109a41e05e517e07f0a76466125650b3d97 +008057de3d3380b0c352e70ac04fcc21108e619a707fbf7f59869cc9a2d571c9 +f77114250c1c41dcd527323edb2fb883dabf371dccf42389a260fbf53464bd24 +d5ae5be48163f142733b205e110d77de5cc07117d7d6d347cc8b035fa387b249 +fde3beeeac843c89bbb871114f5313437a784c051e021da4f80adb2d5e392f0e +46068df67f46afeca052378d97597f21c39db6a2ca7c10c57421499da8d5bdec +128109432f86a0ce63ca2be7fd64e29e8392bdd0013d4990884f7cf49e7b88ad +846af39a3aa1ec3c85f21db07952d1b45cfc20d6848536b63d2572f44ff718ad +c2cfacaf395cc64b34290bf19a19d756b38142c6a7471ab436c6b81abed86fbf +8553dd8d5a052f4d53d6124ea4ddf235f4a792f8aa485fb068d39c682eda37c3 +2fcc58da51f74c24bac8db5cf825407f88daba78f41d8ba078fceb0236c2deff +e61cc0abbdbec3bfa099b49cd1218dbff85cc705730ea545cdff4421ee5a5355 +9ccea2cf6257b757e4c6b853a476f0c97ece80a41fee4994b05eec575f87bba6 +9066eceb28ac92e1f4483f8744ede06a05ea038565096458785453b2462d103f +300aff3783f7a2ee1a27cb223e7145b6b74fb5a95a5445b5800d0b7e4451be83 +8a7679e3a29c9bd79be0ce900f8cede4f5fbfcf46b6354268087bb020914f246 +fe06d18cc7e9cb1003bc96fb5961043d919c9298e61dc5c7cb39886e65939fc9 +037e0484b62d1ee35842b3ddb879a7fe175f07451c4456361bb646e5dd87ad6d +ded8388fa78806f8c993bf16f539a4526503d8baf83d1f0a594db7fb1a11e7da +d2f9db98c5d8206ea4a44ed134d784b05ac0ca245b2a5adbd93efa4a566e93c4 +84fac7ef0ad46254101b308dc4e39c549942af85c96a5dd31e5d9a99149f49ff +99cfc5783d2cf9c320640a5029bbd61c86d4a6ae9fee690c5ac5e92d6b07aea0 +31c6110df41e63bd7039d6ba8ea9ef33beb3cdb415f4497245606963da60194a +8383663ba3f3be2d6e0b4865ddddb484f625beb57eadfc694125ee35480efadd +70248037bf40187f54cb53a51fd0a916d0b1a54311f43cb39856b5e4e17ddf0e +54466ad34cdbed8fee17c87f00bfe4832eea2acaf9e93aa5091b62febfba9b01 +5960618d7135ad546cf4d00c8c725c6da697406891b75361c81cfc2d13a03836 +8f2bc045495a1d24628606990f351b6f6f197ec7b52169495bc0047335c4a3d6 +1a7aaa63fba1aca730ba1fa90ca04a0fab27b145b2dd0b4c03f01c79bb77758b +fa630d02a5200c48499964fdac705d1f6b0aaddc58b47a35077f5ee2fbcab957 +919e5bf614a1468207592bfc36bdd62ea9389142350d0835243f485c99a49ee0 +b6fce33e9f1ca586f704d27c59621206abe70ac31608ca67a512dd60f07510cc +e0ab7715f3a662f824a011ec47e60f84664e474a255712aad0bbb1c7c1488a49 +0a75447e9feaba451fcd1106d7da535ad82757494620a195b2f0b1622c62351d +89b62f4f9bb812fed256952928d864147176ff0e03bdd2ba75977cbd0b5ec371 +4478c47d97601280566d937243a0c8b0b33450773897ed5535bea6d7eafd5413 +5c4a4976ee0153f4eb913aed8a1497b743e5e1ace625936b3da74119b49bb536 +1a6fefc0eb959394bd745cea919b1e62c8cac77754c59b725a26c606a7c5b3c1 +45fa3e24e5fd96e230497a0178f21cdd53c733a6bf29605879f61cd4b7ad1117 +1412b03ef42e4f8261df1544138958b3e96ac45e3a45c1bbd0a6d3f1fc4df057 +d0013bd3dea861453e54eb4721124ee277fa0eed1bdb6ca37e30dff04e91b88f +308edd43cb7dd7e9722e57dcc7f3633209505409a1f98a133874895e00b32c01 +85baefdb0b4e97f75488ea0f76424d9196a2437fc9f67fe2933ff34232768eac +722a84a7fc52fdf3ad248c69fd7d4c45fc33ffc6a04b562ce367d96b03c0ff8d +75174dbdc09bdb35a9f4840a6adc555f42d20bf5e2d3da34a991f63648ebe86f +3e155514afb82c1b3e37fcdcf8c594acf65fdfcf5965f42cb35543ffb1a1e40f +622e6ed20b4979a37835cf08e40b8bcb015db8eb1a044dced8f6bf6360d0fa20 +e656d90efbf461da451852f58439db9281f60edf5de4af016f8715eee83eb666 +d48784d39764e33008e5d9195ef62439f3af1b989bd952fe0a0d30a85708bb1b +a353efd6594a3ca201115b3659dc1a80619f155c6649f944dfa3e543971f8dd2 +b0a30afe77658ab82e630bcd4fcc33af8810da1360730055255aacc77fbe09dd +9b13d44a41e0a1d3789d94bd78494a33ae60b9ad7290e4d1ed6924820140e2a8 +ae5137fe7c2570af124263b99d11ece45cf80a6e11f56dc6d77e50fab50608fa +09eb1520f22ec16571e92a193f1699f81e352bcd9e0c838a8c1d5bfe80d76957 +7129c9c46fda7235dcc34f604171a75f069f9e00adf56e84ab1f74f093bb6995 +743f9e027fc4d9e6bcd647b2ec7f0d7af2e2efd2dbbb68c83ceb1c760fa71ed5 +0394d38963fdcbf3891934a4cbdab80107778a63f1101017becd233ba0c2e602 +e9075c5e509f2ace7b7d5c346dfb58d0ba3e005e38ea7428dfd0100b7e1fddb2 +7fe8cca96b04f9b349693acba904d44e143e03e82d16158beb36dfa21f57a039 +d6bb9bdd1a787fb9df968004388f8655e9d8b6f435117836bc910697aa1737d0 +55c73fcf23f8b56b58b09195b7cbff574a2418b1ab9f74dc607066fcb798b880 +5fb0d761cd5cca51f9ff0d2e67cabdb026f2a9b292fa472b97ab89af60cba974 +71fdef1417b14e6ff5440867aced2ff9837c1cd1e1aea23bc3cf3444e35f7cb5 +97c2f8d5576ffeaa83e06a9e6383e9225ffe0db4b1575e1f87f28b373716b668 +4f3e9e694d6d56495d21673d165cfae5c6ca112d16a40247216da4debabb7e8d +34fcb858707d82cb8868dcd8e956d1ddf8bbf6cd57c293f8e3427f14c99e910d +a7bef26c09e31ca66550496574c0c8f70e7efc9f74bb45fb1ff13b31d8982b44 +038c1218b874ac95ab907d01bca78f00fdec53773064be453a82efa3ce336c46 +69345e172763413f021d75570ddb0a16c806e444d8b9895af997ee7425d2ae29 +1d57d9aa91a5d9e992a7275381ac332a2396900e4d821f69a349d48a5197f98f +3534ab2a47926edacfc5281c09ea8ddff7ccbdec5b95857c9b2d82829376bec9 +79a6ed53c42f6be0c80a9fe6b90c06624a29adc0e268241e145b18dea609cf8e +e79720d031691f5912c7b4c1fd4358a6ed07abe23973f5b296ea3e36d8081d64 +50835e84fe95a56764117785baf8b08ac40dcf7453f4c67100445ea6a77ab755 +e3b4882dd0a9d74332f72322d36ab9dbf2199028eb6c6d0f43e79065e0fa47a7 +68bfe8609fe6ad82e7a1fadbe827d86ab6f3db8d0650c31e80c7b5ae24c703da +104ebb4cbf0d63b0248ac1c47a8ef14a095d902bb390c48760ba7da6fe56fb44 +df02ee166b522a550efab2006e814f4053d0f21f3ee790ca6d17e8ea5ae31083 +5889c2ca6b3fcd267131d33f3f71bbaa5d414479fd6c9e84ae481defa4eacf99 +93a6fe4ff57f5e09fb99b8fce71b958080971e61bf0ccbdd2a86448782aa9871 +0cb686013548fb3f691436501545d2ddb46a3424b643590da9b3069d76eefeda +946b6ae4a531f7d8b3bf98ab35d37ca5b36729548c06d230b597ab2cfd12dd01 +7fd2398830db4b4f2dd298e945659a564470b22656e28a2defb63714b5dcec1a +5cca4f9f3a07077c87c06bcc145edea8424d9f44ef8e73fa98fd216cf3fd8408 +52ec5988a7749f0d6923f6c0ef50e9b2a7a61c006316b49c51a0127004566d81 +066e7f1ed02f5f570cef07df070ee98d836ad6048fa77c8888dadea64b72d4ef +1404634b59cb590e5113d384e43ddcea459dec60c3f1cbec10e33100bc7eb8bc +7e339177105ad6a478ed9e096477601347e97c3916a3981920b16bf4d64d8fb8 +694341db499b9ca3cf34e140d7db4d6c5c291f100c2d419752e89ba7fac3e8f7 +5b4a63616197bcacae3e0170b7467670f67acd1acab2e0502f02f416b851a5cf +6f83c3cd9992dc925b388cf75b423edf1d5d234a341adf12cff88bec1da95ad5 +dcff92b3cca7418cc86ab1f1969ea85824d243bc5cf4fafd8f426556dd9017ee +0242046f909acaed3ff2a91564303d13c8df20ff52e25e60cb7168902daac679 +b794ef58e0ec9a5b5a97a1143b09157c97f9946d98077de28e8908b84f73a018 +e0c3bc6f4a6ee088edde6f1e0f568799d86765d843965381467a99c8b91632e5 +eed53fdeb8673bd6c9b3757773febbf86ee428d4b386985e810db8124f5bf974 +df99afad632f03e338642c9312787ac47a9d2f4a10fc5399b6ae9029a0336d89 +2aabb090e581b749473ff20815277881f985146a028f6dfb0acd19954a0bdbb8 +b4ed1a65d3b9866dac29c6aa8aed39d956433ba649f283aaea848f6cf8f96268 +cc669613981e4705d9220970608e67028de79d0b3668b4a3db70f61c9fc01078 +37ec51eab70d92a017d96cd8893eccbe23081dafeaf81ca2c9d45d38cf554c84 +99a6b479ebfbd96be8f7f4599b10dd45b4ac860ea6aa410f161df2b33c08586d +87218a790509800164b41e3cd0a7d30d9584813c42fe3935ee56c6f22cde9fd4 +05615ab2abac9dfcac550140c4540d6dff9ed67f530570744d0be3e56041e1d8 +ceb5a6925b3bc52c206f6dd87f2c4de70ec19487d2ddaf20ef6b26fcd60631ba +b1677d0ab695dd68b2a3b27a70b0b48fcc872991bd0b9688a966e72239b58d3b +2e58862eb4db390e169100e539c238299449bda356a0968c866ba0e0bf3b88f7 +6cfd39fe10ae30eb6ca7149b41e412cf556969b4c816a1945c0878e2a79e7ece +7e52754c8dfa755d79fb15e5576a8846307527460b6d9182154e23b84ea9d443 +7fcbb470e9833d2f3f90aa88d0e44b175a9358ad0d846ae6744c4b69a5e24692 +eb37b5b9678729be88cb9f84d2773ba99b29ad2056420328116840ccb475ab76 +27bc7efd2dbe6dcdf596e94c09aa959f2d43d48a80ce2faa7c30be324d18b8f8 +70f77be72199e931d5d5f3acf48ff8060e168b48d066b2354fea58713c1a5367 +330c9491fdb6fe9654a8fd66803fdb1990bcf5bf2d8665980d162f1be17663f6 +857563371b1056144cf54ad30f1fae5707f7bbe87fae41d2c683e8a02931de24 +29e66f35188ff3594f37f7ec5021e8ccf00248be459f80ef9a46d0344e153789 +69729194731a49135ae771aac663c0037db67200c9677bf1f39abbbc54802741 +23d36a35f128c1c35dfac1a29a9c1a488f6d7df23933488c858667bfe24948db +86bd0087f94b0c6325a403de4a434bf767c137f248c85257a72e39b51351d401 +8b530913ea8be8bfbeb039233bc3432db0b61aa281a0ce2f01b0399b066fde7e +abcafdd46c4d6bcf2924de2ed3972c01ae0213dc1553928895c2b541b1b254e7 +a1ae46069a110c55de12f66358815cfb07cf0de59865be85f1a8f2b61d0ebae2 +7d341bdc37eab342af148a05d0fa415b86cda706746c75e0fb71a610e455a64a +d8515705ec8d265f3e4ed9c0203744c86a1fe55ff52b6c8f4ba71e0a26651cd5 +fc38d93b2370b1e38c29343c96dd9b3d4a39b78f7bc7f2eed735f46bb46f96b1 +becbcaa7cd99ef23d16bcb3f38a605dbb908b28b1039d2ea1fc5d7afc11f1aa3 +798b407ec236421ccca18fc1f27a12d7e0b253039827104461c51ccb2283c9e2 +6fcb819b656a1aaf1b29821bcecc50b911d1a05330c43a0c6025ec90dc134042 +77ad9424c2d2e642a1223dc74ff16f70b54c0ff578157f0c701279facaeb2563 +cb3855872d3933c0a7be7b633e7e3ef053e1213e4cd7e1c57804eccd8026e581 +beb4c2fc59cacb4c1e7696d165316d7f3391ede443873c7ac48277e47eebc64e +3023d06ffccb05a1a71b64b7da4ce1b6256c4970b179c91e1b5d6ade81c151d4 +dc3cccff1d6ebd118285d56ff7631f2c7e2b89cd70b2ef7a3894366fd177c06a +39e3971747f671898a0109008e3190b0aef909597ffe91d7c7c2069b5680298e +eee7c04e58cd328c1bafac2a8bcb63f6d9a6a56f29f3551ce1d2512b5885d1b7 +8397e464b5f81f4803eebfc0cc632fb653f52fc7ebe2f64ab5ce16e840bd0577 +cdfa24a928e2888ef6171e43aedaf88616344cd64b3a2c0873dbbf8eb1fdc08c +cd86f324775672bc550241d139bdeca9e6ee36d49fbb117eb5eb456d99258067 +94ba27cc50585d2544b2f1f16c19ba41b0cb308c4f50039a843e66b20e04db1e +b0e99faa3556d8e95f4526f0a105d4b761df415148051c604077ce2025732152 +e6db72d810bb8d81c733ba78c0deb8799abaa20d3d77152b2dd109d70efb2bdd +7f17c1b79bcecf6b30cf0f852ac61197e0f601d2602205bc37708fb4306a782b +1f2a39bb03554a1d10100221f99ccb45b538bf2a94ddf8c4e0b10c62f4af712c +a44387b0038bf2474dbd2242c735db0d79246d73a43137d535eee525502ee440 +9021ae2414e9f443740cdacdaabcfaa0084a60ac34303dd559269eb088e2925c +632bdaae44dae0ae57f3080be448c56aa549b620d1729b6cc2974e571a5697b0 +4ff3e6f6542c4fcb2abc9261d97d6e6e60538d69b36c8189491a978a7d00b9b6 +3e62a1f51d6002e12d0604d53af0188e565ceec8ba572bfde122249dacc9d9d7 +75047c69ef0485adf9f0dcec0f0c926ab91b551ebd9b8f4aa03817c25ca92395 +518304be94b5d56bbdb833cee92c32b792c6a31f37448b319880e4cac35d2edf +dff530d0f7773e5148d41ae56e02633781cb2abb15ec2d94ae52d3c8fcfd3097 +45d95f67b560165f57393a42fc7474b5284c7cc0b893f84f8733768264ffa8dd +0bed83d99c035bd1a83597f0d614797c583ec8c5b96b9739f304edfe1e00ab42 +38f353a82e7c71d74877d8519add9b8c78f611174599512f11c22c10cb360307 +b262f1f78c7f9a85f1fd21e94d72abd413650ea6a69b057e021ada9787d06185 +c57c0947f9a2a81822054e855f802160649e25ddc82969d94c052c289f35bb57 +c77de5dfc63716c5b0a87bc7ed859663c457f080089e3d729b9bb1299050788a +79ada19db21011b01a47b278615be5359e71ecec7c06a67c4943e6106e152824 +ccb1fd39c485e90efebb1b2192d93c8bc52e356e51e5fc805cd7e43543e9c500 +d0ac85b7230350f9f403340a16bbdbbc3bdf0f7a571aaec4d6fdbecb288c210f +b7c244f1908305a0b1632a8123001175e36124b543ff92c16576d373b9bdece7 +67889128ffa3497ff846f8befaf5de3b7c339f049adc9116c9a7bb8bae435798 +08dca2d9c151d9329c345919930e8437054501bba38c2bd5102a20e4291203f6 +eece2f70bff3df08aeb8ddf1806e9657ee4a5e3fd5a8fd979d90d45734f14f71 +5d339ac91b7fa18a17be81583c08544a8a32729c17975014d629b139c0b3c236 +bc9a99231ffb339b7761a2586eac564be734ef37992cec6c06c2c93de2b340fb +3a27a52dabe69d9178d9a544430cff229335edd6f817bc52c690917fbf322852 +d4a7a709a593704568cf142b45eff164d817880cc93782c223247c65fa99aca3 +5c66a26093f9ffbc25ca9b3cf6b8ba478695c68212e80e3868a0db1a1c84bcdc +df05fe054733a1b794ed1cc483a57b97ca2e97fcb1ceb9cc2ae7d5e0e064cc8e +01cc628180359749622ac1cfbb57d51b25974ecb15dc83f99dbfba2d779adaf9 +6a9307bf3faef5d2ba5135a15d13c4215570e772376a4a4a3a5ec4028ef11004 +b93acaf38128de94531c23f114fec41cb2e2027e8ee138aef6ad017f5d97a600 +1063be706b65da0eda2234e7e9a9c27c084c4564b362ffa93ec9127cbc9366ce +7b74805943c9961be5a5b5ec87675b02f756af1b70074d03374ae931cff31757 +4145af416a9098bba84ed2d3ed44019257c0f34e7f94dbd10fd04fd15ffd1b64 +f65b2c02e581175436150a074de43f8e11fbc56e806486665cedbcf387504d6f +0687a13d668c69dddbc37adf91ad0091a770ee23850ae2fcbd6b9de9d8a8c8b8 +eccde66b7122c7b9602dbd0f6b7f7e4890933451c7a3904382d7801bcd992f76 +4cd41d74bc8723eba2647db7f813b465d11052e0f4ef593049942915c614ede3 +4f8f2b77bedec635eb3461d66cbfd4be1689a839b1feaa41c0f0fa23669806bb +52fea1fa5ab524a447ef3cfea4583a7790baa418ff8917388daadc5a3d1a9fcc +7f4a826c912eba5d4b82d4c29b639d56532b37ee9aed6bf06137a3af899c70a1 +ce4c9940e6ea87b6e274696c4a15d6aa3c17f9334aa84fcf1edb48e306640e57 +892b25e67c6f87e4e4cdf1a9cf12f69c0028b5fb768e839e1b8f75f3ab2d9763 +6e1be8c5a73bfa8675853695ee32887dd6df5f03f88e637d45f752d22f6c76b3 +71b9a514078c3200ddd2e998f33f1ae5c0a5fdc932f7c4727512caec232a681f +bbdec1a919bddaebf5efbd06869bcfe0637b72cefaac13f915f25cd3a926c0a5 +4875435ee6a413e2554fe4ecfcb96c1b5d8719e84dd34939dfd7795eedecbceb +786df32b6360bffed553a74b444a35e0ab0517cf7aa9c4e420e5bea4a5aac950 +54cfb55d1a1e57b58b8fb382e8ea2acbfb9b43d1ab67e0c1450ed3091758c1b3 +8155fd6996500a55fa5d134f17e55978d930425e0c03748364c46d3bef68a390 +649e09e48c2fab92108eef8603c70a977a388d4d24971296aaabcb932bc96033 +f648a6ada265aca938a6512f456fdc194f7186808deb3c16769d3faa850f78fb +58610c776c2ef3f208404def2940e484a801cdc45aeac88fa9852d1319159340 +3478b1b7f204ff297b67bddf1d38e256f864d3a83d6919ca7db1bbb1f5b8f6e7 +8ba272d1fb28d760618dac6f5633b9481645c9b8eb3a3384518103cc68aceb05 +5a91dd8def04b49d363b0c6daf63aef5d85b1e79504c23b3bb50a4b7194838d6 +b417b0ccbcd95a46834f9bbb2ac30fb2d9b9c31cf4b608e1379399a95f8dfa94 +53998a743c5a5bf33ed1e10177dc4a2a347f5fa4d09470cb5d71b07bf459c800 +0119a2164b143f03fce36c19384a01cec5b9080491b82b9ff115f795d969f480 +b7232d0375a9d46faff31fecc9351b42923e9ab6207d2723915d7843db279505 +280d70d9c80a1821a257aec764b7e85a1e8da7c40d42a0f77385ea66a7643435 +e20af708470f645046bbeac12d840fe3260ce75e20563014d9e2ebdaa57ef06c +0ddb55fdf6ec3e064312d13e25299b153169788e8a4decc095eb37eaf8e8ce2c +cd7174f44ee8f3875c5a3de3c7ce22296e99c44628f52cd3d18eb9215c34e563 +0ba85b5fcf3a211021a19945510c7e39ab56d977f74fd50ba8a70def82fa6777 +6930390700b4636330a998b535126d610e8a1cb63f618d69896fb47576857f5f +8926ddb4833966695a26402aecc48bbcadc04c2833afcedeee14254a9e77603a +5bb7b9de3c97007901143a7901c00b77a13e72940a6507a76164989e71d91eb2 +3080c585be2f8734909fa1efa7fc6a2464d95e4c5051fb8d6065a7d9a453cbdd +033626544b72108e4c4c087b4e4dd972893371ba7b8e8291ea4f98d03c61ce6d +d56734f17a66697f2260af9b3f8b9a36717b490e1ce649d839a66133da7742d2 +dbcaa22ff915fcadffa0383cf34c2290fa42fe23128e29e7bb1c59e55b7ac347 +fe66481f485d7bd09f55cb51d208d0765a510d5f6958fcd3ff5a5ed27d06a02a +f7ecadce4b4ac5f1d0210c5637f07382193d77945e249d2c4973aa43dea41dc0 +51cd72643bda4f749dd5846a9d3a7346d39f78eaad738d2d255df0f0cab5fb10 +96a0ac86bb013980dedfc84ddfef081700fc3c66b6d5a125c9e83df17d92658c +10d79a8aaa222004c20aaae6128132c64f96a7a7c869489a63860c15d53f958b +d6fb81cd165bf253d996c15295f7c2fc52c13b51aded1c774cb35a0ab258bca3 +ab438786ff7e648f42ab568fdd9cd598c52b5748b0c44458d4e0b8080ad19cbc +55d8aa1a78cafed7bd41a864488d8ab0bc12f6689027c65c70a2b26bd2590026 +3e80ba6189672adfe377e9fb516cc6bbb0f2e341dc9e2f34a8bb00b4079ea28f +7c8138c415306e00bdd8e71176faf06fac92e38e8e15dc6ec6cdb389d1a15310 +ca67408a9686f21bf6fbbfa7ce032974e2b860a3a72561508bcf22ede4122185 +b83532444134af2bac5ced1932c9cc06b70160d0cefc8f76ed1108b629e81060 +ce6c30e0bc9ac232fef7ab1c99e21792921bddc20f2afd3b083dba29641458a1 +1ba80613610b01543d336ebc45ae15c276c9ff18fecdc0cde3be18e044497217 +b9a812d926538fc42871f439282c1717833170bdbffbd7e2034d794eee9177ed +28045b2dc45959426e35d30fde +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F130_0 /VXAMRV+NimbusRomNo9L-Regu 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font MFECUR+NimbusMonL-Regu +%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Mono L Regular) readonly def +/FamilyName (Nimbus Mono L) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /MFECUR+NimbusMonL-Regu def +/PaintType 0 def +/WMode 0 def +/FontBBox {-12 -237 650 811} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b89290699b50c1bf1baeffe +1f57be7b5ea025241a248a6d4cfa5067a1da6eba4cfc940599ba3f3c934d7248 +b8e4ac5816f0d2ce8b3c4193ce39d19fffdb75254573173cb51ccd83c2f2d06b +2483cf9b07b21ec6f502f028c273887bb06dae2afac10e9fd3c7cf51bca7b277 +b706e425302dc78975ac0e43b87073257a5cd7424b6865fca89d886e8f95c4f6 +d457623dbbc0d16bafeb4c649f5d72b09b18502eeab687e915e9b536a361b4f1 +44c3cd4cc683b5f05a4ecb4823a5eb5179bb7eee8b76c21b2491a97808f6318b +585b0bad98f42fb4a755bcb74cd354f794c8bea5b90fb9681bd5849d45247e39 +930c882490230e1662d39cca875bffeac3e79a78de6e1298abe9817ae98675c4 +16220ad0d3a36580ee2f2a17aaa1246c416d58a4c52fbb26aaf3b6f75833af8e +3aa996218dafa571fbc7cad90ece9c883c813d8f168c5e86bbfa0f0a5cb36e35 +2de4caa0f8d3227f72c5056bfb5bca6bf9c60e037a0e44670a8d3cbc9a19f379 +ca8db30b711f518a8c7569211ac70c46eed2af62a37f238bd0bd12d60332e673 +c6e784b3eba3f2e71e9993b97e8a38f85048937e958f1cd8fc6e661048546135 +56b810fa1ff611b96495081c04542df7fef085dec619dc8c84cc57683d212813 +9d14728aa32723e1d15f2af8f03422cfafd8ea4c92dabfe00e6110bca39fc555 +bc066ef848e437b50688daf26d001aed7e74605ddf9c0ed36be45455aef92689 +8cf32baf2418e02118593f54fe1857807bfa0b93b5cdccd81d28bede22cda6ee +2e32422c1e8da8866e526300f9059e85ca54122ecbffdc011460913e0d28f7f5 +fbc9d7f9f6934b3d8efc1a91cba4128f6bbc5eb55e5e7b73647bff70662bafbb +145cfa65df3db858bc3fc577b1bd8bc74fb8a61bfa71b8304aeeb36d8efe12fa +6f5eee0eae0830e5177dc745250fc362f78231fc3ac9864559dba92dda2feb96 +2629293435bf4a89f913fd15702cf325981ca3a08b327f7ee35794a9e88326e0 +24559b547fc6da61b7a3b9357f72c767baa9c79c4e7b77f70ec01ac0b8596425 +5f7346dc8cedc702d3d57b09ef89cdd33756619af59acb9d17a3abeaa6c65218 +6d6855348a1095746b34af15df313091c59e5bf9e79b156cd7903c1c42e115e9 +c5203037c808bd295195e074fc4a46fbb1ff01c814878f0c177f552bdc9bb698 +349d73aec17997374ec90b69293a064442141a44c6fe8e3c283c02a4655c579b +f21b53d1fd37996c682745600785c7b52c4eeb47fa5fd640739e1f09d5c5dd2b +b7515a4cce0a21281d315563895972bee88bbc7401be9e20cb160b6bc81ed469 +6d66169bdc648aaae8a9495b072911cc814c19d53b95de0071e3a439d3c09c3c +1cd422c605740a8939487e26bb9233d4cdefcca49bbeb1b913570a51b2f96d30 +2ef8913c6bb60b54f7ea4b8ca16ad3b4194dcba28439eb31a9443caf061c4d88 +c22cec8d9d8d85d7aa225fd64bfae7376abd40f822ba1ecc9339e09403195752 +fc03a5c4742ad93064d975906ed63acb495aae324403d3bca118179e10256543 +1bc84d47e0c016234eec0c52255ae783417941cc884efadb63f8269876f00a8e +1e1f19eafffa00453203a0752750f8c876aaf87826baf77b81d336ffc29249c9 +a6a44f40381294447840632ee59a3c4530391f35da45c16a001f793782be488b +5e01d7f75dbd53fb31f956f16202d3d94a300866814ba44c79764cc25acb57f2 +333dfcf3d97a98fca949b1da71ab27885183d8baafc9bc743143f2f1002ad752 +1e55d207de23e97d1760cd918a55148e37e05f6347e8cc299eed28d7319abcdf +a4a279d5f64cc2151f91a0be9e8382a35b535a6b5f41f3708169881c243391c6 +67d9121ba21f6bb22be1ec9933d9af1dde9693d7704c1141ce2b977ff5181299 +6a57f7806814440a28b1dfb62c4dedb82f0ebaabef3367bebcd43246d54d8eb6 +7af07b164374998f06a0b7e271ad6ea974698a806002374d270c6dd5c9dfd5db +e056fe1b3d58482a0cc98d4d5603c59ec2e13b446023692b9ac2dd7cf767d2dc +a7c62bb3578847085cab79f139bd312cb07ce13e38c3fb8f695bcf4021c282b0 +9b20ba67f378cbb8832751b8f3eed370a572139431b9187893b592529fb1b6c5 +19f51798bce9e56ca50185d42fbd85819c3a1153d65997511b19acf87e69c07d +2ca1a7401c2b23f99c19f95da0df136472f9fb574b21aebbf0c2f892b9260001 +9a9173f108e72c3eb4a93719293e8be026b833cd709c7c05c1a2e7250cad2586 +ca70fb7d927e36a2e4a6f34e754c8dd8ea2571cd82054700d386cdf3420f37bc +b6a70b9a92e46cebee13f6641c67bc40979f9b86e052164612d3dce7be67fa71 +b26ee9f425b54b3577cb4acf3dad02f2e55d2986dea88a5a1955b78c0cd5decd +213c55c9c57183a7dd5832d49ee81724a19abb7da0779f1aa6a77d5d31434a09 +c6f53b7e27123dac042f58dc27653d940358bb8100b416b920aee20672559f62 +8b20c687d77ff83cca449e94fcf4f06614fc539802340619e3a791a18581ffb6 +9bb5961d1e70e55615cce5c9e1466d77435e486f15175cf87fff65e58127b5c3 +024b93c1c296aab24f29483aeba00736ed30be5bb5284d7afc43294b927bec1b +86814a5ac25a3b9cd1f25c813cae791f937375e013159624a360955a58e8fa94 +e49593a97150702c71dd8dbfc3774094df930414ffc68cbd4b4a25041cb3b657 +a54c9bf780142d2586eb5dd9ecc1eb5ea69245d5d9c2af868974ae5d46e3a544 +74e96780ae66023778659d9a45853c24da18dd5ca0489ccceff253b009c06cf5 +826adbd0e8fcf23edd75c3d3de8a4c789a895e06d20606e4f8e3c1bd77976e71 +de409203ef1342bdbf2c11bbab4af5a709f0462aa8fa3a02cbed6f23fb4d5e3d +1751acbd41eecd8571518a9e13889c221ba5568cadf730f9da026fb38e30a25e +87ef6a13484d6ee31c174bfa4b80cc38134d7b18c85c83b4f14d3c7b0a0b7069 +7baa1a397252ac47b67306e45d64061535d05540c86b9599df909e105bb55100 +3a0271c25bc5d596da2a446e35c019b5dead7b289614bd5085d49ecd0464b494 +cd1ab564a93ac9cbf438fa558bbef71c2fe003573a03979a10fe8bd54a053724 +a529f46ffe55cec8d6bbaf1f57d16185595c82a1ef42e3c81cbc55bf50587630 +404b2090df6d9d25468c1eb7a4b2b3da7f5b718157ef8b5f23af088301e46411 +b51e6e0d464096ce22bbc2028488d9af49792b4a17cbbba8ace8fc51e1de01b0 +97e6db05466bf66978305642b6790c08e59a7055f9442cc2cfc23095df2c27ea +decc1ba54d6b81ecc873a9c71796a1ece75765b878d12e4da9e19d026ac44dfa +2dc7e540506546aac70e7b82ae7fa98bf36549f4d540fffd53abaf7ed9044ca5 +6b4e9044a2b23c3e7c70152e96f4e64f6b1918946789d4f703675f3dd6e8e5a8 +f0add5f7e442c35cc782c92db2007596ec1a76d2d22ca5b00f7f9aa9819327a4 +db8d0b03369a05de96b8c4eaec254cba0f39ef6ca005c53afd0ec32f1c092367 +efd9f773bd00b95a60523bc0392b050b15ad70f7cb42f6d36587144cae2447ab +aa4b4d9377a7e86ac489685833e1c14c3e17638b00884a46c1efa2b158f6239b +1bbed6fc68ff606278fd4216c2a6d7888f0f0e5dfc9950962d4964901a47d6cc +2e3243e1dde9ce7f435a7dfb19349a3017ce44b87dc6baec18354a2042c87ed6 +c1e3a1a505cc679e32789f75780f84082cc653a010d14dba84da0191a510359c +1d24d700c58e54718f1d85396e7c5d3a365637085b6f79c061df17bfcd260ea0 +6b8416c9042c2831eb041346a22bc54f9d7ba43f8c4487fc240baec20ad4aaa8 +c03f180b614c59db6e5ec1531aefc908c46b93419b9f5b2d4eba0a67ba43d685 +1ad44d4b43b7796de5c9a11f726a90fb1a389a342143f98f49237fb451c43eb5 +981562d923d684923dcaee71b52ab4ce6269169a35f545e74584fa440c41eb82 +41ab194c78a5b980d021b3eb7994846d963b78eb6e149cca7713c12f77023002 +b8a797c9ccd0c2bd70dbe44f81f9d274a5ff3824ee34cb4317fa4971d67d90a2 +f3d1b1b84960f0fbee40e6341c5271b5b945b9098f3095986ab7db2e0714cca0 +301f6b8378559d86f0b0d95c2dfe94ac8e10df0c8c16dba12505a0d467dccb84 +16bfeb18784bdc10624f15da1a880ffbcbafbed0e1c7360962478006db59c78b +ddcee524b6f9b15a8849ee19aa00fa3f71a3c2c96e68dd0248a94ecc43a60ac3 +88e49e005250706880485df109ce1506c0a4edc40f5ae5fe347d52ff63b26c7c +185a698e171244aa1095620494949d526276175a7e120340d3247cbca4e3df53 +641d6d392abc61c85a22e06cdbc89cf37bffdf8a79361c6dd69e6774772f699b +92f7a7184a00fdd7f36fb8a08ccde5bbcab3731366c3b74072044d3ef2ebc1cb +33118b8c09c04174baef8df1bb4a1e1f848c1a5178ec58ea621f6f8a63d0fcf3 +13db79f885ac659c881ab7e40798a4339e6a78ba27cd9e6803c3d4df196c462b +d08555bed51d7cf5821204728356cf813f554517ac5e28e6c4047c0100610635 +7d25c33330758f71bd1043365bda5d1d9214c8b159d0f8fb69e40e6fb4ef4668 +a228938436dd209dda5925597151f8633297862799152b0317bf21f9572f503b +b10826aa7f8d15f5d780ea27f1b8ca0ba3dd732d3e3effcfad6e6ad8769db6c1 +df22ace8467481d16e8af6f56032c90c8f2500ce66afb94d378d893e84208048 +ec0cf900507f02e40da3e99386f939e05d9737b0b11b7dfae473496d056be5e0 +7f1cd25454f4b290cc43d936450c3d675ceef5da533db25ec07addc7e8355d8b +8abb095ddd61c91da2dbeac0574e9ec9d316ed13df03c997d7a4a9c7a6a3a165 +ec1ce316e820e13291132ae91660d5d1812146abfa137726e8700395b4274502 +7d53b1e5cba817beb577bddcb956e89aa2d1ab24128b9ae8e06d9f0a6dab93bd +f7ee8e2ff918255c3722a8b0e8520dd02ba7c92aba13ebad9ce0ad0f16f728d0 +ad49bcb12b429811d8ca1b5ae29b7d5393401eb5802db4d4497cad43ead218ec +c674f42143bc174c525bd736b77dc28bfc7e107366eb9091eeda60664a771782 +cb41506406dfd29c974c5a18da88b473ae58a2f1fbe5680a40138a9d2fb7955b +3fdda23b2cbe7e27c1dc4aea3069b1e7e25068c9051672b8c9a3a37d6e6fdb24 +3bc20d303198f9b8ad8154b3f4a4f2acb17c31a0489c1366eb8a13012c6b8cca +4d416b911de781563e26c08538e038dd8ef92435a054348add815687ddb99dda +88f1e2c5887707cd4be47f71ab81a3d6cc3e039bd09697734840f8bd0b88aac6 +191c6db089943f99ee4174e5fab3baf3a8429e273c4d1a5140e0073f86105402 +3f60df69e65809b7a1a5a8aee4d25bdde9fd6d05a3fcf4be5f253e41fc49e121 +df89f259ba981d2617209b53ebd92e430a69668995961177b159933501771905 +08f625b26b5085c04b325e7fb6bb45eebe3bc9f5c5114eb37f19937635d71a72 +39a0039003764d10cb403b58c61bf411aa8f5d717bcff23fb338da58d13ca81f +acb3316d2b5b675e86a95cfb525199a21af248a1245c92ee37688c6e76a95187 +3b411697a1ea6694e6ccaddef3d57114cfde70609de67972edd1db95d923e077 +4bce7cc77605f9ba5226fb792829b1b8eaa15361ff78f190a0563fd61aac4452 +ee1b0d293e695416c667735dd886d10e4467b613dd9bb899f2bd75f2f13193f0 +481fcd3b4e2aaec6cf2829b1521dd4b6471ba31aa0aa4d63a6456203896a111b +89c106f1ea85bfe0c0104b1292a1f8d49334578375b55deae2d7381f5cfcc023 +5ddfb3d8546054a0e6d5d81e4254383385ba593a7d3a8e0beb34285dd95d97ca +3eb598b643834644b611e6db4b8b4360c847120038768e218031e097ba0bdea7 +732f7e460155a496b91b3241c74f9ee0c99ec7adf6a87b701a0ceb07fef5fa44 +44e127de3e777c23a8d938f9879df1dabb7adb31247a53174f919a2a5a4f920c +9415f3976a8f4b739e114b2c49d67bcedc1852686cb041e3ee94ef94d9f2096e +76f1c558f40812444c6f0f4dac3a4bd22b82e32d8bbf1504f8232ef00dd2f3ff +5c4b8349a9d1becb8c59a9f4763f2566a7a513a6c11f54d1fdc1867ab741f3c6 +e2b44aa95479e4e9813350473bc7897b9ec592f01f97697a17967d344a4bc9a5 +62786f28f87e3639d091922f4994671b22efd41ff3f6b8a651117d0a2a97ccfc +80a69c974fb2ccb36dd6a4897bf88ebc67bfd892e35e6940e94893e1cdfd2799 +8cfcf2b3737a6232e4783eb4a8ae56b83ed7661377b30225a75a1b90b73079e2 +6aa33fd37b81f7d60de62931b6be9d16367a5fab1d14d281d3e8d09dc525f549 +ed03a449df4655802bc3265010f286df86602740d8a86aaa228b9c47e3e78c0b +22d2600d5cd55a3116058daa7e34174144f78a8f72e0dcb8cc64addcc52df0df +3f8c21d9cc04e187be53f8fed4f33633ba03afa178fa5ce769a7eb0e1b9bf5bd +de0ea74dc99598a66696bf6d5071da995a30b8144acdea116cfc447255a99cce +4ec01bc8a0b355c0881f6e9eb48725d61ee0b245e0f7cc35b9e76fe11f681017 +f794ed8d4c4c7a02e17bd16a02347f28318ccaafe0575734058121e3ad8064ec +a0086a58f216020a2dca29376981a2595bfac2a0394d448949b52ffb47e5c5e0 +d6371cb4a417ac834d6c9fa0018c5efb16e39e32c85088b266d74af5630b2544 +d4cf403482c490f86d35f81cc44b34200400c10c6dff035423e725d41d2b5ee0 +c3f03a603a161713216af97036ed38ff8d9b09f189ad191a0d03369c3fcd5a3a +f88a57338971d7bcb5f3fbf8735ad8459524d93a92eac1c2bf5f0e6e1cf675f1 +6d72b35ceaf34d8fac178a1dd823ca0448ee1fa2f616b803c38b89238aaa1ae7 +cb057ecdbad28147da46a34b8a1f1d389e082cc3e8eb1a7e5c0c932341824c21 +570e003d8c11c87d7082371d3d4804da32fde118c6c5b5b08828e5783200c6ea +0a7ab73343f5fd681a3116fd818c7054a5199212eb0f3a9a0d87bc364670ee2f +7a5081a1e48a58748d297e014dd5db7faaf7a27459f115741bf4facfa1b395e3 +e97452bdaff906af9c52c5908748f1e13cc85d165bc893c1eba728458b708f8a +9e8990a6f258bda0989aad0959e7326d1d6bccb50c4fab15a6ea3cbe94724fc2 +8f174df93fbff41adbb9d4fac0124d33151d06753d4d879ac4f15aec5d1cc0b7 +a9e861f790a16eb0821b2a7b7b42d6f3e389c51a1d7c652859ffbe66646d4199 +a62ed28a30c8932dc4d2855e7e6311d79cedba8beefe2cd529f4b45382f3e6e6 +a7659da9b786fe7bc2e431ee3f11873ab2709200b715343cc25c5365d06be9ac +829458ff77f4d509d9c3917237d759da6775e09c2eaf4ce966a14157ea2780bc +e3249446573c82b33ec5ca150022a83301f00f41eea3694059b14b2a9abcea30 +65cfd06b9dce3823477bf80938d355427666a8287a65e231a2357aed80d27a61 +58140c2cdb1f44caefd6b629fa661440c361dde7817154052436a36bbc1bf382 +e30285979c4568b180417740a17150952e3eb4091f583083d75a05a2d91009de +46da396794dbb5288e2a2e6191d3f22e335f0275f33e9af2154cddbcc99b149c +6d7aad7fdedb23c805f09725b60b5ec77e8ac9953a3578b23c6023a196f35333 +a36fab2ca195e397fc82318434e9f2844d17bbdc177989fd8af61ddb46512d2c +f5d7821941b18b7c1f1be16df6e6bed4a1655edcaf6300fa8765e903b03a95a7 +0a7e6d55457f451a8177e0e9c9f3aec8d174843e3a99ed698689019e96cb4683 +bb24c71e22f4895656acc67ecd671963abeffef53724a645b98e5d2680297fe5 +2d43ddfdfd5536f7c239a5092076512a2a9821f12338e388bd5115ff4f4d2c01 +d741f821874380838988c17bd975fc388a253c8c006c67963ce3c4404baa0750 +c56760e367b566ed129911eb056bee42f12bec9980177f1b3713068073cf34c3 +70d6ee202c49b42809afd1f8786e14a6c63794eb2ddf49d5a06f34de23356260 +96ea26d57b94a928e5312147ecc40bbc6a204c4b3ee9d4f4361f8df9e1c1ae68 +ef60fbeb99339842e652479362b19d33de080f9625b5c167bf2b11775929b12c +fa9e9a89cf84f249a1078f5584425e2ad8ac82adc298867ebea1ec6c0428fdc5 +01dccde39e5fc147959ea254217153c0b550ef96c229664c22286a7827ebbf15 +c7fcdc57dbb5914bb0460b6e0c0f58c98b264925d9996d9e0d31fb70e66eb9e4 +d928015f2c12acdb7d77a66408f2767c05f93292fae45492e5dcea337cbab346 +da82c905ddb016bba5d31e740b813c3d709d78d7ac50326f90d2e4af4c1dd893 +e26f9767db437b52a758d6237e52c4a2a71624d2b1f79dbe83b6b7839deb413b +f34b91b3dfbc88b7b0b78ab579594ac3d57471074f78e59a64d75b4e6ed3cf22 +33f6ebc86e289402dea3907b0a2406188246e8e44054f81854dae0fedaef8952 +c05c8f5c4591673102a0f24f7deea7e19e27863a27c00b510690b331413df839 +5ae5a37f8c6b25082073bcede7c8ecdbbba2c09467afcebb48f4a4e25cb069c2 +b7acc265f988955a79ba95b3f4d8c6cf94164941723601923409e9d81ba8aeea +64e8f1f09794779a1262020bc301b1966a789fa2f37d7521db536c0c8da36b7d +906398a8a41230cda975088fa5a6070d88882dd8dee7af696ef5ba2c5a525d61 +d35a6834907c4846cfc69b17edf77c58e501a0600a04ab4b36d9007ac54ccfb5 +14a47193ed01d4fd5e3c8cf04b3e38c4895de3eee14dfbe6351bbbea6530046f +89e913d022c0cafe528a33c4e84d465fe6fb031b48d904c5120d452a6c1fdfb9 +08e242a05d015a9ab2536dbadf0ffd0190d355edcd3174cfdda0974e2a33cbfb +2a3d557ed2f6f284cb3c990c3071b7efc678a5d27518ec1912cbaa890dd6bbc8 +824eb1e7ac6127a67e68428ffd67e650fd44c9ec448a309056ce45e4a4a2b769 +8183ac418981f617dc469a566e713aedce2bbc7cdddf1f7affc6d11e94757130 +c4ec7b55dba7356b21e5267c5ed99f427a19daf476e48993e856c852d35ca1bb +b32d59ce688ed184fa9ea1622c306cd788d6372c5b4a94b001f198e33209bb59 +46af1ef7b066d049825bb78318a38ca23ec9a93bc4b4b12806c1a0e5be179e3d +0c0e5bda654e506e74e0ef1a8b12c18bc3f041d5e61a8f03436f146e4daae3b9 +6b8c7ae139f42e8dcf772cb5742104aaf776f3dd19bad920df77b42aac654d32 +2de3779c42639b50059d13b81c3904df76a0ab47046a0132378f9201359f71c8 +12eb4837bcbf3f1498bf8c7b2298e6b2e528f9898ddfaf75b5358a73a67e6307 +707fb13b2360ffdc5659ed8e70ecbab711d89f8c6558622d67737b1108ad5139 +b126a6c7be8b25709fa7cc2a625a0796b7d08b11f098edb80f8aa08a5668ae91 +4ff1c470dbcc7775a73fbd857cdb9a5d0c122d4765caa8d9d35514390c9b339a +c04a78342e186e5c49dba4cd9ab165b4c139e76b88c807cc4b5db7b5063c2f81 +16721670497a0183c643c5a70ab2405d5d8b6773a4a2d39b3cd0d763c12ec296 +9b3c3ab916656fcca5d715e7dac796937b2b6d4adb251fb79b183e6eab23796a +0bd0bf5bcab03529467a265781716b0186573b862b2a2057c427d85d7b547c7a +9e7fdf7a674587df709ffd0a63d0852ea0d02c13e8038762de82362739de9ede +0db4296421d462d8286e2152aa67298c9ff511e8de1a26089d383bdbbf27066b +f322738cd2cf198bdefe566ced1808dafc015c8ae972117776594e9c506a3223 +d4ced495d6229c9bec17c47071415f80482f9ecaaeba6a135d2173254dde6be3 +f0ce9a7a81ec2e9af4add855b08309d34e780adf0f7c9029d2ce0d5f807ef0ee +531217450c82b7f3643456772549acc2ba6a5938c517fd775114ed44ec69a45f +d9110c969edd9e6f8b4bfb953aed79a1daf47c7238871e4d537100c4d8981d82 +a2344eb7df5baebad28e34870d52d97a66dfc75740cda6b403c1964c0feb034d +d3e5c8b4a37acb9f5718f7b6a3d267694df8baaabd38154d16c162ebe43b473f +ec1f060846ee8402d67942ee080dac9b18eb8b09d384ac24f85d287ea3e2c59a +0f2c1d6bad36e262e031acd399a2b9a7940908d65f142fb209416e891a6abeeb +389e2df002436d43fa1161b71382d1842788af1a9e6f39ed56e8bf63991fa790 +a52ce312aaede90df1be57e3c1151dd0350ffe7e476cac5f34cf8505bcbd25f3 +29aeed3a52bfe1f10366dfc4a15fe212b1cc9da76c8272d7ce85c2930d797b82 +4a67de55c50d45cb3640db2a79ecb647a2fd2d948114eea9bad6312319f8db5a +a29d60b22439d45760751904f5de5d8c5c9d0211ac9d30b9459dd05eeea240f0 +97f0c239068c514b8213609014e6bc50633d0ecf774c210aee7c75a5bac24e62 +813181e4d040ad1bd4bd4ec7b99b8a37abd694cb67483d1c5dd5c17f54ea7f20 +50d0ea8ce1cbfa5395e62e10c5d17a423ac76bfba25a38fd474b5b4117ccfccd +30a2ffa484af429168b1b5679b67542755e989b39387fcd9b1d8f8ba313a758c +58641f34ccbc8f2556ad1b17c33f601ea76ac75ee6b681aef12c0712a14e7b8e +a8a5bd316223d5142e8b53a6f81a8a608a3dc32f20c5e417a6aff0f725dd7867 +429fdcdc16a22ef6112fdfc5282c61a1aa9b134c1b420de7b359be8373cf3716 +d7b3ae832ec15e305ff6c8e9d4197f8b0150b30e1b9e7f15275b4b7a65dfc611 +97c0e5f91561f3e6203950edfd6cea20d0649071442b2916ebce5f4d3da73914 +5a2bfe6d055580af134b7dddbb9baf9477454eee8abc7b33eea500102e395212 +78d08c08ae455bc0fc5bf5a0a577e5f5fc71490add5a623ccca134b62c19d3a6 +4019415ecee0168621be2b4856ef3b3944c0db9aef7d3e933a034184934bfd4e +3fe21d4d2625e6464e9ff9cc25e793eb7b8701d3fa07ff9a3020f76d668d083f +59c6f6751179d60eb17b9c4e35f3815aa5ed3793a2030d317f1610215fa920a5 +5ff29a67e8e6f186f00b5ce164677eb1961eeee35b5a7891d4296967a9d096bc +76b0d072eabab7ea758da89fbdc25b8261d9fa08099b6e84494fe034c3edd5f0 +c45e67ffe588b2532efb3dd1c34be9ce299712eac0e4c4cbee6f30e958c9dea0 +15c5c4fef7cd440ea982f91c07928463807fe07f27ef61a5deefa47879847835 +d4e50aa1dd0ad2b3d01069cc7b4741b3f680131f7d5cafc6b3978c3c1d608ac9 +d24342092746628cb71fa01e3c675f14463f9edd4c339ada41ba4b6a0faa5117 +204463bc7b94d01edc1b3d5781898c85516617f29b4dce2d32c2686ddbfdb838 +f67b097be600f6aeefb6eca5f729b45be307232f92731c10c3330672c9584141 +7192e62a0ebae828fadd77bfc2ecdc1e562daf5660354e0edd5b7177bd8e9d24 +f77e526e649044cfd49633d48cea64de714e59438ad980e0b1ffd51ee19692ed +665e2ff332bb54bdbf75316c4b1a39c538312fd649e8c462994dc8f14bf056ff +0804de76474d0ee084e363c8b7081b1c08e252e05e49679e6c7ac81f42e9372d +e5af64f59c4fb62f3e2e7b16ff53bbbc006e3d9b0f29434db5a63210944053da +ab56b1075a0c3832220752d104fa1770d3acfbc31704a1b7852c077058f616e0 +a4373c1c92c7b60566691573502e9a92d583a3163bf31fc100c92e6405ee4d54 +09d23a83225bf6d1de2c7bead011ad64547d6835ac9a7378033c85592a0c3497 +a03c16190ebdabb792ca0bf803dcbc3bdf0f7a571aae00f596ee01eb476bad97 +3a27a219aafcc0fa245c6731a2e8e561c63b7bc3147b9433a8203fddb7138b0c +1611c7e62375f2a114f7bfab36cb1a94b9e10ca63833ab245af595217779bc7f +d12e68a65919eca4fae72f755669580ab0009452bf086ea835f91a0d5b384b40 +82bd515f006865bbee2c50db43b4457a793693806b86f68a2b2419fc3e937a72 +c6f414de148d2a62a71ee9fcab710d6dc08ad6c4ac443365e7a78843f80cd769 +c56efecc2d63487b5fcead1aaaf9481a7361723388f5b51c2d9cea90486cb9f9 +79f6f5ee718d4a49ed91cb091adcbd0e7b3ad963368c9cde877666a742cf5073 +aaf79428b3095f989fc1fa6f5ab1d724d92c33c1325c05a39423b8a83bba9359 +97793fda280740aeb6be3193be5f4feeca2a8f28efa9c8e016f0fc87c8f3392d +5715b9b9a7aa3c61ac84461e2c3220372568aaed851f1cc40481e326197ecab1 +f3cd792fbeb27a58a5f889a5f6321473148c6d311ca89be96039ac9423700d87 +ab0d7e8b89717d1a62ca14e01f51bd77832bb6dbf76b201a04d222852050cc5c +c6a4996789a0bfd6ce364592300282f102e66f4ae9e50d60d886cacb099df960 +c42e2213017c567f27326e677bbd04a239631950b566eb39e4f675d2e989f56f +74da3a0469d988ea0122ecc3670d458ad82bcf7ad04bf3ca9b00d76ee569f98b +a375285a1abbff253b8f179f71f496286330e364049c72ecad4d82a933af0189 +03de5e4abcfc637803167e56911f826735a7c41e7936f4bea148397bcfb18cda +fb03182ed7c511aa9de0c6e6c80b24cb535f03ee16bbcb514d65ca9ac2ef15c1 +aa1825759fc4ecafc7c0d9401f139b3f20ee915955268578a933b184a86f2017 +03cbf4db79be18c09c8cb07d85739b8653ad37b8c0b647161e5cac746b3c0b94 +2ae2a0540f38dbee122cad0cf739ef1b49b6dbbd5d08c97c04dca33030f18718 +583337a015395e1fa932df0328c7ddd9546b7812ba06d82a35f8110d55fa377d +fa6880f52645890d58478e4ee3b72f08b2d7113b2453729b37e4fffad13c5f62 +06b3c767a45c80bd479d1e24df660e46c83c48166fccec13b9cc4e62a6aaa813 +7c424885f83d7647b80849c0a77bed562f134034cda9fd6e8d7dec9e43f0c018 +9287de759676f20005556cedc67c31509a8bf56a5c972b5d247f21d8b6a58953 +7d92101841166d7781d4d80cdc35ca382d8c2dac3ea3a34f93dce0ff8c76ef12 +390d5d57d88f3bc00d46513f0358c43a22c413d9a6ba6b3e13913474b9e53bf5 +31136a5edf9192965aca98e06316c05fd3d6e88fe09cc08e327ed027b81eb146 +63e3073ea5d1d59b74149c5f5242d3cb253c36a84cc837d76b2ba36104aef0d8 +f9f4404d63c42f3d635dc9195ea582b589cb5b54ab01af9ae53f3ec95992c09f +a5bfe86e6ef6948bc387730a9cff0cdd365650aeaa5e1d52d8f88dd49d36e6f0 +786c7f4ef8c2a5a242e84cfd4dc50adfea0c2ac27839699b92fa8feb6436f2aa +d02710777083723ca7e481f83b637f19ffb7511de223a0a261324189edb38d88 +6ff5cb1356e8d567afe76f96cb72f88016e39e99af6aad499ac60c8a3205f253 +82c0312e1f2b6ee7b37d178bd4e67550276a7421b4f514fd293ad32bb1121234 +bff93d2297dd32dfdd7e7ba91c0544f79dfea965f4f67494f3ddd97d7881fcfb +20ed71f6b5cd27b12d04098a9293e273148590fbb65f6fba63e7bcf14dfe6f0b +51f870be20174f991329a5ef3d3c9fce206799a01ca102ee7999c2a97a19e796 +bb5f88922b76f922d302dd833ec532022b13ec573b375cf75e49718b2278f2b2 +4ce9865f20902d6358440efc9eab6e0e069ac7c193c88a044cf33f6a39388f6a +296f42c637533cc503adfc71c5f898c408a7e5479868ebd29c9ed02939ffd49a +2812baa355be429858e0c6aac60817d684778b71fb9a73e7ac4fcb078bb1a75a +b425ea09ad8585ab3fad79429321a8f96e2e1f02ad70e2fdbeee625bb434b0be +f8eb957f817c5699c7293e47daa4ead6d47f00fbb6c8674ef1f7729cdb19749a +ca9cd399a4abcf28ff71edececb2a955ffbe9ebf4bdab56256e7cd66304ed4ab +1b3fddf6431296aa641a8795a4006a049fd3b35074a865c901636b70619ec26d +aaaa8c8c9060938337144209f3e3de01e92293ca89583cbb4c2edec074bb4c05 +15130c3ebfd78dc687f0ad0981c0d27fcaeb28f470193ca13d98277dbfcfbf38 +f8353dbd04380abef7176b0b4199d7319ebfd88ece219ba6edec59fd158987e8 +9adc035b8fb2141be0e0f25d56e077e5992e4f95640abca7aeac3d929be02d40 +9a86dbcc043637c5e0f1a5a12579e57b042b386be96c9a8b3c4e79c8dd28a52b +a1159728785a75f2e579b8669a36a9f9e7807ff9d5aa0d8652609a47264a2003 +fd202bc8fe9cf80e2ef05ea5e5fbae676a77bbdc4308ab92eb0dd9a960f4865b +8305eef47abc2353287f52c766ea1c1b86fdacf0986e56a87462ac820e61051e +7f22cd8ea7dcc7838a45a08ea3fec105d80fe5ee5e87732bfc2e9d664a7ab43b +05321557d69ceed6b679797a67a0c38b9d101bbe870d746568325c52d4ca255b +b23f9672ce2b4e3fe944f5dbc388e575abd897d969ac2a81915e3fec3d7409ed +14de1e4cf7737b6e46f6c71142db06a799a7208539c649244ce73a58f2247e81 +4f241aba74d6ae593d47c227137ccddcf1f523a730a234c91ac3ae8a456cad1e +91a9480c438b047be40bb2e4038f8ebc34ecc3a8037454b7342c317871fc1d97 +42f26e3d956da7679a072cab96b27fb2ddf480d2f40ed88b2e5b0b82892c8314 +cec9bdc12433159714891b8591a051cf2cce7580af74d5096f53a65347488bcb +948fb028f310575d3429123ebecd9b09d83f30ab8c8ab65d49d691fac27e3612 +66ea08634f4c7d3a648ec068c2cf31f116951934864dca2755daacb6d22803f0 +9488117ef66e9b12663da9d00a3eb0280ba412e4b6f6397ee7800f250fbfa023 +3162addcca4dc23190a52397cda3285291842a2b269c4e07f17a0035fcbe785b +6a570e4b75692658ed47b6dbf297adf1b3b164740d1e851f08deca9c05a263a8 +3364c544cece706e77a32f6d5d10f8d4170d5246d92c2c9fae457e0f5e4ecd4d +08b4edfd42a1791cca41078d5e520807817206193d8a649eb39b64c80e126feb +240e1784da3c66378196828104c49e5fb86475a80c21de71e0aa36ac5e529ade +427c03c2236db0deca99c7c486ff463a72723efb519263916e73c25da625d0fb +e45258ad2abf3445b72cbf3e7e64d507198f666edec002e233cc0af6a8c1095c +3cd232e2ec50b2ede3e09b61e25996b4a64c0eec9d55025b1f47e53e0b128bef +a34646b4e2c13699d112c958590058e6b606cbd978cbb0ef69eee350bbf71ff1 +8213a42d135e77e2c53a8121aa3dd1e903dc0e961810d103bd70a2b448f29ec5 +c3d907d7243d76c6ae04c22a8fbc6c1a05f9b9ec97cbb0e76928f4aa26c913e0 +3f8c371efb61f370751eea6af25a3df4ab3da3e4aa263c2477343e4b19915219 +c4c52cf43dbf373c316b80619f479d9b531e62f26ef9fc6da13e9cf0bce74d13 +c2832f1c9d9432437d253dccf73cd699342521a3cfe8f85ccdcd23e9b240c961 +fce15ef77fad8438674b55da638df2492b29fc1a003859f382a776260ae5067f +93dd176181c10c4a45e8f237c5c9781e01d2e1e0890e1a6e75e2bbfda4d29613 +efdcdfb21317d770fa6c1ac3800f328bdb82b48b7320ddcf64add23374971af1 +50470fd002c01ef412c5bb4984737840da5c9e0e4d4b2b7747056a3865af6db4 +f4b9cd84d27dd2e45aa0d9f32d0cf58a5f1baa374359223cfdd07c18017660a2 +9227404eef0abbd0e29bd8698752e85448a5c3cf596dc805a87ff903ff890e48 +b7971764fcd8f921eefcc55b2d20cd5908a6fa35d56bea96a39ab521d985c50c +4e0213b30325d295a00d32d97e95646867122dbef37a3c866fd72e2f29ed8758 +a362a4f17875cba8be23d04a35714d4c27c4417039fc8bcd25365c8a4bb41815 +ce1f74949d6b6aa58fef0c4cbb8d54ce92d65d0a65f13ac6063de4a55ba5561d +509f2fec155b2181a169ecf14f1fab587569f260c0cacded8021ed8d7cae5ad1 +332f1061e166686b41277495597c16e728d6a8ff49f824df503a63322b442182 +665a12900dd48d1361342575fdd5c9d9ddd7bc73a937b2ac6257255414029a65 +9001199e9e1f16cf3cf876bee000302935493ae997e3f112420d7d3f06739b79 +eddc1bf7ecfc5316549d2ff228a4e28b522d6cfaae3148bea2755a45bc27dfc5 +128a9a38777cd3b07f91edacedba2565b55218d7891da863243cf68e7800b82f +0341740a1f5dc6dcf0125cda844867fe4945326f13a954430753a28ea8491bdd +c545e71e4d52cabc3f05dce434101d36a62328c5fe6b5df3864f9f5aec22f399 +43f72fed081d3724306477a06eb9b6fcc9faeb77e62ee4e20cc51600b1bb081a +1c5a00e064d5755838b251807ae57c85675cf04b69a66bef0c19c364969d3547 +55efcf31f8ae346582462e986e3a1d653c205e5d58d21de4553832c885e543bd +11eea2d3c08f883000966c99281251fbc2920917700037278d4934f3441dd535 +bdd3c52111ed0b282ca23cfa97ab25c8726acb13d50599245e532432572c35ac +b9391685d9e1deed1f95fcb151594cd63e79691b5972ba2c3a0c0a2ffaf3c9fa +5ac47d9177a691742e4634db6631c8696d0a30bce1d86a4fb737ab85296ea479 +fe90c51cce54d64087bfc80ae56abb5d04f5516bffb681e6b39f480767f2120e +97d1e8488f1f540e2ebf63eb74596670f5892f4c327971f697c7530778c3676f +2792289cb12486935c447d4eaf4afec65fe6c6962306449e33fb19fb9806f87a +8b91874ddf3e3138481fdc711f0954d73f11fba39efdeb55ed13b16b932525e9 +9f3c86ae60f9096efd4968759def8d629ff2838decbe4c68833ba0d64d1d3330 +b84cfe8ceb23f4b5d55aa5a9b51ee595aee0cd668b20c687d77ff83c803ab994 +c743b43d9882837c42a58cf704490fddcb5646d48cfd2e30464d710c1440513f +4417dfd66d39e0fa6c596e17d07964ebf2caecd0a9fd78e003541ba53468e719 +b7dac2685ccb9b7d857aff1d4432a72f61829010924781f5d15ffcf8d504e361 +6f86c6638469db4ad281d8ec365848b6f7ae1047114a2cd3cf3d1e46e0b4f40e +1a8d3e1df1c1b677702d7fbd5a5924f91c726de2e37b436250eb71610dd82cd5 +5c049fd044b4407784fd83387eb6a788103430fab4f682294b287dac43f3061e +d99c74309ae973bb998bbb2a691402843a1a28ee62ae8e8baf4d645d156b94ab +34680095425ad8b4dc27289e3c6818d6032f91535459d7595b2b9bfc2f44e782 +30f0af49c0a2223e1cee9e1289f682ed5e8ea7db99663a234719667bcffa8077 +e0118b0b9702538421dfada01d97d7a8f232464b9fc209cf278bd5fef80c14be +011a9f6fc78dd20ab012a30780db2507f4d5e1e493f30814ab1c70cda75ce959 +b5d515b2ee8640dd4bcda6710703a9e5670abadae856b86ef8e4143a5f03fc16 +a6c57ac7c3a96c50e45191b0b1c4f6acd622c400cd0f2ae9e9d51236f1b945d3 +71adc5feab8aa8422a28755b63978aaff787158a68c26fd29ab6e849b076b852 +2190caef1a86663f4e12cdf25ba7bf882ef2e0e21c77c14fdf940792d7bb28f8 +892a9ca0bbabe1c70c152f30f366bc86b5bb1eb3b54425617682a5463238c999 +aba3a7bf788a297d2a555dbb218b19ce501aac43d94a0bb6ae290628821efb0c +84ceecb30c140917a458db6fd011f3cbfb4a1cb5ea019db628c106e2a55f1c13 +448edd4a9a159ebb369d509da296da724f729fc7560c00c41f4309e32ea6fb71 +16f62325a5af317f106a8d8c2c01ecce6775d45fdbefdf6925e9a44604dda13b +27cc9a960a21eea2af9bdf6b3cd357d6097ad40df7403005746a30833e814eac +8db72c383fa42ba9fd007a263ce3b74c1356bd522d2611e4e960c9ff5204d46f +ee332f9f134e75c791a6d20923ece8d4dfedcf96ab45dfd751739dbd47b4863a +f0fda172848cd279afd9fac3cc5744c1fa8a5fb4955c6c1c952f56da06430aee +084507664f93c71d881b63041cdec58306100a0e8c77421d75679ce33e2a0a63 +ac2f813006cea69e00352ffd5f5914b63dbad5905a590ce0903ed9b9679779e2 +d9da62f478768776a173832a8f3cd66b6b62484d190baf2d834241000b0eec79 +f1e53b42a74b159bf781ee4415ab6acff86c5b0593cf463bf95d8fa82293a548 +84bb226f40f24591e5ad463ae4b672905e7a4222edf976e8ad889e71986b3818 +bd3eeb6a0c96787c6fdf3a4faed94f0ba0269fd082ac451531e3b0c01f996090 +3f821dcd64642868f07aa0feada34088a85e6644ef07f4402b4b293073e9d308 +bb298b0e44be36bdda218259b4f48f1b638f5007d3aa8ece802b485e7e9075d2 +6ec881fbdecb3cf58c8a3afe0d9835e7b468c648e52b2eddb81dcba4e9678bf4 +b173541dbec382423e80877ba2df94a605bbc2cdca2b76f74d2eb425d8191958 +804617f21172f397bb762aa7dfd0485cd020397a5d3e9fc9405ec7edccbcbdf4 +295a0057b7684a701bb7ea01e8978fb3367ecd089be19aab2828f6825d275d3f +60662c1e2ec5e98ecb99a96d6fe379e2fd158a7106b2190902f0ed71969b6daf +3f9e460f16f1b40cc2aa08330b9fc2e24802bed034b71de445a14bb33f642989 +4f76319eddee328319ee9577740fc803b81714a99bf0a5722981427ba0858546 +c0f77f3919070060704c3bd991d94909d2012146b88c0d35fba7c2de864e35b7 +caf0099c4630443625be3769b01526f3f0c8c821da9d546bc258c004a4d2b46b +886f1ef916f50d3f5fd139e0570b4151dd41f1f1b5dab0db7787105c77b86901 +73c562d3eef6ef741078659467f333450d7d80c67c91a26ba8c77adcee6f4c56 +c7f248dd92520db35768e703f7bd171f9e663b9daebeb9611cf48425b6b35c1e +8bc7a0b45441ad3854ac9b37061839f578256a8e41766d1a6b29a99a0195620f +a090d0ef4120667902b0587946206f294b78775d60ebec668f6e4fb9ca897e85 +76151b245aff8232a90f97a5a93e935c88579dc0f2e9da7cbd02426b3b15ed50 +30acf50107f7b4d4e2c32dd75d6d8c4539176a2244e761ebf1ffbf97d336fdd6 +ef9cf138326e10bdb57638235348eef8ffd33c84b426ec1c81fd8d4a3907d52d +1ba7e9b64dd56b8fbc2362e30f2451b69b0d7cbea1f3101afcd44242d3ff5b66 +89a7c05449b281035e983c6b8c68859734b232a73996a19d116ac4a94f7b482e +1f984371e7e9919c312250c35f6f7fee25ec23e562dcc25cb29ea79dff0e7c8c +fa19280288c26dd5c32f4aeb98c85afda533191809267f0555498da5688b7c20 +219a058efaa597125535871922ff9b20cfbf4c4b35bdfa4bde73ca8ce6abf14c +510ed2072a01c8adfada0064777509d4f97bd2baf66e7151ade76e407066efdd +2e08a15790c81d545b340019bd350c7b90b36adc8658c1848020a77f918e1527 +b3974710af503a79d7947dce93bd81161cd7e0b1125d2fe0edaeb91baf1279e7 +312fbed646472b352310fdfbefdcc4c20ccfed0d6626083b0261d7c47d966984 +8dca4298b9ddb58fe21bb391c7d45d9b562d38c4dc23acb5aa87e3ddf59ee238 +c91318db2491a24110af90539a16940141d1efdf4a13d202f9b9401bc89d7297 +5269cd5515f9a6186a6ef866cfa03730f726d7a4075e0bc6f094e9584a84cf1e +78489bb68dc09ee3f1356f4e45b8621e06078a6727eb72c36fca805213c1675d +4365255d90164f33ce6b2231113f64fdcf5a789cd61002b2a38d2ca5bf1f5361 +c9ae0f4efb51337e344fb7ce15f8edbdc9ec82a9435175f59b6c19ae2dd0b10a +944565e4b14bd1dcda02d42be27fb9f0330636091228e3b89709c8148932a5f8 +c5ba5bfecfef6de83eb414adc613d8534c4e4528d934c37e768d08e103b8ed2a +e1e49bb1b3e6cbcdc3ff63dac7994b8c09203d82a99710449277c20a34e01538 +67c5d5e6abebba650c441d3fe56de997e928193682e5f1faa93a5bc800862132 +ed3b6c005cc0e604231e3e61d17214ca38148c875c268a861a14b54e659dd932 +cbe6ea7109b273975d6ceed351f0b0876a0b647946d29097dd98b5f6bda7b43a +e6481f17743fda503b34a120c8c06f4798c1fcd4e521a30d76f2340df562b63d +dd4b27da8b583547d285f3848bb9fddb60d0ed22a4cb27a2784e8d7662e84ffa +eea50afc03b0815b72bbe9558c8959d0ccc00a8c8c9f740f95b671a66dfdfc68 +77fac12c1995d977495c9ccacd924e45a66f8739de156ee6962c7930f8aac374 +894f8bc396ff69f2249392c7c4248f9cf9ffff9eaf635e66a34511f39a066b88 +4866e776b8d6eca0319f23ca604ead742bb6f6f3b046454a1c0fc242551112b5 +c745e9b8f12723867b2b895c0f93c99df1d542b86c1c9db47390f2d6c3b57ecc +66b1a6ab514a47fd9aa6240b46c54a92fdf80fc44eeed4b8a136fb88b1fa5b9c +a2fe682cca4d0c5a3e994cfebdc270f48e3af91ae6bc9172bd9c73053a761364 +6ef9e68ef58c718a478e7d81e57f34a791c26269819c78574d7cc12632684219 +a1f8e1c5ce8b358d6fbf23984e59d9533ad310d158ab5baa9feda08717a7f5e0 +57684c455a7e3d833f82b4e13e9a92b0b8fba5cdd72a7e46709074ddc82e449a +c906474441066fdd9cb7f341f3a2ee9f2fbf5e4e1a350a45fcad6b2e05825b6c +89077d742619cf1f8434a3b5cc44998176667cfd5c5f4ee51326d1ee3e449915 +00bdaf57c88a107ac49c14cebf18d010c5b3206ec88fd06e3c5114581ee5a5e8 +c4ee5a5c3d48653fb23d28f26862c433ed083af01ed3df8e147548f9cdd882f8 +ca3088106b9c73b9e28786ffa643c343a940bf850f312666e635b8db95c6f70b +83d645fd947f6df322d26f8f9081cae71ba8b9d0de67d535b61146c956801d6b +ff9a69365bda9bc97d8d93142d4c367d5255587ada25e4fb061f8e430f73d2a9 +7142d9e4c17435b78805946e4fde624ea5d9b5c511c9afe2cfaf447cf08235b8 +575ddab8af93588e0c8206f08f883170ed4463da31a53cef67f01aab8f645acc +c2c764f24bf831dcf005833ccd1296025368b3d51a04efd095fd1355e93de563 +e71dd047ef49f5bf8c17b01b2884872257d743ac6fdd8f54e27a241d7c75b387 +a8841d8cede676e35d4f01acba2acebd8b22113bfbef80d5eab1e8cf56f649a4 +516ec097872a597e83519fc1397c7d4a4f6db7daf044835b17d085578f5a3776 +fd5ed9235c018354e801fac338aa7ee581e97d91df0196ea4bcb09f0e6f2e2bf +b5470827f1b6bb0b7133c19bf43bbe824ebdaf9526ab15ff8ae8848bf0decb3f +cfa7d3f5ed71191894c705a27cd9aa30fd384ce6a5f0bc51c5651dd2510a3481 +d086aa87595f885c4c0afcb02b1837cedf85c5e64d440e36581874a117043b75 +78da94a069cf2bd57ae70c230e8d1a0d4637223d14a9868835d8923feb404323 +43c22d0f0e8201c20247c78abf9267915069d6471862c2a0c51ee3ce3153e305 +4a4ec6ea52dcb55df358d1a0d8aafa79fe08ebe4d22e9ecb9d2e50a7f367cded +7169f84285c482fc1effbde6feea424ecdda2494127c7b896dd05f5e62f5fd1c +031de960d6ec59954e8405081601df741edd97f227fd426e0998ca7b9b498beb +4cda9a16715cb699c46d1386469958079ddf5ff174d70338206208f0b9ade386 +03e8dcf31e09f44976c1ad762896a615d9bfe54978b7c3914458c8af4d33dc62 +9f9af5171df3b9e548b24011ec5f02e31dc379582e16f3c999f047b82e7f27f0 +4bfdd827c9a1d19e4230695d4ec499afdb6147146cb6f5a8a26efbd6d0c5f205 +34cb9c37fa4c4b6122f55bacb756173282abd6a2e5219c25b86a5181021f0bac +6f17f89f3b8f74c281aeea7c1d4ffac602c2364c9e1ec8b0a623bd3541765cf7 +aa5febbb6e857810a564850259ac4ce6d641f7b765dd46584c43c8113c8583f9 +e7763d3f4f83649e12e15557f48dcb0a637140b2f7479f78f1f64bcf8a07acc0 +43b9d9ac1f8b2c3b00c36b46d8e514c998fcd47354b364e8c2434e774ac7098b +24c3bfadbaab5bdb8ab0a6b9773aea4175615241249a2a58222df8c53c32d01d +6adc5fb4a933605fff98c7d011266380b305403a79867936156240a5c555105b +95cec3873530fa6d37e8cfc286118a9618c60d6282412d0ccc5a8e3af47a42ec +29cee0176d1c4802144619a5bf1cdf9ec5b8d6f87c379c476ab941da24420a86 +04a0b1ad7884b5e05136139afccf0b7101cae4b8f0bfdbe276aad1b95e2c0d57 +3902bfdee651a202b99189cada176a22facd053bbc73af1c90cbda10635798e9 +8de05c338e90b3dc4afb8d29010590b641db4a9ab707294e55e44c97e275b52f +b88f52a6c7e545cdc73de46da699c8c3d895880368aa035a137fa8686ef4f64e +09167b9e523312b175a166de5e1297c60db361d9505c12b48c1780a00be2a9a1 +43bc6362c731eb26a61097c62c28d2cc8d75ba3c63e31a49b9cb5b8b7fe1fbbb +6153bc87b4538ef5cd4919811329ae933d86ef556883323ed5a6db5c98c11b2c +cc04c4f937289590e5f7ee8d57940f21373a81b8b92eb7ca978c1a07af7b1065 +3e6498a6e2fa734269d61cf0dedd647eddbbe395e1e8190552f9a4332082bee0 +87f28fd6bb19e48de8ad662f41b4a5de657511f2329fe6b541f50ec43be24d5e +e7336712535ece6a590426e10422d130f4fd8b0fe314c9fe068c6a45835994ae +7bfda8ae49fab23905e4d8b374fc654f336b36b2080df61abc288b26b9ca7b42 +68e46f120b82cdcb74715e6d09aac096fd117ace3383beaca52aa248cfe307ca +8930a34b7062fb153d968c93169dd223449ca68765480cfdc5df39be45055d37 +8ba14daa5a4745a9f7b76ab664ef3d5b2fba29c60a06d1a088c05eec6d95c080 +1974ec344b24dfd892db7874e3e9df0fd61ef8f59b525f92f2b374999f923f34 +668e55cc90ff2890107a7528853f44177fa52a071f0ce997ae94b590289411e4 +c0669c936d4b885de8427b60b2f8820bc9d6781bf275a95921d8cf4f55cc8cc7 +73ff7d001f4fc5c41ea1c755ee48c5550677755aee061a3ac85bc0d9c1e5b410 +f38ddb877fef4ad4142c87c42b6fead87f1daa99ee0fbe7e7eee948672373a3f +7ace2444607921c61cefa7360f3194685acf836165e19395c2b2c9cb5778d9a2 +6f35f91d61e5e4838aa23909b46a899a1e02e27ebfb5368f1080272f6ae9adc5 +44f512191bf17dba3eb22d98b9b934f359fc86c9e451d2d4194632a7db5b1270 +6a58cea47392fa8cc24f6b4ec5d172e9e5601617d8e22e837c0b35b4281364e5 +81757e2fccb98fa88879d7ccc568fa9b183504b491329320c968b5611eb1f337 +a6e50d6faac591da994aa47761865ab84651c328bf259be59bd752f110f89081 +7553823cc67e36721e95f1c4e2e372e020f2b2ffb045aa70ca4dd6d55d88e32d +c8a17492ef28a44d4a536fca8bd75b3dc392fc296377b2c4743897c32eb65283 +e776e8f8fd97c661c67c3f0d97343af141bf6b77499a13af4605e36d3f4c3fab +12bc5daa5db1d12dfe5915acf14409e9302b1bbc8c5861948eae329ea31132df +8494560e564bc16073c7a777fefb30cac6f4b8943c70195289946a60f06d4306 +4536c2740995b7247451c9e1619f7e277af4bcbfff6b68553ae23eef7b179c16 +cab6aae7b6f5fc72e0d7cac34611d1353716580948ba69dc534a3fa592984244 +c1bbd0a6d3f1fc4d9c8ff48e770f5c65be3b5a961e2ab8931e73c8222e6eb481 +86e92906bf2b44fef5a59b460bc88ad1837730515d82c337c349cd087329ffff +0718e22bd3f09fede7042992a191575008890c5966f1230ab186f019f1794671 +8e619ce8706fd94bf0fb1d6ec22513150c1b9496742a94e048df079bde5d7bf3 +9db82668e5f5453962990f4e3e0245cd2e767c5cf3754c1371bb37bb7e14db75 +a90fcd5de1a7d75748289177ebe65a397762b5b1dbd468e7cbb3fec66a6b3f2e +8e9a1802bb2cc4506b3ad1632d674f1d54a0c1c08787f274b48d60e9111d8035 +be3af44a3a12e16175ebbafdee5cfce2a9a26cb9826c86207f8ea895e5c2fd66 +216be83f81fa47f39dbaff3789865b1bef63bae463b7d166dfba5e3e9967697d +f6c91c7dbb765bdb91f4ee5920567a94199416484e75cb6b1c0d1bdd62e831f2 +4b6d7b1009bea14c78ca6b8f1020cb05c9bfd13076d5f335d0b8ae417fa26c75 +d04a28a778d8858e64736fa0a5ba789b58b4d05540ecdf28ee044ea18704076f +c3c92090d119bc67594021aaa4e89a063ac0e64f2198c5cdb3951c7681ababbf +6e96666f467a0fdc729efcd2f1d94e193d8fd56802063840696f3eca394c2841 +6b7e6bd4759aaceebdf82bb473d49256e653943469db71794ae96b3d130bf97d +752a9b3bc4449bb756039609a4f9fcc63c637d8672f2f24dbd49a5f9f5139c54 +23c4a1cba345784f28b7933dd3d2c9938b35e63678b045ec314fd9e9188f1b18 +ca034a26f5d7e2e779cfe4d16560ed2e4f3ac2bf1b5324c6b342e29b5ba3c9e0 +7bf1bff519f91bd9cbd4c198f0b98431d83d7309d0a4b62bcd450d62649e5b41 +335d87c297d288942a637999c2dbdaaaeda4f68d166265a37df001b1a4a5f561 +64a9a7af810851d98af3e01b0e4bbcdf33d3035b98118b48c6452da0caecca10 +228a308a0a3844d57628b2dfd7189f1fd252ea1ce3cbbab7e71329b886cc36ef +b40f642aa54698e87f4ce8b310f0ee29968ae04de003fbaff84d866e4220b607 +3b3c5fdfef88354a54d4318dd852ffeb9be81630c673e425fd3bb6ddec9f298f +a9982f8a5859b983bcc09b989f4a71ee4a54d38a220c3ce7491e7d996d8b0e11 +b085acb8f217be35f3eb7fa08bd8ea8c66df8ad00e329ae732ce12801aa8b1a9 +40db1a7b303967c185b90229a1188eeda3a1565dad1c08181fb35ba03667d513 +9f2b6a71dd27e11c7db9a7eced6404cb09250fa0ae2f0fe7fa61147039cb8685 +e7a1566e25b40b1f23ffda5515c107e3487ede0a148f2d8500f102b4f517c956 +87b2e0399387f4a9067ecc725bcb327ba5e98d5c68fb54ac99834146bbd7e91c +b04d9576bb16e39608c14c25aae446d250b388610b2714757631c18feb700057 +c0022456c9ea28140a150dc6fea0333ecf9c291d95505de3c053c1f957f76a06 +a5e96f792200eb5f1811e86d70c9bf1e0d28da28b8c6042555a27ddd0aa168b0 +0f3c113217d990f6ead0a6ecc4ff4c92c577121d2b1dcbff547c03184360a6b6 +3788919d20302f0c35541b48cb6e926be087b1f7308041dc8cb8f161d8a8bd32 +ecc861efd6ebe16568dd47b82fd1a02200733fef4176a7477185d79e44c128fd +c54f4f28cee76dcded7399bcfebbfa620a6f5e4df5350fe6005f84541a6e77cd +97ddcf704455f96435edb3666d9cb57521f35e258eeb2163944c90cbdb3d4a70 +c94b9d3905fff429f16560c6bc44aa27bb481e24d03f29f135eef38d973d12e9 +c251de1d9b976d4d7bb7b4f62dc7a6093d186d240db797432dfb5e71f8fa09d1 +b9b6cbde7b4674bb3f38967091b8b375c0e7dfddc0a206b0d8908707521254a3 +35be48528674c8597822a0a9e9ca84f0b3d2a44ec9deca0db51fa2ef3db16851 +7939ebef52b5af799ff6fe86b0cc459be94187af479e95651233f2515e01ccc9 +57130b01e6e97df375396f8499535a1fcc0dae920db25db41477263a847b578e +8ac94e59fcb69b97a1ebf8d84e2fab6925bd16077d5a58403539acb40adbb89a +55623d7e09a8481e71b47416751f01881ece4d94ea9cff6dabb3546ff2cde4cf +1ba77ecadcd4499637e26c5064a342d71cf50d725c40286ad352bf97e0da521d +58055ff97c68768b4435db372f0b3d23845d7709ac47b2a965327f62573a8fe9 +e9c5c435ddf12478bcdfde41c0e4303b03949446ec9291c553eebd9add6bfb9a +45165ce3820af4264dd3b54ac41e4b2df6ede1286973660e37281c7540beb69d +16a86ae03b8c5ce7ac142585f72a0cba8cfa3c71a54db60d1305790ffbaeee1f +f31774926a1da96a37574c9a5b66daad0a68adf9f104123941ac4d3342c13bac +b9b124ec9db917032e3f495107f3cab93d57751e88a5369e27358ecf4f9348ea +543fb55c0492862ce28cfb1f28e0e5ffaa32df8fdca241db555619583fad76d5 +04ef599f233c424359768f6e8f0cea95774901577277dfd8f90418598e +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F134_0 /MFECUR+NimbusMonL-Regu 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font ZOVMRD+CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /ZOVMRD+CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 45 /arrowhookright put +dup 58 /period put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +currentdict end +currentfile eexec +d9d66f633b846a97b686a97e45a3d0aa0529731c99a784ccbe85b4993b2eebde +3b12d472b7cf54651ef21185116a69ab1096ed4bad2f646635e019b6417cc77b +532f85d811c70d1429a19a5307ef63eb5c5e02c89fc6c20f6d9d89e7d91fe470 +b72befda23f5df76be05af4ce93137a219ed8a04a9d7d6fdf37e6b7fcde0d90b +986423e5960a5d9fbb4c956556e8df90cbfaec476fa36fd9a5c8175c9af513fe +d919c2ddd26bdc0d99398b9f4d03d5993dfc0930297866e1cd0a319b6b1fd958 +9e394a533a081c36d456a09920001a3d2199583eb9b84b4dee08e3d12939e321 +990cd249827d9648574955f61baaa11263a91b6c3d47a5190165b0c25abf6d3e +6ec187e4b05182126bb0d0323d943170b795255260f9fd25f2248d04f45dfbfb +def7ff8b19bfef637b210018ae02572b389b3f76282beb29cc301905d388c721 +59616893e774413f48de0b408bc66dce3fe17cb9f84d205839d58014d6a88823 +d9320ae93af96d97a02c4d5a2bb2b8c7925c4578003959c46e3ce1a2f0eac4bf +8b9b325e46435bde60bc54d72bc8acb5c0a34413ac87045dc7b84646a324b808 +6fd8e34217213e131c3b1510415ce45420688ed9c1d27890ec68bd7c1235faf9 +1dab3a369dd2fc3be5cf9655c7b7eda7361d7e05e5831b6b8e2eec542a7b38ee +03be4bac6079d038acb3c7c916279764547c2d51976baba94ba9866d79f13909 +95aa39b0f03103a07cbdf441b8c5669f729020af284b7ff52a29c6255fcaacf1 +74109050fba2602e72593fbcbfc26e726ee4aef97b7632bc4f5f353b5c67fed2 +3ea752a4a57b8f7feff1d7341d895f0a3a0be1d8e3391970457a967eff84f6d8 +47750b1145b8cc5bd96ee7aa99ddc9e06939e383bda41175233d58ad263ebf19 +afc0e2f840512d321166547b306c592b8a01e1fa2564b9a26dac14256414e4c8 +42616728d918c74d13c349f4186ec7b9708b86467425a6fdb3a396562f7ee4d8 +40b43621744cf8a23a6e532649b66c2a0002dd04f8f39618e4f572819dd34837 +b5a08e643fdca1505af6a1fa3ddfd1fa758013caed8acddbbb334d664dff5b53 +95601766777978d01677b8d19e1b10a078432d2884bb42d1f224976325883657 +05acb022d1e9cb556e37af91917c78e98229e3a4dbf03ae741998542977ad6df +1760fc1f1a479464922afda2cba7961e9da696b71205e19c542c97f25419c43c +fa1a042ba0cf5622ffbd3e775d0d564135d99b9ffba011eebc4066b003ce2f88 +825936d7393d05d3804601cee9d123120fdf73624a9d4e361a28e998acec53f8 +7a62a0aee33be2e96542534a8af24497d1c377cd7f723767b44857d94c6cda7a +c3d6f0087fa36655dd2b81eaecb31fe4f4a2fb1ea9fbe8b83d35826ac93fbb4f +2bee014f41f8f276510cf5ce35c3954e8cafc521d0c3ab80ea8c7fc29427a1d4 +42d6f6c1800919e58de9ae12304d718ad80febbb412da54153469cd51a288628 +ad109baa77981525b3d9b0efe593537fcbb8520d38cccbd5db171a0385a432c1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F147_0 /ZOVMRD+CMMI10 1 1 +[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/arrowhookright/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/period/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +%%BeginResource: font ERVBFT+NimbusMonL-Bold +%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Mono L Bold) readonly def +/FamilyName (Nimbus Mono L) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /ERVBFT+NimbusMonL-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-43 -278 681 871} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b892ad5e69acacc6c1640eb +3067bfc64938f41636db8831883bddabc6777dee17f2e84f1d530bc76f51c621 +75ec6b727a82c193d1c0801ac492bbe281b46626bd21f2adbbfd144793ef754a +ea5f1cda3310e83d78a098160c66d6b0c68d4976898d9dc1a08d01740ac3e7f6 +8d3ce0a7e109104248cb86318400bd82ef894efd9c9456e97055286c144d3efc +d2625110f1ae76241079bec19939ac962e0ba813359c15b07c74d5e9868e2167 +ea1199d21ca8827cddf1be8357261bd32e79fea6bc475577c5f6848345bce58d +f5435281572ae6b33b53607ebee6f862d4c752aee43c00cdbfd258c7765b1358 +5d6165ee034e5815de79cc26c4a720607bafa6049710ee3782bc2cd84fe2473f +1335d20a3b6e9e8355af36673cdbe63c27d4f0e183fedab10031b1ee33b9573a +2e1961b7c6baa41f7c3ee707fe86071ede5756a00d7b3bf0a21b7c3cf41093cd +66eccccc22f4534912cb900b08e69574b07f246305dcbc238780278aeb8c9e55 +3d096a944ec7aa9f697f354aa137df90a9547efec1cbd568cb999979f5aec6af +a84edaee1564d178541cf4631081781608fd38964257cf89b1c8e0120b3f6af0 +793597ad553cee5cccd5c4f09cb0b4e998e6e76243191af7e93833d067833f0e +53670d7e996ed67cfe6699a6e3815932ad272af4829c2ee08a30d3938c928d1c +e89af71192ec1247ca233093aafa54ffa58f4aaf3fe9c62302e598f4ff8cc32c +4d318391f7a36d0d8b416dd36d776b301425cbaf82d520141238781111a14cce +7927e2af21ef837558002539aaeb170fa7e7e37efd447c37db455d2f08533155 +53f3c5c3be4817680efd0ba3a114db6aaba6c4d0d57b09ef8baad463996718c1 +9d155a62d7ae82eae4c82760c594a6ba3c7ee4290f0d898bb3e404ccaa91fea4 +eaa2146ac6a23f6c5a8aae834a0587d990024bbe8de485c71b916ad96dd66792 +a732a188e6a57c459ebbd7756cfd54770e2a8d81bd4618d916a30ec7084b2492 +5f77ab14169547eedfefb6f03c7d5365cef512df194628d5fbea6cf56d0f5346 +b6b6c1da1dd8d8321b88807b579bb6a0c8f69cd919e311b6ade903b470f4e0a3 +dd5015c6432452ecec048dcd14814e47def4a53c5ca6fa9e91d8a28c719f9348 +509c0e17d632f8cb3f7468bb0e7f7f6525c086dc7efb997a60e059d3d4938489 +23e60f7c67fa6aa8062594f122a48c54aa7c049859928a3dfc72752acad074aa +416c667fcd176da4d7d31a9f6be6f146d4a9dc78f419fab7c9e6c74d40ea659c +24098088bea26bf5a725fe56025d1fcf8465ed7103702aef74973f6fb697e645 +e902d65354a44bb3489007c555a6a08bb057eca27c93bfcee9de42e2782fed4d +664ad7f2d238b7eda1ca4ad473bb9559e11a9f214e258ce1a2a60512975b112b +336864238a36732c3adacbfd52c85a0dc809ff955f9c81401f72107f3d263999 +a69836d76d228ab4f954b00da07bc4a4e165f2dc5ecd8138cc408ac22217b15d +8baf04408d4b47e55129b0e596c93d10cd42372292e1ff483868e8510076f7f1 +ed8ead1bdee2b49533f87ddbef2abdcbca432307f7ad0b3c3d4721f3e67e609b +b06f8b7e66af7c843aa1f71bdadf0f4fb6baac84815c8154a0023cfb68282b4c +8e24e478f81f8d26ef82d6d0e1da4a65478f4a1f65a7dfb4d1700207850c33f8 +148158a784b452ac6874080039e2259431c05c4522f1d67522e273b443ae9820 +adb5303cd0d839ffd17eb1fc6957159a569f64873b4b3bf99349c486a3af2b20 +b6b9c41263300ab0844d24daf780b4f324eda854d4e210daedc0e34f4b67fca2 +1265ea3764f8f755007b62e9e18e80bd30f3b96124065198c0a5985ba2172550 +8c8eabe77b26df4451f5068956fce111041a7d23f681ff2c1b93344fe688708b +61a47674c318d078fc4bf79217659987dcd1bda1e1b74068960036c472906152 +cafe4a8a702d271a02c790ea3e440e4f415556ec703a23b7aaf7bc50c5a32f7f +fee6426433e945c28be038cbe5ee0e7933945f052757d480c58d4d7dc4ab924f +985e054fd553d1c037beaba29b14e823a4091b08ed602a69d1c3eb0fd63faa93 +36db22e6588d3d2fa727916163030958cc89b3ce99ddeda6190f97e039f9821d +ab4e4d9a15cb5094041790b995d8950412bbf049bd1d8afeb8bddafc6aef748a +f2523b8313e13f90f966c134e39d52e10b63e30aadca42bbac5962e4e3f71337 +bc2fd40679beb44e111250352f04cb0404158bad9f74416c94003bd12c88d9e9 +5cac3a3eb575733eb44a3c32946dacdb3405f5b4a2513fdf9e6bb2e6e21c5385 +6c527ccc120eaf95d400847dfc9e6a40806330442e1895b53a6188e57c65b466 +da203785fc322efd64f2e6f66f996bf7ca035bb2117648a8857f1b10469aee10 +dd22d785de27f01f1d725b56b380917004a06afc0046335f97a2ff20ea44f794 +c1dfd6b107549e39247a5cb3f9c37af849e9c5f06214a570113d91ad4e14d9cb +aadf8ef93a933795c0cbfb7204dc605b4b3b95b9fed0372d8df634f7293298a3 +6aa4abd1f212ecd5d4ac49d467567385f80e163b9464f6554e48ff78d45aa402 +b5ee093a8f96da45504e41bfb1a72f579031efa801690a32f4e248a5f773027d +da3f3721d4fb481fd1b8e81054aa4a700e9964a87871e01f03fe80ac4215cdf2 +7a4944cf89a893638730631261114f8aab967fe29e280124fa8d51fc94b1c552 +db58e038097172d5f634ceafb877d7caca03436cf6bf40afe4dc99ce08d3605a +78e2c90ffe766fd3ac0e8b2ab247c3f689a55e350cbe80a9a452bf8666d5710a +6fbbc45e4690afc625bb7a8a29bc17aa582b6e200bd5123e26b2d445992a3a5f +7aa128c3f6230588c41c6c456655961b823e65d7471ad16f9aea07c2b3d39c45 +726f023ea4780719a3656ae18670daa3bc084e60fdf2ba1ff0204f285d72d9a8 +269430e406cd36741bb227a1aa28cedf9484689a78dd5495337bde66b5a790fe +4af761c0b505ff974e4c7f67348eb1887b5b9315a7b3455d3677bc77b61d48ec +f5ebdc73b25eeaf12a6c896a54b499ba5f2897b7da9465c34561b23e0e740eec +fc7adf944329e003f5266b94a425f3864b167a34d0b9d259fcd8d741c9dc0fb5 +bffb8c8cef470f923d7962cb5806c67763358a9f6ccf78220f28e45a84b0ff35 +c585c18b19c61b51cbe58007fb852e0a92ed6d704f15ff0f863528db72ea3dd4 +3ea0af466fa5b60ac4490aa5db18a649c442a60b4f824e914915376a127dbe30 +85a3c56ef4233579b756eb62e04fea0a55503f88bfdf011436d9d5088e027c26 +daa8165842a4ddd43fc3ab8dadbb4d53c5ba9a5b51f33d505fe3ed168109f1f3 +9ac5c3357e48cd9e3adccf2daaad831000e27307d6cb2aa6ecf5f92cff39b266 +73b1d3587e029313101a9075ab35de260f23f3d3bab5f7a6134fd07c076dcd99 +7bf2e7c40ff0c0fa1096312b791d638b0038138ed5c578e51309444691c1b182 +8b346fe0286e13e3907beda13044177c788b4948a4dd398aa9fc317665b250a1 +3570a783821db58159b825b14c2a639f62995a049eeeb8904226a8f8e14a7959 +731a74dc4b215d7ec095ebe86a3bf07080cdb0dce6d06fcc2e3a57bb04944f90 +8f395bd65117984c1596303c2781e3997bbfb6ab9f354ebcea7404785d8dfb04 +b19a3a6792807fe5debd6eeec1ba9ba9a37473d6c435bdefd5b2ea9c21d9ec79 +0043b5ad1b0a50f9a24594d00f8fd155681c33df8f0c0b3cd5a4fc275da65dfc +6c65ed8713956bb94b6281a4f39c8ef72b932adf3f6ecfa697ff7d84f93e7a29 +8fab7b48172e32ba7b3135f4a2501961f4a1c50403fc38c715743b55095ecc1a +38f11f1475521fa00f950776279e8a377fb4ca4870c8daa4fc67efe4db8e37c0 +d56ad93cd334ebe18dd6d92a3ea48b29e7e76eec5e8aa0db20ad690869053422 +8567c4b72be2093426677988f8ac9f7fcde0dac8bae175066a485f3b1d0c2129 +9e38a93996a0eb7a3357ee43bcdf8749bcfd7e7e0a23c7d9e118c4da7fff5661 +07454fc1ab28a875af7e512b2432256c401ea462d9aeb0a2f97270cf2aa8ec53 +1e5248ad52b1b74a376faaf7772e948f433cea2f0ed4dabec00855a394fedb83 +1daff1d977e9b816ebd27801505dcaa51f9ab531e6c1358b275d3a6ba38f4f4c +528f2dceea3a404a6362e3cfef9d904b573571a4e634d4852f3b922495af19c3 +c63c736d1e8a5b15cfc4da58f26f22be233b4579377227110f8fe5b0df57b495 +2c14d2011b6215b855c36d901f001e24261089f5edd39f7e5bbb2bf90c6f5c5e +7ba8928434f52689365ed48123414ead2e00f8860e60afb5f59d2715c4ee2b3b +2b10399ca1c3f70259c63762f64a5a1cb6b1995030a7d775a04cd77a95436e4b +c3b1f3d1959ded9f35fdd7fcde9b051245446dcac11fb3d0228ce4c012a2f201 +81ec3dd2aa1bd66ec02c93e4784268f754c9f0eba42d27b755bc58ad00e09e04 +e05fd21ed0c160353d2f5467b5903b4e1d1b8666acce06ada99c063c684d8738 +3d338c579595d1e2ab301c4236183cf2c3be0320ee83cde4ea050160b58787f2 +bad8154825c9b29cc14682e15db5f53aba109799c10f25fa2e54560fdafe6c91 +c246ae56edebe0aa30e152b61fa64e517f6cc41ac7b3c25ecada33e3f6d6ee5f +562542e0e66d9c07aa9889505d51452cc2ee73e3683e3fabe26f003b87d9fbdc +a376e85ad9547c23e463fa073429d32ca0e58326385a89106d5b72cde3c00c11 +c5f40d1e8b61e6cb1cc6416e28afa6caa469682ec8365081a21d77a8b1df7167 +6344226bb9a7533c0fdfe153878a3af3088e520b94933d0099c2ff89974bf795 +d871b9e5d40cd7aac72a99f351d824f86d33cc89bd70dd41f1a866657bac3a58 +a4eedf997eb49f8d967e148f381e753d5e67080d2843d44a3585e078615bea47 +6c882773d995f4154fdb773a7d9e29fe46e464e602cd206063c96fc51c30ffed +cecdfa28a951dd5211acd684ed3efd9feaa5aa98b091aece8681999d7c8ce708 +1c64f09e18e64198b841d7824e03de11101493975ecb1b7d556714725a14bdb4 +5d9237ecf693202198964c1554a04ab3485bbf9ff863441da3511d8fe6363e32 +a38a11f4dc6a1ee18bfa3a1c2c93a90675b0c21959054b17b1af4d533c87ac69 +08d0c344fe817d6817a74fdb46f35d3b48b9128784f43a68d809425c6570c600 +9a76199111e88a1c9802de558332000dbb9d1211929d509af5915b7ae8ea1c3d +d2598f5007de8e7383f7453fc6a9c0b91c80e9b1742bf6418dca69450785fb73 +12dd228889cfbc3f6711a26022b29f9295ee1ca8459305fbf2b93cb3fff5b6e7 +2b5c1d2c4d453f0b9a53b6f361136b1048b30e7c90e0de8edda423e55ccb2e2e +ee7b502af2baf30a92af542869b8f26ee28509dc01492095e0c27ccaa30e0db6 +3f02f11dc0ce8a94b8a8a7ef735e4fab04830ef077a8d788b224c184339274fd +5f7b547b77f81bad985c73b05a79d3c8661a9c2b71c7313d8b9cb50ae03aee95 +2dbf1afc9ddfc00d59e6f99021dffbb66acddaedf48df5462fc528dfdafa5e5b +a039d6bb9bdd1a78e47684a3c53ca307abd566093c2a4f6b9f0be52d4f1f2758 +ec48370eab4e1e6ab393a23358bae52fed3b270124639dd0a56ca6afce77494b +34f46433cac90eb63e7e0d25de6c8a0670b14e83d08a531cf2148002f9a6df19 +7f87c989b831c509df23057b3ec569eb5f5f530edd047a53b5b59f483703bdcf +b578fdc44ca7487e3d39479ca4760457e7018af01116b29bbdf7c3e0f5c07a8f +7f502c15059d9635b7ce630194962e4183c3838d9401260a743d8ebae1665ce8 +73bcfe5d090a8984e98030fe6b21dbcb49398b6905ec04ed310e37cd069a85d3 +7cd9e3a02dd8e036b2a79192ec036cf7e10653e08928cb8bf4911122d27e195f +48d3dfaa34122ef2df8e023c9ea1f246af2879f5df632719bf7a91f266d823aa +caefce067bf74ee0d625cf128c3930ab83521380e0ceb5daa2384da4ab23c34d +0db8a4acce1a33b6deea3581efe521279147ac1b36e4f6b2c08df2b2dbab051d +264a250a06ed06aa906c2682ad2ecdccbfd880941bd824d021f086560bfbb359 +e2519a2708a4976f42913465e18872a93cda809a85730a4930ef1e3e733292c8 +06c80c8865645c6a69b128b1333c3ac8c616d3e3a0163aba54c7a51a063fbce1 +4018cabe1b1ebdafaefc27d2b22afc96449cd515cced671baa88d51c5c778bfe +00208127f1fc35db9c6afe4fc91dd0bb1277181508d7b9868a055025c65394e9 +ab7a95494118d20fbdd7ce0b5f11492df5e8c54c1ce1ecd2e7279e07fe6a62d5 +63d7ffd38f04ba75057cf190319634f57aa246f03f5f904ff952d7b1006d43bc +ce88d89ade52e861aefad538b644942b6b97e778000de2f2ac2b2280d85a823a +176d8387ca420a441980d3e866604325917f78572ec9ba14a0944e37480ad3ff +9c10590c0705840d09c8bb076a5aae81b5e315ca901e262b773143a554360fda +3dc799fd07482666f47c17d8a5bad6efa53f20707869c5fd40d940a885310cd6 +d5ca9c351731fa69fdf0bfb148e17ac26ff43bfbb38c101867ed95d789ed2b0f +61820249b398fac0c5eee32032984302eb1804b82bad515d721213732ad43b95 +d4a02e17b22159ca29e300042804b75807782b9bda49255cccf4e35c461ff59b +65e36f6c6345dbb2e8c2f5445031999c2d8f0444cf4198ac17db48199c3b3fec +02a130d230aba456406e1070178bdaafc422343ed9edbf471c965d2b891586db +a34bb2d66f98f716e605799f3800c68000941a52d691640583cce11b94cb5599 +29fd0d5e8a9307831fe15fcd232eb361721d0da9e7ce111ff1ebc256a407372a +253180e51f1800ffb0313c2c3f3c4fcddd59f824dcd0eaa1e59837487288b558 +7f8e6d27954208fb815ed1d54a36476a95c660751a2ce7d475c72ff1784c363f +a641595eb92e65d9e7bfe18eeffeddfe82d9f6f0cee37e6a9e60b44939263272 +4816df40ed24551f0d07d813aba49a80bd3560188e5d0170385fd15c34b45465 +3d5d59bf7624ab116452ac28dc9217b11c75a08d68e55b10e9567a9d3d8d5da8 +89116318aff25efab611da69e132ba2ff888d68c84c056544c0fe9137faa8344 +4008487c34ff2c2376558ce20108f76582965fb06c2129e607a0e60889d97fac +2c71a026299b071ea7f9995a542b7e31efede8a4d341210a37f7b4bb96aa7c31 +c873cc0c3edff7b23d8a22e7e601ffbbab0f671b02ba487cf6b588ebecd26f9b +b7e8de0cbda870662bcca90716c0ff768a9c7c69c1dcb4086f1e881c6dd5b3f5 +0ac517ca096f28b1c7ac9195f99e44d444017a3bd54a68f4588f0a7562553053 +8bfaf7788a7243c30446213bc987e3383913f24b36b33e4b082e507cae63358c +9675599f6d746305a417fe8848f37bf85f4535e28ddbc5868dd6dbd3148cdc1f +2c2d224f00c3af4c1ddbfd88bf79eec76e45ef546cae548825a0bca6bf93b0b1 +373af60a7b24a75079d6645d0908a9f55ed0fe7397100a730a6f4e55678714bd +90c887e46a2c7703b13b1dda74a819b97abfe6275a24e73901540168737a8b32 +ca1902b7577b8761b3c4a6b60dfad490e35d71c5f35d8ef382fe66433336951d +e4ee981f980168853438755f135c333b8723d5778e2e3067dc73b7fd99aafbe1 +d5a2d1cf443905fb45730ce8fff14674abded9f94b45756a646b4cb1f789c7e8 +0748f3641a22c01b10adbdc77760c0e2a0b9055c4f9107d935f5c2fb2fdd2845 +6d6d2d2096e4baf14bcc8d716adf053bfe40845f02c0d18fccc453f3f8e45458 +69f802f506ca21d0fab24d7f3d6d6c219637a2dcbc58614c1456a9c6b0b0f57d +09cce675fff4f626b1b68c0a63fb9a16145d58176cf27ff5d3513dbec6014f3a +2b5de7ce69c8ac2fc184bad23950b28cf0414801764967ff97022cd4865d994e +585ff2c992d480de31f549f26a18e4721133f3d88316976bdae41431d44ec8d7 +4eacb29aeb132ff49e3c646ef025eb541dcc54f38b8aeb562887ed6cdd07ffa6 +cf3b2f89e4b0fbb5226702068b8043b6e2f284e4350c97a7498e6440bc3c8d2d +27d8aa1eac980e960613180ae4224624b2c6f92ed4666e391ae5e159c0ce207a +7433e462cd92aeb67eb89fdcd20e46f17f3d15ee679c064176a2db0ad5c38eed +7595cf6ab9750fca76e8e5ea2443b9d13da375ca2a2dc87fbd3d81ed58e366ef +94952cbd918134ea08f90516854207a2fd92799c410ed1fb6a9c36877d0b777e +ef59b03f19bc6b8fda91ab8ae21c89d117825a1595466da10f20b86d6d223cdb +6976312c7fb7bffb58feadfcd019bacedce96ec239b5a799005e94bdefb9ec40 +e717a597326b5330f38fbf708d002c9eb8d8ea0834241a35e3a07a58a030e678 +5812bb5de1cb511426cf49ff39647db65d8a7f2f87ca5e903eb1478984abcc17 +c7ee0b1f7d1e9e3b81c663abcce77a90f1cff1b01f116d2995e65cba0b3f1a3e +80079ece2fc25e0f5cf24507c99e5b6e87a417cdf29a1a8c58aa747afa962c25 +14671fbe467e22931a723a236aedff5676acde6ee71dc9eec11301af96927274 +a732813a49a473edb7e9886b6c45605681a563f32745d60cb4a26a7064406756 +c9add724e9b400097377258e81cfe085b1abdb3a00354353b50c9bd11a6e655a +d264a203708f739a46e4322a1a8204e32ae385d4f7694d6ad63f975986ffd869 +355b7ea9c0feef8f6d7bcce3128a0e45853de0a5f442bb805166c7906c9f1023 +df70bca683907a0bbc11249670f81c522441aa6fc4e7889a38d15ead8cad4ccf +e95ff5438d0edc450e6399f0228ea318dc2979e7e5a36eb76f9d81061ec8c615 +217d9dc7a1d0924dd953ad2b741e48357953d43186da75f340c58b7d2a6c7eaa +3038fa4b66b0ccea51af9610e5558d82bf79a301d73d57b6feaef32d6f19e801 +e37a3c1ea341bee088e322faf9ab5ab1934b70f894853984abd5f34c4d3fea05 +5ab4fc70179cc9f1379f98b3d1f529f3c2aa4ae63b8d2bfd46afdbcda8ea11be +f32c93eb4d435fc37486a1cbaadc3c98de581ebad18f35175d7b3e67c9194d5b +bb3cd1918e86daacb86055a548fab07ce7c933bd984eb713405d2b3f48124432 +a88e10b97f7be3a270405594d3e06c17b47719e2678f0f069ff1abfe7d3672d7 +6a748a9e277ffdd25f5477d0c9d60d7e8da9e0ef30e5fd6c70d47d31637bc0cd +4d67f5ed2b103889a61fd11075aabce9f2517ec9b53d7db5b27790d9bb1e19c3 +d7c3a7e1b95516ee38062d4ea759151e4de0449e6aae79500c42b4efe4936d0d +000fb3391330c035d9d6b9e25671f9ac599a40c37b2439c06fdfd988abcbaf77 +0e42d324e8ca78613f35ea64aa88c3c43e51cebe8ed1067cad94ea0387783e03 +e76af474f739b9249d1e95eef85ab528e8cd2da99e33c7ef0ee9df694db43f3d +fe467e6fd1b5291ecbf6b1ac7a25c002dee8be0727ec5439715bfd8f854843ea +1d080677f64889d70165f1bad110a8baf3885629f8ddbc3d3b09c57dea28b4f6 +7a3c042ce64d636d0bdef920ab5ef9544f52ad533837867c4930fd4dd3213e18 +ae2ca622e0e218b1bd54bd60e01d4cddfc2e9b64c6c99e79ab2c3e52cbefa598 +434213d475b6292190b89be95b3c6660133e1b498bd7ff2fd14aab2aca0dffaf +62d9df30c19ca0e949007dcf8453e70e60a519674d305523d33bfc3119037236 +19cc4ab1707db2c4984c6d4fb4310932e9ede7808cfc7d343a7fda08068966d4 +7877d7de7c0f5ffbfaae5666be3bdb48de31c5ab6bcfa7d35816e5862bc4a13c +ecf2355935040fac37141f7bef7e58f7b025e187df3950edfd6cea20d0649071 +442b2916ebce5f4d3ce055efdabf1c2dc348ac0ae6777f679e2f62a0a3ee9124 +7fc855bfc6f0c337a74c44ea1f5dd32ce6183a4c80a6b967861f6101c28b72da +d6aa1128f196627e24179c18f384e27cf7f81f43138381d177f93f8082cc9d56 +1b3c99f1bea073a1a81f8bcea131e3587b397937c4029d486fe6842a709558f7 +43cd16c8f0a5e4fbb3e522663b82e2544a6fecefd3d8a2b222301fd4988c0136 +859e86087fad63292bc4187412731a966710ca9ccb86329560d64be31ca4b526 +82245c1a487046ad21dd9a270e3fae72fecdcf9608784f649a25474034ac744d +44e14e72d02ff17b2252aa5273de3ba3cd71a95070a9fed0dff80653b3d346c7 +56119529e5bcb6011d341e368827cddf22d4f99f1781829df808507e2b4ceb13 +211b08f55444e75a005639a20c33706f8985f3308c08f77e72dbfbe049ae8177 +c2da2e62eb58f0fbb369f5bab0fff49f9d4765f931fe66f8aa107d8116becdfb +466d282527bab6fa29721678837cb46d60148a7fd9cae63d6aa634d23ee21161 +ef9e834520f367903a65bef7996ab77d37ba97aeb2a7a8c3502aac988e7a0430 +9d67a06db4a90714fd1a933402df0830026920bf1f71cb0379bda8714415c9bc +e7795fa4ebc37e819b3d8ee65375bfdd6b36bda41b7791864389e9b589919ee6 +2872bac2e221b28150d3024a984033899e5372ab474b9b4494f7bb4331b6213e +7953565f35d2ea6da212956dab01571cbeeef86293c58a259860e294f69730e6 +f141680cf75d40e829f9679e98341fd1e0817cb8e40cd6c4fa691ac691fb59df +b78e87add951eac41ad1b4f4fa45d2e346e0fa73157a7d2b2df89ea56a80e885 +9e0d0331d216db4f1b95d662bad40e472f21bbe05576ce4a2d27af01880f438a +30c17bc65fb460ac1b3e01aa43aa3677ba05a437fcca3ce4c2864d99c701d79e +3a199dbc7e2f00be8d4347f96b61ba0f88e90b49d412d0ed162e82715ea04c27 +af3feb0a7b3e4dd17c875a51e9bbed3c9e10eaabeec0f029d94fa90d60605b52 +2dcff539fbc323e7f0e1cbfc1a192a44345efc070bd5d5939d9f4383897704f0 +e785126abd9f582f1afe88a727784afdac3dca49892c6beb52cb1adee18034e8 +e88a441890175575951fd87594b63751e69165496d566bd23c8db4b9239bbaa9 +ef5058f5b51c74cf70632f88f1a05e1b40078c183ea8433427f63a5f68a1b81c +bd46625b8ba2cf713c001cca4c74a186f93aaa3869a517dd64f1e81c71823239 +1934faea604cf4d9ddf974fb09c5786bde05978bb25209b5c7648602dd62c32c +61ec4b5ce1177185354dd5cdf15540121b6d82457ff3111db1aab1889fb0e3c8 +38cbc7a671ba16a4bc567d9cdd427205e8f4de7edc64c00bb6080071130b43d3 +6e7919a5b7c29c68ac505ff107d1e2ab66a3417612ba2f461548f1e72c702a19 +7a6311dae649e46768d85d759281429b97a35379b84c763d35cfd434a4e3bbb8 +4c6e5ee8dff3a7449bec14c785bce1d4c617217ee6315fda000f0c54d1054e80 +c8f9f452daaa465f633ffc3eeda9c76e7a77024eaf39bd5bc9562fa44f3da9ae +7e665a33bd22aae6dbc1d9efab63741e30775eeffb819ff933342c8e6b978f8a +2aa20c2f2810072c4f2437e7cc13861002ab6d5ee84a6f80549683a34da3cec9 +e3471d112332ea260153836fa24e22eec0cdb0a5b3b0773cfd237daa67c55aa4 +cbf1cc30f43183a93bf7d7068ead32ac8064bb1f0a8bb61cf5472bcab360cf71 +b61c3443eae4f1ec7fc0d883559f8a2ff2522dcd7dad5f395e9ab2454cca6dad +07bb58bdeb1e54f75816dabea8d170974909b2fad53f9a69d97eb11ff20c6aef +eb6d76e9fa93c317115602db90359be638da383d9e01f6bdacb5ac5bd7c77d42 +d80646ace9f2384774610f63f97d70c4e81a2871be0a5b028c88afd82a3b6376 +5d5064a6786a829a6e6320120395b1541bfd6e3ec182d50982d7bec4140f146a +06890a79b85a6f20f9bf616f5f56e02752c5d177a48aa2f8ecb67e42e2314850 +d2109c0965a55d1e0f470371443991f9b8859ac70bd6f049dbf57ccc8e2e3c67 +eb8d1b4f36c660746008460ebc0f7284c802925206b968477a503dfa6879794e +7ed82fcc58443fa1d95fd561bc9d3a2ccb2bfa19916d8a88e6f7eff0ce0a7d4d +90c77f63bc75f3368f7a97dea9d9392e3f499ae4b8e53602636cd53ebdb42213 +c2668a3c618a76f6f5a96fc33c0e41ef620a63e3c52512c66b59f810c6b85923 +d81ff8618f42ee19b10d4d088bd6b784e4f9bd6bffe083161181b2f79b374fd4 +b846650d4b95b6c3e58449d8f0a201aec72d87588c54fbb3112045040109a3d2 +d98c778ed3fe07f54010773b628baf29ad3b91072fbdef7cde0b969d0b695bf2 +5d386c6b8647bfd55c169374c57d5bd8fb29af5c5a6718d7cee318a06ad35d96 +fbf879929e28bd43b583aff2769688e087b00ea95b28629a71c6ea847f988357 +da9e23422fe2ebc4c33f183679233e0d1d8150ec58ca6ca0bda2a529e6f6d146 +92010b1eda6360aac940ed23410455209383b68c3a1fd68a0ef92d16cd4deda9 +9dbedb1ce18a79817fb3d043f919f1b98c62ecc70dc27886b258428ae2d1075e +ef8c1225f96be5ee3c1b4e127d26bc2abc6d457333a0d5cce99dff00f3f41e0b +a9fd7bac9e96691cd316abe913a6edf95c6c5d37086cf3cb960b82684ce473ed +574fd8c6ca059bd679441c22e6c39376d3a33c8011361c834bbd7b87c345a9f0 +c6cc1328b5af926f763bebc13be92238da171124de119a097d65e5d623cbf157 +a4e93e250a6bc34bc54feb2889da3f5993eff0bf38ef6e440d0bdb405746aa70 +4e5de570b0347d52b25ae9e0ffd758b8d6da1a57e47289a26d0ed30e31474273 +c2315c74a39e6b26f558dec140d384cd3bbd7246bf46a0f7becce45fe0c343ce +78016204e814dccc58061d48ffc808423452985b12d28c94eaba89eda793f7b2 +8d9fde11f30434bdf73c48484a814ebe541f4e6eb817de43146ae4e04fa7129a +ec0e4b92ae22a1d2344375f68314d839aade59c4ac1d556538fd7a9f7ee9a139 +f3620952c6c45f7181a6448a807a1bf62cb59f440199297cbc8a360d0168c153 +7c6b3ba56dd0f7f104271138846a6f305f2c8a7536512c54a1c46232606a6649 +81a8083d59a4b5e8ca2cd0b70dd0b44bef1c2ae9ebcbaeecbc7c4bfb2ce309f7 +830ba06f3c8e79fddf737451a67d8c4425c51e11f832d99198c16dee864b4c9a +e48863f5a3cd0e6f3c5b31a6bff527bce260aefbc40b1d8065d2f88f97dd9ff4 +8b21d069ae8cebaa511f0d00c1da76207821859bb191d5f9261adff3e6417788 +5b493db49420f472496a8207d3f2d64fa3304de0e78d6259a626d8fdf81c51d0 +f81ef8c619507f0544ebd3aa8d1f200a5ce240a1171441438d6bbb19c0850bdf +4a0147baf4787513752e4e052a09d6b94bec96107e64f6b2692bedf2a38863e1 +15ac2564c0eb10fb923ef3d505f750bfb6407856406cc92e9b2a3a810fb49ef8 +e8f445c2e32b30d352fba6fe345c8af241307e76c13ed376554b857b23f2b10e +9f4f1d6b25ee850d744332fb73349790426bc3adf811998f84f4721247ed9dc2 +cb33d343ed9fcbdd001d97708408a4885ef05908333546167859788124f50eaf +7f9cd5b7a9f4a77b2337f51569fe3fb45e41dc50394ec963851fef76ed67592c +bac68e378043d77137974cb61772228d63d46d92821662203dcc0dd1db375bd6 +95c9153c7226202ee545aa36b0bfba49bba59e918e3bcad377cb461d52442b9c +d159764090efaa0a887a12b0c9884d4eb0cbae8b2b5fe1d68b8b13abcde73223 +234063907a8012134dc42337f131ce012a98e582fcc50c9507c1f87b83d62dfc +bb951dd48c3fb078aaebfa25ae1908f87d97915d86bea53e23c2c4fd426210cb +a517ee3681183d327a5ab42c02977c3221213e76ed5f986ad6bcc14f50651367 +f142a4dc6379213974fb90a7be +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F392_0 /ERVBFT+NimbusMonL-Bold 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +%%BeginResource: font BZXIEB+CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /BZXIEB+CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 32 /arrowleft put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +currentdict end +currentfile eexec +d9d66f633b846a97b686a97e45a3d0aa052f09f9c8ade9d907c058b87e9b6964 +7d53359e51216774a4eaa1e2b58ec3176bd1184a633b951372b4198d4e8c5ef4 +a213acb58aa0a658908035bf2ed8531779838a960dfe2b27ea49c37156989c85 +e21b3abf72e39a89232cd9f4237fc80c9e64e8425aa3bef7ded60b122a52922a +221a37d9a807dd01161779dde7d31ff2b87f97c73d63eecdda4c49501773468a +27d1663e0b62f461f6e40a5d6676d1d12b51e641c1d4e8e2771864fc104f8cbf +5b78ec1d88228725f1c453a678f58a7e1b7bd7ca700717d288eb8da1f57c4f09 +0abf1d42c5ddd0c384c7e22f8f8047be1d4c1cc8e33368fb1ac82b4e96146730 +de3302b2e6b819cb6ae455b1af3187ffe8071aa57ef8a6616b9cb7941d44ec7a +71a7bb3df755178d7d2e4bb69859efa4bbc30bd6bb1531133fd4d9438ff99f09 +4ecc068a324d75b5f696b8688eeb2f17e5ed34ccd6d047a4e3806d000c199d7c +515db70a8d4f6146fe068dc1e5de8bc5703711da090312ba3fc00a08c453c609 +c627a8bd98d9e826f964721e92bbdc978e88eea0a9c14802ebcc41f810428fa8 +b9972032a01769a7c72d1a65276f414deedaf1d22be23f4705bf5ef31b6a3b69 +0c896320f09e9875b50220a5bdbbd57c041b5ea97f421685a7256b0d9755edbe +d05190dabf1c3dbf558258163c8231d89167a816bba55fb1f14ad04320ae381d +f783a9eacee8ae5c1838775fe2380bdd1f3afcccc96d2a2dfc999b52a6689c51 +af82b8d63205b339103134dac7e3c45e6693940276041bb07ebdb9b729e8ef0d +ee8bf450fa42551be65217fea902e28decc09580b504f0f52f1e8fc5ce7ac28d +c4e47f908fdaeba23827a97a0aa741aa7708f7bbfec6fa69cc4f7c3bd4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F564_0 /BZXIEB+CMSY10 1 1 +[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /arrowleft/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +%%BeginResource: font WWWUTU+NimbusRomNo9L-ReguItal +%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (Nimbus Roman No9 L Regular Italic) readonly def +/FamilyName (Nimbus Roman No9 L) readonly def +/Weight (Regular) readonly def +/ItalicAngle -15.5 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /WWWUTU+NimbusRomNo9L-ReguItal def +/PaintType 0 def +/WMode 0 def +/FontBBox {-169 -270 1010 924} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae +6fbf7f9888e039ab60fcaf852eb4ce3afeb979d5ea70fde44a2ae5c8c0166c27 +bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf +045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 +0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 +1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e134d4cb5abced39ac635 +da001e9934c198a7f9b9ed0028a85e9ae00421dfd8eaa3bb3b4b4ce45d209303 +237bd51809fe4d880900b1eeb236aca87b9ff6ebe6b994a60af5d67ccc42bd56 +77295c346eb4c62bdc1ef22ee07daad928dfb73455f091f32408ed6430b97417 +683af27a03718a156e3f6e7b6e4f2e8177503cd82ddbf4557a3ccff4c858ae7a +f7efed6cc521a28342436b953e4650b5792be85ea2f989eb6d986905a61fa38b +96e1bbc830b74469150fb0b598a794fd80d10870084a877273a9502c3456e5ef +74350e6e3be5863e8ba185eb59fb87b36566af71200b6ed389d1287d4e925e33 +b2383ed05d87d48586e698fbc5d562ed9d8a09ec3eaa1b1f300224af20c23f26 +a2eadc74562571da84b3914d1d80b127c6ff4706c7046bbb372a0013e0ab94f0 +c27946583871d272bf4f20fa84e89d745de7bba885cc09ba72e0f530ed4ef7d1 +864b3c67007ed98800284235372f0a70c912e21e851afbf812165b8df912cd1a +013e271f0b347967876c68ae4c4107ef8ad1f170916210034c66394a9d971b68 +fbfc1131e37fc178eb97c1b2a0f573add9d7c0bf944e6529734df8a7ef54485b +a3375cc30e9e328943733cbd352bc15b06c85bfb4a96994291c72a0eae84fb01 +0f1b24d0125fb8c16d60561df8bb7aa7ddfe9549afb70c1e89424214609fde41 +9a142892e30f02754fd234ceb3c59a2a04c06bab7ae40e8fdec50559b8347684 +391c750987802d5452c47c1e0b5f222de9a0eeafee19d796ff375a1e1ef0aeed +1bcac4f485fcaee18aec585d1a9d80f41871dda45fef1eae82c5893118987beb +4d9e345c27c7419fe65e4853b40537d822e34ff1e0bd2819d21ef607981259e8 +9f1040a2d708d7463858aa5381759ac49df4dddeb209a278fe60bd2508aca0f4 +6a249a05b652e4c7bf1b676943cdc4602910fa3ea7636985a10f637832a5abab +9c7a580d605929d6d7154506217252a755beb8462d30a798ffa9b26e500eab24 +7e9fd612c776ae60423995dc1852686cb041e66357a9acd4b6a4e9846b1dc803 +23dab6b7765205d82b50cc6394e725c19df00f7db427341d514047e4bc594efb +a262eb2c414e43d8acc9cb195d12f3b2a9748f38edb3ac3447d27d20d1e62bbe +22f6378e508f0cd6f17ef1c500407f6d442e92ef2e00b8de78660d87fd1c7209 +ea67cdb37076e1eaaed128814a948e27e1f2fa81fe54be6c57ef8c2b2e460f08 +6ff1bb529c9100b1d878dc9a077d21805e89d8b0fbc2a074e4b55a869c96fca7 +8117347b9cfa480ff4a37b34b040a99fba99942bd86ce4b46ff5c69babca7a3a +f5018da05556bff71ecc844b2b718598f0825cda3d19d714fb66472621113ad7 +bb240de7dfbd1f17ffd8f2ef4b85a8eb6e1bfdf26c7f98168197c02c4aa535c2 +0f9ef9b7cb7f1d174b2e94953f541c3b84d43366e0e00a028b98f990b4d01515 +3ccc2e1853473bb9b25857e4b8f9d6695ef332bd3baa9ee551a4b142defb7f03 +97cd075ef9cd41082ccbf63e849c48835e105923e725d41d2b5ee0c3f03a603a +161713216af97bd21aa87e3a80d75383603152011530b8abd2294d041e90a040 +f61baf86be97f8daa8326eb1a2b4511425785f35f75835683515af6cd0e73194 +2b25d5fa8c7e12ccde33aa193d61a35eba7f7e101843e35dfdf3e07a1442b0eb +f2a9084634736a21128843df49c84b1061d0826777a754076c4c3d0a68b32dba +ed4b5c0746ddecdd79fbcc7a4425eddaa7f49257148f05ff52ff6bac71cb65ca +8ad5869cc9fd7c4c194ae8d5d20a730a035234d8f9a6363e7a49fc22bbd34d08 +eb7fd43a678be52b95eccf029a6b18a512d30ceb0b6adf80ff1232dfda1a5752 +b5222edd9012b45cf0df0644b2e713afef21255a08232efbd5d5f7506bfd050a +f0daf55b5db595d29361f8253c26c37e09b4f87056edd8c90e0df4fc74072541 +8ad8ccea562e4ce72acc8e9f39284fca274c572ffec24ba30ef9db07054965bd +2205d717c9b3b0723061cd74ec688b915ab6689904d5762629c891f2fc0cdfb1 +8d8a4d2260dc93d7ac1107b197d7e8418bbacfc660d888697296b7cc6581024c +e583b0114ffe3b3a960d601ff23c0f633e2b85300042f717c4718c0547fd9b19 +e74d0e18f6908e4528065888c136dc8767b74025ef5faf470a272f57f548d738 +c5d2ff6def4366c1c08e0b09855e04ec3bbd8cb6b770f638ac7d852b7b2250f6 +cfbb5669c9112fbf73546a9c1e968a1e1a06128efee6422e41df1519c7346635 +31fea419bba8067c6d0e964143a0906762197b8de95502ae9bb54ced17de5ce8 +9d628716bf1e306aad09bd7f8cb2b7dae5bfa9ef53e716d5aa2ca014eae837c6 +c0f2d5f535ae93682e855b1bdd6ce955627284a4712f67c1d6de9f80d4dda43a +9fe34fe4fab544459a1dfa0d1383c50bb3e6c3df078acb88db37ecb38aaabbb3 +cc59d3fbe6a84f1f9521b6e05d0a0b2e0fceae8eeea4f41976945501f32bb383 +455467d21777796688e57ae9b7b392d167b63bfdc1102565649b53694f1eb3e8 +5ec2f094ab06d427b5e1e7412b3369336c766a7fc778190dd5aeebef9b6a034e +133314cb512667f1a4eef90a1251ca9e8aaf7966ec96004c09c4dfacbb0d4c45 +60d8df4183d3598fb9584a4433c9131f8602474f27e4916b43de80ed1d02f6e4 +d208b014c0a44d94ef709930eca646b2f07d8358d48d0a768b6f13492e3cb877 +fe38c58a7f5468af52ffc11b8c02bd91484cdc022abe678a7f2e298a7fad967a +2ea7dc427e6ac154766ca4ae15fd414a76064823f3145724184e30ec4f1494c8 +78f7f63edea60daf2448de8a79801ecfd86a06ef122451dd2380bb1a4256a7ea +806d131e66d5a6e3079f7c2d7c143e2879f5316ffebb1bfa166a088b8fa9cb7f +4a5f0875a8ff5d378e9e8205c6155ea85756475ca5149eb72643b4ae1f907c0c +fc8f63150cdc6209b1951af23ff68188360939501770eac39ed55dadc4dfb1c5 +b2ef39c93d0326a804f62e8f187a224444098835ff670ad55b49f3cd0aba2901 +293ae04427916ee14c81f4044a05d9c8ad14ad4b5567e8e0147780a0bd294c5a +10a50a5cc7656f901588419108d2570e804a5e590004008776c8cf20b56d5ef1 +fa32538c480bcc1955321f954008871ba180177dea952fefec536f6522582647 +bc205dd139a18d2a41956baa4b002169cf042ab2ebf91ff203dc2e2559171910 +2119e94673a275d73f3909d0834b170e2b62beedcca27afb44a35ac51dcb5719 +82706f101b216b4af3523974378a05c327702b132335ff288adf62578f30cdcc +cf826898361bd49238f368ae2182fbb631e375e903ed9efb911a047119b40830 +a39909494e86aee21694223df1a57ac8e5b4f0465d0868939ac77ccb448d3f58 +36631cebdc06bf2865c58437568cd734efbfa870214853232ccb48cc57c8c32e +97cdeb89cf5e0c032e81de377b368f7d57187f0828675a52382d41de6cd9fb52 +2a1ccfde3192c650fcd7d1f86db03c401e6eebd0d40bf23c10e021ed66bc5b7c +ae57d0905bd24925c8573f069139883bbde13df3ae05bec1771eddb9b003555f +9d69657ac718c065a32ef7ca8a1ff5880fc66196e8123050a47ebe4dd5c1a4a7 +40ce1cf340bf08021fceef8172d9cdeb063f4e4c2205ae4503c71aec1836f9bf +96ccd0a712e33407446ceab96221d7b3f4342fc74aafa802481acecee7243807 +390b2d12c844193560738e576d27b0f5a90b25e1b5a27de8a2c74b3303526191 +5ee0251065475f26bf0bbca5549f13e1357797a5728b46ba9570c095d938112c +b3ba212c26cd6bb569ea276e1d8397569f8d4c78528490187a172d2e30dd0228 +d69fdaa25fbdb477c88d52f0ba137280d68656036c17b8852b03c21621d0b21c +6c016f18cacfa9a998e972f40eda07278da54fe5119babf0145d6824f051cd63 +91bc93472f780f00e261dc74d6673da37d8d9291e25af279829f8d47bb524c19 +8b598ce1c576ac8542b5ead99b039ac2996a6d791a22a5d5bb0fa3eb65d1fa01 +401d5c7d44a9cfe082e9314ada6f4ac8ecea5be8e5a1cb6a1dba1c615e69ec9b +0f231b64ac31c545859f0195bb9b403121df7be1ea1488b413825d8e1d7afbfc +e5a8e1e52d9c3ea6de3ce75d013cb7396e825bac3a50d0bffd2d30c6f1c5dc0d +83c1b68dd8b6042382285812093db4c5d7f6eaa8a4acbeba794f63610456a641 +42fdfd0c4c5f0c4486a6170b7701ca64cd1408f686fbd2afb56ba307722b2bba +c542123f766171b43aae5ac053094a04ac4faa3cbdadcec81ab5aaac58d3a7b7 +1dbedcfe63d062b11dbcacefea89c6f8916389d3f7d93da89ebd8c37414c7db6 +d6512a4e8c76145ac170faf136a023b3c31cbae9775e436d6cb2835b77b56458 +6905d558a3cfab0f1f3426557a66bf775292df056cfaaca8c087b4c0bcc2aae1 +fa49f346602384f743be6b1aa26134ba2872366c17f1dd356221838a40be3a4d +0b8502a964d360ea9bc58e4ffbf283c8294679197faf5d23aad1c89c3da84902 +c95619fa0ab76ca0c7ae725a1c5d9c40e84cc84eba8fc95361f3a738ddbcb593 +b3110db2f69ecf9da21d788d36a1bf986e2dd78c9e62f643e6677f80991f90a0 +8bd35484fc4aef3243bc3b460f57bf6f0a503b57f84723738e1b94c3029520c1 +f8d787f99305ef87fe64293b5fbf0a378306459c022f4127f2e2207ba818aac4 +1c860b70833b92cb7228ab2c8f68d03b6ecb67d4f83cb160c170298e1bff339f +306505ea4fe86929f115b3c55c7fbdb7f09eb38f7c8ca86c9c89d9b92dae37a9 +5839a181e6e55835da3e81c8846980ec5c16646a31bbffe54a8505e005c9200c +cb2b476083d7e55e63648146e8e615d349ed779b787232605beb38346e3578bf +d043797edc00f6df91c9a02958ea01f55f00d576c8a8d236e81b59eaf96bdfe3 +4de4125a3893acea97aa8d6373b736d4cc0166095bbb75b7341f06d8e3fb732a +5539fa8a27abc1d82f1a86a76870450fdebbe889dd048cbf2f184dcca5377649 +9ca0053aa9a88ab4d6f279f8a3ba704ed057dc2a361d07e5af6c9c8ce4b08c05 +d06635afce1cd7fb1288df9ca1f9a556d1a120691297d8134214da14db45cdbf +5545abb75134d45257b1e373eaf23fb600370cf8e7de02e7211639b11f8fa0d5 +6627c5718f554ca3351ac95c04dbe894e20692065af2c7a9e239449df4a65917 +2e0fa2bd3ebffbffd9093569851a31db46c8c30c1fb8339a7f742a2c89212831 +15459844298972b8b06e2c699d6acaaf331a023047e5b2041fc39d830b0851a5 +8ef1e329b688034f9c91927cbaae2ec2c84f8502127055ade448d6dd7eea3aae +392dce03347141b3b85f3018b3396b9fb1e4a59c50d9e8b82610088575eec663 +5686e7234e72e4690ce386fcf9d16b54c9c692e9324427dee7e096b6d4c45501 +da2d0eda66a1f29e90c00fd2c62ae43a97f611794c4704d179ce0bd63ffc4f50 +ab3ca7086bf942283fb0d175888a13e5278aaaa25a26e3df4fbf13e64519ad94 +44af171207f3f89b369ccd6162c0ba1320d30d3a596d9f58976f94434c1fb773 +e70be87528a9bd5fb7e494e6cdba0a3cabab8dc2073ea7f5b956bf5d5ca1b258 +25a73e0824ce8d00f4c945c0afdc4b57f7c0162a14b30154b61ab030a73679af +d43e322a04fc7b3c814f3b2d07585eae6a5254b43bc836c6000bf23a56fbfbfe +8478f1cd00150ee39f0aad2c7ae3313b8d619b84ddd8cd3878a4b306950873da +9a592f520b7d7e0cf9b9c97d35139eef9c329763869e64d89a52fed016e1cd40 +4497359d9d4d6bb70222418282cd9ed7f12c16cc1aa6b3eea9c812b7c3910209 +2831b0f05e644f58e878c1eaa3d587c89b26db8b9952e0bead12c7db6aa5a042 +9e33012db0551fe6a589baa800905a7cb35d220efbb675a96444edd18ad89dbc +ebc4087162e977b4cc680a0e3490bfaf28a556c3bb9299935097e3e048679849 +a85ce906f55bdf564f3cca2b0a70b404d02520b77614e577231cb2310dde1ba5 +cea1ef926ad191c98a21ed76ebb8f407ea2ae2ff56014216abb118c0218590f5 +f3284f9a187a85b3f5091f05b21d747f6fe7384a27ae6a8ddb923df4f61900e9 +adb8be5d338613e1486d710e892b5b733061951d164ae233023a69e02457e90d +dfb6d8a53ea0a57f3c9e27614633ace3c6cf57dc8c81d0c079642c4a0745d281 +2bc6ac4587a56e65d6955e50f4380d94f9628c130102e2a3325d694865a0dd90 +01ab118f393fd86d01aedb5612fcb49e8b81fa6fadf7b69650fcef45a0a724d9 +ecf8ced5cf56913fb68a39c71350acd855433cc25b25ade198cda46bfccf1fac +f1c841a1e6058a73e26e580cb46384885c417799d92822689c2f58bc1e0a040a +9d7d3d73de3c18688d62581d54a0eadf9deffb3db34a9f052bce33d5fe8e8ae9 +78e4b0bdcc2a8ffdcaa5b4c0f4a0256d94364e70e1749dbc2b147d69ec539b47 +ef868ac4807f7ac1f01c93b3361942915581efc754453f221f4a70bb903ec310 +62cca7ac392f6f70b61f49822cfd65c668070babc1102322e4cf224902f0cc6e +26bb2c119c3c66434f4a85164c49ed51084a1f0795eb631f6d38123619cc5ced +c8c6908f380a4a3f7939d0b03187e448fa44333ed8d8c2504c3fce0235795d86 +f7a7bb423d1a7ca81b27b4f81c93ac95ba336a0d8e6bb90c96ae775ee34c07da +5cd019a73b7944424d242dd7d96ea0349307ed426fe0c7fb8b5cbe3d295a3069 +b975fafbe78109cab35ac2fa5154f66af9b9ea522cd4847408d1ce24cf7fc770 +4f222fedc962ff21d09aa2ae6cc1b14cfbcab5d0016607362d3c8f6347f7a54e +821327ddd475396b465b1bf5894703c6de1e9947e64867e68efb2620c7f46367 +c0c345f294b781943f0c96500688a08347b0272c60e5d6a7810a44c4e5654d09 +05931a57e1fe6ff7edd1e77a1e1c39070b49e4d72a62f06340f9a76d0553905b +35e5711434d25cc3b14557bbaf66a82a6ef543bbfd14c314ddee0ee99090482f +c1dd06eecf203ec9511a3ad6ccecdd1139ccf31dc72e407853d159c1622131df +f560bd84c30c58439b06aef79bf53ffaa90ab3727e59f164271a69c5bf36f0d8 +3f9c0099933b6bdfc2f613d4f3565dfbd0c85e8723491ead13697f8945f63a6a +612990613b54bb7a19c1d3a13c14f19694e3b1293293a51c64ebe436738eb61e +2ccef09ca77eeb35c7bf10db2a9b1eabbe4fb88ccefeae6359bf5e136ee974ea +a1a5c7152d54de8dfab89422943ad50e5884f330ad4078763ea071c6265e555d +a610d246133435db11c37e786302e3e8889ece1d9ec3670d82babfed7be2fb7e +fdb78e1b6e1c682b930f48bf0a28301b463a5ca77c368f7d57187f0828675a52 +382d41de6cd9fb522cf52d8792796fccac48d9528d6ba65cca775eea0d9e272c +084f8017bb4ff779b615a46518b256b2c43b27e28b988bf6b60d783d56905a5d +7794904c0cb95e2aa83512f47d2c393b778b7611053d31bbc4670c6ffe45ff25 +2b7064e4740e8895169607d57c89956b526a664b28a2a9f7c42d6a40c4a95aa6 +6be98967f52a855db02c498f141fd6afffc0a69b14bbd009a0c0f023d4d6706c +cc05401aa96d550b6ce0190281ba4cebf16acfa4fd94730cd977d6c120c124ba +ef8489e22a13c30552196e99046201ccff11cb3aff92a63e47a10a3a6433bfc0 +e77047453b71527f209c939d8516182ca5f0966ccbf971fede25e3fefd92cf8b +fd11ac59dff36c25aaa8c771a83d9cbb7dccb37f4f7572f11f702bc27ea9510b +a2d4baa94f5953beb927aaf2426421f0093c603bd63827e28f17d57cef476577 +c1f13eb8beeada42a1eb221cac3dccd5d84a6f74fa2b289c3cab6e2fc94dd92b +d96a015b218ca7facbe18f9c7a580610905847a649e4477773b87686f7f28b33 +24148f4213ccaac483b43be2a9763fdbbdbbd50a0f9d59fc31f5b7b2ac0f915a +89abd64d84faa62a4c3167fbbf651a6236ead6ad931c11435921cbdc4ed66f67 +fe83bc059fa0c625001ad5b3bf638293646d33076f3afafa8b8fd7307da5c53b +5845999c1624e9ed30cd48483403f9afdabbcbe80fa5025bea2cbc081e2b32c7 +42685421ce3d574a414b340075cb02e80d7427d4cc503ee02f5b33e509d76e0b +21b5d5a252757c4b7893dd9870f9371eca57ae78ac688ee28c31d597bc018496 +3fa54a8e160a77dc8b0627d7319885fb2ae0e2e2c9fbcde4b5a7acb04bf1e611 +b73b0dee3ac8f44c4ca15dbeca20c35a7a8805f3c22e6fba8e9b22722dd25ae3 +ba2dec2a0c9a13509f4c9fd3dba03ef6e49a632bf7de5ec45b64a1f4e3a36976 +1b7a9c7b95bd29b09b930b0d82f2c39f9bc3c24d99c58a664d4adedf7b74e13e +6d85e03e615a60a2aee9f790c6d0a2e6e82e6840e51b38c4579fb95337423fba +437d97ab42bafb1097b2e2952e86c88e94ba7020e83163b5d810de8f57625819 +d86d7ae834d7135e30f2e21dd061ff15f22de6c9243d2caaa5abf67abee3a6f5 +306273037adcd10e8f00818ee88ad2ea98d6b7f1ee7e3d1db49a57fa350664d6 +021078ee1ebfbdbe5aee9efab2acd9809ccfb180f8017a84ba6bfc1ba5940eca +3076c863f8d9df3e4afb32361acab13bacd3e465d094b64bece987be66fa501d +5deba893368ea3fdd3b3a4201d3bd68b3464ead10c6f0ddf513a630e0133fec8 +08630e4b3c8b0aad1bbeed508e7e03d41b3d060a92b1958407843e4cabd78d79 +ff72fc0e92f4903cfd05856f457dd15b1aab99c1d29804d2f3134c9817f45fd2 +efebb92545f056f4ca76ea74ad464cd041b7cbb8892f2dba833118b83e20c039 +99939ffc6cc50503bb871565797ec537e26eb622fd30303273748af2afd97e07 +a9c2a96f4ef8754dc3ea8f3348cb30d76bdaa84d2e933c94c99d13e74f19970f +5d2bd19712926e230dd02aeae6461edd83ac935ec2f420649f82d4160a072700 +10141602c3a6572740d8e97fd08e56b987062bb57237bbb3056a36e97e399a7a +cf9653743a9984ef36254d60772a0eedca800923461a3e4443a5ef469aefceec +aa1831e56b0d8ea6ccb76bb9dbb6ab7584ee268bdd0f5f0d57eddba9b97d74a2 +910f178f388a50fa32aad7b87b3235efcabd4b5009190d12e8c770f6e70dbe10 +e747e1984a1c41d701e6220b001fe25b9a677c996f8fd91bd40fa7e07f57e8bd +5d2381442b337924e56de4d18cdc352314caebf065f610b00b50302bae3ad612 +dad9059a3d7f3bd63827e28f17d57cef4a8cb8af1f080a993c3c74871e4b7bdb +2602d07587aed02aa783d80234b6eecc77d163847e63d3c9aa412d10acea7a5c +5ece5b893bb3031facee72701acd225d6b6a752cb2f84de3ceab2b97b606a0bf +c6874869a86e3a55a4e1d7abd94719f604ea68b1108ebb5bebc3ef465bdd2cdb +864ecfe0d6959d5114eaaf1612c970caa2c94729178e6af130a1df211a3795a9 +b5fb934e47f6c48155a19acce788036b4867f90d40c1e4ff7460399f1f08f98a +0aa3e0d8e354195a2563759dfe0183c8d67b449516ed8f5cf3288f7298d62092 +922f07027352bc7c9612cfca46f1cf2ed1417ab863c2615f2d26ee13d7a04a18 +8336ec9961e76af2f506e3db3d67a2a4fb2dbbb0ca34be6db9789a1cda607d9b +35f0eac47f488bbe74f8f04b49dc492ec8f096e6710ad59d248a0c98497541d8 +5f9134d5215b0a05fc29db1aa71e432a2c0b00106bf3124df0b72c144375a280 +9cc5ed8335b3e970eaad9178f43011b55d7f3e11d89be1058361893016254440 +353b88162a4e7913721092e05573497ed693f3120176dc08253d2356559041d8 +741a6b9c41f8eb695369633632ffc35a1e2e4ed6258f0a8eef0bf6bb028efed8 +a679be4bc197cc868255f748ca953312eef556d8fdae4e9706c3116e76140587 +db18492730a14e96c211fcd0aeb0d4324b1b4abd0150637c6c135fcca1823fde +20482dbbab536f87e1d3f0ac4b5154e33bfaade3ac4af8b8d2082658d35a251e +a0d718f702ed8d957555331c9593abbf64b2194dac9f098773ef4313cd8a48e7 +4d60513d6ee1c132e59ebf5dce2359b61efd16fb4cce810172abb3939e874792 +a862462c72895461ed4dd265abbf52c11c50e607fd3bebeff0397398f656066c +5f64fc4e67cf5f984fe818c9500cb10beadc1ac513c0c8e60701144b949ce67d +08cec1adeb70fb01f48abfea22412f4b07b710a8d774228ae156bfdd556c0f49 +bda072c0926a08150f77ee338b3b4303bd2186da21b89df804cd531c499ef953 +9b1ed325e5ef952af05cf67a9fe64b1af975c18348809161ad382debfde45495 +5b32472edf5098b6d1f8fc8807f81ee5be3659bd0f47542ee81e20cbaef168dd +4b991069cda2f850b1faa40e74fad79ed5f74a0fde1c060996a2280e9c9d21f5 +d23174d3ef4d9eb6e337d443cfccaeab8b0015e6427f9439c8473a1364faf782 +f58bd8bd775899092844ba570c427dff47b8cc4859fd9042ce78aa27ffea8b5a +c52be0d97cd01c7250a6eda489b5a17e23167239e0d7fd8f3429529ef02548e9 +b7bc1dcfc729600ff98d9f9b33ecdd10ff78baa313b7e35c51dfe8c6a17568fd +bfbd434860a8ef3821b336783fa328279c05b05aba37f8d26da43391c9cfbd71 +6b240148995a005448afbe45ef2c2853aa3c1cf3ba6434ec79e8dbacef443569 +8e6ef17bdf960e9a37f0b34f4aa39641492bcce95afe55d168e510f934288da7 +c61eb3e1a42f18abc608995cd8c9afcc591751bcd9759387d3924751b1a2c79a +0cf18b53d3ed8096e2c559dd001e8bf6824b3eedafedd8b89fa23f4aeed14435 +a7d05da7b0607edf2aab0816e866f6791e834bff5f5c6699edb97df199549d54 +3d039671a481d094352ec76d2f7e5119887ee3ad1117f749a85b3b6f37e3d25f +25397d1d019da9c5c6fbbfbaeb4fdf0a423f6394968f2eabc560f76e75b07b54 +a6d87328604fc86be37a1e8e5790eb845cca88bbc2e01eab28a6d6615229658b +7554a85064aacf698949e4f56f2bd61bd5af31bd6012ef0c1bb627cbeec71b52 +e99af95f699617a8462e14e144424a64e4c1cda80a13cf7b20929041b2df6686 +15c2f77a73f9cdbca33cd11188a9a608b240b27e7cfc5234fdad6db5d6565787 +d99f45709674690ee704de4ce6accc37343eaac02dd8ca368221d607c4ea24dc +05aaa5162120301a8fb4c3166ef0e813aab536200a8d54d3e0679cbad59cae0d +d9c251016336c63243b42f4a439af0f1b4d4cc3ee9c24dae5ec87c10b4b046eb +3877eae636101c3231319957690cf7cd562fb48e44abd46bfd8640de5348a01d +8389dbe26165729c3ea1023b354cc6b6928922cffb2df9ea60d853a74067b442 +a7d4938296e2ffdeee8b33dae2ecf5be2451fbe3829f9c1d45820c9849176a43 +22694f059367670d68ad12080a84603821f867ca37dc727c3c5254103af21cd9 +034f679aea5d4bc81366245725fa46cd671ac9251817e8abbe9f06f182b738e9 +05769b0d6a504170334d09bb7b809c249ca9678658b36fef98a0f8936cc9167f +31837fb2e92319b8e4df5168494fe90a12a88b93bae098fac2f3af2c087759cf +0fdc3d901e921222a19e53c654d13e52a6f272bd65e3deee14e3e59c6dd9b794 +dbd476ccd4deb50e94d207123a5bb6276e40177c13adee9227e283b51bdc8e50 +2af8d9f3d4cdf61a9bffdb5047aa305f7c61fbb49440b70993c9620020fadf15 +4b5248e8e2a6fd5638a447a593b320039eb53a709e992a481c0de5f19640c17f +cdcfacfbf7b5252c0274c53f6de78a11db640076e01a11be6a63c3a8be0e3fb0 +f0c1f40b379b80399771b0b23aa0fb934ee3184f0c18d5cb40285510a4eb92f1 +6f089ce3cf32b52add23b0f6a436637a17a71f90e8c91adeaff7eb97220a17b7 +354ea80c678e158c1ecd586f0e2e6d7ab5a179500d404e19a65db6c9568b0799 +330d69b254d29e704196964553817ab428be257c5d51aac61ee9cffcd3ec4615 +1d6e9992ad91a791d1c2465df24757dcbc64f3788b15868b905e53ccd04625c7 +f04fa267d68a6aeb59443ead9bc171f845b2b0d7ac7e788c21411a1d4b3935d6 +ef2093333ce092da5d06fcf6c1f1afc68db00cc1d0090f21046b54694f5162cc +cb07ac6e81a3b657871db0692cd70edcfb645c335167e08eb15caa6cbf6419b0 +1cb28d3beb8c5ab6c8f77663a2c258177a1feb9abb560e903b45a1d14644a08d +778a0db918b36ed5a2d6d409adf41a21b13211679094cf290c4652633d861e1e +2cf20b69ccdcf17ac7d4bc15febe037998b98c176369d225995e578f62f6e548 +049da929686caf8b58bf1baf99bfd7196c8084419d381078ad0bc6bffbe163de +15a4d0e6fb53208aff06f08967882b17c0696f060218ae037682036cb39365b7 +33d8c2b0f2414f3c919473a6abc8d419f70b541a62082602990c3c35a55217d5 +96fea82048181950779a3fc5f67bdad8df84e5433fa67bccd05ec886d857b789 +18ffbf083fa0b9f98cf5cfc9ae29d607d2ed11fa02131fd7c258431b20f7b113 +c316b7163644fdef029d33366200e9c4b5727940490a81aa139dddf9493f6b32 +0ee84950a6a549460032d0ba7fb3b2ded2e4028bd3ef456005bfc1456c681f25 +82dad6da15127a1ef14550d9557b86c2bc37440d538ee5146f320c9db07aed68 +70f6fa748a5b87fde0e3ef4cf1567e743eea26076ba668b46f3f7ad99f4df367 +fd40d87cca35267a09a3a33f8212655b747323e9d5f184cde766906f6f85ef2b +3ad0dc0edcd150e589dae9c0e19d464ad618c32e14a5dbcaa6ecbcd990cc49ad +c6de19129debd2de99b506adf4dbdea4ff1364e300447c9c0deda2cdf1d3648b +1a83bd4be46e1797fb5b6216077a54f12c7ace9c28320026a19492e58193d082 +c0b5473a5a603ce22ea377511b725ad9c23b1a1b906b465fa02d0fb620e23074 +66c9d077730916850cd2abcc2412a364f4a0efde3fb741dea91fbba138e74dcb +809627282be317d8f1dbb22220c9696bf39a27fc38aff90eaf458151a00a8a88 +9d4f5d933b1eee63054c65798ad32079ce573d53c620b6a0f81fd931b5a24707 +ebb30cf01b0c63b55ee8c08b805a9a45aea8aacf49982ce6d3e8726c6a122437 +1b9b116a56de605482449dabbb83d353ebdf355fcb8cde5658c699b8a55718a8 +6e051b42221dda48257e9f56d09f31a77630930abb0fce0d49ec9cb27c6ce480 +4c3b36d45ec195e7f78dc930370ed66cd4b6763085ec4c626693e69b39e993b1 +70b2289f29dcf94d5d2763a8211a92c40442371aa2f4297c9958c833421ee693 +a74b256e425979afe86b286bbda0983e14194250d9fecd03a8ba1fe615e93ae1 +d60d43f6858ea9cd47ddf88a1bfb5e90b60a28cdb269d9e1e43b0cf470a95b48 +aa5299e7159e7ccb18200914b93c3b0df79f181789fdfd6693613d0d42778883 +88847927f59d40f0cb5334f62eafe4f380076cfb7720174eceab1eb5050ea12c +e4293db115c4f9bd4d21910a69d566a706f5c0e1bcb344203503855e6643b125 +17b6db03c41f13a347ad39e47a46d626f8a31a163bda6d23264657b412bdec99 +c87a103d26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +/F637_0 /WWWUTU+NimbusRomNo9L-ReguItal 1 1 +[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash + /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron + /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity + /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal + /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered + /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +pdfMakeFont +612 792 false pdfSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 756] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 463.019 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -36] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.436 701.916 Td +/F122_0 24.7902 Tf +(bzip2) 63.3638 Tj +-278 TJm +(and) 44.077 Tj +-278 TJm +(libbzip2,) 99.1856 Tj +-278 TJm +(ver) 37.2101 Tj +15 TJm +(sion) 50.9687 Tj +-278 TJm +(1.0.5) 55.1334 Tj +[1 0 0 1 72 696.784] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -15.4939] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -681.29] cm +[1 0 0 1 0 0] Tm +0 0 Td +90.4929 661.631 Td +/F122_0 20.6585 Tf +(A) 14.9154 Tj +-278 TJm +(pr) 20.6585 Tj +20 TJm +(ogram) 63.1324 Tj +-278 TJm +(and) 36.7308 Tj +-278 TJm +(librar) 51.6669 Tj +-10 TJm +(y) 11.4861 Tj +-278 TJm +(f) 6.87928 Tj +20 TJm +(or) 20.6585 Tj +-278 TJm +(data) 42.4739 Tj +-278 TJm +(compression) 128.579 Tj +[1 0 0 1 72 657.035] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -144] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -513.035] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.676 503.285 Td +/F122_0 11.9552 Tf +(J) 6.64709 Tj +20 TJm +(ulian) 27.9034 Tj +-278 TJm +(Se) 14.6212 Tj +15 TJm +(war) 20.5988 Tj +20 TJm +(d,) 10.6282 Tj +-278 TJm +(http://www) 61.103 Tj +40 TJm +(.bzip.or) 42.5127 Tj +15 TJm +(g) 7.30463 Tj +[1 0 0 1 72 500.625] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -435.826] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 463.019 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 2 2 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 709.534 Td +/F122_0 14.3462 Tf +(bzip2) 36.6689 Tj +-489 TJm +(and) 25.5075 Tj +-488 TJm +(libbzip2,) 57.3991 Tj +-542 TJm +(ver) 21.5336 Tj +15 TJm +(sion) 29.4958 Tj +-488 TJm +(1.0.5:) 36.6832 Tj +-766 TJm +(A) 10.358 Tj +-488 TJm +(pr) 14.3462 Tj +20 TJm +(ogram) 43.842 Tj +-489 TJm +(and) 25.5075 Tj +-489 TJm +(librar) 35.8798 Tj +-10 TJm +(y) 7.97649 Tj +-488 TJm +(f) 4.77728 Tj +20 TJm +(or) 14.3462 Tj +-489 TJm +(data) 29.4958 Tj +72 692.319 Td +(compression) 89.2907 Tj +[1 0 0 1 72 689.349] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -689.349] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 680.364 Td +/F130_0 9.9626 Tf +(by) 9.9626 Tj +-250 TJm +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard) 12.7222 Tj +[1 0 0 1 72 678.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -678.207] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 668.409 Td +/F130_0 9.9626 Tf +(Cop) 16.6077 Tj +10 TJm +(yright) 23.8007 Tj +[1 0 0 1 114.799 668.409] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -114.799 -668.409] cm +[1 0 0 1 0 0] Tm +0 0 Td +114.799 668.409 Td +/F130_0 9.9626 Tf +(\251) 7.57158 Tj +[1 0 0 1 122.371 668.409] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -122.371 -668.409] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.861 668.409 Td +/F130_0 9.9626 Tf +(1996-2007) 43.1679 Tj +-250 TJm +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard) 12.7222 Tj +[1 0 0 1 72 666.252] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -7.9701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -658.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 650.875 Td +/F130_0 7.9701 Tf +(This) 14.1708 Tj +-250 TJm +(program,) 28.9952 Tj +[1 0 0 1 119.151 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.151 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.151 650.875 Td +/F134_0 7.9701 Tf +(bzip2) 23.9103 Tj +[1 0 0 1 143.061 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.061 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.061 650.875 Td +/F130_0 7.9701 Tf +(,) 1.99253 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(associated) 32.7571 Tj +-250 TJm +(library) 21.2483 Tj +[1 0 0 1 216.768 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.768 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.768 650.875 Td +/F134_0 7.9701 Tf +(libbzip2) 38.2565 Tj +[1 0 0 1 255.024 650.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -255.024 -650.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.024 650.875 Td +/F130_0 7.9701 Tf +(,) 1.99253 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(all) 7.9701 Tj +-250 TJm +(documentation,) 49.3668 Tj +-250 TJm +(are) 9.73149 Tj +-250 TJm +(cop) 11.5088 Tj +10 TJm +(yright) 19.0406 Tj +-250 TJm +(\251) 6.05728 Tj +-250 TJm +(1996-2007) 34.5344 Tj +-250 TJm +(Julian) 19.0406 Tj +-250 TJm +(Se) 7.9701 Tj +25 TJm +(w) 5.75441 Tj +10 TJm +(ard.) 12.1703 Tj +-310 TJm +(All) 10.1858 Tj +-250 TJm +(rights) 18.1559 Tj +-250 TJm +(reserv) 19.471 Tj +15 TJm +(ed.) 9.5163 Tj +[1 0 0 1 72 649.149] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -7.9701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -641.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 633.34 Td +/F130_0 7.9701 Tf +(Redistrib) 29.2264 Tj +20 TJm +(ution) 16.3865 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(use) 10.6241 Tj +-250 TJm +(in) 6.20074 Tj +-250 TJm +(source) 20.802 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(binary) 20.3636 Tj +-250 TJm +(forms,) 20.5868 Tj +-250 TJm +(with) 14.1708 Tj +-250 TJm +(or) 6.63909 Tj +-250 TJm +(without) 24.3566 Tj +-250 TJm +(modi\002cation,) 42.2894 Tj +-250 TJm +(are) 9.73149 Tj +-250 TJm +(permitted) 30.5494 Tj +-250 TJm +(pro) 10.6241 Tj +15 TJm +(vided) 17.7096 Tj +-250 TJm +(that) 11.9551 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(follo) 15.0555 Tj +25 TJm +(wing) 15.9402 Tj +-250 TJm +(conditions) 33.2114 Tj +-250 TJm +(are) 9.73149 Tj +-250 TJm +(met:) 14.1708 Tj +[1 0 0 1 72 631.615] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -23.7789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -607.836] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 607.836 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 607.836] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -607.836] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 607.836 Td +/F130_0 7.9701 Tf +(Redistrib) 29.2264 Tj +20 TJm +(utions) 19.4869 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(source) 20.802 Tj +-250 TJm +(code) 15.0475 Tj +-250 TJm +(must) 15.5018 Tj +-250 TJm +(retain) 18.1479 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(abo) 11.5088 Tj +15 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-250 TJm +(cop) 11.5088 Tj +10 TJm +(yright) 19.0406 Tj +-250 TJm +(notice,) 21.4714 Tj +-250 TJm +(this) 11.5168 Tj +-250 TJm +(list) 9.74743 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(conditions) 33.2114 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(follo) 15.0555 Tj +25 TJm +(wing) 15.9402 Tj +-250 TJm +(disclaimer) 33.2034 Tj +55 TJm +(.) 1.99253 Tj +[1 0 0 1 470.908 607.836] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -398.908 -17.5343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -590.302] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 590.302 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 590.302] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -590.302] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 590.302 Td +/F130_0 7.9701 Tf +(The) 12.3935 Tj +-270 TJm +(origin) 19.0406 Tj +-270 TJm +(of) 6.63909 Tj +-270 TJm +(this) 11.5168 Tj +-270 TJm +(softw) 17.7096 Tj +10 TJm +(are) 9.73149 Tj +-270 TJm +(must) 15.5018 Tj +-270 TJm +(not) 10.1858 Tj +-270 TJm +(be) 7.52377 Tj +-270 TJm +(misrepresented;) 50.4667 Tj +-279 TJm +(you) 11.9551 Tj +-270 TJm +(must) 15.5018 Tj +-270 TJm +(not) 10.1858 Tj +-270 TJm +(claim) 17.7096 Tj +-270 TJm +(that) 11.9551 Tj +-270 TJm +(you) 11.9551 Tj +-270 TJm +(wrote) 18.1479 Tj +-270 TJm +(the) 9.73946 Tj +-270 TJm +(original) 24.795 Tj +-270 TJm +(softw) 17.7096 Tj +10 TJm +(are.) 11.724 Tj +-740 TJm +(If) 5.30809 Tj +-270 TJm +(you) 11.9551 Tj +-270 TJm +(use) 10.6241 Tj +-270 TJm +(this) 11.5168 Tj +-270 TJm +(softw) 17.7096 Tj +10 TJm +(are) 9.73149 Tj +-270 TJm +(in) 6.20074 Tj +-269 TJm +(a) 3.53872 Tj +83.9552 580.737 Td +(product,) 26.3412 Tj +-250 TJm +(an) 7.52377 Tj +-250 TJm +(ackno) 19.0326 Tj +25 TJm +(wledgment) 35.4191 Tj +-250 TJm +(in) 6.20074 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(product) 24.3487 Tj +-250 TJm +(documentation) 47.3743 Tj +-250 TJm +(w) 5.75441 Tj +10 TJm +(ould) 14.1708 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(appreciated) 36.7342 Tj +-250 TJm +(b) 3.98505 Tj +20 TJm +(ut) 6.20074 Tj +-250 TJm +(is) 5.31606 Tj +-250 TJm +(not) 10.1858 Tj +-250 TJm +(required.) 28.5489 Tj +[1 0 0 1 403.817 580.737] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.817 -17.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -563.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 563.203 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 563.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -563.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 563.203 Td +/F130_0 7.9701 Tf +(Altered) 23.9023 Tj +-250 TJm +(source) 20.802 Tj +-250 TJm +(v) 3.98505 Tj +15 TJm +(ersions) 22.5793 Tj +-250 TJm +(must) 15.5018 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(plainly) 22.1409 Tj +-250 TJm +(mark) 16.3786 Tj +10 TJm +(ed) 7.52377 Tj +-250 TJm +(as) 6.63909 Tj +-250 TJm +(such,) 16.6017 Tj +-250 TJm +(and) 11.5088 Tj +-250 TJm +(must) 15.5018 Tj +-250 TJm +(not) 10.1858 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(misrepresented) 48.251 Tj +-250 TJm +(as) 6.63909 Tj +-250 TJm +(being) 17.7096 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(original) 24.795 Tj +-250 TJm +(softw) 17.7096 Tj +10 TJm +(are.) 11.724 Tj +[1 0 0 1 464.405 563.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.405 -17.5343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 5.5791 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -77.5791 -545.669] cm +[1 0 0 1 0 0] Tm +0 0 Td +77.5791 545.669 Td +/F130_0 7.9701 Tf +(\225) 2.78954 Tj +[1 0 0 1 80.3686 545.669] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9926 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.594 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -545.669] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.9552 545.669 Td +/F130_0 7.9701 Tf +(The) 12.3935 Tj +-250 TJm +(name) 17.2632 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(author) 20.3636 Tj +-250 TJm +(may) 13.7245 Tj +-250 TJm +(not) 10.1858 Tj +-250 TJm +(be) 7.52377 Tj +-250 TJm +(used) 14.6092 Tj +-250 TJm +(to) 6.20074 Tj +-250 TJm +(endorse) 24.787 Tj +-250 TJm +(or) 6.63909 Tj +-250 TJm +(promote) 26.5643 Tj +-250 TJm +(products) 27.449 Tj +-250 TJm +(deri) 12.3935 Tj +25 TJm +(v) 3.98505 Tj +15 TJm +(ed) 7.52377 Tj +-250 TJm +(from) 15.4939 Tj +-250 TJm +(this) 11.5168 Tj +-250 TJm +(softw) 17.7096 Tj +10 TJm +(are) 9.73149 Tj +-250 TJm +(without) 24.3566 Tj +-250 TJm +(speci\002c) 24.3487 Tj +-250 TJm +(prior) 15.4939 Tj +-250 TJm +(written) 22.5793 Tj +-250 TJm +(permission.) 36.9733 Tj +[1 0 0 1 533.577 545.669] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.577 -9.6956] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -535.973] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 528.135 Td +/F130_0 7.9701 Tf +(THIS) 17.7096 Tj +-401 TJm +(SOFTW) 27.0107 Tj +120 TJm +(ARE) 15.9402 Tj +-401 TJm +(IS) 7.08542 Tj +-400 TJm +(PR) 9.74743 Tj +40 TJm +(O) 5.75441 Tj +50 TJm +(VIDED) 24.787 Tj +-401 TJm +(BY) 11.0705 Tj +-401 TJm +(THE) 15.4939 Tj +-401 TJm +(A) 5.75441 Tj +55 TJm +(UTHOR) 27.449 Tj +-401 TJm +("AS) 13.4376 Tj +-401 TJm +(IS") 10.3372 Tj +-401 TJm +(AND) 17.2632 Tj +-400 TJm +(ANY) 17.2632 Tj +-401 TJm +(EXPRESS) 34.1041 Tj +-401 TJm +(OR) 11.0705 Tj +-401 TJm +(IMPLIED) 32.3188 Tj +-401 TJm +(W) 7.52377 Tj +120 TJm +(ARRANTIES,) 46.7128 Tj +-401 TJm +(INCLUDING,) 46.2585 Tj +-400 TJm +(B) 5.31606 Tj +10 TJm +(UT) 10.6241 Tj +72 518.571 Td +(NO) 11.5088 Tj +40 TJm +(T) 4.86973 Tj +-304 TJm +(LIMITED) 32.7571 Tj +-304 TJm +(T) 4.86973 Tj +18 TJm +(O,) 7.74694 Tj +-305 TJm +(THE) 15.4939 Tj +-304 TJm +(IMPLIED) 32.3188 Tj +-304 TJm +(W) 7.52377 Tj +120 TJm +(ARRANTIES) 44.7202 Tj +-304 TJm +(OF) 10.1858 Tj +-304 TJm +(MERCHANT) 44.7202 Tj +93 TJm +(ABILITY) 31.8724 Tj +-304 TJm +(AND) 17.2632 Tj +-305 TJm +(FITNESS) 31.442 Tj +-304 TJm +(FOR) 15.5018 Tj +-304 TJm +(A) 5.75441 Tj +-304 TJm +(P) 4.43138 Tj +92 TJm +(AR) 11.0705 Tj +60 TJm +(TICULAR) 34.5344 Tj +-304 TJm +(PURPOSE) 34.9887 Tj +-304 TJm +(ARE) 15.9402 Tj +-305 TJm +(DI) 8.40846 Tj +1 TJm +(S-) 7.08542 Tj +72 509.006 Td +(CLAIMED.) 38.2963 Tj +-576 TJm +(IN) 8.40846 Tj +-287 TJm +(NO) 11.5088 Tj +-288 TJm +(EVENT) 26.118 Tj +-288 TJm +(SHALL) 25.6797 Tj +-288 TJm +(THE) 15.4939 Tj +-287 TJm +(A) 5.75441 Tj +55 TJm +(UTHOR) 27.449 Tj +-288 TJm +(BE) 10.1858 Tj +-288 TJm +(LIABLE) 28.3337 Tj +-288 TJm +(FOR) 15.5018 Tj +-288 TJm +(ANY) 17.2632 Tj +-287 TJm +(DIRECT) 28.78 Tj +74 TJm +(,) 1.99253 Tj +-288 TJm +(INDIRECT) 37.1885 Tj +74 TJm +(,) 1.99253 Tj +-288 TJm +(INCIDENT) 37.6268 Tj +93 TJm +(AL,) 12.6167 Tj +-288 TJm +(SPECIAL,) 34.3193 Tj +-288 TJm +(EXEMPLAR) 42.9509 Tj +65 TJm +(Y) 5.75441 Tj +129 TJm +(,) 1.99253 Tj +72 499.442 Td +(OR) 11.0705 Tj +-299 TJm +(CONSEQ) 31.8804 Tj +10 TJm +(UENTIAL) 34.5265 Tj +-300 TJm +(D) 5.75441 Tj +40 TJm +(AMA) 18.5942 Tj +40 TJm +(GES) 15.0555 Tj +-299 TJm +(\(INCLUDING,) 48.9125 Tj +-299 TJm +(B) 5.31606 Tj +10 TJm +(UT) 10.6241 Tj +-299 TJm +(NO) 11.5088 Tj +40 TJm +(T) 4.86973 Tj +-300 TJm +(LIMITED) 32.7571 Tj +-299 TJm +(T) 4.86973 Tj +18 TJm +(O,) 7.74694 Tj +-299 TJm +(PR) 9.74743 Tj +40 TJm +(OCUREMENT) 49.59 Tj +-299 TJm +(OF) 10.1858 Tj +-300 TJm +(SUBSTITUTE) 47.8206 Tj +-299 TJm +(GOODS) 27.449 Tj +-299 TJm +(OR) 11.0705 Tj +-300 TJm +(SER) 14.6172 Tj +80 TJm +(VICES) 23.0256 Tj +1 TJm +(;) 2.21569 Tj +72 489.878 Td +(LOSS) 19.4869 Tj +-360 TJm +(OF) 10.1858 Tj +-360 TJm +(USE,) 17.048 Tj +-360 TJm +(D) 5.75441 Tj +40 TJm +(A) 5.75441 Tj +111 TJm +(T) 4.86973 Tj +93 TJm +(A,) 7.74694 Tj +-360 TJm +(OR) 11.0705 Tj +-359 TJm +(PR) 9.74743 Tj +40 TJm +(OFITS;) 24.3566 Tj +-360 TJm +(OR) 11.0705 Tj +-360 TJm +(B) 5.31606 Tj +10 TJm +(USINESS) 32.3267 Tj +-360 TJm +(INTERR) 28.78 Tj +40 TJm +(UPTION\)) 31.8724 Tj +-360 TJm +(HO) 11.5088 Tj +35 TJm +(WEVER) 28.3337 Tj +-360 TJm +(CA) 11.0705 Tj +55 TJm +(USED) 20.8099 Tj +-359 TJm +(AND) 17.2632 Tj +-360 TJm +(ON) 11.5088 Tj +-360 TJm +(ANY) 17.2632 Tj +-360 TJm +(THEOR) 26.5643 Tj +65 TJm +(Y) 5.75441 Tj +-360 TJm +(OF) 10.1858 Tj +-360 TJm +(LIAB) 18.5942 Tj +1 TJm +(ILITY) 20.802 Tj +128 TJm +(,) 1.99253 Tj +72 480.314 Td +(WHETHER) 38.9578 Tj +-247 TJm +(IN) 8.40846 Tj +-247 TJm +(CONTRA) 32.7651 Tj +40 TJm +(CT) 10.1858 Tj +74 TJm +(,) 1.99253 Tj +-247 TJm +(STRICT) 27.457 Tj +-247 TJm +(LIABILITY) 39.3962 Tj +129 TJm +(,) 1.99253 Tj +-246 TJm +(OR) 11.0705 Tj +-247 TJm +(T) 4.86973 Tj +18 TJm +(OR) 11.0705 Tj +60 TJm +(T) 4.86973 Tj +-247 TJm +(\(INCLUDING) 46.92 Tj +-247 TJm +(NEGLIGENCE) 50.4667 Tj +-247 TJm +(OR) 11.0705 Tj +-247 TJm +(O) 5.75441 Tj +40 TJm +(THER) 20.8099 Tj +55 TJm +(WISE\)) 22.133 Tj +-247 TJm +(ARISING) 32.3188 Tj +-247 TJm +(IN) 8.40846 Tj +-247 TJm +(ANY) 17.2632 Tj +-247 TJm +(W) 7.52377 Tj +120 TJm +(A) 5.75441 Tj +105 TJm +(Y) 5.75441 Tj +-247 TJm +(OUT) 16.3786 Tj +72 470.75 Td +(OF) 10.1858 Tj +-250 TJm +(THE) 15.4939 Tj +-250 TJm +(USE) 15.0555 Tj +-250 TJm +(OF) 10.1858 Tj +-250 TJm +(THIS) 17.7096 Tj +-250 TJm +(SOFTW) 27.0107 Tj +120 TJm +(ARE,) 17.9327 Tj +-250 TJm +(EVEN) 21.2483 Tj +-250 TJm +(IF) 7.08542 Tj +-250 TJm +(AD) 11.5088 Tj +40 TJm +(VISED) 23.464 Tj +-250 TJm +(OF) 10.1858 Tj +-250 TJm +(THE) 15.4939 Tj +-250 TJm +(POSSIBILITY) 47.8206 Tj +-250 TJm +(OF) 10.1858 Tj +-250 TJm +(SUCH) 21.2563 Tj +-250 TJm +(D) 5.75441 Tj +40 TJm +(AMA) 18.5942 Tj +40 TJm +(GE.) 12.6167 Tj +[1 0 0 1 72 469.598] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -7.9701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -461.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 453.216 Td +/F130_0 7.9701 Tf +(P) 4.43138 Tj +92 TJm +(A) 5.75441 Tj +111 TJm +(TENTS:) 27.0107 Tj +-296 TJm +(T) 4.86973 Tj +80 TJm +(o) 3.98505 Tj +-295 TJm +(the) 9.73946 Tj +-296 TJm +(best) 12.8398 Tj +-295 TJm +(of) 6.63909 Tj +-296 TJm +(my) 10.1858 Tj +-295 TJm +(kno) 11.9551 Tj +25 TJm +(wledge,) 25.0102 Tj +[1 0 0 1 208.544 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.544 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.544 453.216 Td +/F134_0 7.9701 Tf +(bzip2) 23.9103 Tj +[1 0 0 1 232.454 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.454 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.81 453.216 Td +/F130_0 7.9701 Tf +(and) 11.5088 Tj +[1 0 0 1 248.674 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.674 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.674 453.216 Td +/F134_0 7.9701 Tf +(libbzip2) 38.2565 Tj +[1 0 0 1 286.931 453.216] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -286.931 -453.216] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.286 453.216 Td +/F130_0 7.9701 Tf +(do) 7.9701 Tj +-296 TJm +(not) 10.1858 Tj +-295 TJm +(use) 10.6241 Tj +-296 TJm +(an) 7.52377 Tj +15 TJm +(y) 3.98505 Tj +-295 TJm +(patented) 27.0027 Tj +-296 TJm +(algorithms.) 36.0886 Tj +-893 TJm +(Ho) 9.73946 Tj +25 TJm +(we) 9.29314 Tj +25 TJm +(v) 3.98505 Tj +15 TJm +(er) 6.19277 Tj +40 TJm +(,) 1.99253 Tj +-307 TJm +(I) 2.65404 Tj +-295 TJm +(do) 7.9701 Tj +-296 TJm +(not) 10.1858 Tj +-295 TJm +(ha) 7.52377 Tj +20 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-296 TJm +(the) 9.73946 Tj +-295 TJm +(resources) 30.0951 Tj +-296 TJm +(to) 6.20074 Tj +72 443.652 Td +(carry) 16.3706 Tj +-250 TJm +(out) 10.1858 Tj +-250 TJm +(a) 3.53872 Tj +-250 TJm +(patent) 19.4789 Tj +-250 TJm +(search.) 22.3482 Tj +-620 TJm +(Therefore) 31.4181 Tj +-250 TJm +(I) 2.65404 Tj +-250 TJm +(cannot) 21.2483 Tj +-250 TJm +(gi) 6.20074 Tj +25 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-250 TJm +(an) 7.52377 Tj +15 TJm +(y) 3.98505 Tj +-250 TJm +(guarantee) 30.9798 Tj +-250 TJm +(of) 6.63909 Tj +-250 TJm +(the) 9.73946 Tj +-250 TJm +(abo) 11.5088 Tj +15 TJm +(v) 3.98505 Tj +15 TJm +(e) 3.53872 Tj +-250 TJm +(statement.) 32.5419 Tj +[1 0 0 1 72 441.926] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -391.074] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 46.7993 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -46.7993 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5986 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 3 3 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 707.441 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 698.619] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -686.879] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 686.879 Td +/F130_0 9.9626 Tf +(1.) 7.47195 Tj +-310 TJm +(Introduction) 49.2551 Tj +[1 0 0 1 131.815 686.879] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.796 -686.879] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.733 686.879 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 686.879] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -686.879] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 686.879 Td +/F130_0 9.9626 Tf +(1) 4.9813 Tj +[1 0 0 1 516.09 686.879] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.923] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 674.923 Td +/F130_0 9.9626 Tf +(2.) 7.47195 Tj +-310 TJm +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 152.318 674.923] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.3 -674.923] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.054 674.923 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 674.923] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -674.923] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 674.923 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 674.923] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -662.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 662.968 Td +/F130_0 9.9626 Tf +(2.1.) 14.9439 Tj +-310 TJm +(N) 7.193 Tj +35 TJm +(AME) 22.1369 Tj +[1 0 0 1 119.014 662.968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.995 -662.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +132.691 662.968 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 662.968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -662.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 662.968 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 662.968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -651.013] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 651.013 Td +/F130_0 9.9626 Tf +(2.2.) 14.9439 Tj +-310 TJm +(SYNOPSIS) 47.0534 Tj +[1 0 0 1 137.085 651.013] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -142.067 -651.013] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.582 651.013 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 651.013] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -651.013] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 651.013 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 651.013] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -639.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 639.058 Td +/F130_0 9.9626 Tf +(2.3.) 14.9439 Tj +-310 TJm +(DESCRIPTION) 64.7569 Tj +[1 0 0 1 154.789 639.058] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.77 -639.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +168.29 639.058 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 639.058] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -639.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 639.058 Td +/F130_0 9.9626 Tf +(3) 4.9813 Tj +[1 0 0 1 516.09 639.058] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -627.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 627.103 Td +/F130_0 9.9626 Tf +(2.4.) 14.9439 Tj +-310 TJm +(OPTIONS) 42.0621 Tj +[1 0 0 1 132.094 627.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.076 -627.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.873 627.103 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 627.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -627.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 627.103 Td +/F130_0 9.9626 Tf +(4) 4.9813 Tj +[1 0 0 1 516.09 627.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -615.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 615.147 Td +/F130_0 9.9626 Tf +(2.5.) 14.9439 Tj +-310 TJm +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-250 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 207.9 615.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.881 -615.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.412 615.147 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 615.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -615.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 615.147 Td +/F130_0 9.9626 Tf +(5) 4.9813 Tj +[1 0 0 1 516.09 615.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -603.192] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 603.192 Td +/F130_0 9.9626 Tf +(2.6.) 14.9439 Tj +-310 TJm +(RECO) 26.5703 Tj +50 TJm +(VERING) 37.6287 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(A) 7.193 Tj +111 TJm +(T) 6.08715 Tj +93 TJm +(A) 7.193 Tj +-250 TJm +(FR) 12.1843 Tj +40 TJm +(OM) 16.0497 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(AMA) 23.2427 Tj +40 TJm +(GED) 20.4731 Tj +-250 TJm +(FILES) 26.5703 Tj +[1 0 0 1 293.449 603.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.43 -603.192] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.464 603.192 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 603.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -603.192] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 603.192 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 603.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -591.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 591.237 Td +/F130_0 9.9626 Tf +(2.7.) 14.9439 Tj +-310 TJm +(PERFORMANCE) 73.6236 Tj +-250 TJm +(NO) 14.386 Tj +40 TJm +(TES) 17.7135 Tj +[1 0 0 1 197.847 591.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.829 -591.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.958 591.237 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 591.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -591.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 591.237 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 591.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -579.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 579.282 Td +/F130_0 9.9626 Tf +(2.8.) 14.9439 Tj +-310 TJm +(CA) 13.8381 Tj +135 TJm +(VEA) 20.4731 Tj +111 TJm +(TS) 11.6264 Tj +[1 0 0 1 133.519 579.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.5 -579.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +148.799 579.282 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 579.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -579.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 579.282 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 579.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -567.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 567.327 Td +/F130_0 9.9626 Tf +(2.9.) 14.9439 Tj +-310 TJm +(A) 7.193 Tj +55 TJm +(UTHOR) 34.3112 Tj +[1 0 0 1 130.989 567.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.97 -567.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.32 567.327 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 567.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -567.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 567.327 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 567.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.2192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.736] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 555.372 Td +/F130_0 9.9626 Tf +(3.) 7.47195 Tj +-310 TJm +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 160.049 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.049 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +160.049 555.372 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 207.87 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.342 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.856 555.372 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -555.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 555.372 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 516.09 555.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -543.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 543.416 Td +/F130_0 9.9626 Tf +(3.1.) 14.9439 Tj +-310 TJm +(T) 6.08715 Tj +80 TJm +(op-le) 20.4731 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(structure) 34.8591 Tj +[1 0 0 1 164.921 543.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.902 -543.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.997 543.416 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 543.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -543.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 543.416 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 516.09 543.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -531.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 531.461 Td +/F130_0 9.9626 Tf +(3.1.1.) 22.4159 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 177.374 531.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -182.355 -531.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.866 531.461 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 531.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -531.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 531.461 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 531.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -519.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 519.506 Td +/F130_0 9.9626 Tf +(3.1.2.) 22.4159 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 179.287 519.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -184.268 -519.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.822 519.506 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 519.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -519.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 519.506 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 519.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -507.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 507.551 Td +/F130_0 9.9626 Tf +(3.1.3.) 22.4159 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 202.669 507.551] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.65 -507.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.582 507.551 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 507.551] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -507.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 507.551 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 507.551] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -495.596] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 495.596 Td +/F130_0 9.9626 Tf +(3.2.) 14.9439 Tj +-310 TJm +(Error) 21.0211 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 148.413 495.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -153.394 -495.596] cm +[1 0 0 1 0 0] Tm +0 0 Td +162.611 495.596 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 495.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -495.596] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 495.596 Td +/F130_0 9.9626 Tf +(10) 9.9626 Tj +[1 0 0 1 516.09 495.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -483.641] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 483.641 Td +/F130_0 9.9626 Tf +(3.3.) 14.9439 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 167.571 483.641] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.552 -483.641] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.045 483.641 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 483.641] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -483.641] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 483.641 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 483.641] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.685 Td +/F130_0 9.9626 Tf +(3.3.1.) 22.4159 Tj +[1 0 0 1 97.5043 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 471.685 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 205.101 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.082 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +219.736 471.685 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -471.685] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 471.685 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 471.685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 459.73 Td +/F130_0 9.9626 Tf +(3.3.2.) 22.4159 Tj +[1 0 0 1 97.5043 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 459.73 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 181.19 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 459.73 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -459.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 459.73 Td +/F130_0 9.9626 Tf +(13) 9.9626 Tj +[1 0 0 1 516.09 459.73] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 447.775 Td +/F130_0 9.9626 Tf +(3.3.3.) 22.4159 Tj +[1 0 0 1 97.5043 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 447.775 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 199.123 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.105 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.533 447.775 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -447.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 447.775 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 447.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 435.82 Td +/F130_0 9.9626 Tf +(3.3.4.) 22.4159 Tj +[1 0 0 1 97.5043 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 435.82 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 217.056 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.037 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.355 435.82 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -435.82] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 435.82 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 435.82] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 423.865 Td +/F130_0 9.9626 Tf +(3.3.5.) 22.4159 Tj +[1 0 0 1 97.5043 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 423.865 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 193.146 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 423.865 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -423.865] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 423.865 Td +/F130_0 9.9626 Tf +(17) 9.9626 Tj +[1 0 0 1 516.09 423.865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 411.91 Td +/F130_0 9.9626 Tf +(3.3.6.) 22.4159 Tj +[1 0 0 1 97.5043 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 411.91 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 211.078 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 411.91 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -411.91] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 411.91 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 411.91] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -399.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 399.954 Td +/F130_0 9.9626 Tf +(3.4.) 14.9439 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 169.483 399.954] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.465 -399.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +184.216 399.954 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 399.954] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -399.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 399.954 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 399.954] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 387.999 Td +/F130_0 9.9626 Tf +(3.4.1.) 22.4159 Tj +[1 0 0 1 97.5043 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 387.999 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 181.19 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 387.999 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -387.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 387.999 Td +/F130_0 9.9626 Tf +(19) 9.9626 Tj +[1 0 0 1 516.09 387.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 376.044 Td +/F130_0 9.9626 Tf +(3.4.2.) 22.4159 Tj +[1 0 0 1 97.5043 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 376.044 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 157.28 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -162.261 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.472 376.044 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -376.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 376.044 Td +/F130_0 9.9626 Tf +(20) 9.9626 Tj +[1 0 0 1 516.09 376.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 364.089 Td +/F130_0 9.9626 Tf +(3.4.3.) 22.4159 Tj +[1 0 0 1 97.5043 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 364.089 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 211.078 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 364.089 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -364.089] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 364.089 Td +/F130_0 9.9626 Tf +(21) 9.9626 Tj +[1 0 0 1 516.09 364.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 352.134 Td +/F130_0 9.9626 Tf +(3.4.4.) 22.4159 Tj +[1 0 0 1 97.5043 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 352.134 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 187.168 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 352.134 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -352.134] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 352.134 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 352.134] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 340.179 Td +/F130_0 9.9626 Tf +(3.4.5.) 22.4159 Tj +[1 0 0 1 97.5043 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 340.179 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 187.168 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 340.179 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -340.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 340.179 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 340.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 328.223 Td +/F130_0 9.9626 Tf +(3.4.6.) 22.4159 Tj +[1 0 0 1 97.5043 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 328.223 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 163.258 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.239 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.675 328.223 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -328.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 328.223 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 328.223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 316.268 Td +/F130_0 9.9626 Tf +(3.4.7.) 22.4159 Tj +[1 0 0 1 97.5043 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 316.268 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 193.146 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 316.268 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -316.268] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 316.268 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 316.268] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -304.313] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 304.313 Td +/F130_0 9.9626 Tf +(3.4.8.) 22.4159 Tj +-310 TJm +(Handling) 37.0808 Tj +-250 TJm +(embedded) 40.9463 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(streams) 30.4357 Tj +[1 0 0 1 279.56 304.313] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.541 -304.313] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.601 304.313 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 304.313] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -304.313] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 304.313 Td +/F130_0 9.9626 Tf +(24) 9.9626 Tj +[1 0 0 1 516.09 304.313] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -292.358] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 292.358 Td +/F130_0 9.9626 Tf +(3.4.9.) 22.4159 Tj +-310 TJm +(Standard) 35.417 Tj +-250 TJm +(\002le-reading/writing) 77.4791 Tj +-250 TJm +(code) 18.8094 Tj +[1 0 0 1 234.19 292.358] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.172 -292.358] cm +[1 0 0 1 0 0] Tm +0 0 Td +247.564 292.358 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 292.358] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -292.358] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 292.358 Td +/F130_0 9.9626 Tf +(25) 9.9626 Tj +[1 0 0 1 516.09 292.358] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -280.403] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 280.403 Td +/F130_0 9.9626 Tf +(3.5.) 14.9439 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 155.625 280.403] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.607 -280.403] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.645 280.403 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 280.403] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -280.403] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 280.403 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 280.403] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 268.448 Td +/F130_0 9.9626 Tf +(3.5.1.) 22.4159 Tj +[1 0 0 1 97.5043 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 268.448 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 240.966 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.948 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.38 268.448 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -268.448] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 268.448 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 268.448] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 256.492 Td +/F130_0 9.9626 Tf +(3.5.2.) 22.4159 Tj +[1 0 0 1 97.5043 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 256.492 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 252.922 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -257.903 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +267.999 256.492 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -256.492] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 256.492 Td +/F130_0 9.9626 Tf +(27) 9.9626 Tj +[1 0 0 1 516.09 256.492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 244.537 Td +/F130_0 9.9626 Tf +(3.6.) 14.9439 Tj +[1 0 0 1 90.0324 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90.0324 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +90.0324 244.537 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 113.943 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.943 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.433 244.537 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 209.144 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.126 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +223.971 244.537 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -244.537] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 244.537 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 244.537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 232.582 Td +/F130_0 9.9626 Tf +(3.7.) 14.9439 Tj +-310 TJm +(Using) 23.8007 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 177.195 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.195 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +177.195 232.582 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 207.083 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.083 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.083 232.582 Td +/F130_0 9.9626 Tf +(-free) 18.7994 Tj +-250 TJm +(en) 9.40469 Tj +40 TJm +(vironment) 40.9562 Tj +[1 0 0 1 278.335 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -283.316 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +291.775 232.582 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -232.582] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 232.582 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 232.582] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 220.627 Td +/F130_0 9.9626 Tf +(3.7.1.) 22.4159 Tj +-310 TJm +(Getting) 29.8878 Tj +-250 TJm +(rid) 11.0684 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 154.231 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -154.231 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +154.231 220.627 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 184.119 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.1 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.175 220.627 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -220.627] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 220.627 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 220.627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -208.672] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 208.672 Td +/F130_0 9.9626 Tf +(3.7.2.) 22.4159 Tj +-310 TJm +(Critical) 29.8878 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 186.599 208.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.58 -208.672] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.629 208.672 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 208.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -208.672] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 208.672 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 208.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -196.717] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 196.717 Td +/F130_0 9.9626 Tf +(3.8.) 14.9439 Tj +-310 TJm +(Making) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(DLL) 19.3673 Tj +[1 0 0 1 189.828 196.717] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194.809 -196.717] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.243 196.717 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 196.717] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -196.717] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 196.717 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 196.717] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -184.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 184.761 Td +/F130_0 9.9626 Tf +(4.) 7.47195 Tj +-310 TJm +(Miscellanea) 48.1393 Tj +[1 0 0 1 130.699 184.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.68 -184.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.898 184.761 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 184.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -184.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 184.761 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 516.09 184.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -172.806] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 172.806 Td +/F130_0 9.9626 Tf +(4.1.) 14.9439 Tj +-310 TJm +(Limitations) 45.9475 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(format) 26.5603 Tj +[1 0 0 1 255.231 172.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.212 -172.806] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.154 172.806 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 172.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -172.806] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 172.806 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 516.09 172.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -160.851] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 160.851 Td +/F130_0 9.9626 Tf +(4.2.) 14.9439 Tj +-310 TJm +(Portability) 42.0721 Tj +-250 TJm +(issues) 23.8007 Tj +[1 0 0 1 158.395 160.851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.376 -160.851] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.03 160.851 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 160.851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -160.851] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 160.851 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 160.851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -148.896] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 148.896 Td +/F130_0 9.9626 Tf +(4.3.) 14.9439 Tj +-310 TJm +(Reporting) 39.8504 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +[1 0 0 1 150.993 148.896] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.975 -148.896] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.115 148.896 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 148.896] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -148.896] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 148.896 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 148.896] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -136.941] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 136.941 Td +/F130_0 9.9626 Tf +(4.4.) 14.9439 Tj +-310 TJm +(Did) 14.9439 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(get) 12.1743 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(right) 18.8194 Tj +-250 TJm +(package?) 37.0609 Tj +[1 0 0 1 212.602 136.941] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.778 -136.941] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.109 136.941 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 136.941] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -136.941] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 136.941 Td +/F130_0 9.9626 Tf +(33) 9.9626 Tj +[1 0 0 1 516.09 136.941] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -124.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 124.986 Td +/F130_0 9.9626 Tf +(4.5.) 14.9439 Tj +-310 TJm +(Further) 29.3299 Tj +-250 TJm +(Reading) 33.2053 Tj +[1 0 0 1 155.058 124.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.039 -124.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.361 124.986 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 124.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -124.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 124.986 Td +/F130_0 9.9626 Tf +(34) 9.9626 Tj +[1 0 0 1 516.09 124.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -62.0143] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 41.3997 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -494.668 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +536.068 50.8518 Td +/F130_0 9.9626 Tf +(iii) 8.30881 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 4 4 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(1.) 20.675 Tj +-278 TJm +(Intr) 39.937 Tj +20 TJm +(oduction) 104.664 Tj +[1 0 0 1 72 701.606] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -691.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 679.998 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 679.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -679.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.507 679.998 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-263 TJm +(\002les) 16.6077 Tj +-263 TJm +(using) 21.589 Tj +-263 TJm +(the) 12.1743 Tj +-262 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheeler) 48.1293 Tj +-263 TJm +(block-sorting) 53.1305 Tj +-263 TJm +(te) 7.193 Tj +15 TJm +(xt) 7.7509 Tj +-263 TJm +(compression) 50.3609 Tj +-263 TJm +(algorithm,) 41.2352 Tj +-266 TJm +(and) 14.386 Tj +-263 TJm +(Huf) 15.4918 Tj +25 TJm +(fman) 20.4731 Tj +-263 TJm +(coding.) 29.6088 Tj +72 668.043 Td +(Compression) 52.5826 Tj +-203 TJm +(is) 6.64505 Tj +-204 TJm +(generally) 37.0708 Tj +-203 TJm +(considerably) 50.9089 Tj +-203 TJm +(better) 22.6848 Tj +-204 TJm +(t) 2.7696 Tj +1 TJm +(han) 14.386 Tj +-204 TJm +(that) 14.9439 Tj +-203 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed) 9.40469 Tj +-203 TJm +(by) 9.9626 Tj +-204 TJm +(more) 20.4731 Tj +-203 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(entional) 32.0995 Tj +-203 TJm +(LZ77/LZ78-based) 73.0458 Tj +-204 TJm +(compressors,) 52.2937 Tj +72 656.087 Td +(and) 14.386 Tj +-250 TJm +(approaches) 44.8118 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(performance) 50.341 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(PPM) 19.9352 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(amily) 22.6948 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(statistical) 37.6387 Tj +-250 TJm +(compressors.) 52.2937 Tj +[1 0 0 1 72 653.931] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -643.968] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 634.17 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.073 634.17 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-320 TJm +(b) 4.9813 Tj +20 TJm +(uilt) 13.2901 Tj +-319 TJm +(on) 9.9626 Tj +-320 TJm +(top) 12.7322 Tj +-320 TJm +(of) 8.29885 Tj +[1 0 0 1 176.712 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.712 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.712 634.17 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 224.533 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -224.533 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.533 634.17 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-337 TJm +(a) 4.42339 Tj +-320 TJm +(\003e) 9.9626 Tj +15 TJm +(xible) 19.9252 Tj +-320 TJm +(library) 26.5603 Tj +-319 TJm +(for) 11.6164 Tj +-320 TJm +(handling) 34.8691 Tj +-320 TJm +(compressed) 47.0334 Tj +-320 TJm +(data) 16.5977 Tj +-319 TJm +(in) 7.7509 Tj +-320 TJm +(the) 12.1743 Tj +[1 0 0 1 449.816 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -449.816 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.816 634.17 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 479.704 634.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.704 -634.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.889 634.17 Td +/F130_0 9.9626 Tf +(format.) 29.0509 Tj +-1039 TJm +(This) 17.7135 Tj +72 622.214 Td +(manual) 29.3299 Tj +-316 TJm +(describes) 37.0708 Tj +-316 TJm +(both) 17.7135 Tj +-317 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-316 TJm +(to) 7.7509 Tj +-316 TJm +(use) 13.2801 Tj +-316 TJm +(the) 12.1743 Tj +-316 TJm +(program) 33.7533 Tj +-316 TJm +(and) 14.386 Tj +-317 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-316 TJm +(to) 7.7509 Tj +-316 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-316 TJm +(with) 17.7135 Tj +-316 TJm +(the) 12.1743 Tj +-317 TJm +(library) 26.5603 Tj +-316 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +-1017 TJm +(Most) 20.4831 Tj +-316 TJm +(of) 8.29885 Tj +-316 TJm +(the) 12.1743 Tj +-317 TJm +(manual) 29.3299 Tj +-316 TJm +(is) 6.64505 Tj +72 610.259 Td +(de) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +20 TJm +(oted) 17.1556 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(program,) 36.2439 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(good) 19.9252 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(interest) 29.3299 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(program.) 36.2439 Tj +[1 0 0 1 72 608.102] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 578.379 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 578.379] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -86.944 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 578.379 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-259 TJm +(to) 7.7509 Tj +-260 TJm +(use) 13.2801 Tj +-259 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 156.985 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -156.985 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.57 578.379 Td +/F130_0 9.9626 Tf +([2]) 11.6164 Tj +[1 0 0 1 171.186 578.379] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -171.186 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.771 578.379 Td +/F130_0 9.9626 Tf +(describes) 37.0708 Tj +-259 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-260 TJm +(to) 7.7509 Tj +-259 TJm +(use) 13.2801 Tj +[1 0 0 1 259.119 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.119 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.119 578.379 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 289.007 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.007 -578.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.007 578.379 Td +/F130_0 9.9626 Tf +(;) 2.7696 Tj +-264 TJm +(this) 14.396 Tj +-260 TJm +(is) 6.64505 Tj +-259 TJm +(the) 12.1743 Tj +-260 TJm +(only) 17.7135 Tj +-259 TJm +(part) 15.4918 Tj +-259 TJm +(you) 14.9439 Tj +-260 TJm +(need) 18.8094 Tj +-259 TJm +(to) 7.7509 Tj +-260 TJm +(read) 17.1456 Tj +-259 TJm +(if) 6.08715 Tj +-260 TJm +(you) 14.9439 Tj +-259 TJm +(just) 14.396 Tj +-260 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-259 TJm +(to) 7.7509 Tj +-260 TJm +(kno) 14.9439 Tj +25 TJm +(w) 7.193 Tj +86.944 566.424 Td +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(operate) 29.3199 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(program.) 36.2439 Tj +[1 0 0 1 199.302 566.424] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -127.302 -21.9178] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 544.506 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 544.506] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -86.944 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 544.506 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(libbzip2) 32.6574 Tj +[1 0 0 1 197.09 544.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -197.09 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.58 544.506 Td +/F130_0 9.9626 Tf +([8]) 11.6164 Tj +[1 0 0 1 211.197 544.506] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -211.197 -544.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.687 544.506 Td +/F130_0 9.9626 Tf +(describes) 37.0708 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(programming) 54.2364 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(aces) 17.1456 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(detail,) 24.6275 Tj +-250 TJm +(and) 14.386 Tj +[1 0 0 1 417.501 544.506] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -345.501 -21.9178] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 522.588 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 522.588] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 2.4907 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -86.944 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 522.588 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 135.083 522.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -135.083 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.573 522.588 Td +/F130_0 9.9626 Tf +([31]) 16.5977 Tj +[1 0 0 1 154.171 522.588] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -154.171 -522.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +156.662 522.588 Td +/F130_0 9.9626 Tf +(records) 29.3199 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(miscellaneous) 56.4481 Tj +-250 TJm +(notes) 21.031 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(thought) 30.4457 Tj +-250 TJm +(ought) 22.6948 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(recorded) 34.8492 Tj +-250 TJm +(some) 21.031 Tj +25 TJm +(where.) 26.8293 Tj +[1 0 0 1 492.31 522.588] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -420.31 -471.736] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.8518 Td +/F130_0 9.9626 Tf +(1) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 5 5 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(2.) 20.675 Tj +-278 TJm +(Ho) 33.0453 Tj +15 TJm +(w) 19.2868 Tj +-278 TJm +(to) 23.4019 Tj +-278 TJm +(use) 42.7135 Tj +-278 TJm +(bzip2) 63.3638 Tj +[1 0 0 1 72 696.784] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -14.944] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -671.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 656.35 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 647.528] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 635.788 Td +/F130_0 9.9626 Tf +(2.1.) 14.9439 Tj +-310 TJm +(N) 7.193 Tj +35 TJm +(AME) 22.1369 Tj +[1 0 0 1 119.014 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.995 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +132.691 635.788 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 635.788 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 623.832 Td +/F130_0 9.9626 Tf +(2.2.) 14.9439 Tj +-310 TJm +(SYNOPSIS) 47.0534 Tj +[1 0 0 1 137.085 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -142.067 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.582 623.832 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 623.832 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 516.09 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 611.877 Td +/F130_0 9.9626 Tf +(2.3.) 14.9439 Tj +-310 TJm +(DESCRIPTION) 64.7569 Tj +[1 0 0 1 154.789 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.77 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +168.29 611.877 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 611.877 Td +/F130_0 9.9626 Tf +(3) 4.9813 Tj +[1 0 0 1 516.09 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 599.922 Td +/F130_0 9.9626 Tf +(2.4.) 14.9439 Tj +-310 TJm +(OPTIONS) 42.0621 Tj +[1 0 0 1 132.094 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.076 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.873 599.922 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 599.922 Td +/F130_0 9.9626 Tf +(4) 4.9813 Tj +[1 0 0 1 516.09 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 587.967 Td +/F130_0 9.9626 Tf +(2.5.) 14.9439 Tj +-310 TJm +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-250 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 207.9 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.881 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.412 587.967 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 587.967 Td +/F130_0 9.9626 Tf +(5) 4.9813 Tj +[1 0 0 1 516.09 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 576.012 Td +/F130_0 9.9626 Tf +(2.6.) 14.9439 Tj +-310 TJm +(RECO) 26.5703 Tj +50 TJm +(VERING) 37.6287 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(A) 7.193 Tj +111 TJm +(T) 6.08715 Tj +93 TJm +(A) 7.193 Tj +-250 TJm +(FR) 12.1843 Tj +40 TJm +(OM) 16.0497 Tj +-250 TJm +(D) 7.193 Tj +40 TJm +(AMA) 23.2427 Tj +40 TJm +(GED) 20.4731 Tj +-250 TJm +(FILES) 26.5703 Tj +[1 0 0 1 293.449 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.43 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.464 576.012 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 576.012 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 564.056 Td +/F130_0 9.9626 Tf +(2.7.) 14.9439 Tj +-310 TJm +(PERFORMANCE) 73.6236 Tj +-250 TJm +(NO) 14.386 Tj +40 TJm +(TES) 17.7135 Tj +[1 0 0 1 197.847 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.829 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.958 564.056 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 564.056 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 516.09 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 552.101 Td +/F130_0 9.9626 Tf +(2.8.) 14.9439 Tj +-310 TJm +(CA) 13.8381 Tj +135 TJm +(VEA) 20.4731 Tj +111 TJm +(TS) 11.6264 Tj +[1 0 0 1 133.519 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.5 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +148.799 552.101 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 552.101 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8556] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 540.146 Td +/F130_0 9.9626 Tf +(2.9.) 14.9439 Tj +-310 TJm +(A) 7.193 Tj +55 TJm +(UTHOR) 34.3112 Tj +[1 0 0 1 130.989 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.97 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.32 540.146 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 540.146 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 516.09 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.2191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -520.002] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 508.266 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-250 TJm +(chapter) 29.3199 Tj +-250 TJm +(contains) 33.2053 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(cop) 14.386 Tj +10 TJm +(y) 4.9813 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 213.837 508.266] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.837 -508.266] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.837 508.266 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 243.725 508.266] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.725 -508.266] cm +[1 0 0 1 0 0] Tm +0 0 Td +246.215 508.266 Td +/F130_0 9.9626 Tf +(man) 17.1556 Tj +-250 TJm +(page,) 21.3 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(nothing) 30.4457 Tj +-250 TJm +(else.) 17.9825 Tj +[1 0 0 1 72 506.109] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -496.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 473.513 Td +/F122_0 20.6585 Tf +(2.1.) 34.4584 Tj +-278 TJm +(NAME) 60.8186 Tj +[1 0 0 1 72 473.513] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -31.8804] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 441.632 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 441.632 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 116.832 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.832 441.632 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 121.813 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -121.813 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +121.813 441.632 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 163.656 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.656 -441.632] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.147 441.632 Td +/F130_0 9.9626 Tf +(-) 3.31755 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(block-sorting) 53.1305 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(compressor) 45.9276 Tj +40 TJm +(,) 2.49065 Tj +-250 TJm +(v1.0.4) 24.9065 Tj +[1 0 0 1 325.129 441.632] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.129 -21.9179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -419.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 419.715 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 419.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -419.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 419.715 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 116.832 419.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -419.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.322 419.715 Td +/F130_0 9.9626 Tf +(-) 3.31755 Tj +-250 TJm +(decompresses) 55.3323 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(stdout) 24.3586 Tj +[1 0 0 1 236.651 419.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.651 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -397.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 397.797 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 397.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -397.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 397.797 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 158.675 397.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.675 -397.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.166 397.797 Td +/F130_0 9.9626 Tf +(-) 3.31755 Tj +-250 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ers) 11.6164 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(damaged) 35.965 Tj +-250 TJm +(bzip2) 22.1369 Tj +-250 TJm +(\002les) 16.6077 Tj +[1 0 0 1 323.545 397.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -251.545 -12.1195] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -375.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 353.081 Td +/F122_0 20.6585 Tf +(2.2.) 34.4584 Tj +-278 TJm +(SYNOPSIS) 105.627 Tj +[1 0 0 1 72 352.823] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -31.6223] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -321.201] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 321.201 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 321.201] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -321.201] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 321.201 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 116.832 321.201] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -321.201] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.322 321.201 Td +/F130_0 9.9626 Tf +([) 3.31755 Tj +-250 TJm +(-cdfkqstvzVL123456789) 100.164 Tj +-250 TJm +(]) 3.31755 Tj +-250 TJm +([) 3.31755 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(...) 7.47195 Tj +-620 TJm +(]) 3.31755 Tj +[1 0 0 1 297.045 321.201] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -225.045 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -299.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 299.283 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 299.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -299.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 299.283 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 128.787 299.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -128.787 -299.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.278 299.283 Td +/F130_0 9.9626 Tf +([) 3.31755 Tj +-250 TJm +(-fkvsVL) 33.7533 Tj +-250 TJm +(]) 3.31755 Tj +-250 TJm +([) 3.31755 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(...) 7.47195 Tj +-620 TJm +(]) 3.31755 Tj +[1 0 0 1 242.589 299.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -170.589 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -277.365] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 277.365 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 277.365] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -277.365] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 277.365 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 116.832 277.365] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.832 -277.365] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.322 277.365 Td +/F130_0 9.9626 Tf +([) 3.31755 Tj +-250 TJm +(-s) 7.193 Tj +-250 TJm +(]) 3.31755 Tj +-250 TJm +([) 3.31755 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(...) 7.47195 Tj +-620 TJm +(]) 3.31755 Tj +[1 0 0 1 204.074 277.365] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -132.074 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -255.447] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 255.447 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 255.447] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -255.447] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 255.447 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 158.675 255.447] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.675 -255.447] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.166 255.447 Td +/F130_0 9.9626 Tf +(\002lename) 34.3112 Tj +[1 0 0 1 195.476 255.447] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.477 -204.596] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.8519] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.8519 Td +/F130_0 9.9626 Tf +(2) 4.9813 Tj +[1 0 0 1 453.269 50.8519] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 6 6 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 704.93 Td +/F122_0 20.6585 Tf +(2.3.) 34.4584 Tj +-278 TJm +(DESCRIPTION) 141.18 Tj +[1 0 0 1 72 704.672] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -694.709] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 683.012 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 683.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -683.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.56 683.012 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-268 TJm +(\002les) 16.6077 Tj +-268 TJm +(using) 21.589 Tj +-268 TJm +(the) 12.1743 Tj +-269 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheeler) 48.1293 Tj +-268 TJm +(block) 22.1369 Tj +-268 TJm +(sorting) 27.6761 Tj +-268 TJm +(te) 7.193 Tj +15 TJm +(xt) 7.7509 Tj +-268 TJm +(compression) 50.3609 Tj +-268 TJm +(algorithm,) 41.2352 Tj +-273 TJm +(and) 14.386 Tj +-268 TJm +(Huf) 15.4918 Tj +25 TJm +(fman) 20.4731 Tj +-269 TJm +(c) 4.42339 Tj +1 TJm +(od) 9.9626 Tj +-1 TJm +(i) 2.7696 Tj +1 TJm +(ng.) 12.4533 Tj +72 671.057 Td +(Compression) 52.5826 Tj +-203 TJm +(is) 6.64505 Tj +-204 TJm +(generally) 37.0708 Tj +-203 TJm +(considerably) 50.9089 Tj +-203 TJm +(better) 22.6848 Tj +-204 TJm +(t) 2.7696 Tj +1 TJm +(han) 14.386 Tj +-204 TJm +(that) 14.9439 Tj +-203 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed) 9.40469 Tj +-203 TJm +(by) 9.9626 Tj +-204 TJm +(more) 20.4731 Tj +-203 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(entional) 32.0995 Tj +-203 TJm +(LZ77/LZ78-based) 73.0458 Tj +-204 TJm +(compressors,) 52.2937 Tj +72 659.101 Td +(and) 14.386 Tj +-250 TJm +(approaches) 44.8118 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(performance) 50.341 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(PPM) 19.9352 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(amily) 22.6948 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(statistical) 37.6387 Tj +-250 TJm +(compressors.) 52.2937 Tj +[1 0 0 1 72 656.945] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -646.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 637.184 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(command-line) 57.5539 Tj +-250 TJm +(options) 29.3399 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(deliberately) 47.0334 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-250 TJm +(similar) 27.6761 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(those) 21.031 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(GNU) 21.579 Tj +[1 0 0 1 364.869 637.184] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -364.869 -637.184] cm +[1 0 0 1 0 0] Tm +0 0 Td +364.869 637.184 Td +/F134_0 9.9626 Tf +(gzip) 23.9102 Tj +[1 0 0 1 388.779 637.184] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -388.779 -637.184] cm +[1 0 0 1 0 0] Tm +0 0 Td +388.779 637.184 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(identical.) 36.8018 Tj +[1 0 0 1 72 635.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -625.064] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 615.266 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 615.266] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -615.266] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.175 615.266 Td +/F130_0 9.9626 Tf +(e) 4.42339 Tj +15 TJm +(xpects) 25.4544 Tj +-330 TJm +(a) 4.42339 Tj +-330 TJm +(list) 12.1843 Tj +-330 TJm +(of) 8.29885 Tj +-330 TJm +(\002le) 12.7322 Tj +-329 TJm +(names) 25.4544 Tj +-330 TJm +(to) 7.7509 Tj +-330 TJm +(accompan) 40.3884 Tj +15 TJm +(y) 4.9813 Tj +-330 TJm +(the) 12.1743 Tj +-330 TJm +(command-line) 57.5539 Tj +-330 TJm +(\003ags.) 21.31 Tj +-1099 TJm +(Each) 19.9152 Tj +-330 TJm +(\002le) 12.7322 Tj +-330 TJm +(is) 6.64505 Tj +-330 TJm +(replaced) 33.7433 Tj +-330 TJm +(by) 9.9626 Tj +-330 TJm +(a) 4.42339 Tj +-330 TJm +(compressed) 47.0334 Tj +72 603.311 Td +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-349 TJm +(of) 8.29885 Tj +-348 TJm +(itself,) 22.4159 Tj +-373 TJm +(with) 17.7135 Tj +-349 TJm +(the) 12.1743 Tj +-349 TJm +(name) 21.579 Tj +[1 0 0 1 204.444 603.311] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.444 -603.311] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.444 603.311 Td +/F134_0 9.9626 Tf +(original_name.bz2) 101.619 Tj +[1 0 0 1 306.063 603.311] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -306.063 -603.311] cm +[1 0 0 1 0 0] Tm +0 0 Td +306.063 603.311 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1212 TJm +(Each) 19.9152 Tj +-348 TJm +(compressed) 47.0334 Tj +-349 TJm +(\002le) 12.7322 Tj +-348 TJm +(has) 13.2801 Tj +-349 TJm +(the) 12.1743 Tj +-348 TJm +(same) 20.4731 Tj +-349 TJm +(modi\002cation) 50.3709 Tj +-349 TJm +(date,) 19.0883 Tj +72 591.356 Td +(permissions,) 50.092 Tj +-344 TJm +(and,) 16.8766 Tj +-344 TJm +(when) 21.579 Tj +-325 TJm +(possible,) 35.1481 Tj +-344 TJm +(o) 4.9813 Tj +25 TJm +(wnership) 36.5229 Tj +-325 TJm +(as) 8.29885 Tj +-325 TJm +(the) 12.1743 Tj +-326 TJm +(corresponding) 56.996 Tj +-325 TJm +(original,) 33.4843 Tj +-344 TJm +(so) 8.85675 Tj +-325 TJm +(that) 14.9439 Tj +-325 TJm +(these) 20.4731 Tj +-325 TJm +(properties) 39.8404 Tj +-325 TJm +(can) 13.8281 Tj +-326 TJm +(be) 9.40469 Tj +-325 TJm +(correctly) 35.4071 Tj +72 579.4 Td +(restored) 32.0895 Tj +-308 TJm +(at) 7.193 Tj +-308 TJm +(decompression) 59.7656 Tj +-307 TJm +(time.) 20.2042 Tj +-484 TJm +(File) 15.5018 Tj +-308 TJm +(name) 21.579 Tj +-308 TJm +(handling) 34.8691 Tj +-308 TJm +(is) 6.64505 Tj +-307 TJm +(nai) 12.1743 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-308 TJm +(in) 7.7509 Tj +-308 TJm +(the) 12.1743 Tj +-308 TJm +(sense) 21.579 Tj +-308 TJm +(that) 14.9439 Tj +-308 TJm +(there) 19.9152 Tj +-307 TJm +(is) 6.64505 Tj +-308 TJm +(no) 9.9626 Tj +-308 TJm +(mechanism) 45.3796 Tj +-308 TJm +(for) 11.6164 Tj +-308 TJm +(preserving) 42.0521 Tj +72 567.445 Td +(original) 30.9936 Tj +-334 TJm +(\002le) 12.7322 Tj +-333 TJm +(names,) 27.9451 Tj +-355 TJm +(permissions,) 50.092 Tj +-355 TJm +(o) 4.9813 Tj +25 TJm +(wnerships) 40.3983 Tj +-333 TJm +(or) 8.29885 Tj +-334 TJm +(dates) 20.4731 Tj +-334 TJm +(in) 7.7509 Tj +-333 TJm +(\002lesystems) 44.2838 Tj +-334 TJm +(which) 24.3486 Tj +-334 TJm +(lack) 16.5977 Tj +-333 TJm +(these) 20.4731 Tj +-334 TJm +(concepts,) 37.3498 Tj +-355 TJm +(or) 8.29885 Tj +-333 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-334 TJm +(serious) 28.224 Tj +-334 TJm +(\002le) 12.7322 Tj +72 555.49 Td +(name) 21.579 Tj +-250 TJm +(length) 24.9065 Tj +-250 TJm +(restrictions,) 46.7644 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(MS-DOS.) 40.1294 Tj +[1 0 0 1 72 553.333] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -543.371] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 533.572 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.379 533.572 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 121.255 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -121.255 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +121.255 533.572 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 163.098 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.098 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.589 533.572 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erwrite) 28.2141 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-250 TJm +(\002les.) 19.0983 Tj +-620 TJm +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(happen,) 31.2626 Tj +-250 TJm +(specify) 28.772 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 495.977 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -495.977 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +495.977 533.572 Td +/F134_0 9.9626 Tf +(-f) 11.9551 Tj +[1 0 0 1 507.932 533.572] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -507.932 -533.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.423 533.572 Td +/F130_0 9.9626 Tf +(\003ag.) 17.4346 Tj +[1 0 0 1 72 531.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -521.453] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 511.654 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-284 TJm +(no) 9.9626 Tj +-285 TJm +(\002le) 12.7322 Tj +-284 TJm +(names) 25.4544 Tj +-284 TJm +(are) 12.1643 Tj +-284 TJm +(speci\002ed,) 37.9077 Tj +[1 0 0 1 193.935 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.935 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.935 511.654 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 223.823 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.823 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +226.655 511.654 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-284 TJm +(from) 19.3673 Tj +-285 TJm +(standard) 33.7533 Tj +-284 TJm +(input) 20.4831 Tj +-284 TJm +(to) 7.7509 Tj +-284 TJm +(standard) 33.7533 Tj +-285 TJm +(output.) 27.9551 Tj +-825 TJm +(In) 8.29885 Tj +-285 TJm +(this) 14.396 Tj +-284 TJm +(case,) 19.6363 Tj +[1 0 0 1 491.778 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -491.778 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +491.778 511.654 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 521.666 511.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -521.666 -511.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +524.499 511.654 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +72 499.699 Td +(decline) 28.772 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(write) 20.4731 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(terminal,) 35.696 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(entirely) 30.4357 Tj +-250 TJm +(incomprehensible) 70.8341 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(therefore) 35.955 Tj +-250 TJm +(pointless.) 37.9177 Tj +[1 0 0 1 72 497.542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -487.58] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 477.781 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 113.843 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.176 477.781 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 130.125 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -130.125 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +130.125 477.781 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-d) 11.9551 Tj +[1 0 0 1 177.946 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.946 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +177.946 477.781 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-234 TJm +(decompresses) 55.3323 Tj +-234 TJm +(all) 9.9626 Tj +-234 TJm +(speci\002ed) 35.417 Tj +-235 TJm +(\002les.) 19.0983 Tj +-609 TJm +(Files) 19.3773 Tj +-234 TJm +(which) 24.3486 Tj +-234 TJm +(were) 19.3573 Tj +-234 TJm +(not) 12.7322 Tj +-235 TJm +(created) 28.762 Tj +-234 TJm +(by) 9.9626 Tj +[1 0 0 1 445.012 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -445.012 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +445.012 477.781 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 474.9 477.781] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -474.9 -477.781] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.233 477.781 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-234 TJm +(be) 9.40469 Tj +-234 TJm +(detected) 33.1954 Tj +72 465.826 Td +(and) 14.386 Tj +-280 TJm +(i) 2.7696 Tj +1 TJm +(gnored,) 30.1568 Tj +-287 TJm +(and) 14.386 Tj +-280 TJm +(a) 4.42339 Tj +-279 TJm +(w) 7.193 Tj +10 TJm +(arning) 25.4544 Tj +-280 TJm +(issued.) 27.3972 Tj +[1 0 0 1 216.033 465.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.033 -465.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.033 465.826 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 245.921 465.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.921 -465.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.705 465.826 Td +/F130_0 9.9626 Tf +(attempts) 33.7633 Tj +-279 TJm +(to) 7.7509 Tj +-280 TJm +(guess) 22.1369 Tj +-279 TJm +(the) 12.1743 Tj +-280 TJm +(\002lename) 34.3112 Tj +-279 TJm +(for) 11.6164 Tj +-280 TJm +(the) 12.1743 Tj +-279 TJm +(decompressed) 56.4381 Tj +-280 TJm +(\002le) 12.7322 Tj +-279 TJm +(from) 19.3673 Tj +-280 TJm +(that) 14.9439 Tj +-279 TJm +(of) 8.29885 Tj +-280 TJm +(the) 12.1743 Tj +72 453.871 Td +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(follo) 18.8194 Tj +25 TJm +(ws:) 13.8381 Tj +[1 0 0 1 72 451.714] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 421.991 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 421.991 Td +/F134_0 9.9626 Tf +(filename.bz2) 71.7307 Tj +[1 0 0 1 164.653 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 421.991 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -421.991] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 421.991 Td +/F134_0 9.9626 Tf +(filename) 47.8205 Tj +[1 0 0 1 252.313 421.991] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -180.313 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 400.073 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 400.073 Td +/F134_0 9.9626 Tf +(filename.bz) 65.7532 Tj +[1 0 0 1 158.675 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.675 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.166 400.073 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 198.515 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.515 -400.073] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.515 400.073 Td +/F134_0 9.9626 Tf +(filename) 47.8205 Tj +[1 0 0 1 246.336 400.073] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.336 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 378.155 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 378.155 Td +/F134_0 9.9626 Tf +(filename.tbz2) 77.7083 Tj +[1 0 0 1 164.653 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 378.155 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -378.155] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 378.155 Td +/F134_0 9.9626 Tf +(filename.tar) 71.7307 Tj +[1 0 0 1 276.224 378.155] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.224 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 356.237 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 356.237 Td +/F134_0 9.9626 Tf +(filename.tbz) 71.7307 Tj +[1 0 0 1 164.653 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 356.237 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -356.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 356.237 Td +/F134_0 9.9626 Tf +(filename.tar) 71.7307 Tj +[1 0 0 1 276.224 356.237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.224 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 334.319 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 334.319 Td +/F134_0 9.9626 Tf +(anyothername) 71.7307 Tj +[1 0 0 1 164.653 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.143 334.319 Td +/F130_0 9.9626 Tf +(becomes) 34.8591 Tj +[1 0 0 1 204.493 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.493 -334.319] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.493 334.319 Td +/F134_0 9.9626 Tf +(anyothername.out) 95.641 Tj +[1 0 0 1 300.134 334.319] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -228.134 -11.4968] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -322.823] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.402 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-342 TJm +(the) 12.1743 Tj +-342 TJm +(\002le) 12.7322 Tj +-342 TJm +(does) 18.2614 Tj +-342 TJm +(not) 12.7322 Tj +-343 TJm +(end) 14.386 Tj +-342 TJm +(in) 7.7509 Tj +-342 TJm +(one) 14.386 Tj +-342 TJm +(of) 8.29885 Tj +-342 TJm +(the) 12.1743 Tj +-342 TJm +(recognised) 43.158 Tj +-342 TJm +(endings,) 33.4843 Tj +[1 0 0 1 309.305 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -309.305 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.305 312.402 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 333.215 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -333.215 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.215 312.402 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 339.344 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.344 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.344 312.402 Td +/F134_0 9.9626 Tf +(.bz) 17.9327 Tj +[1 0 0 1 357.276 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -357.276 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +357.276 312.402 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 363.405 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.405 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.405 312.402 Td +/F134_0 9.9626 Tf +(.tbz2) 29.8878 Tj +[1 0 0 1 393.293 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.293 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +396.701 312.402 Td +/F130_0 9.9626 Tf +(or) 8.29885 Tj +[1 0 0 1 408.409 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -408.409 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +408.409 312.402 Td +/F134_0 9.9626 Tf +(.tbz) 23.9102 Tj +[1 0 0 1 432.319 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -432.319 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +432.319 312.402 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 438.448 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.448 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.448 312.402 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 468.336 312.402] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.336 -312.402] cm +[1 0 0 1 0 0] Tm +0 0 Td +471.744 312.402 Td +/F130_0 9.9626 Tf +(complains) 40.9562 Tj +-342 TJm +(that) 14.9439 Tj +-342 TJm +(it) 5.53921 Tj +72 300.446 Td +(cannot) 26.5603 Tj +-250 TJm +(guess) 22.1369 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(name) 21.579 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(original) 30.9936 Tj +-250 TJm +(\002le,) 15.2229 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(uses) 17.1556 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(original) 30.9936 Tj +-250 TJm +(name) 21.579 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 370.009 300.446] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -370.009 -300.446] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.009 300.446 Td +/F134_0 9.9626 Tf +(.out) 23.9102 Tj +[1 0 0 1 393.92 300.446] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.92 -300.446] cm +[1 0 0 1 0 0] Tm +0 0 Td +396.41 300.446 Td +/F130_0 9.9626 Tf +(appended.) 40.6673 Tj +[1 0 0 1 72 298.29] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -288.327] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 278.529 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(compression,) 52.8516 Tj +-250 TJm +(supplying) 39.3025 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(\002lenames) 38.1866 Tj +-250 TJm +(causes) 26.0024 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(input) 20.4831 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 276.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -266.409] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 256.611 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 113.843 256.611] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -256.611] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.409 256.611 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-257 TJm +(correctly) 35.4071 Tj +-258 TJm +(decompress) 47.0334 Tj +-257 TJm +(a) 4.42339 Tj +-258 TJm +(\002le) 12.7322 Tj +-257 TJm +(which) 24.3486 Tj +-258 TJm +(is) 6.64505 Tj +-258 TJm +(the) 12.1743 Tj +-257 TJm +(concatenation) 55.3323 Tj +-258 TJm +(of) 8.29885 Tj +-257 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-258 TJm +(or) 8.29885 Tj +-257 TJm +(more) 20.4731 Tj +-258 TJm +(compressed) 47.0334 Tj +-257 TJm +(\002les.) 19.0983 Tj +-665 TJm +(The) 15.4918 Tj +-258 TJm +(result) 22.1369 Tj +-257 TJm +(is) 6.64505 Tj +72 244.656 Td +(the) 12.1743 Tj +-239 TJm +(concatenation) 55.3323 Tj +-238 TJm +(of) 8.29885 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(corresponding) 56.996 Tj +-239 TJm +(uncompressed) 56.996 Tj +-238 TJm +(\002les.) 19.0983 Tj +-613 TJm +(Inte) 15.4918 Tj +15 TJm +(grity) 18.8194 Tj +-238 TJm +(testing) 26.5703 Tj +-239 TJm +(\() 3.31755 Tj +[1 0 0 1 382.247 244.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.247 -244.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +382.247 244.656 Td +/F134_0 9.9626 Tf +(-t) 11.9551 Tj +[1 0 0 1 394.202 244.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -394.202 -244.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +394.202 244.656 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-239 TJm +(of) 8.29885 Tj +-238 TJm +(concatenated) 52.0048 Tj +-239 TJm +(compressed) 47.0334 Tj +-239 TJm +(\002les) 16.6077 Tj +-239 TJm +(is) 6.64505 Tj +72 232.7 Td +(also) 16.0497 Tj +-250 TJm +(supported.) 41.7831 Tj +[1 0 0 1 72 230.544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -220.581] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 210.783 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-399 TJm +(can) 13.8281 Tj +-399 TJm +(also) 16.0497 Tj +-399 TJm +(compress) 37.6287 Tj +-400 TJm +(or) 8.29885 Tj +-399 TJm +(decompress) 47.0334 Tj +-399 TJm +(\002les) 16.6077 Tj +-399 TJm +(to) 7.7509 Tj +-399 TJm +(the) 12.1743 Tj +-399 TJm +(standard) 33.7533 Tj +-399 TJm +(output) 25.4644 Tj +-399 TJm +(by) 9.9626 Tj +-400 TJm +(gi) 7.7509 Tj +25 TJm +(ving) 17.7135 Tj +-399 TJm +(the) 12.1743 Tj +[1 0 0 1 409.67 210.783] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.67 -210.783] cm +[1 0 0 1 0 0] Tm +0 0 Td +409.67 210.783 Td +/F134_0 9.9626 Tf +(-c) 11.9551 Tj +[1 0 0 1 421.625 210.783] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -421.625 -210.783] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.602 210.783 Td +/F130_0 9.9626 Tf +(\003ag.) 17.4346 Tj +-757 TJm +(Multiple) 34.3212 Tj +-400 TJm +(\002l) 8.30881 Tj +1 TJm +(es) 8.29885 Tj +-400 TJm +(may) 17.1556 Tj +-399 TJm +(be) 9.40469 Tj +72 198.828 Td +(compressed) 47.0334 Tj +-367 TJm +(and) 14.386 Tj +-367 TJm +(decompressed) 56.4381 Tj +-367 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-367 TJm +(this.) 16.8866 Tj +-1321 TJm +(The) 15.4918 Tj +-367 TJm +(resulting) 34.8691 Tj +-367 TJm +(outputs) 29.3399 Tj +-367 TJm +(are) 12.1643 Tj +-367 TJm +(fed) 12.7222 Tj +-367 TJm +(sequentially) 48.1492 Tj +-366 TJm +(to) 7.7509 Tj +-367 TJm +(stdout.) 26.8492 Tj +-1322 TJm +(Compression) 52.5826 Tj +-367 TJm +(of) 8.29885 Tj +72 186.872 Td +(multiple) 33.2153 Tj +-289 TJm +(\002les) 16.6077 Tj +-289 TJm +(in) 7.7509 Tj +-289 TJm +(this) 14.396 Tj +-289 TJm +(manner) 29.8778 Tj +-288 TJm +(generates) 37.6188 Tj +-289 TJm +(a) 4.42339 Tj +-289 TJm +(stream) 26.5603 Tj +-289 TJm +(containing) 42.0621 Tj +-289 TJm +(multiple) 33.2153 Tj +-289 TJm +(compressed) 47.0334 Tj +-289 TJm +(\002le) 12.7322 Tj +-289 TJm +(representations.) 62.8042 Tj +-853 TJm +(Such) 19.9252 Tj +-289 TJm +(a) 4.42339 Tj +-289 TJm +(stream) 26.5603 Tj +72 174.917 Td +(can) 13.8281 Tj +-391 TJm +(be) 9.40469 Tj +-391 TJm +(decompressed) 56.4381 Tj +-390 TJm +(correctly) 35.4071 Tj +-391 TJm +(only) 17.7135 Tj +-391 TJm +(by) 9.9626 Tj +[1 0 0 1 238.116 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -238.116 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.116 174.917 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 268.004 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -268.004 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +271.897 174.917 Td +/F130_0 9.9626 Tf +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-391 TJm +(0.9.0) 19.9252 Tj +-391 TJm +(or) 8.29885 Tj +-391 TJm +(l) 2.7696 Tj +1 TJm +(ater) 14.9339 Tj +55 TJm +(.) 2.49065 Tj +-733 TJm +(Earlier) 27.1082 Tj +-391 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-391 TJm +(of) 8.29885 Tj +[1 0 0 1 448.071 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -448.071 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +448.071 174.917 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 477.958 174.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -477.958 -174.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +481.852 174.917 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-391 TJm +(stop) 16.6077 Tj +-391 TJm +(after) 18.2515 Tj +72 162.962 Td +(decompressing) 59.7656 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002rst) 15.5018 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 160.805] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -150.843] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 141.044 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 101.888 141.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -141.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.379 141.044 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 118.486 141.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.486 -141.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.486 141.044 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-dc) 17.9327 Tj +[1 0 0 1 172.284 141.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.284 -141.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.284 141.044 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-250 TJm +(decompresses) 55.3323 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(speci\002ed) 35.417 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 138.887] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -128.925] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 119.126 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.866 119.126 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-299 TJm +(read) 17.1456 Tj +-299 TJm +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-299 TJm +(from) 19.3673 Tj +-299 TJm +(the) 12.1743 Tj +-299 TJm +(en) 9.40469 Tj +40 TJm +(vironment) 40.9562 Tj +-298 TJm +(v) 4.9813 Tj +25 TJm +(ariables) 30.9837 Tj +[1 0 0 1 316.903 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.903 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +316.903 119.126 Td +/F134_0 9.9626 Tf +(BZIP2) 29.8878 Tj +[1 0 0 1 346.791 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -346.791 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +349.769 119.126 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 367.133 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -367.133 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +367.133 119.126 Td +/F134_0 9.9626 Tf +(BZIP) 23.9102 Tj +[1 0 0 1 391.043 119.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -391.043 -119.126] cm +[1 0 0 1 0 0] Tm +0 0 Td +391.043 119.126 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-299 TJm +(in) 7.7509 Tj +-299 TJm +(that) 14.9439 Tj +-299 TJm +(order) 21.0211 Tj +40 TJm +(,) 2.49065 Tj +-311 TJm +(and) 14.386 Tj +-299 TJm +(will) 15.5018 Tj +-299 TJm +(process) 29.8778 Tj +-299 TJm +(them) 19.9252 Tj +72 107.171 Td +(before) 25.4445 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-250 TJm +(read) 17.1456 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(command) 39.2925 Tj +-250 TJm +(line.) 17.4346 Tj +-310 TJm +(This) 17.7135 Tj +-250 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(enient) 24.3486 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(supply) 26.5703 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(ar) 7.74094 Tj +18 TJm +(guments.) 36.2539 Tj +[1 0 0 1 72 105.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -95.0517] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 85.2534 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-294 TJm +(is) 6.64505 Tj +-294 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-294 TJm +(performed,) 43.9849 Tj +-305 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-294 TJm +(if) 6.08715 Tj +-294 TJm +(the) 12.1743 Tj +-294 TJm +(compressed) 47.0334 Tj +-294 TJm +(\002le) 12.7322 Tj +-293 TJm +(is) 6.64505 Tj +-294 TJm +(slightly) 29.8978 Tj +-294 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-294 TJm +(than) 17.1556 Tj +-294 TJm +(the) 12.1743 Tj +-294 TJm +(original.) 33.4843 Tj +-884 TJm +(Files) 19.3773 Tj +-294 TJm +(of) 8.29885 Tj +-294 TJm +(less) 14.9439 Tj +-294 TJm +(than) 17.1556 Tj +72 73.2982 Td +(about) 22.1369 Tj +-246 TJm +(one) 14.386 Tj +-246 TJm +(hundred) 32.6474 Tj +-245 TJm +(bytes) 21.031 Tj +-246 TJm +(tend) 17.1556 Tj +-246 TJm +(to) 7.7509 Tj +-246 TJm +(get) 12.1743 Tj +-246 TJm +(l) 2.7696 Tj +1 TJm +(ar) 7.74094 Tj +18 TJm +(ger) 12.7222 Tj +40 TJm +(,) 2.49065 Tj +-247 TJm +(since) 20.4731 Tj +-246 TJm +(the) 12.1743 Tj +-246 TJm +(compression) 50.3609 Tj +-245 TJm +(mechanism) 45.3796 Tj +-246 TJm +(has) 13.2801 Tj +-246 TJm +(a) 4.42339 Tj +-246 TJm +(constant) 33.2053 Tj +-246 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erhead) 26.5503 Tj +-245 TJm +(in) 7.7509 Tj +-246 TJm +(the) 12.1743 Tj +-246 TJm +(re) 7.74094 Tj +15 TJm +(gion) 17.7135 Tj +-246 TJm +(of) 8.29885 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(3) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 7 7 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(50) 9.9626 Tj +-264 TJm +(bytes.) 23.5217 Tj +-351 TJm +(Random) 33.7633 Tj +-264 TJm +(dat) 12.1743 Tj +1 TJm +(a) 4.42339 Tj +-264 TJm +(\(including) 40.9562 Tj +-264 TJm +(the) 12.1743 Tj +-264 TJm +(output) 25.4644 Tj +-263 TJm +(of) 8.29885 Tj +-264 TJm +(most) 19.3773 Tj +-264 TJm +(\002le) 12.7322 Tj +-263 TJm +(compressors\)) 53.1206 Tj +-264 TJm +(is) 6.64505 Tj +-264 TJm +(coded) 23.7907 Tj +-263 TJm +(at) 7.193 Tj +-264 TJm +(about) 22.1369 Tj +-264 TJm +(8.05) 17.4346 Tj +-263 TJm +(bits) 14.396 Tj +-264 TJm +(per) 12.7222 Tj +-264 TJm +(byte,) 19.6462 Tj +-267 TJm +(gi) 7.7509 Tj +25 TJm +(ving) 17.7135 Tj +-264 TJm +(an) 9.40469 Tj +72 698.082 Td +(e) 4.42339 Tj +15 TJm +(xpansion) 35.9749 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(around) 27.6661 Tj +-250 TJm +(0.5%.) 23.2427 Tj +[1 0 0 1 72 695.925] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -686.081] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.283 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-268 TJm +(a) 4.42339 Tj +-268 TJm +(self-check) 40.9363 Tj +-269 TJm +(for) 11.6164 Tj +-268 TJm +(your) 18.2614 Tj +-268 TJm +(protection,) 42.889 Tj +[1 0 0 1 217.273 676.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -217.273 -676.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +217.273 676.283 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 247.161 676.283] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -247.161 -676.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +249.833 676.283 Td +/F130_0 9.9626 Tf +(uses) 17.1556 Tj +-268 TJm +(32-bit) 23.8007 Tj +-268 TJm +(CRCs) 23.8106 Tj +-269 TJm +(to) 7.7509 Tj +-268 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-268 TJm +(sure) 16.5977 Tj +-268 TJm +(that) 14.9439 Tj +-268 TJm +(the) 12.1743 Tj +-269 TJm +(decompressed) 56.4381 Tj +-268 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-268 TJm +(of) 8.29885 Tj +-268 TJm +(a) 4.42339 Tj +-268 TJm +(\002le) 12.7322 Tj +-269 TJm +(is) 6.64505 Tj +72 664.328 Td +(identical) 34.3112 Tj +-200 TJm +(to) 7.7509 Tj +-199 TJm +(the) 12.1743 Tj +-200 TJm +(original.) 33.4843 Tj +-586 TJm +(This) 17.7135 Tj +-200 TJm +(guards) 26.5603 Tj +-199 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-200 TJm +(corruption) 41.5042 Tj +-199 TJm +(of) 8.29885 Tj +-200 TJm +(the) 12.1743 Tj +-200 TJm +(compressed) 47.0334 Tj +-199 TJm +(data,) 19.0883 Tj +-210 TJm +(and) 14.386 Tj +-199 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-200 TJm +(undetected) 43.158 Tj +-200 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +-199 TJm +(in) 7.7509 Tj +[1 0 0 1 510.112 664.328] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -664.328] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 664.328 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 540 664.328] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -664.328] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 652.373 Td +/F130_0 9.9626 Tf +(\(hopefully) 41.5042 Tj +-275 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-274 TJm +(unlik) 20.4831 Tj +10 TJm +(ely\).) 17.9825 Tj +-384 TJm +(The) 15.4918 Tj +-275 TJm +(chances) 31.5316 Tj +-275 TJm +(of) 8.29885 Tj +-275 TJm +(data) 16.5977 Tj +-274 TJm +(corruption) 41.5042 Tj +-275 TJm +(going) 22.6948 Tj +-275 TJm +(undetected) 43.158 Tj +-274 TJm +(is) 6.64505 Tj +-275 TJm +(microscopic,) 51.1878 Tj +-281 TJm +(about) 22.1369 Tj +-275 TJm +(one) 14.386 Tj +-274 TJm +(chance) 27.6562 Tj +-275 TJm +(in) 7.7509 Tj +-275 TJm +(four) 16.5977 Tj +72 640.417 Td +(billion) 26.0223 Tj +-279 TJm +(for) 11.6164 Tj +-279 TJm +(each) 18.2515 Tj +-279 TJm +(\002le) 12.7322 Tj +-280 TJm +(processed.) 41.7732 Tj +-795 TJm +(Be) 11.0684 Tj +-279 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(are,) 14.655 Tj +-286 TJm +(though,) 30.1668 Tj +-287 TJm +(that) 14.9439 Tj +-279 TJm +(the) 12.1743 Tj +-279 TJm +(check) 23.2328 Tj +-279 TJm +(occurs) 26.0024 Tj +-279 TJm +(upon) 19.9252 Tj +-279 TJm +(decompression,) 62.2563 Tj +-287 TJm +(so) 8.85675 Tj +-279 TJm +(it) 5.53921 Tj +-279 TJm +(can) 13.8281 Tj +-279 TJm +(only) 17.7135 Tj +-280 TJm +(tell) 12.7322 Tj +-279 TJm +(you) 14.9439 Tj +72 628.462 Td +(that) 14.9439 Tj +-237 TJm +(something) 41.5142 Tj +-236 TJm +(is) 6.64505 Tj +-237 TJm +(wrong.) 27.9451 Tj +-611 TJm +(It) 6.08715 Tj +-237 TJm +(can') 17.1456 Tj +18 TJm +(t) 2.7696 Tj +-237 TJm +(help) 17.1556 Tj +-237 TJm +(you) 14.9439 Tj +-236 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-237 TJm +(the) 12.1743 Tj +-237 TJm +(original) 30.9936 Tj +-237 TJm +(uncompressed) 56.996 Tj +-236 TJm +(data.) 19.0883 Tj +-612 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-236 TJm +(can) 13.8281 Tj +-237 TJm +(use) 13.2801 Tj +[1 0 0 1 458.159 628.462] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -458.159 -628.462] cm +[1 0 0 1 0 0] Tm +0 0 Td +458.159 628.462 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 529.89 628.462] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -529.89 -628.462] cm +[1 0 0 1 0 0] Tm +0 0 Td +532.249 628.462 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +72 616.507 Td +(try) 11.0684 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(damaged) 35.965 Tj +-250 TJm +(\002les.) 19.0983 Tj +[1 0 0 1 72 614.35] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -604.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 594.708 Td +/F130_0 9.9626 Tf +(Return) 27.1182 Tj +-298 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +-406 TJm +(0) 4.9813 Tj +-298 TJm +(for) 11.6164 Tj +-298 TJm +(a) 4.42339 Tj +-298 TJm +(normal) 28.224 Tj +-298 TJm +(e) 4.42339 Tj +15 TJm +(xit,) 13.0112 Tj +-310 TJm +(1) 4.9813 Tj +-298 TJm +(for) 11.6164 Tj +-297 TJm +(en) 9.40469 Tj +40 TJm +(vironmental) 48.1492 Tj +-298 TJm +(problems) 37.0808 Tj +-298 TJm +(\(\002le) 16.0497 Tj +-298 TJm +(not) 12.7322 Tj +-298 TJm +(found,) 25.7334 Tj +-310 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +25 TJm +(alid) 14.9439 Tj +-298 TJm +(\003ags,) 21.31 Tj +-310 TJm +(I/O) 13.2801 Tj +-298 TJm +(errors,) 25.7234 Tj +-310 TJm +(etc.\),) 19.9152 Tj +-310 TJm +(2) 4.9813 Tj +-298 TJm +(to) 7.7509 Tj +72 582.753 Td +(indicate) 31.5416 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(corrupt) 28.772 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le,) 15.2229 Tj +-250 TJm +(3) 4.9813 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(internal) 30.4357 Tj +-250 TJm +(consistenc) 41.5042 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(\(e) 7.74094 Tj +15 TJm +(g,) 7.47195 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ug\)) 13.2801 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(caused) 27.1082 Tj +[1 0 0 1 443.065 582.753] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -443.065 -582.753] cm +[1 0 0 1 0 0] Tm +0 0 Td +443.065 582.753 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 472.953 582.753] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.953 -582.753] cm +[1 0 0 1 0 0] Tm +0 0 Td +475.444 582.753 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(panic.) 24.0696 Tj +[1 0 0 1 72 580.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -570.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 548.118 Td +/F122_0 20.6585 Tf +(2.4.) 34.4584 Tj +-278 TJm +(OPTIONS) 92.9839 Tj +[1 0 0 1 72 547.86] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -528.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 516.475 Td +/F134_0 9.9626 Tf +(-c) 11.9551 Tj +-600 TJm +(--stdout) 47.8205 Tj +[1 0 0 1 137.753 516.475] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -68.2441 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -516.32] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 504.52 Td +/F130_0 9.9626 Tf +(Compress) 39.8504 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(decompress) 47.0334 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(standard) 33.7533 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 502.363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -488.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 478.854 Td +/F134_0 9.9626 Tf +(-d) 11.9551 Tj +-600 TJm +(--decompress) 71.7307 Tj +[1 0 0 1 161.664 478.854] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -92.1544 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -477.32] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 466.899 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(orce) 17.1456 Tj +-296 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 200.214 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -200.214 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.214 466.899 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 230.102 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -230.102 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.102 466.899 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 235.659 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -235.659 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.659 466.899 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 277.502 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.502 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +280.454 466.899 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 297.791 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -297.791 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.791 466.899 Td +/F134_0 9.9626 Tf +(bzcat) 29.8878 Tj +[1 0 0 1 327.679 466.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -327.679 -466.899] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.631 466.899 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-296 TJm +(really) 22.6848 Tj +-296 TJm +(the) 12.1743 Tj +-297 TJm +(same) 20.4731 Tj +-296 TJm +(program,) 36.2439 Tj +-308 TJm +(and) 14.386 Tj +-296 TJm +(the) 12.1743 Tj +-296 TJm +(decision) 33.2053 Tj +-297 TJm +(about) 22.1369 Tj +108 454.944 Td +(what) 19.3673 Tj +-303 TJm +(actions) 28.224 Tj +-303 TJm +(to) 7.7509 Tj +-303 TJm +(tak) 12.1743 Tj +10 TJm +(e) 4.42339 Tj +-303 TJm +(is) 6.64505 Tj +-303 TJm +(done) 19.3673 Tj +-303 TJm +(on) 9.9626 Tj +-304 TJm +(the) 12.1743 Tj +-303 TJm +(basis) 19.9252 Tj +-303 TJm +(of) 8.29885 Tj +-303 TJm +(which) 24.3486 Tj +-303 TJm +(name) 21.579 Tj +-303 TJm +(is) 6.64505 Tj +-303 TJm +(used.) 20.7521 Tj +-939 TJm +(This) 17.7135 Tj +-303 TJm +(\003ag) 14.9439 Tj +-303 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(errides) 27.1082 Tj +-303 TJm +(that) 14.9439 Tj +-303 TJm +(mechanism,) 47.8703 Tj +-316 TJm +(and) 14.386 Tj +108 442.988 Td +(forces) 24.3386 Tj +-250 TJm +(bzip2) 22.1369 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(decompress.) 49.5241 Tj +[1 0 0 1 72 440.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -427.121] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 417.323 Td +/F134_0 9.9626 Tf +(-z) 11.9551 Tj +-600 TJm +(--compress) 59.7756 Tj +[1 0 0 1 149.709 417.323] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.1993 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -415.789] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 405.368 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(complement) 49.2551 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 187.969 405.368] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -187.969 -405.368] cm +[1 0 0 1 0 0] Tm +0 0 Td +187.969 405.368 Td +/F134_0 9.9626 Tf +(-d) 11.9551 Tj +[1 0 0 1 199.924 405.368] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -199.924 -405.368] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.924 405.368 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +-310 TJm +(forces) 24.3386 Tj +-250 TJm +(compression,) 52.8516 Tj +-250 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(ardless) 27.6661 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +20 TJm +(okation) 29.8878 Tj +-250 TJm +(name.) 24.0696 Tj +[1 0 0 1 72 403.211] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -389.5] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 379.702 Td +/F134_0 9.9626 Tf +(-t) 11.9551 Tj +-600 TJm +(--test) 35.8654 Tj +[1 0 0 1 125.798 379.702] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -56.2889 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -379.548] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 367.747 Td +/F130_0 9.9626 Tf +(Check) 25.4544 Tj +-270 TJm +(inte) 14.9439 Tj +15 TJm +(grity) 18.8194 Tj +-271 TJm +(of) 8.29885 Tj +-270 TJm +(the) 12.1743 Tj +-271 TJm +(speci\002ed) 35.417 Tj +-270 TJm +(\002le\(s\),) 25.7334 Tj +-276 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-270 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-270 TJm +(decompress) 47.0334 Tj +-271 TJm +(them.) 22.4159 Tj +-742 TJm +(This) 17.7135 Tj +-271 TJm +(really) 22.6848 Tj +-270 TJm +(performs) 35.965 Tj +-270 TJm +(a) 4.42339 Tj +-271 TJm +(trial) 16.0497 Tj +-270 TJm +(decompres-) 46.4755 Tj +108 355.791 Td +(sion) 16.6077 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(thro) 16.0497 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(result.) 24.6275 Tj +[1 0 0 1 72 353.635] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.924] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 330.126 Td +/F134_0 9.9626 Tf +(-f) 11.9551 Tj +-600 TJm +(--force) 41.8429 Tj +[1 0 0 1 131.776 330.126] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -62.2665 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -329.971] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 318.171 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(orce) 17.1456 Tj +-338 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erwrite) 28.2141 Tj +-339 TJm +(of) 8.29885 Tj +-338 TJm +(output) 25.4644 Tj +-338 TJm +(\002les.) 19.0983 Tj +-1150 TJm +(Normally) 38.1866 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 289.831 318.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.831 -318.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.831 318.171 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 319.719 318.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -319.719 -318.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +323.089 318.171 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-338 TJm +(not) 12.7322 Tj +-339 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(erwrite) 28.2141 Tj +-338 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-338 TJm +(output) 25.4644 Tj +-338 TJm +(\002les.) 19.0983 Tj +-1150 TJm +(Also) 18.8194 Tj +-339 TJm +(forces) 24.3386 Tj +[1 0 0 1 108 306.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -306.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 306.215 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 137.888 306.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.888 -306.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.379 306.215 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(break) 22.1269 Tj +-250 TJm +(hard) 17.7035 Tj +-250 TJm +(links) 19.3773 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(\002les,) 19.0983 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(otherwise) 38.7346 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ouldn') 26.0123 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(do.) 12.4533 Tj +[1 0 0 1 72 304.681] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -294.837] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 284.416 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 137.888 284.416] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.888 -284.416] cm +[1 0 0 1 0 0] Tm +0 0 Td +141.211 284.416 Td +/F130_0 9.9626 Tf +(normally) 35.9749 Tj +-334 TJm +(declines) 32.6474 Tj +-333 TJm +(to) 7.7509 Tj +-334 TJm +(decompress) 47.0334 Tj +-333 TJm +(\002les) 16.6077 Tj +-334 TJm +(which) 24.3486 Tj +-333 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-334 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-333 TJm +(the) 12.1743 Tj +-334 TJm +(correct) 27.6562 Tj +-333 TJm +(magic) 24.3486 Tj +-334 TJm +(header) 26.5503 Tj +-333 TJm +(bytes.) 23.5217 Tj +-561 TJm +(If) 6.63509 Tj +-334 TJm +(forced) 25.4445 Tj +108 272.461 Td +(\() 3.31755 Tj +[1 0 0 1 111.318 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -111.318 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +111.318 272.461 Td +/F134_0 9.9626 Tf +(-f) 11.9551 Tj +[1 0 0 1 123.273 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.273 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.273 272.461 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(we) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +40 TJm +(,) 2.49065 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(pass) 17.1556 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(through) 30.9936 Tj +-250 TJm +(unmodi\002ed.) 47.8803 Tj +-310 TJm +(This) 17.7135 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(GNU) 21.579 Tj +[1 0 0 1 412.585 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -412.585 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +412.585 272.461 Td +/F134_0 9.9626 Tf +(gzip) 23.9102 Tj +[1 0 0 1 436.496 272.461] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -436.496 -272.461] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.986 272.461 Td +/F130_0 9.9626 Tf +(beha) 18.8094 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(es.) 10.7895 Tj +[1 0 0 1 72 270.304] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -256.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 246.795 Td +/F134_0 9.9626 Tf +(-k) 11.9551 Tj +-600 TJm +(--keep) 35.8654 Tj +[1 0 0 1 125.798 246.795] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -56.2889 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -245.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 234.84 Td +/F130_0 9.9626 Tf +(K) 7.193 Tj +25 TJm +(eep) 13.8281 Tj +-250 TJm +(\(don') 21.579 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(delete\)) 27.1082 Tj +-250 TJm +(input) 20.4831 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(during) 26.0123 Tj +-250 TJm +(compression) 50.3609 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 72 232.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -218.973] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 209.174 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +-600 TJm +(--small) 41.8429 Tj +[1 0 0 1 131.776 209.174] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -62.2665 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -209.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 197.219 Td +/F130_0 9.9626 Tf +(Reduce) 29.8778 Tj +-347 TJm +(memory) 33.2053 Tj +-347 TJm +(usage,) 25.1755 Tj +-371 TJm +(for) 11.6164 Tj +-346 TJm +(compression,) 52.8516 Tj +-371 TJm +(decompression) 59.7656 Tj +-347 TJm +(and) 14.386 Tj +-347 TJm +(testing.) 29.0609 Tj +-1201 TJm +(Files) 19.3773 Tj +-347 TJm +(are) 12.1643 Tj +-347 TJm +(decompressed) 56.4381 Tj +-346 TJm +(and) 14.386 Tj +-347 TJm +(tested) 23.2427 Tj +108 185.264 Td +(using) 21.589 Tj +-388 TJm +(a) 4.42339 Tj +-388 TJm +(modi\002ed) 35.427 Tj +-388 TJm +(algorithm) 38.7446 Tj +-389 TJm +(which) 24.3486 Tj +-388 TJm +(only) 17.7135 Tj +-388 TJm +(requires) 32.0895 Tj +-388 TJm +(2.5) 12.4533 Tj +-388 TJm +(bytes) 21.031 Tj +-388 TJm +(per) 12.7222 Tj +-388 TJm +(block) 22.1369 Tj +-389 TJm +(byte.) 19.6462 Tj +-1448 TJm +(This) 17.7135 Tj +-389 TJm +(means) 25.4544 Tj +-388 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-388 TJm +(\002le) 12.7322 Tj +-388 TJm +(can) 13.8281 Tj +-388 TJm +(be) 9.40469 Tj +108 173.309 Td +(decompressed) 56.4381 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(2300k) 24.9065 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(albeit) 22.1369 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(about) 22.1369 Tj +-250 TJm +(half) 15.4918 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(speed.) 25.1755 Tj +[1 0 0 1 72 171.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -161.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 151.51 Td +/F130_0 9.9626 Tf +(During) 28.224 Tj +-252 TJm +(compr) 25.4544 Tj +1 TJm +(ession,) 27.3972 Tj +[1 0 0 1 194.09 151.51] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194.09 -151.51] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.09 151.51 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +[1 0 0 1 206.046 151.51] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -206.046 -151.51] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.551 151.51 Td +/F130_0 9.9626 Tf +(selects) 26.5603 Tj +-251 TJm +(a) 4.42339 Tj +-252 TJm +(block) 22.1369 Tj +-251 TJm +(size) 15.4918 Tj +-252 TJm +(of) 8.29885 Tj +-252 TJm +(200k,) 22.4159 Tj +-251 TJm +(which) 24.3486 Tj +-252 TJm +(limits) 22.7048 Tj +-251 TJm +(memory) 33.2053 Tj +-252 TJm +(use) 13.2801 Tj +-251 TJm +(to) 7.7509 Tj +-252 TJm +(around) 27.6661 Tj +-251 TJm +(the) 12.1743 Tj +-252 TJm +(same) 20.4731 Tj +-251 TJm +(\002gure,) 25.7334 Tj +-252 TJm +(at) 7.193 Tj +108 139.554 Td +(the) 12.1743 Tj +-287 TJm +(e) 4.42339 Tj +15 TJm +(xpense) 27.6661 Tj +-287 TJm +(of) 8.29885 Tj +-288 TJm +(your) 18.2614 Tj +-287 TJm +(compression) 50.3609 Tj +-287 TJm +(ratio.) 20.7521 Tj +-843 TJm +(In) 8.29885 Tj +-287 TJm +(short,) 22.4159 Tj +-297 TJm +(if) 6.08715 Tj +-287 TJm +(your) 18.2614 Tj +-287 TJm +(machine) 33.7533 Tj +-287 TJm +(is) 6.64505 Tj +-287 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +-287 TJm +(on) 9.9626 Tj +-288 TJm +(memory) 33.2053 Tj +-287 TJm +(\(8) 8.29885 Tj +-287 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abytes) 25.4544 Tj +-287 TJm +(or) 8.29885 Tj +-287 TJm +(less\),) 20.7521 Tj +108 127.599 Td +(use) 13.2801 Tj +[1 0 0 1 123.771 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -123.771 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.771 127.599 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +[1 0 0 1 135.726 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -135.726 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.216 127.599 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-250 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(erything.) 35.696 Tj +-620 TJm +(See) 14.386 Tj +[1 0 0 1 220.079 127.599] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -220.079 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.079 127.599 Td +/F130_0 9.9626 Tf +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-250 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 337.946 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -337.946 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +340.437 127.599 Td +/F130_0 9.9626 Tf +([5]) 11.6164 Tj +[1 0 0 1 352.053 127.599] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.053 -127.599] cm +[1 0 0 1 0 0] Tm +0 0 Td +354.544 127.599 Td +/F130_0 9.9626 Tf +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 125.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -111.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 101.934 Td +/F134_0 9.9626 Tf +(-q) 11.9551 Tj +-600 TJm +(--quiet) 41.8429 Tj +[1 0 0 1 131.776 101.934] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -62.2665 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -100.399] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 89.9784 Td +/F130_0 9.9626 Tf +(Suppress) 35.9749 Tj +-221 TJm +(non-essential) 52.5726 Tj +-220 TJm +(w) 7.193 Tj +10 TJm +(arning) 25.4544 Tj +-221 TJm +(messages.) 40.1194 Tj +-300 TJm +(Messages) 38.7346 Tj +-221 TJm +(pertaining) 40.3983 Tj +-221 TJm +(to) 7.7509 Tj +-220 TJm +(I/O) 13.2801 Tj +-221 TJm +(errors) 23.2328 Tj +-221 TJm +(and) 14.386 Tj +-220 TJm +(other) 20.4731 Tj +-221 TJm +(critical) 27.6661 Tj +-221 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ents) 16.0497 Tj +-221 TJm +(wi) 9.9626 Tj +1 TJm +(ll) 5.53921 Tj +-221 TJm +(not) 12.7322 Tj +108 78.0232 Td +(be) 9.40469 Tj +-250 TJm +(suppressed.) 46.2065 Tj +[1 0 0 1 72 75.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.8664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.8518 Td +/F130_0 9.9626 Tf +(4) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 8 8 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F134_0 9.9626 Tf +(-v) 11.9551 Tj +-600 TJm +(--verbose) 53.798 Tj +[1 0 0 1 143.731 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -74.2217 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -709.883] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 698.082 Td +/F130_0 9.9626 Tf +(V) 7.193 Tj +111 TJm +(erbose) 26.0024 Tj +-323 TJm +(mode) 22.1369 Tj +-322 TJm +(--) 6.63509 Tj +-323 TJm +(sho) 13.8381 Tj +25 TJm +(w) 7.193 Tj +-322 TJm +(the) 12.1743 Tj +-323 TJm +(compression) 50.3609 Tj +-323 TJm +(ratio) 18.2614 Tj +-322 TJm +(for) 11.6164 Tj +-323 TJm +(each) 18.2515 Tj +-322 TJm +(\002le) 12.7322 Tj +-323 TJm +(processed.) 41.7732 Tj +-1056 TJm +(Further) 29.3299 Tj +[1 0 0 1 430.015 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -430.015 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +430.015 698.082 Td +/F134_0 9.9626 Tf +(-v) 11.9551 Tj +[1 0 0 1 441.97 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.97 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.97 698.082 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-323 TJm +(increase) 32.6375 Tj +-322 TJm +(the) 12.1743 Tj +-323 TJm +(v) 4.9813 Tj +15 TJm +(erbosity) 32.0995 Tj +108 686.127 Td +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el,) 9.68365 Tj +-250 TJm +(spe) 13.2801 Tj +25 TJm +(wing) 19.9252 Tj +-250 TJm +(out) 12.7322 Tj +-250 TJm +(lots) 14.396 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(information) 47.0434 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(primarily) 37.0808 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(interest) 29.3299 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(diagnostic) 40.9562 Tj +-250 TJm +(purposes.) 37.9077 Tj +[1 0 0 1 72 683.97] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -670.023] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 660.224 Td +/F134_0 9.9626 Tf +(-L) 11.9551 Tj +-600 TJm +(--license) 53.798 Tj +-600 TJm +(-V) 11.9551 Tj +-600 TJm +(--version) 53.798 Tj +[1 0 0 1 221.44 660.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.93 -0.1544] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -660.07] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 648.269 Td +/F130_0 9.9626 Tf +(Display) 30.9936 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(softw) 22.1369 Tj +10 TJm +(are) 12.1643 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersion,) 26.8392 Tj +-250 TJm +(license) 27.6661 Tj +-250 TJm +(terms) 22.1369 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(conditions.) 44.0048 Tj +[1 0 0 1 72 646.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -632.165] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 622.366 Td +/F134_0 9.9626 Tf +(-1) 11.9551 Tj +[1 0 0 1 83.9552 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.9552 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.4458 622.366 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 100.553 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -100.553 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +100.553 622.366 Td +/F134_0 9.9626 Tf +(--fast) 35.8654 Tj +[1 0 0 1 136.418 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.418 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +136.418 622.366 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 152.468 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -152.468 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.468 622.366 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 164.423 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.423 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.914 622.366 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 181.021 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -181.021 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.021 622.366 Td +/F134_0 9.9626 Tf +(-best) 29.8878 Tj +[1 0 0 1 210.909 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.909 -622.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.909 622.366 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +[1 0 0 1 214.226 622.366] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -142.226 -1.7832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -620.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 610.411 Td +/F130_0 9.9626 Tf +(Set) 12.7322 Tj +-288 TJm +(the) 12.1743 Tj +-289 TJm +(block) 22.1369 Tj +-288 TJm +(size) 15.4918 Tj +-288 TJm +(to) 7.7509 Tj +-288 TJm +(100) 14.9439 Tj +-289 TJm +(k,) 7.47195 Tj +-298 TJm +(200) 14.9439 Tj +-288 TJm +(k) 4.9813 Tj +-288 TJm +(...) 7.47195 Tj +-850 TJm +(900) 14.9439 Tj +-288 TJm +(k) 4.9813 Tj +-288 TJm +(when) 21.579 Tj +-289 TJm +(compressing.) 52.8516 Tj +-849 TJm +(Has) 15.4918 Tj +-289 TJm +(no) 9.9626 Tj +-288 TJm +(ef) 7.74094 Tj +25 TJm +(fect) 14.9339 Tj +-288 TJm +(when) 21.579 Tj +-288 TJm +(decompressing.) 62.2563 Tj +-850 TJm +(See) 14.386 Tj +[1 0 0 1 108 598.456] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -108 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 598.456 Td +/F130_0 9.9626 Tf +(MEMOR) 37.6387 Tj +65 TJm +(Y) 7.193 Tj +-297 TJm +(MAN) 23.2427 Tj +35 TJm +(A) 7.193 Tj +40 TJm +(GEMENT) 41.5042 Tj +[1 0 0 1 226.338 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -226.338 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.3 598.456 Td +/F130_0 9.9626 Tf +([5]) 11.6164 Tj +[1 0 0 1 240.916 598.456] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.916 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.878 598.456 Td +/F130_0 9.9626 Tf +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +-904 TJm +(The) 15.4918 Tj +[1 0 0 1 297.278 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -297.278 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.278 598.456 Td +/F134_0 9.9626 Tf +(--fast) 35.8654 Tj +[1 0 0 1 333.144 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -333.144 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +336.106 598.456 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 353.454 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.454 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.454 598.456 Td +/F134_0 9.9626 Tf +(--best) 35.8654 Tj +[1 0 0 1 389.319 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -389.319 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.281 598.456 Td +/F130_0 9.9626 Tf +(aliases) 26.5603 Tj +-297 TJm +(are) 12.1643 Tj +-298 TJm +(primarily) 37.0808 Tj +-297 TJm +(for) 11.6164 Tj +-297 TJm +(GNU) 21.579 Tj +[1 0 0 1 516.09 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.09 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.09 598.456 Td +/F134_0 9.9626 Tf +(gzip) 23.9102 Tj +[1 0 0 1 540 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -598.456] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 586.501 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +65 TJm +(.) 2.49065 Tj +-356 TJm +(In) 8.29885 Tj +-265 TJm +(particular) 38.1767 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 220.423 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.423 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.423 586.501 Td +/F134_0 9.9626 Tf +(--fast) 35.8654 Tj +[1 0 0 1 256.288 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -256.288 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.932 586.501 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-265 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-266 TJm +(things) 24.3586 Tj +-265 TJm +(signi\002cantly) 49.2651 Tj +-265 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +55 TJm +(.) 2.49065 Tj +-712 TJm +(And) 17.1556 Tj +[1 0 0 1 444.622 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.622 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +444.622 586.501 Td +/F134_0 9.9626 Tf +(--best) 35.8654 Tj +[1 0 0 1 480.487 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -480.487 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +483.131 586.501 Td +/F130_0 9.9626 Tf +(merely) 27.6661 Tj +-265 TJm +(selects) 26.5603 Tj +108 574.546 Td +(the) 12.1743 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 574.446] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -560.498] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 548.643 Td +/F134_0 9.9626 Tf +(--) 11.9551 Tj +[1 0 0 1 83.9552 548.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -14.4458 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -548.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 536.688 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +35 TJm +(reats) 18.8094 Tj +-261 TJm +(all) 9.9626 Tj +-261 TJm +(subsequent) 44.2738 Tj +-260 TJm +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-261 TJm +(as) 8.29885 Tj +-261 TJm +(\002le) 12.7322 Tj +-261 TJm +(names,) 27.9451 Tj +-263 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-261 TJm +(if) 6.08715 Tj +-261 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-260 TJm +(start) 17.1556 Tj +-261 TJm +(with) 17.7135 Tj +-261 TJm +(a) 4.42339 Tj +-261 TJm +(dash.) 20.7521 Tj +-685 TJm +(This) 17.7135 Tj +-260 TJm +(is) 6.64505 Tj +-261 TJm +(so) 8.85675 Tj +-261 TJm +(you) 14.9439 Tj +-261 TJm +(can) 13.8281 Tj +-260 TJm +(handle) 26.5603 Tj +-261 TJm +(\002les) 16.6077 Tj +108 524.732 Td +(with) 17.7135 Tj +-250 TJm +(names) 25.4544 Tj +-250 TJm +(be) 9.40469 Tj +15 TJm +(ginning) 30.4457 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(dash,) 20.7521 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xample:) 32.0995 Tj +[1 0 0 1 302.27 524.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.27 -524.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.27 524.732 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(--) 11.9551 Tj +-600 TJm +(-myfilename) 65.7532 Tj +[1 0 0 1 421.821 524.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -421.821 -524.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +421.821 524.732 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 522.576] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -508.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 498.83 Td +/F134_0 9.9626 Tf +(--repetitive-fast) 101.619 Tj +[1 0 0 1 173.619 498.83] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -498.83] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.619 498.83 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 178.6 498.83] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.582 -498.83] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.582 498.83 Td +/F134_0 9.9626 Tf +(--repetitive-best) 101.619 Tj +[1 0 0 1 285.2 498.83] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.691 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -497.295] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 486.874 Td +/F130_0 9.9626 Tf +(These) 23.7907 Tj +-207 TJm +(\003ags) 18.8194 Tj +-206 TJm +(are) 12.1643 Tj +-207 TJm +(redundant) 39.8404 Tj +-207 TJm +(in) 7.7509 Tj +-206 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-207 TJm +(0.9.5) 19.9252 Tj +-207 TJm +(and) 14.386 Tj +-206 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +-591 TJm +(The) 15.4918 Tj +15 TJm +(y) 4.9813 Tj +-207 TJm +(pro) 13.2801 Tj +15 TJm +(vided) 22.1369 Tj +-207 TJm +(some) 21.031 Tj +-207 TJm +(c) 4.42339 Tj +1 TJm +(o) 4.9813 Tj +-1 TJm +(a) 4.42339 Tj +1 TJm +(rse) 11.6164 Tj +-207 TJm +(control) 28.224 Tj +-207 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-207 TJm +(the) 12.1743 Tj +-206 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +108 474.919 Td +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-251 TJm +(sorting) 27.6761 Tj +-250 TJm +(algorithm) 38.7446 Tj +-250 TJm +(in) 7.7509 Tj +-251 TJm +(earlier) 25.4445 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersions,) 30.7147 Tj +-250 TJm +(which) 24.3486 Tj +-251 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(sometimes) 42.62 Tj +-250 TJm +(useful.) 26.8392 Tj +-622 TJm +(0.9.5) 19.9252 Tj +-251 TJm +(and) 14.386 Tj +-250 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-251 TJm +(an) 9.40469 Tj +-250 TJm +(impro) 23.8007 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ed) 9.40469 Tj +108 462.964 Td +(algorithm) 38.7446 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(renders) 29.3199 Tj +-250 TJm +(these) 20.4731 Tj +-250 TJm +(\003ags) 18.8194 Tj +-250 TJm +(irrele) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant.) 14.6649 Tj +[1 0 0 1 72 460.807] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -436.897] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 414.264 Td +/F122_0 20.6585 Tf +(2.5.) 34.4584 Tj +-278 TJm +(MEMOR) 79.184 Tj +50 TJm +(Y) 13.7792 Tj +-278 TJm +(MANA) 61.9548 Tj +50 TJm +(GEMENT) 88.3771 Tj +[1 0 0 1 72 414.005] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -404.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 392.346 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 392.346] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -392.346] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.454 392.346 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-258 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-257 TJm +(\002les) 16.6077 Tj +-258 TJm +(in) 7.7509 Tj +-257 TJm +(blocks.) 28.503 Tj +-666 TJm +(The) 15.4918 Tj +-257 TJm +(block) 22.1369 Tj +-258 TJm +(size) 15.4918 Tj +-258 TJm +(af) 7.74094 Tj +25 TJm +(fects) 18.8094 Tj +-257 TJm +(both) 17.7135 Tj +-258 TJm +(the) 12.1743 Tj +-257 TJm +(compression) 50.3609 Tj +-258 TJm +(ratio) 18.2614 Tj +-257 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed,) 11.8953 Tj +-260 TJm +(and) 14.386 Tj +-258 TJm +(the) 12.1743 Tj +-257 TJm +(amount) 29.8878 Tj +72 380.391 Td +(of) 8.29885 Tj +-215 TJm +(memory) 33.2053 Tj +-215 TJm +(needed) 28.2141 Tj +-215 TJm +(for) 11.6164 Tj +-215 TJm +(compression) 50.3609 Tj +-214 TJm +(and) 14.386 Tj +-215 TJm +(decompression.) 62.2563 Tj +-597 TJm +(The) 15.4918 Tj +-215 TJm +(\003ags) 18.8194 Tj +[1 0 0 1 337.719 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -337.719 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +337.719 380.391 Td +/F134_0 9.9626 Tf +(-1) 11.9551 Tj +[1 0 0 1 349.674 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -349.674 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +351.815 380.391 Td +/F130_0 9.9626 Tf +(through) 30.9936 Tj +[1 0 0 1 384.95 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.95 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.95 380.391 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 396.905 380.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -396.905 -380.391] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.046 380.391 Td +/F130_0 9.9626 Tf +(specify) 28.772 Tj +-215 TJm +(the) 12.1743 Tj +-215 TJm +(block) 22.1369 Tj +-215 TJm +(size) 15.4918 Tj +-215 TJm +(to) 7.7509 Tj +-214 TJm +(be) 9.40469 Tj +-215 TJm +(100,000) 32.3785 Tj +72 368.435 Td +(bytes) 21.031 Tj +-278 TJm +(through) 30.9936 Tj +-277 TJm +(900,000) 32.3785 Tj +-278 TJm +(bytes) 21.031 Tj +-278 TJm +(\(the) 15.4918 Tj +-277 TJm +(def) 12.7222 Tj +10 TJm +(ault\)) 18.2614 Tj +-278 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +-786 TJm +(At) 9.9626 Tj +-278 TJm +(decompression) 59.7656 Tj +-278 TJm +(time,) 20.2042 Tj +-284 TJm +(the) 12.1743 Tj +-278 TJm +(block) 22.1369 Tj +-278 TJm +(size) 15.4918 Tj +-277 TJm +(used) 18.2614 Tj +-278 TJm +(for) 11.6164 Tj +-278 TJm +(compression) 50.3609 Tj +72 356.48 Td +(is) 6.64505 Tj +-243 TJm +(read) 17.1456 Tj +-242 TJm +(from) 19.3673 Tj +-243 TJm +(the) 12.1743 Tj +-242 TJm +(header) 26.5503 Tj +-243 TJm +(of) 8.29885 Tj +-242 TJm +(the) 12.1743 Tj +-243 TJm +(compressed) 47.0334 Tj +-242 TJm +(\002le,) 15.2229 Tj +-244 TJm +(and) 14.386 Tj +[1 0 0 1 275.174 356.48] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -275.174 -356.48] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.174 356.48 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 317.017 356.48] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -317.017 -356.48] cm +[1 0 0 1 0 0] Tm +0 0 Td +319.433 356.48 Td +/F130_0 9.9626 Tf +(then) 17.1556 Tj +-243 TJm +(all) 9.9626 Tj +1 TJm +(o) 4.9813 Tj +-1 TJm +(c) 4.42339 Tj +1 TJm +(ates) 15.4918 Tj +-243 TJm +(itself) 19.9252 Tj +-242 TJm +(just) 14.396 Tj +-243 TJm +(enough) 29.3299 Tj +-243 TJm +(memory) 33.2053 Tj +-242 TJm +(to) 7.7509 Tj +-243 TJm +(decompress) 47.0334 Tj +72 344.525 Td +(the) 12.1743 Tj +-303 TJm +(\002le.) 15.2229 Tj +-940 TJm +(Since) 22.1369 Tj +-304 TJm +(block) 22.1369 Tj +-303 TJm +(sizes) 19.3673 Tj +-303 TJm +(are) 12.1643 Tj +-303 TJm +(stored) 24.3486 Tj +-304 TJm +(in) 7.7509 Tj +-303 TJm +(compressed) 47.0334 Tj +-303 TJm +(\002les,) 19.0983 Tj +-317 TJm +(it) 5.53921 Tj +-303 TJm +(follo) 18.8194 Tj +25 TJm +(ws) 11.0684 Tj +-304 TJm +(that) 14.9439 Tj +-303 TJm +(the) 12.1743 Tj +-303 TJm +(\003ags) 18.8194 Tj +[1 0 0 1 406.35 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.35 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.35 344.525 Td +/F134_0 9.9626 Tf +(-1) 11.9551 Tj +[1 0 0 1 418.305 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.305 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +421.327 344.525 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +[1 0 0 1 432.1 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -432.1 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +432.1 344.525 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 444.055 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.055 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +447.077 344.525 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-303 TJm +(irrele) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant) 12.1743 Tj +-304 TJm +(to) 7.7509 Tj +-303 TJm +(and) 14.386 Tj +-303 TJm +(so) 8.85675 Tj +72 332.57 Td +(ignored) 30.4357 Tj +-250 TJm +(during) 26.0123 Tj +-250 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 72 330.413] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -320.45] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 310.652 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(requirements,) 54.5054 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(bytes,) 23.5217 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(estimated) 38.1866 Tj +-250 TJm +(as:) 11.0684 Tj +[1 0 0 1 72 308.495] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -299.13] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 299.13 Td +/F134_0 9.9626 Tf +(Compression:) 71.7307 Tj +-1278 TJm +(400k) 23.9102 Tj +-426 TJm +(+) 5.97756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(8) 5.97756 Tj +-426 TJm +(x) 5.97756 Tj +-426 TJm +(block) 29.8878 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(\)) 5.97756 Tj +90 275.22 Td +(Decompression:) 83.6858 Tj +-426 TJm +(100k) 23.9102 Tj +-426 TJm +(+) 5.97756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +-426 TJm +(x) 5.97756 Tj +-426 TJm +(block) 29.8878 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(\),) 11.9551 Tj +-426 TJm +(or) 11.9551 Tj +153.66 263.265 Td +(100k) 23.9102 Tj +-426 TJm +(+) 5.97756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(2.5) 17.9327 Tj +-426 TJm +(x) 5.97756 Tj +-426 TJm +(block) 29.8878 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(\)) 5.97756 Tj +[1 0 0 1 72 247.723] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -237.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 225.805 Td +/F130_0 9.9626 Tf +(Lar) 13.8281 Tj +18 TJm +(ger) 12.7222 Tj +-292 TJm +(block) 22.1369 Tj +-292 TJm +(sizes) 19.3673 Tj +-291 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-292 TJm +(rapidly) 28.224 Tj +-292 TJm +(diminishing) 47.6113 Tj +-292 TJm +(mar) 15.4918 Tj +18 TJm +(ginal) 19.9252 Tj +-291 TJm +(returns.) 30.1568 Tj +-871 TJm +(Most) 20.4831 Tj +-292 TJm +(of) 8.29885 Tj +-291 TJm +(the) 12.1743 Tj +-292 TJm +(compression) 50.3609 Tj +-292 TJm +(comes) 25.4544 Tj +-292 TJm +(from) 19.3673 Tj +-291 TJm +(the) 12.1743 Tj +-292 TJm +(\002rst) 15.5018 Tj +-292 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-292 TJm +(or) 8.29885 Tj +72 213.85 Td +(three) 19.9152 Tj +-232 TJm +(hundred) 32.6474 Tj +-232 TJm +(k) 4.9813 Tj +-232 TJm +(of) 8.29885 Tj +-232 TJm +(block) 22.1369 Tj +-232 TJm +(size,) 17.9825 Tj +-235 TJm +(a) 4.42339 Tj +-232 TJm +(f) 3.31755 Tj +10 TJm +(act) 11.6164 Tj +-232 TJm +(w) 7.193 Tj +10 TJm +(orth) 16.0497 Tj +-232 TJm +(bearing) 29.8778 Tj +-232 TJm +(in) 7.7509 Tj +-232 TJm +(mind) 20.4831 Tj +-232 TJm +(when) 21.579 Tj +-231 TJm +(using) 21.589 Tj +[1 0 0 1 354.025 213.85] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -354.025 -213.85] cm +[1 0 0 1 0 0] Tm +0 0 Td +354.025 213.85 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 383.913 213.85] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -383.913 -213.85] cm +[1 0 0 1 0 0] Tm +0 0 Td +386.223 213.85 Td +/F130_0 9.9626 Tf +(on) 9.9626 Tj +-232 TJm +(small) 21.589 Tj +-232 TJm +(machines.) 40.1194 Tj +-304 TJm +(It) 6.08715 Tj +-232 TJm +(is) 6.64505 Tj +-232 TJm +(also) 16.0497 Tj +-231 TJm +(important) 38.7446 Tj +72 201.895 Td +(to) 7.7509 Tj +-250 TJm +(appreciate) 40.9363 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(requirement) 48.1393 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(set) 11.0684 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(compression) 50.3609 Tj +-250 TJm +(time) 17.7135 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(choice) 26.0024 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(size.) 17.9825 Tj +[1 0 0 1 72 199.738] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -189.776] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 179.977 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-388 TJm +(\002les) 16.6077 Tj +-389 TJm +(compressed) 47.0334 Tj +-388 TJm +(with) 17.7135 Tj +-389 TJm +(the) 12.1743 Tj +-388 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-389 TJm +(900k) 19.9252 Tj +-388 TJm +(block) 22.1369 Tj +-389 TJm +(size,) 17.9825 Tj +[1 0 0 1 302.002 179.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.002 -179.977] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.002 179.977 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 343.846 179.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -343.846 -179.977] cm +[1 0 0 1 0 0] Tm +0 0 Td +347.715 179.977 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-388 TJm +(require) 28.2141 Tj +-389 TJm +(about) 22.1369 Tj +-388 TJm +(3700) 19.9252 Tj +-389 TJm +(kbytes) 26.0123 Tj +-388 TJm +(to) 7.7509 Tj +-389 TJm +(decompress.) 49.5241 Tj +72 168.022 Td +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-424 TJm +(support) 29.8878 Tj +-425 TJm +(decompression) 59.7656 Tj +-424 TJm +(of) 8.29885 Tj +-424 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-425 TJm +(\002l) 8.30881 Tj +1 TJm +(e) 4.42339 Tj +-425 TJm +(on) 9.9626 Tj +-424 TJm +(a) 4.42339 Tj +-424 TJm +(4) 4.9813 Tj +-425 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abyte) 21.579 Tj +-424 TJm +(machine,) 36.2439 Tj +[1 0 0 1 348.272 168.022] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -348.272 -168.022] cm +[1 0 0 1 0 0] Tm +0 0 Td +348.272 168.022 Td +/F134_0 9.9626 Tf +(bunzip2) 41.8429 Tj +[1 0 0 1 390.115 168.022] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -390.115 -168.022] cm +[1 0 0 1 0 0] Tm +0 0 Td +394.342 168.022 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-424 TJm +(an) 9.40469 Tj +-425 TJm +(option) 25.4644 Tj +-424 TJm +(to) 7.7509 Tj +-424 TJm +(decompress) 47.0334 Tj +-424 TJm +(using) 21.589 Tj +72 156.067 Td +(approximately) 57.5539 Tj +-281 TJm +(half) 15.4918 Tj +-281 TJm +(this) 14.396 Tj +-280 TJm +(amount) 29.8878 Tj +-281 TJm +(of) 8.29885 Tj +-281 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-288 TJm +(about) 22.1369 Tj +-281 TJm +(2300) 19.9252 Tj +-281 TJm +(kbytes.) 28.503 Tj +-805 TJm +(Decompression) 61.9773 Tj +-280 TJm +(speed) 22.6848 Tj +-281 TJm +(is) 6.64505 Tj +-281 TJm +(also) 16.0497 Tj +-281 TJm +(halv) 17.1556 Tj +15 TJm +(ed,) 11.8953 Tj +-288 TJm +(so) 8.85675 Tj +-281 TJm +(you) 14.9439 Tj +-281 TJm +(should) 26.5703 Tj +72 144.112 Td +(use) 13.2801 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(option) 25.4644 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(where) 24.3386 Tj +-250 TJm +(necessary) 38.7246 Tj +65 TJm +(.) 2.49065 Tj +-620 TJm +(The) 15.4918 Tj +-250 TJm +(rele) 14.9339 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant) 12.1743 Tj +-250 TJm +(\003ag) 14.9439 Tj +-250 TJm +(is) 6.64505 Tj +[1 0 0 1 305.024 144.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.024 -144.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.024 144.112 Td +/F134_0 9.9626 Tf +(-s) 11.9551 Tj +[1 0 0 1 316.979 144.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.979 -144.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +316.979 144.112 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 141.955] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -131.992] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 122.194 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +-204 TJm +(general,) 31.8106 Tj +-214 TJm +(try) 11.0684 Tj +-204 TJm +(and) 14.386 Tj +-205 TJm +(use) 13.2801 Tj +-204 TJm +(the) 12.1743 Tj +-204 TJm +(lar) 10.5105 Tj +18 TJm +(gest) 16.0497 Tj +-205 TJm +(block) 22.1369 Tj +-204 TJm +(size) 15.4918 Tj +-205 TJm +(memory) 33.2053 Tj +-204 TJm +(constraints) 43.1679 Tj +-204 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-214 TJm +(since) 20.4731 Tj +-204 TJm +(that) 14.9439 Tj +-205 TJm +(maximises) 42.62 Tj +-204 TJm +(the) 12.1743 Tj +-204 TJm +(compression) 50.3609 Tj +-205 TJm +(achie) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ed.) 11.8953 Tj +72 110.239 Td +(Compression) 52.5826 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(speed) 22.6848 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(virtually) 33.7633 Tj +-250 TJm +(unaf) 17.7035 Tj +25 TJm +(fected) 24.3386 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(size.) 17.9825 Tj +[1 0 0 1 72 108.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -98.1193] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 88.321 Td +/F130_0 9.9626 Tf +(Another) 32.6474 Tj +-296 TJm +(signi\002cant) 41.5142 Tj +-296 TJm +(point) 20.4831 Tj +-295 TJm +(applies) 28.224 Tj +-296 TJm +(to) 7.7509 Tj +-296 TJm +(\002les) 16.6077 Tj +-296 TJm +(which) 24.3486 Tj +-296 TJm +(\002t) 8.30881 Tj +-296 TJm +(in) 7.7509 Tj +-296 TJm +(a) 4.42339 Tj +-295 TJm +(single) 23.8007 Tj +-296 TJm +(block) 22.1369 Tj +-296 TJm +(--) 6.63509 Tj +-296 TJm +(that) 14.9439 Tj +-296 TJm +(means) 25.4544 Tj +-296 TJm +(most) 19.3773 Tj +-295 TJm +(\002les) 16.6077 Tj +-296 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-296 TJm +(encounter) 39.2825 Tj +-296 TJm +(using) 21.589 Tj +-296 TJm +(a) 4.42339 Tj +72 76.3658 Td +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-290 TJm +(block) 22.1369 Tj +-290 TJm +(size.) 17.9825 Tj +-859 TJm +(The) 15.4918 Tj +-290 TJm +(amount) 29.8878 Tj +-290 TJm +(of) 8.29885 Tj +-290 TJm +(real) 14.9339 Tj +-290 TJm +(memory) 33.2053 Tj +-289 TJm +(touched) 31.5416 Tj +-290 TJm +(is) 6.64505 Tj +-290 TJm +(proportional) 49.2551 Tj +-290 TJm +(to) 7.7509 Tj +-290 TJm +(the) 12.1743 Tj +-290 TJm +(size) 15.4918 Tj +-290 TJm +(of) 8.29885 Tj +-290 TJm +(the) 12.1743 Tj +-289 TJm +(\002le,) 15.2229 Tj +-300 TJm +(since) 20.4731 Tj +-290 TJm +(the) 12.1743 Tj +-290 TJm +(\002le) 12.7322 Tj +-290 TJm +(is) 6.64505 Tj +-290 TJm +(smaller) 29.3299 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(5) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 9 9 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(than) 17.1556 Tj +-362 TJm +(a) 4.42339 Tj +-362 TJm +(block.) 24.6275 Tj +-1293 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-362 TJm +(e) 4.42339 Tj +15 TJm +(xample,) 31.8205 Tj +-390 TJm +(compressing) 50.3609 Tj +-362 TJm +(a) 4.42339 Tj +-362 TJm +(\002le) 12.7322 Tj +-362 TJm +(20,000) 27.3972 Tj +-362 TJm +(bytes) 21.031 Tj +-362 TJm +(long) 17.7135 Tj +-362 TJm +(with) 17.7135 Tj +-362 TJm +(the) 12.1743 Tj +-362 TJm +(\003ag) 14.9439 Tj +[1 0 0 1 406.528 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.528 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.528 710.037 Td +/F134_0 9.9626 Tf +(-9) 11.9551 Tj +[1 0 0 1 418.483 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.483 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.09 710.037 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-362 TJm +(cause) 22.1269 Tj +-362 TJm +(the) 12.1743 Tj +-362 TJm +(compressor) 45.9276 Tj +-362 TJm +(to) 7.7509 Tj +72 698.082 Td +(allocate) 30.9837 Tj +-271 TJm +(around) 27.6661 Tj +-272 TJm +(7600k) 24.9065 Tj +-271 TJm +(of) 8.29885 Tj +-272 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-277 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-271 TJm +(only) 17.7135 Tj +-272 TJm +(touch) 22.1369 Tj +-271 TJm +(400k) 19.9252 Tj +-272 TJm +(+) 5.61891 Tj +-271 TJm +(20000) 24.9065 Tj +-272 TJm +(*) 4.9813 Tj +-271 TJm +(8) 4.9813 Tj +-272 TJm +(=) 5.61891 Tj +-271 TJm +(560) 14.9439 Tj +-272 TJm +(kbytes) 26.0123 Tj +-271 TJm +(of) 8.29885 Tj +-272 TJm +(it.) 8.02986 Tj +-748 TJm +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +-277 TJm +(the) 12.1743 Tj +-272 TJm +(decompressor) 55.3323 Tj +72 686.127 Td +(will) 15.5018 Tj +-250 TJm +(allocate) 30.9837 Tj +-250 TJm +(3700k) 24.9065 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(touch) 22.1369 Tj +-250 TJm +(100k) 19.9252 Tj +-250 TJm +(+) 5.61891 Tj +-250 TJm +(20000) 24.9065 Tj +-250 TJm +(*) 4.9813 Tj +-250 TJm +(4) 4.9813 Tj +-250 TJm +(=) 5.61891 Tj +-250 TJm +(180) 14.9439 Tj +-250 TJm +(kbytes.) 28.503 Tj +[1 0 0 1 72 683.97] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 664.209 Td +/F130_0 9.9626 Tf +(Here) 19.3573 Tj +-293 TJm +(is) 6.64505 Tj +-294 TJm +(a) 4.42339 Tj +-293 TJm +(table) 19.3673 Tj +-294 TJm +(which) 24.3486 Tj +-293 TJm +(summarises) 47.0434 Tj +-294 TJm +(the) 12.1743 Tj +-293 TJm +(maximum) 40.4083 Tj +-294 TJm +(memory) 33.2053 Tj +-293 TJm +(usage) 22.6848 Tj +-294 TJm +(for) 11.6164 Tj +-293 TJm +(dif) 11.0684 Tj +25 TJm +(ferent) 23.2328 Tj +-294 TJm +(block) 22.1369 Tj +-293 TJm +(sizes.) 21.8579 Tj +-881 TJm +(Also) 18.8194 Tj +-293 TJm +(recorded) 34.8492 Tj +-294 TJm +(is) 6.64505 Tj +-293 TJm +(the) 12.1743 Tj +-294 TJm +(total) 17.7135 Tj +72 652.254 Td +(compressed) 47.0334 Tj +-289 TJm +(size) 15.4918 Tj +-289 TJm +(for) 11.6164 Tj +-289 TJm +(14) 9.9626 Tj +-289 TJm +(\002les) 16.6077 Tj +-290 TJm +(of) 8.29885 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(Calg) 18.8194 Tj +5 TJm +(ary) 12.7222 Tj +-289 TJm +(T) 6.08715 Tj +70 TJm +(e) 4.42339 Tj +15 TJm +(xt) 7.7509 Tj +-289 TJm +(Compression) 52.5826 Tj +-289 TJm +(Corpus) 28.782 Tj +-289 TJm +(totalling) 33.2153 Tj +-289 TJm +(3,141,622) 39.8504 Tj +-290 TJm +(bytes.) 23.5217 Tj +-854 TJm +(This) 17.7135 Tj +-290 TJm +(column) 29.8878 Tj +-289 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +72 640.299 Td +(some) 21.031 Tj +-253 TJm +(feel) 14.9339 Tj +-253 TJm +(for) 11.6164 Tj +-253 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-253 TJm +(compression) 50.3609 Tj +-253 TJm +(v) 4.9813 Tj +25 TJm +(aries) 18.8094 Tj +-253 TJm +(with) 17.7135 Tj +-253 TJm +(block) 22.1369 Tj +-253 TJm +(size.) 17.9825 Tj +-638 TJm +(These) 23.7907 Tj +-253 TJm +(\002gures) 27.1182 Tj +-253 TJm +(tend) 17.1556 Tj +-254 TJm +(to) 7.7509 Tj +-253 TJm +(understate) 40.9463 Tj +-253 TJm +(the) 12.1743 Tj +-253 TJm +(adv) 14.386 Tj +25 TJm +(antage) 26.0024 Tj +-253 TJm +(of) 8.29885 Tj +-253 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-253 TJm +(block) 22.1369 Tj +72 628.344 Td +(sizes) 19.3673 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-250 TJm +(\002les,) 19.0983 Tj +-250 TJm +(since) 20.4731 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(Corpus) 28.782 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(dominated) 42.0621 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(smaller) 29.3299 Tj +-250 TJm +(\002les.) 19.0983 Tj +[1 0 0 1 72 626.187] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -156.413] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 155.417 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 151.831] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -616.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.952 616.822 Td +/F134_0 9.9626 Tf +(Compress) 47.8205 Tj +-1278 TJm +(Decompress) 59.7756 Tj +-1278 TJm +(Decompress) 59.7756 Tj +-1278 TJm +(Corpus) 35.8654 Tj +90 604.867 Td +(Flag) 23.9102 Tj +-2130 TJm +(usage) 29.8878 Tj +-2556 TJm +(usage) 29.8878 Tj +-2982 TJm +(-s) 11.9551 Tj +-426 TJm +(usage) 29.8878 Tj +-2130 TJm +(Size) 23.9102 Tj +94.244 580.956 Td +(-1) 11.9551 Tj +-2556 TJm +(1200k) 29.8878 Tj +-2982 TJm +(500k) 23.9102 Tj +-3834 TJm +(350k) 23.9102 Tj +-2556 TJm +(914704) 35.8654 Tj +94.244 569.001 Td +(-2) 11.9551 Tj +-2556 TJm +(2000k) 29.8878 Tj +-2982 TJm +(900k) 23.9102 Tj +-3834 TJm +(600k) 23.9102 Tj +-2556 TJm +(877703) 35.8654 Tj +94.244 557.046 Td +(-3) 11.9551 Tj +-2556 TJm +(2800k) 29.8878 Tj +-2556 TJm +(1300k) 29.8878 Tj +-3834 TJm +(850k) 23.9102 Tj +-2556 TJm +(860338) 35.8654 Tj +94.244 545.091 Td +(-4) 11.9551 Tj +-2556 TJm +(3600k) 29.8878 Tj +-2556 TJm +(1700k) 29.8878 Tj +-3408 TJm +(1100k) 29.8878 Tj +-2556 TJm +(846899) 35.8654 Tj +94.244 533.136 Td +(-5) 11.9551 Tj +-2556 TJm +(4400k) 29.8878 Tj +-2556 TJm +(2100k) 29.8878 Tj +-3408 TJm +(1350k) 29.8878 Tj +-2556 TJm +(845160) 35.8654 Tj +94.244 521.181 Td +(-6) 11.9551 Tj +-2556 TJm +(5200k) 29.8878 Tj +-2556 TJm +(2500k) 29.8878 Tj +-3408 TJm +(1600k) 29.8878 Tj +-2556 TJm +(838626) 35.8654 Tj +94.244 509.225 Td +(-7) 11.9551 Tj +-2556 TJm +(6100k) 29.8878 Tj +-2556 TJm +(2900k) 29.8878 Tj +-3408 TJm +(1850k) 29.8878 Tj +-2556 TJm +(834096) 35.8654 Tj +94.244 497.27 Td +(-8) 11.9551 Tj +-2556 TJm +(6800k) 29.8878 Tj +-2556 TJm +(3300k) 29.8878 Tj +-3408 TJm +(2100k) 29.8878 Tj +-2556 TJm +(828642) 35.8654 Tj +94.244 485.315 Td +(-9) 11.9551 Tj +-2556 TJm +(7600k) 29.8878 Tj +-2556 TJm +(3700k) 29.8878 Tj +-3408 TJm +(2350k) 29.8878 Tj +-2556 TJm +(828642) 35.8654 Tj +[1 0 0 1 72 469.773] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -459.811] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 435.021 Td +/F122_0 20.6585 Tf +(2.6.) 34.4584 Tj +-278 TJm +(RECO) 59.6824 Tj +50 TJm +(VERING) 79.2047 Tj +-278 TJm +(D) 14.9154 Tj +40 TJm +(A) 14.9154 Tj +90 TJm +(T) 12.6223 Tj +90 TJm +(A) 14.9154 Tj +-278 TJm +(FR) 27.5378 Tj +20 TJm +(OM) 33.2808 Tj +-278 TJm +(D) 14.9154 Tj +40 TJm +(AMA) 47.0394 Tj +50 TJm +(GED) 44.767 Tj +72 410.23 Td +(FILES) 58.5462 Tj +[1 0 0 1 72 409.972] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -400.01] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 388.312 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 388.312] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -388.312] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.138 388.312 Td +/F130_0 9.9626 Tf +(compresses) 45.9276 Tj +-326 TJm +(\002les) 16.6077 Tj +-326 TJm +(in) 7.7509 Tj +-326 TJm +(blocks,) 28.503 Tj +-346 TJm +(usually) 28.782 Tj +-326 TJm +(900kbytes) 40.9562 Tj +-326 TJm +(long.) 20.2042 Tj +-1077 TJm +(Each) 19.9152 Tj +-326 TJm +(block) 22.1369 Tj +-327 TJm +(is) 6.64505 Tj +-326 TJm +(handled) 31.5416 Tj +-326 TJm +(independently) 56.4481 Tj +65 TJm +(.) 2.49065 Tj +-1077 TJm +(If) 6.63509 Tj +-326 TJm +(a) 4.42339 Tj +-326 TJm +(media) 24.3486 Tj +-326 TJm +(or) 8.29885 Tj +72 376.357 Td +(transmission) 50.3709 Tj +-319 TJm +(error) 19.3573 Tj +-318 TJm +(causes) 26.0024 Tj +-319 TJm +(a) 4.42339 Tj +-318 TJm +(multi-block) 46.4955 Tj +[1 0 0 1 234.518 376.357] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.518 -376.357] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.518 376.357 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 258.429 376.357] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.429 -376.357] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.603 376.357 Td +/F130_0 9.9626 Tf +(\002le) 12.7322 Tj +-319 TJm +(to) 7.7509 Tj +-318 TJm +(become) 30.9837 Tj +-319 TJm +(damaged,) 38.4556 Tj +-336 TJm +(it) 5.53921 Tj +-318 TJm +(may) 17.1556 Tj +-319 TJm +(be) 9.40469 Tj +-318 TJm +(possible) 32.6574 Tj +-319 TJm +(to) 7.7509 Tj +-318 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-319 TJm +(data) 16.5977 Tj +-319 TJm +(from) 19.3673 Tj +-318 TJm +(the) 12.1743 Tj +72 364.402 Td +(undamaged) 45.9276 Tj +-250 TJm +(blocks) 26.0123 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002le.) 15.2229 Tj +[1 0 0 1 72 362.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -352.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 342.484 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-358 TJm +(compressed) 47.0334 Tj +-357 TJm +(representation) 56.4381 Tj +-358 TJm +(of) 8.29885 Tj +-357 TJm +(each) 18.2515 Tj +-358 TJm +(block) 22.1369 Tj +-358 TJm +(is) 6.64505 Tj +-357 TJm +(delimited) 37.6387 Tj +-358 TJm +(by) 9.9626 Tj +-357 TJm +(a) 4.42339 Tj +-358 TJm +(48-bit) 23.8007 Tj +-358 TJm +(pattern,) 30.1568 Tj +-384 TJm +(which) 24.3486 Tj +-358 TJm +(mak) 17.1556 Tj +10 TJm +(es) 8.29885 Tj +-357 TJm +(it) 5.53921 Tj +-358 TJm +(possible) 32.6574 Tj +-357 TJm +(to) 7.7509 Tj +-358 TJm +(\002nd) 15.5018 Tj +-358 TJm +(the) 12.1743 Tj +72 330.529 Td +(block) 22.1369 Tj +-286 TJm +(boundaries) 43.7159 Tj +-286 TJm +(wit) 12.7322 Tj +1 TJm +(h) 4.9813 Tj +-286 TJm +(reasonable) 42.6001 Tj +-286 TJm +(certainty) 34.8591 Tj +65 TJm +(.) 2.49065 Tj +-835 TJm +(Each) 19.9152 Tj +-285 TJm +(block) 22.1369 Tj +-286 TJm +(also) 16.0497 Tj +-286 TJm +(carries) 26.5503 Tj +-286 TJm +(its) 9.41466 Tj +-285 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-286 TJm +(32-bit) 23.8007 Tj +-286 TJm +(CRC,) 22.4258 Tj +-286 TJm +(so) 8.85675 Tj +-285 TJm +(damaged) 35.965 Tj +-286 TJm +(blocks) 26.0123 Tj +-286 TJm +(can) 13.8281 Tj +-286 TJm +(be) 9.40469 Tj +72 318.574 Td +(distinguished) 53.1405 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(undamaged) 45.9276 Tj +-250 TJm +(ones.) 20.7521 Tj +[1 0 0 1 72 316.417] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -306.455] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 296.656 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 296.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -296.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.448 296.656 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-273 TJm +(a) 4.42339 Tj +-272 TJm +(simple) 26.5703 Tj +-273 TJm +(program) 33.7533 Tj +-273 TJm +(whose) 25.4544 Tj +-272 TJm +(purpose) 31.5416 Tj +-273 TJm +(is) 6.64505 Tj +-273 TJm +(to) 7.7509 Tj +-272 TJm +(search) 25.4445 Tj +-273 TJm +(for) 11.6164 Tj +-273 TJm +(blocks) 26.0123 Tj +-272 TJm +(in) 7.7509 Tj +[1 0 0 1 392.655 296.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.655 -296.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.655 296.656 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 416.566 296.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -416.566 -296.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.282 296.656 Td +/F130_0 9.9626 Tf +(\002les,) 19.0983 Tj +-278 TJm +(and) 14.386 Tj +-273 TJm +(write) 20.4731 Tj +-273 TJm +(each) 18.2515 Tj +-272 TJm +(block) 22.1369 Tj +-273 TJm +(out) 12.7322 Tj +72 284.701 Td +(into) 15.5018 Tj +-254 TJm +(its) 9.41466 Tj +-255 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +[1 0 0 1 121.43 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -121.43 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +121.43 284.701 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 145.34 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -145.34 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.875 284.701 Td +/F130_0 9.9626 Tf +(\002le.) 15.2229 Tj +-647 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-255 TJm +(can) 13.8281 Tj +-254 TJm +(then) 17.1556 Tj +-255 TJm +(use) 13.2801 Tj +[1 0 0 1 240.01 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.01 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +240.01 284.701 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-t) 11.9551 Tj +[1 0 0 1 287.831 284.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.831 -284.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +290.367 284.701 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-255 TJm +(t) 2.7696 Tj +1 TJm +(est) 11.0684 Tj +-255 TJm +(the) 12.1743 Tj +-254 TJm +(inte) 14.9439 Tj +15 TJm +(grity) 18.8194 Tj +-255 TJm +(of) 8.29885 Tj +-254 TJm +(the) 12.1743 Tj +-255 TJm +(resulting) 34.8691 Tj +-254 TJm +(\002les,) 19.0983 Tj +-256 TJm +(and) 14.386 Tj +-255 TJm +(decompress) 47.0334 Tj +-254 TJm +(those) 21.031 Tj +72 272.746 Td +(which) 24.3486 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(undamaged.) 48.4182 Tj +[1 0 0 1 72 270.589] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -260.626] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 250.828 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 250.828] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -250.828] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.099 250.828 Td +/F130_0 9.9626 Tf +(tak) 12.1743 Tj +10 TJm +(es) 8.29885 Tj +-639 TJm +(a) 4.42339 Tj +-639 TJm +(single) 23.8007 Tj +-639 TJm +(ar) 7.74094 Tj +18 TJm +(gument,) 32.3785 Tj +-737 TJm +(the) 12.1743 Tj +-639 TJm +(name) 21.579 Tj +-639 TJm +(of) 8.29885 Tj +-639 TJm +(the) 12.1743 Tj +-639 TJm +(damaged) 35.965 Tj +-639 TJm +(\002le,) 15.2229 Tj +-737 TJm +(and) 14.386 Tj +-639 TJm +(writes) 24.3486 Tj +-639 TJm +(a) 4.42339 Tj +-639 TJm +(number) 30.4357 Tj +-639 TJm +(of) 8.29885 Tj +-640 TJm +(\002les) 16.6077 Tj +[1 0 0 1 72 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 238.873 Td +/F134_0 9.9626 Tf +(rec0001file.bz2) 89.6634 Tj +[1 0 0 1 161.664 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.664 238.873 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 169.072 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.072 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.072 238.873 Td +/F134_0 9.9626 Tf +(rec0002file.bz2) 89.6634 Tj +[1 0 0 1 258.736 238.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.736 -238.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.736 238.873 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-494 TJm +(etc,) 14.107 Tj +-493 TJm +(containing) 42.0621 Tj +-445 TJm +(the) 12.1743 Tj +-445 TJm +(e) 4.42339 Tj +15 TJm +(xtracted) 32.0895 Tj +-445 TJm +(blocks.) 28.503 Tj +-1789 TJm +(The) 15.4918 Tj +-445 TJm +(output) 25.4644 Tj +-445 TJm +(\002lenames) 38.1866 Tj +-445 TJm +(are) 12.1643 Tj +72 226.918 Td +(designed) 35.417 Tj +-337 TJm +(so) 8.85675 Tj +-337 TJm +(that) 14.9439 Tj +-337 TJm +(the) 12.1743 Tj +-337 TJm +(use) 13.2801 Tj +-337 TJm +(of) 8.29885 Tj +-337 TJm +(wildc) 22.1369 Tj +1 TJm +(ards) 16.5977 Tj +-337 TJm +(in) 7.7509 Tj +-337 TJm +(subsequent) 44.2738 Tj +-337 TJm +(processing) 42.61 Tj +-337 TJm +(--) 6.63509 Tj +-337 TJm +(for) 11.6164 Tj +-337 TJm +(e) 4.42339 Tj +15 TJm +(xample,) 31.8205 Tj +[1 0 0 1 396.538 226.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -396.538 -226.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +396.538 226.918 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-600 TJm +(-dc) 17.9327 Tj +-600 TJm +(rec) 17.9327 Tj +474.247 225.174 Td +(*) 5.97756 Tj +480.224 226.918 Td +(file.bz2) 47.8205 Tj +-600 TJm +(>) 5.97756 Tj +72 214.963 Td +(recovered_data) 83.6858 Tj +[1 0 0 1 155.686 214.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -214.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.177 214.963 Td +/F130_0 9.9626 Tf +(--) 6.63509 Tj +-250 TJm +(lists) 16.0597 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002les) 16.6077 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(correct) 27.6562 Tj +-250 TJm +(order) 21.0211 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 213.653] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -203.69] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 193.045 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 193.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -193.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +145.93 193.045 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-221 TJm +(be) 9.40469 Tj +-220 TJm +(of) 8.29885 Tj +-221 TJm +(most) 19.3773 Tj +-221 TJm +(use) 13.2801 Tj +-220 TJm +(dealing) 29.3299 Tj +-221 TJm +(with) 17.7135 Tj +-221 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +[1 0 0 1 307.229 193.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -307.229 -193.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +307.229 193.045 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 331.14 193.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.14 -193.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.338 193.045 Td +/F130_0 9.9626 Tf +(\002les,) 19.0983 Tj +-227 TJm +(as) 8.29885 Tj +-220 TJm +(these) 20.4731 Tj +-221 TJm +(will) 15.5018 Tj +-221 TJm +(contain) 29.3299 Tj +-220 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-221 TJm +(blocks.) 28.503 Tj +-600 TJm +(It) 6.08715 Tj +-221 TJm +(is) 6.64505 Tj +-221 TJm +(clearly) 27.1082 Tj +72 181.09 Td +(futile) 21.031 Tj +-289 TJm +(to) 7.7509 Tj +-289 TJm +(use) 13.2801 Tj +-289 TJm +(it) 5.53921 Tj +-289 TJm +(on) 9.9626 Tj +-289 TJm +(damaged) 35.965 Tj +-289 TJm +(single-block) 49.2551 Tj +-290 TJm +(\002les) 16.6077 Tj +1 TJm +(,) 2.49065 Tj +-299 TJm +(since) 20.4731 Tj +-289 TJm +(a) 4.42339 Tj +-290 TJm +(damaged) 35.965 Tj +-289 TJm +(block) 22.1369 Tj +-289 TJm +(cannot) 26.5603 Tj +-289 TJm +(be) 9.40469 Tj +-289 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ered.) 19.6363 Tj +-854 TJm +(If) 6.63509 Tj +-289 TJm +(you) 14.9439 Tj +-290 TJm +(wish) 18.8194 Tj +-289 TJm +(to) 7.7509 Tj +-289 TJm +(minimise) 37.0908 Tj +72 169.135 Td +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-320 TJm +(potential) 34.8691 Tj +-320 TJm +(data) 16.5977 Tj +-319 TJm +(loss) 15.5018 Tj +-320 TJm +(through) 30.9936 Tj +-320 TJm +(media) 24.3486 Tj +-320 TJm +(or) 8.29885 Tj +-319 TJm +(transmission) 50.3709 Tj +-320 TJm +(errors,) 25.7234 Tj +-337 TJm +(you) 14.9439 Tj +-320 TJm +(might) 23.2527 Tj +-320 TJm +(consider) 33.7533 Tj +-320 TJm +(compressing) 50.3609 Tj +-319 TJm +(with) 17.7135 Tj +-320 TJm +(a) 4.42339 Tj +-320 TJm +(smaller) 29.3299 Tj +-320 TJm +(block) 22.1369 Tj +72 157.179 Td +(size.) 17.9825 Tj +[1 0 0 1 72 157.08] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -147.117] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 122.426 Td +/F122_0 20.6585 Tf +(2.7.) 34.4584 Tj +-278 TJm +(PERFORMANCE) 161.818 Tj +-278 TJm +(NO) 30.9877 Tj +40 TJm +(TES) 40.1808 Tj +[1 0 0 1 72 122.168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -112.206] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 100.509 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-305 TJm +(sorting) 27.6761 Tj +-304 TJm +(phase) 22.6848 Tj +-305 TJm +(of) 8.29885 Tj +-304 TJm +(compression) 50.3609 Tj +-305 TJm +(g) 4.9813 Tj +5 TJm +(athers) 23.7907 Tj +-304 TJm +(together) 32.6474 Tj +-305 TJm +(similar) 27.6761 Tj +-304 TJm +(strings) 26.5703 Tj +-305 TJm +(in) 7.7509 Tj +-304 TJm +(the) 12.1743 Tj +-305 TJm +(\002le.) 15.2229 Tj +-947 TJm +(Because) 33.1954 Tj +-305 TJm +(of) 8.29885 Tj +-304 TJm +(this,) 16.8866 Tj +-319 TJm +(\002les) 16.6077 Tj +-304 TJm +(containing) 42.0621 Tj +-305 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +72 88.5534 Td +(long) 17.7135 Tj +-286 TJm +(runs) 17.1556 Tj +-285 TJm +(of) 8.29885 Tj +-286 TJm +(repeated) 33.7433 Tj +-285 TJm +(symbols,) 35.706 Tj +-295 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-286 TJm +("aabaabaabaab) 59.3771 Tj +-285 TJm +(...") 11.5367 Tj +-571 TJm +(\(repeated) 37.0609 Tj +-286 TJm +(se) 8.29885 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(eral) 14.9339 Tj +-286 TJm +(hundred) 32.6474 Tj +-285 TJm +(times\)) 24.9065 Tj +-286 TJm +(may) 17.1556 Tj +-286 TJm +(com) 17.1556 Tj +1 TJm +(press) 20.4731 Tj +-286 TJm +(more) 20.4731 Tj +-286 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +72 76.5983 Td +(than) 17.1556 Tj +-322 TJm +(normal.) 30.7147 Tj +-524 TJm +(V) 7.193 Tj +111 TJm +(ersions) 28.224 Tj +-322 TJm +(0.9.5) 19.9252 Tj +-321 TJm +(and) 14.386 Tj +-322 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-322 TJm +(f) 3.31755 Tj +10 TJm +(are) 12.1643 Tj +-321 TJm +(much) 22.1369 Tj +-322 TJm +(better) 22.6848 Tj +-321 TJm +(than) 17.1556 Tj +-322 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-321 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-322 TJm +(in) 7.7509 Tj +-322 TJm +(this) 14.396 Tj +-321 TJm +(respect.) 30.7047 Tj +-1050 TJm +(The) 15.4918 Tj +-321 TJm +(ratio) 18.2614 Tj +-322 TJm +(between) 33.1954 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(6) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 10 10 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 105.519 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -371.59 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.109 749.245 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 266.071 747.089] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(w) 7.193 Tj +10 TJm +(orst-case) 35.4071 Tj +-289 TJm +(and) 14.386 Tj +-290 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(erage-case) 42.0322 Tj +-289 TJm +(compression) 50.3609 Tj +-290 TJm +(time) 17.7135 Tj +-289 TJm +(is) 6.64505 Tj +-290 TJm +(in) 7.7509 Tj +-289 TJm +(the) 12.1743 Tj +-290 TJm +(re) 7.74094 Tj +15 TJm +(gion) 17.7135 Tj +-289 TJm +(of) 8.29885 Tj +-289 TJm +(10:1.) 20.2042 Tj +-857 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-290 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-289 TJm +(v) 4.9813 Tj +15 TJm +(ersions,) 30.7147 Tj +-299 TJm +(this) 14.396 Tj +-290 TJm +(\002gure) 23.2427 Tj +-289 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-290 TJm +(more) 20.4731 Tj +72 698.082 Td +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(100:1.) 25.1855 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 186.002 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.002 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +186.002 698.082 Td +/F134_0 9.9626 Tf +(-vvvv) 29.8878 Tj +[1 0 0 1 215.889 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.889 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +218.38 698.082 Td +/F130_0 9.9626 Tf +(option) 25.4644 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(monitor) 31.5516 Tj +-250 TJm +(progress) 33.7533 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(great) 19.9152 Tj +-250 TJm +(detail,) 24.6275 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant.) 14.6649 Tj +[1 0 0 1 72 695.925] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -685.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.164 Td +/F130_0 9.9626 Tf +(Decompression) 61.9773 Tj +-250 TJm +(speed) 22.6848 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(unaf) 17.7035 Tj +25 TJm +(fected) 24.3386 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(these) 20.4731 Tj +-250 TJm +(phenomena.) 48.4182 Tj +[1 0 0 1 72 674.007] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -664.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 654.247 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.863 654.247 Td +/F130_0 9.9626 Tf +(usually) 28.782 Tj +-299 TJm +(allocates) 34.8591 Tj +-298 TJm +(se) 8.29885 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(eral) 14.9339 Tj +-299 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abytes) 25.4544 Tj +-298 TJm +(of) 8.29885 Tj +-299 TJm +(memory) 33.2053 Tj +-299 TJm +(to) 7.7509 Tj +-298 TJm +(operate) 29.3199 Tj +-299 TJm +(in,) 10.2416 Tj +-311 TJm +(and) 14.386 Tj +-298 TJm +(then) 17.1556 Tj +-299 TJm +(char) 17.1456 Tj +18 TJm +(ges) 13.2801 Tj +-298 TJm +(all) 9.9626 Tj +-299 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-299 TJm +(it) 5.53921 Tj +-298 TJm +(in) 7.7509 Tj +-299 TJm +(a) 4.42339 Tj +-298 TJm +(f) 3.31755 Tj +10 TJm +(airly) 18.2614 Tj +-299 TJm +(random) 30.4357 Tj +72 642.291 Td +(f) 3.31755 Tj +10 TJm +(ashion.) 28.503 Tj +-743 TJm +(This) 17.7135 Tj +-270 TJm +(means) 25.4544 Tj +-271 TJm +(that) 14.9439 Tj +-270 TJm +(performance,) 52.8317 Tj +-276 TJm +(both) 17.7135 Tj +-270 TJm +(for) 11.6164 Tj +-271 TJm +(compressing) 50.3609 Tj +-270 TJm +(and) 14.386 Tj +-271 TJm +(decompressing,) 62.2563 Tj +-275 TJm +(is) 6.64505 Tj +-271 TJm +(lar) 10.5105 Tj +18 TJm +(gely) 17.1556 Tj +-270 TJm +(determined) 44.8217 Tj +-271 TJm +(by) 9.9626 Tj +-270 TJm +(the) 12.1743 Tj +-271 TJm +(speed) 22.6848 Tj +72 630.336 Td +(at) 7.193 Tj +-294 TJm +(which) 24.3486 Tj +-294 TJm +(your) 18.2614 Tj +-294 TJm +(machine) 33.7533 Tj +-295 TJm +(ca) 8.84679 Tj +1 TJm +(n) 4.9813 Tj +-295 TJm +(service) 28.2141 Tj +-294 TJm +(cache) 22.6749 Tj +-294 TJm +(misses.) 29.0609 Tj +-442 TJm +(Because) 33.1954 Tj +-294 TJm +(of) 8.29885 Tj +-294 TJm +(this,) 16.8866 Tj +-306 TJm +(small) 21.589 Tj +-294 TJm +(changes) 32.0895 Tj +-294 TJm +(to) 7.7509 Tj +-294 TJm +(the) 12.1743 Tj +-294 TJm +(code) 18.8094 Tj +-294 TJm +(to) 7.7509 Tj +-294 TJm +(reduce) 26.5503 Tj +-294 TJm +(the) 12.1743 Tj +-295 TJm +(miss) 18.2714 Tj +-294 TJm +(rate) 14.9339 Tj +72 618.381 Td +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-253 TJm +(been) 18.8094 Tj +-253 TJm +(observ) 26.5603 Tj +15 TJm +(ed) 9.40469 Tj +-253 TJm +(to) 7.7509 Tj +-253 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-253 TJm +(disproportionately) 73.0557 Tj +-253 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-253 TJm +(performance) 50.341 Tj +-253 TJm +(impro) 23.8007 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ements.) 30.7147 Tj +-639 TJm +(I) 3.31755 Tj +-253 TJm +(imagine) 32.0995 Tj +[1 0 0 1 438.909 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.909 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.909 618.381 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 468.796 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.796 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +471.318 618.381 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-253 TJm +(perform) 32.0895 Tj +-253 TJm +(best) 16.0497 Tj +72 606.426 Td +(on) 9.9626 Tj +-250 TJm +(machines) 37.6287 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-250 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-250 TJm +(caches.) 29.041 Tj +[1 0 0 1 72 604.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -594.306] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 571.673 Td +/F122_0 20.6585 Tf +(2.8.) 34.4584 Tj +-278 TJm +(CA) 29.8309 Tj +80 TJm +(VEA) 42.4739 Tj +90 TJm +(TS) 26.4016 Tj +[1 0 0 1 72 571.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -561.452] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 549.755 Td +/F130_0 9.9626 Tf +(I/O) 13.2801 Tj +-268 TJm +(error) 19.3573 Tj +-267 TJm +(messages) 37.6287 Tj +-268 TJm +(are) 12.1643 Tj +-268 TJm +(not) 12.7322 Tj +-268 TJm +(as) 8.29885 Tj +-267 TJm +(helpful) 28.224 Tj +-268 TJm +(as) 8.29885 Tj +-268 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-267 TJm +(could) 22.1369 Tj +-268 TJm +(be.) 11.8953 Tj +[1 0 0 1 293.313 549.755] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.313 -549.755] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.313 549.755 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 323.201 549.755] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -323.201 -549.755] cm +[1 0 0 1 0 0] Tm +0 0 Td +325.868 549.755 Td +/F130_0 9.9626 Tf +(tries) 17.1556 Tj +-268 TJm +(hard) 17.7035 Tj +-267 TJm +(to) 7.7509 Tj +-268 TJm +(detect) 23.7907 Tj +-268 TJm +(I/O) 13.2801 Tj +-268 TJm +(errors) 23.2328 Tj +-267 TJm +(and) 14.386 Tj +-268 TJm +(e) 4.42339 Tj +15 TJm +(xit) 10.5205 Tj +-268 TJm +(cleanly) 28.772 Tj +65 TJm +(,) 2.49065 Tj +-272 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-268 TJm +(the) 12.1743 Tj +72 537.8 Td +(details) 26.0123 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(what) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem) 33.2053 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(sometimes) 42.62 Tj +-250 TJm +(seem) 20.4731 Tj +-250 TJm +(rather) 23.2328 Tj +-250 TJm +(misleading.) 46.2165 Tj +[1 0 0 1 72 535.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -525.681] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 515.882 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-280 TJm +(manual) 29.3299 Tj +-279 TJm +(page) 18.8094 Tj +-280 TJm +(pertains) 31.5416 Tj +-280 TJm +(to) 7.7509 Tj +-279 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-280 TJm +(1.0.5) 19.9252 Tj +-280 TJm +(of) 8.29885 Tj +[1 0 0 1 256.84 515.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -256.84 -515.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +256.84 515.882 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 286.728 515.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -286.728 -515.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +286.728 515.882 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-798 TJm +(Compressed) 49.2551 Tj +-280 TJm +(data) 16.5977 Tj +-279 TJm +(created) 28.762 Tj +-280 TJm +(by) 9.9626 Tj +-280 TJm +(this) 14.396 Tj +-279 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-280 TJm +(is) 6.64505 Tj +-280 TJm +(entirely) 30.4357 Tj +-279 TJm +(forw) 18.8094 Tj +10 TJm +(ards) 16.5977 Tj +72 503.927 Td +(and) 14.386 Tj +-294 TJm +(backw) 26.0024 Tj +10 TJm +(ards) 16.5977 Tj +-293 TJm +(compatible) 44.2738 Tj +-294 TJm +(with) 17.7135 Tj +-294 TJm +(the) 12.1743 Tj +-293 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-294 TJm +(public) 24.9065 Tj +-294 TJm +(releases,) 34.0223 Tj +-304 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-294 TJm +(0.1pl2,) 27.6761 Tj +-305 TJm +(0.9.0) 19.9252 Tj +-293 TJm +(and) 14.386 Tj +-294 TJm +(0.9.5,) 22.4159 Tj +-305 TJm +(1.0.0,) 22.4159 Tj +-304 TJm +(1.0.1,) 22.4159 Tj +-305 TJm +(1.0.2) 19.9252 Tj +-294 TJm +(and) 14.386 Tj +72 491.972 Td +(1.0.3,) 22.4159 Tj +-263 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-260 TJm +(with) 17.7135 Tj +-260 TJm +(the) 12.1743 Tj +-260 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-260 TJm +(e) 4.42339 Tj +15 TJm +(xception:) 37.0808 Tj +-330 TJm +(0.9.0) 19.9252 Tj +-260 TJm +(and) 14.386 Tj +-260 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-260 TJm +(can) 13.8281 Tj +-260 TJm +(correctly) 35.4071 Tj +-260 TJm +(decompress) 47.0334 Tj +-260 TJm +(multiple) 33.2153 Tj +-260 TJm +(concatenated) 52.0048 Tj +-260 TJm +(compressed) 47.0334 Tj +72 480.017 Td +(\002les.) 19.0983 Tj +-310 TJm +(0.1pl2) 25.1855 Tj +-250 TJm +(cannot) 26.5603 Tj +-250 TJm +(do) 9.9626 Tj +-250 TJm +(this;) 17.1656 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(stop) 16.6077 Tj +-250 TJm +(after) 18.2515 Tj +-250 TJm +(decompressing) 59.7656 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002rst) 15.5018 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 477.86] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -467.897] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 458.099 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 143.731 458.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -458.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.174 458.099 Td +/F130_0 9.9626 Tf +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-245 TJm +(prior) 19.3673 Tj +-245 TJm +(to) 7.7509 Tj +-245 TJm +(1.0.2) 19.9252 Tj +-246 TJm +(used) 18.2614 Tj +-245 TJm +(32-bit) 23.8007 Tj +-245 TJm +(inte) 14.9439 Tj +15 TJm +(gers) 16.5977 Tj +-245 TJm +(to) 7.7509 Tj +-245 TJm +(represent) 36.5129 Tj +-245 TJm +(bit) 10.5205 Tj +-246 TJm +(positions) 35.9849 Tj +-245 TJm +(in) 7.7509 Tj +-245 TJm +(compressed) 47.0334 Tj +-245 TJm +(\002les,) 19.0983 Tj +-246 TJm +(so) 8.85675 Tj +-245 TJm +(it) 5.53921 Tj +-245 TJm +(could) 22.1369 Tj +72 446.144 Td +(not) 12.7322 Tj +-384 TJm +(handle) 26.5603 Tj +-383 TJm +(compressed) 47.0334 Tj +-384 TJm +(\002les) 16.6077 Tj +-383 TJm +(more) 20.4731 Tj +-384 TJm +(than) 17.1556 Tj +-383 TJm +(512) 14.9439 Tj +-384 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(abytes) 25.4544 Tj +-383 TJm +(long.) 20.2042 Tj +-1421 TJm +(V) 7.193 Tj +111 TJm +(ersions) 28.224 Tj +-384 TJm +(1.0.2) 19.9252 Tj +-383 TJm +(and) 14.386 Tj +-384 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-384 TJm +(use) 13.2801 Tj +-383 TJm +(64-bit) 23.8007 Tj +-384 TJm +(ints) 14.396 Tj +-383 TJm +(on) 9.9626 Tj +-384 TJm +(some) 21.031 Tj +72 434.189 Td +(platforms) 38.1866 Tj +-245 TJm +(which) 24.3486 Tj +-246 TJm +(support) 29.8878 Tj +-245 TJm +(them) 19.9252 Tj +-246 TJm +(\(GNU) 24.8965 Tj +-245 TJm +(supported) 39.2925 Tj +-245 TJm +(tar) 10.5105 Tj +18 TJm +(gets,) 18.5404 Tj +-247 TJm +(and) 14.386 Tj +-245 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws\).) 16.8766 Tj +-309 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-245 TJm +(establish) 34.8691 Tj +-245 TJm +(whether) 32.0895 Tj +-246 TJm +(or) 8.29885 Tj +-245 TJm +(not) 12.7322 Tj +[1 0 0 1 468.269 434.189] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.269 -434.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.269 434.189 Td +/F134_0 9.9626 Tf +(bzip2recover) 71.7307 Tj +[1 0 0 1 540 434.189] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -434.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 422.233 Td +/F130_0 9.9626 Tf +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-255 TJm +(b) 4.9813 Tj +20 TJm +(uilt) 13.2901 Tj +-255 TJm +(with) 17.7135 Tj +-255 TJm +(such) 18.2614 Tj +-255 TJm +(a) 4.42339 Tj +-255 TJm +(limitation,) 41.2452 Tj +-256 TJm +(run) 13.2801 Tj +-255 TJm +(it) 5.53921 Tj +-255 TJm +(without) 30.4457 Tj +-255 TJm +(ar) 7.74094 Tj +18 TJm +(guments.) 36.2539 Tj +-325 TJm +(In) 8.29885 Tj +-255 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-256 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ent) 12.1743 Tj +-255 TJm +(you) 14.9439 Tj +-255 TJm +(can) 13.8281 Tj +-255 TJm +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +-255 TJm +(yourself) 32.6474 Tj +-255 TJm +(an) 9.40469 Tj +-255 TJm +(unlimited) 38.1966 Tj +-255 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-255 TJm +(if) 6.08715 Tj +72 410.278 Td +(you) 14.9439 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(recompile) 39.8404 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 176.318 410.278] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.318 -410.278] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.318 410.278 Td +/F134_0 9.9626 Tf +(MaybeUInt64) 65.7532 Tj +[1 0 0 1 242.071 410.278] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.071 -410.278] cm +[1 0 0 1 0 0] Tm +0 0 Td +244.562 410.278 Td +/F130_0 9.9626 Tf +(set) 11.0684 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(unsigned) 35.9749 Tj +-250 TJm +(64-bit) 23.8007 Tj +-250 TJm +(inte) 14.9439 Tj +15 TJm +(ger) 12.7222 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 408.121] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -398.159] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 375.525 Td +/F122_0 20.6585 Tf +(2.9.) 34.4584 Tj +-278 TJm +(A) 14.9154 Tj +50 TJm +(UTHOR) 73.441 Tj +[1 0 0 1 72 375.267] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -365.305] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 353.608 Td +/F130_0 9.9626 Tf +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard,) 15.2129 Tj +[1 0 0 1 132.801 353.608] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -132.801 -353.608] cm +[1 0 0 1 0 0] Tm +0 0 Td +132.801 353.608 Td +/F134_0 9.9626 Tf +(jseward@bzip.org) 95.641 Tj +[1 0 0 1 228.443 353.608] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -156.443 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -342.111] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 331.69 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-299 TJm +(ideas) 20.4731 Tj +-300 TJm +(embodied) 39.2925 Tj +-299 TJm +(in) 7.7509 Tj +[1 0 0 1 166.942 331.69] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -166.942 -331.69] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.942 331.69 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 196.83 331.69] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.83 -331.69] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.813 331.69 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-299 TJm +(due) 14.386 Tj +-300 TJm +(to) 7.7509 Tj +-299 TJm +(\(at) 10.5105 Tj +-300 TJm +(least\)) 21.579 Tj +-299 TJm +(the) 12.1743 Tj +-300 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-299 TJm +(people:) 29.3299 Tj +-409 TJm +(Michael) 32.6474 Tj +-300 TJm +(Burro) 23.2427 Tj +25 TJm +(ws) 11.0684 Tj +-299 TJm +(and) 14.386 Tj +-299 TJm +(Da) 11.6164 Tj +20 TJm +(vid) 12.7322 Tj +-300 TJm +(Wheeler) 33.7433 Tj +-299 TJm +(\(for) 14.9339 Tj +72 319.735 Td +(the) 12.1743 Tj +-312 TJm +(block) 22.1369 Tj +-313 TJm +(sorting) 27.6761 Tj +-312 TJm +(transformation\),) 64.468 Tj +-328 TJm +(Da) 11.6164 Tj +20 TJm +(vid) 12.7322 Tj +-312 TJm +(Wheeler) 33.7433 Tj +-313 TJm +(\(ag) 12.7222 Tj +5 TJm +(ain,) 14.6649 Tj +-327 TJm +(for) 11.6164 Tj +-313 TJm +(the) 12.1743 Tj +-312 TJm +(Huf) 15.4918 Tj +25 TJm +(fman) 20.4731 Tj +-312 TJm +(coder\),) 27.9351 Tj +-328 TJm +(Peter) 20.4731 Tj +-313 TJm +(Fenwick) 34.3112 Tj +-312 TJm +(\(for) 14.9339 Tj +-312 TJm +(the) 12.1743 Tj +-313 TJm +(structured) 39.8404 Tj +72 307.78 Td +(coding) 27.1182 Tj +-325 TJm +(model) 24.9065 Tj +-326 TJm +(in) 7.7509 Tj +-325 TJm +(the) 12.1743 Tj +-326 TJm +(original) 30.9936 Tj +[1 0 0 1 191.156 307.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.156 -307.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +191.156 307.779 Td +/F134_0 9.9626 Tf +(bzip) 23.9102 Tj +[1 0 0 1 215.067 307.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -215.067 -307.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +215.067 307.779 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-344 TJm +(and) 14.386 Tj +-326 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-325 TJm +(re\002nements\),) 52.2937 Tj +-345 TJm +(and) 14.386 Tj +-325 TJm +(Alistair) 29.8878 Tj +-326 TJm +(Mof) 17.1556 Tj +25 TJm +(f) 3.31755 Tj +10 TJm +(at,) 9.68365 Tj +-344 TJm +(Radford) 32.6474 Tj +-325 TJm +(Neal) 18.8094 Tj +-326 TJm +(and) 14.386 Tj +-325 TJm +(Ian) 12.7222 Tj +-326 TJm +(W) 9.40469 Tj +40 TJm +(itten) 17.7135 Tj +-325 TJm +(\(for) 14.9339 Tj +72 295.824 Td +(the) 12.1743 Tj +-277 TJm +(arithmetic) 40.3983 Tj +-277 TJm +(coder) 22.1269 Tj +-277 TJm +(in) 7.7509 Tj +-277 TJm +(the) 12.1743 Tj +-277 TJm +(original) 30.9936 Tj +[1 0 0 1 214.171 295.824] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.171 -295.824] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.171 295.824 Td +/F134_0 9.9626 Tf +(bzip) 23.9102 Tj +[1 0 0 1 238.082 295.824] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -238.082 -295.824] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.082 295.824 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +-782 TJm +(I) 3.31755 Tj +-277 TJm +(am) 12.1743 Tj +-276 TJm +(much) 22.1369 Tj +-277 TJm +(indebted) 34.3112 Tj +-277 TJm +(for) 11.6164 Tj +-277 TJm +(their) 18.2614 Tj +-277 TJm +(help,) 19.6462 Tj +-284 TJm +(support) 29.8878 Tj +-277 TJm +(and) 14.386 Tj +-277 TJm +(advice.) 28.493 Tj +-781 TJm +(See) 14.386 Tj +-277 TJm +(the) 12.1743 Tj +-277 TJm +(manual) 29.3299 Tj +72 283.869 Td +(in) 7.7509 Tj +-330 TJm +(the) 12.1743 Tj +-330 TJm +(source) 26.0024 Tj +-330 TJm +(distrib) 25.4644 Tj +20 TJm +(ution) 20.4831 Tj +-330 TJm +(for) 11.6164 Tj +-329 TJm +(pointers) 32.0995 Tj +-330 TJm +(to) 7.7509 Tj +-330 TJm +(sources) 29.8778 Tj +-330 TJm +(of) 8.29885 Tj +-330 TJm +(documentation.) 61.7083 Tj +-1099 TJm +(Christian) 36.5329 Tj +-330 TJm +(v) 4.9813 Tj +20 TJm +(on) 9.9626 Tj +-330 TJm +(Roques) 29.8878 Tj +-330 TJm +(encouraged) 45.9176 Tj +-330 TJm +(me) 12.1743 Tj +-330 TJm +(to) 7.7509 Tj +-330 TJm +(look) 17.7135 Tj +72 271.914 Td +(for) 11.6164 Tj +-271 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +-271 TJm +(sorting) 27.6761 Tj +-271 TJm +(algorithms,) 45.1107 Tj +-276 TJm +(so) 8.85675 Tj +-272 TJm +(as) 8.29885 Tj +-271 TJm +(to) 7.7509 Tj +-271 TJm +(speed) 22.6848 Tj +-271 TJm +(up) 9.9626 Tj +-271 TJm +(compression.) 52.8516 Tj +-746 TJm +(Bela) 18.2614 Tj +-271 TJm +(Lubkin) 28.782 Tj +-271 TJm +(encouraged) 45.9176 Tj +-271 TJm +(me) 12.1743 Tj +-272 TJm +(to) 7.7509 Tj +-271 TJm +(impro) 23.8007 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-271 TJm +(the) 12.1743 Tj +-271 TJm +(w) 7.193 Tj +10 TJm +(orst-case) 35.4071 Tj +72 259.959 Td +(compression) 50.3609 Tj +-340 TJm +(performance.) 52.8317 Tj +-580 TJm +(Donna) 26.5603 Tj +-339 TJm +(Robinson) 38.1966 Tj +-340 TJm +(XMLised) 38.1866 Tj +-340 TJm +(the) 12.1743 Tj +-340 TJm +(documentation.) 61.7083 Tj +-580 TJm +(Man) 18.2614 Tj +15 TJm +(y) 4.9813 Tj +-340 TJm +(people) 26.5603 Tj +-340 TJm +(sent) 16.0497 Tj +-339 TJm +(patches,) 32.3685 Tj +-363 TJm +(helped) 26.5603 Tj +-340 TJm +(with) 17.7135 Tj +72 248.004 Td +(portability) 41.5142 Tj +-250 TJm +(problems,) 39.5714 Tj +-250 TJm +(lent) 14.9439 Tj +-250 TJm +(machines,) 40.1194 Tj +-250 TJm +(g) 4.9813 Tj +5 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(advice) 26.0024 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(were) 19.3573 Tj +-250 TJm +(generally) 37.0708 Tj +-250 TJm +(helpful.) 30.7147 Tj +[1 0 0 1 72 245.847] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -194.995] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.5851] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.4855] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.332 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +539.395 50.9514 Td +/F130_0 9.9626 Tf +(7) 4.9813 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 11 11 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 141.643 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -141.643 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(3.) 20.675 Tj +-556 TJm +(Pr) 26.1785 Tj +20 TJm +(ogramming) 134.983 Tj +-278 TJm +(with) 49.5804 Tj +[1 0 0 1 330.484 701.916] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.484 -701.916] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.484 701.916 Td +/F392_0 24.7902 Tf +(libbzip2) 118.993 Tj +[1 0 0 1 449.477 701.916] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -377.477 -5.5156] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -14.9439] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -671.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 656.35 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 647.528] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 635.788 Td +/F130_0 9.9626 Tf +(3.1.) 14.9439 Tj +-310 TJm +(T) 6.08715 Tj +80 TJm +(op-le) 20.4731 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(structure) 34.8591 Tj +[1 0 0 1 164.921 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.902 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.997 635.788 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -635.788] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 635.788 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 516.09 635.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 623.832 Td +/F130_0 9.9626 Tf +(3.1.1.) 22.4159 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 177.374 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -182.355 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.866 623.832 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -623.832] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 623.832 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 623.832] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 611.877 Td +/F130_0 9.9626 Tf +(3.1.2.) 22.4159 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 179.287 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -184.268 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.822 611.877 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -611.877] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 611.877 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 611.877] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 599.922 Td +/F130_0 9.9626 Tf +(3.1.3.) 22.4159 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(summary) 37.0808 Tj +[1 0 0 1 202.669 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.65 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.582 599.922 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 511.108 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.108 -599.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.108 599.922 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 516.09 599.922] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 587.967 Td +/F130_0 9.9626 Tf +(3.2.) 14.9439 Tj +-310 TJm +(Error) 21.0211 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 148.413 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -153.394 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +162.611 587.967 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -587.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 587.967 Td +/F130_0 9.9626 Tf +(10) 9.9626 Tj +[1 0 0 1 516.09 587.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 576.012 Td +/F130_0 9.9626 Tf +(3.3.) 14.9439 Tj +-310 TJm +(Lo) 11.0684 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 167.571 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.552 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.045 576.012 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -576.012] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 576.012 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 576.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -0.0995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.8557] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 564.056 Td +/F130_0 9.9626 Tf +(3.3.1.) 22.4159 Tj +[1 0 0 1 97.5043 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 564.056 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 205.101 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.082 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +219.736 564.056 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -564.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 564.056 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 516.09 564.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 552.101 Td +/F130_0 9.9626 Tf +(3.3.2.) 22.4159 Tj +[1 0 0 1 97.5043 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 552.101 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 181.19 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 552.101 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -552.101] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 552.101 Td +/F130_0 9.9626 Tf +(13) 9.9626 Tj +[1 0 0 1 516.09 552.101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 540.146 Td +/F130_0 9.9626 Tf +(3.3.3.) 22.4159 Tj +[1 0 0 1 97.5043 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 540.146 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 199.123 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.105 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.533 540.146 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -540.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 540.146 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 540.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 528.191 Td +/F130_0 9.9626 Tf +(3.3.4.) 22.4159 Tj +[1 0 0 1 97.5043 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 528.191 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 217.056 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.037 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.355 528.191 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -528.191] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 528.191 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 516.09 528.191] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 516.236 Td +/F130_0 9.9626 Tf +(3.3.5.) 22.4159 Tj +[1 0 0 1 97.5043 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 516.236 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 193.146 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 516.236 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -516.236] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 516.236 Td +/F130_0 9.9626 Tf +(17) 9.9626 Tj +[1 0 0 1 516.09 516.236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 504.281 Td +/F130_0 9.9626 Tf +(3.3.6.) 22.4159 Tj +[1 0 0 1 97.5043 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 504.281 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 211.078 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 504.281 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -504.281] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 504.281 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 504.281] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -492.325] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 492.325 Td +/F130_0 9.9626 Tf +(3.4.) 14.9439 Tj +-310 TJm +(High-le) 30.4357 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +[1 0 0 1 169.483 492.325] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.465 -492.325] cm +[1 0 0 1 0 0] Tm +0 0 Td +184.216 492.325 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 492.325] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -492.325] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 492.325 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 516.09 492.325] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 480.37 Td +/F130_0 9.9626 Tf +(3.4.1.) 22.4159 Tj +[1 0 0 1 97.5043 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 480.37 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 181.19 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -186.172 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.497 480.37 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -480.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 480.37 Td +/F130_0 9.9626 Tf +(19) 9.9626 Tj +[1 0 0 1 516.09 480.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 468.415 Td +/F130_0 9.9626 Tf +(3.4.2.) 22.4159 Tj +[1 0 0 1 97.5043 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 468.415 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 157.28 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -162.261 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.472 468.415 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -468.415] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 468.415 Td +/F130_0 9.9626 Tf +(20) 9.9626 Tj +[1 0 0 1 516.09 468.415] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 456.46 Td +/F130_0 9.9626 Tf +(3.4.3.) 22.4159 Tj +[1 0 0 1 97.5043 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 456.46 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 211.078 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.06 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.938 456.46 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -456.46] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 456.46 Td +/F130_0 9.9626 Tf +(21) 9.9626 Tj +[1 0 0 1 516.09 456.46] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 444.505 Td +/F130_0 9.9626 Tf +(3.4.4.) 22.4159 Tj +[1 0 0 1 97.5043 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 444.505 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 187.168 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 444.505 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -444.505] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 444.505 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 444.505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 432.55 Td +/F130_0 9.9626 Tf +(3.4.5.) 22.4159 Tj +[1 0 0 1 97.5043 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 432.55 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 187.168 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.149 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.914 432.55 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -432.55] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 432.55 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 516.09 432.55] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 420.594 Td +/F130_0 9.9626 Tf +(3.4.6.) 22.4159 Tj +[1 0 0 1 97.5043 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 420.594 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 163.258 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.239 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.675 420.594 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -420.594] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 420.594 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 420.594] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6452] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 408.639 Td +/F130_0 9.9626 Tf +(3.4.7.) 22.4159 Tj +[1 0 0 1 97.5043 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 408.639 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 193.146 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.127 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.116 408.639 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -408.639] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 408.639 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 516.09 408.639] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.6451] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -396.684] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 396.684 Td +/F130_0 9.9626 Tf +(3.4.8.) 22.4159 Tj +-310 TJm +(Handling) 37.0808 Tj +-250 TJm +(embedded) 40.9463 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(streams) 30.4357 Tj +[1 0 0 1 279.56 396.684] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.541 -396.684] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.601 396.684 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 396.684] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -396.684] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 396.684 Td +/F130_0 9.9626 Tf +(24) 9.9626 Tj +[1 0 0 1 516.09 396.684] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -384.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 384.729 Td +/F130_0 9.9626 Tf +(3.4.9.) 22.4159 Tj +-310 TJm +(Standard) 35.417 Tj +-250 TJm +(\002le-reading/writing) 77.4791 Tj +-250 TJm +(code) 18.8094 Tj +[1 0 0 1 234.19 384.729] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.172 -384.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +247.564 384.729 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 384.729] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -384.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 384.729 Td +/F130_0 9.9626 Tf +(25) 9.9626 Tj +[1 0 0 1 516.09 384.729] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -372.774] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 372.774 Td +/F130_0 9.9626 Tf +(3.5.) 14.9439 Tj +-310 TJm +(Utility) 26.0223 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 155.625 372.774] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.607 -372.774] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.645 372.774 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 372.774] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -372.774] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 372.774 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 372.774] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 360.819 Td +/F130_0 9.9626 Tf +(3.5.1.) 22.4159 Tj +[1 0 0 1 97.5043 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 360.819 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 240.966 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.948 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.38 360.819 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -360.819] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 360.819 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 516.09 360.819] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 348.863 Td +/F130_0 9.9626 Tf +(3.5.2.) 22.4159 Tj +[1 0 0 1 97.5043 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -97.5043 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +97.5043 348.863 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 252.922 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -257.903 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +267.999 348.863 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -348.863] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 348.863 Td +/F130_0 9.9626 Tf +(27) 9.9626 Tj +[1 0 0 1 516.09 348.863] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -1.5342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -10.421] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 336.908 Td +/F130_0 9.9626 Tf +(3.6.) 14.9439 Tj +[1 0 0 1 90.0324 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90.0324 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +90.0324 336.908 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 113.943 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.943 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.433 336.908 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +-250 TJm +(functions) 37.0808 Tj +[1 0 0 1 209.144 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.126 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +223.971 336.908 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -336.908] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 336.908 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 336.908] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 324.953 Td +/F130_0 9.9626 Tf +(3.7.) 14.9439 Tj +-310 TJm +(Using) 23.8007 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 177.195 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.195 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +177.195 324.953 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 207.083 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.083 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.083 324.953 Td +/F130_0 9.9626 Tf +(-free) 18.7994 Tj +-250 TJm +(en) 9.40469 Tj +40 TJm +(vironment) 40.9562 Tj +[1 0 0 1 278.335 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -283.316 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +291.775 324.953 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -324.953] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 324.953 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 516.09 324.953] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.998 Td +/F130_0 9.9626 Tf +(3.7.1.) 22.4159 Tj +-310 TJm +(Getting) 29.8878 Tj +-250 TJm +(rid) 11.0684 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 154.231 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -154.231 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +154.231 312.998 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 184.119 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.1 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.175 312.998 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -312.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 312.998 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 312.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -301.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 301.043 Td +/F130_0 9.9626 Tf +(3.7.2.) 22.4159 Tj +-310 TJm +(Critical) 29.8878 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(handling) 34.8691 Tj +[1 0 0 1 186.599 301.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.58 -301.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.629 301.043 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 301.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -301.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 301.043 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 301.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -289.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 289.088 Td +/F130_0 9.9626 Tf +(3.8.) 14.9439 Tj +-310 TJm +(Making) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(DLL) 19.3673 Tj +[1 0 0 1 189.828 289.088] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194.809 -289.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.243 289.088 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 289.088] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -289.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 289.088 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 516.09 289.088] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1569] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -267.006] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 257.207 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-250 TJm +(chapter) 29.3199 Tj +-250 TJm +(describes) 37.0708 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(programming) 54.2364 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 282.448 257.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.448 -257.207] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.448 257.207 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 330.269 257.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.269 -257.207] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.269 257.207 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 255.05] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -245.088] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 235.289 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-273 TJm +(general) 29.3199 Tj +-272 TJm +(background) 47.0334 Tj +-273 TJm +(information,) 49.534 Tj +-278 TJm +(particularly) 45.9276 Tj +-273 TJm +(about) 22.1369 Tj +-273 TJm +(memory) 33.2053 Tj +-272 TJm +(use) 13.2801 Tj +-273 TJm +(and) 14.386 Tj +-273 TJm +(performance) 50.341 Tj +-272 TJm +(aspects,) 31.2626 Tj +-279 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-272 TJm +(be) 9.40469 Tj +-273 TJm +(well) 17.1556 Tj +-273 TJm +(advised) 30.4357 Tj +72 223.334 Td +(to) 7.7509 Tj +-250 TJm +(read) 17.1456 Tj +[1 0 0 1 101.878 223.334] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -101.878 -223.334] cm +[1 0 0 1 0 0] Tm +0 0 Td +101.878 223.334 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 171.636 223.334] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -171.636 -223.334] cm +[1 0 0 1 0 0] Tm +0 0 Td +174.126 223.334 Td +/F130_0 9.9626 Tf +([2]) 11.6164 Tj +[1 0 0 1 185.743 223.334] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -185.743 -223.334] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.233 223.334 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-250 TJm +(well.) 19.6462 Tj +[1 0 0 1 72 221.177] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -211.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 188.581 Td +/F122_0 20.6585 Tf +(3.1.) 34.4584 Tj +-278 TJm +(T) 12.6223 Tj +80 TJm +(op-le) 49.3532 Tj +15 TJm +(vel) 28.7153 Tj +-278 TJm +(structure) 89.5339 Tj +[1 0 0 1 72 184.305] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -174.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 166.664 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 119.821 166.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -166.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +123.608 166.664 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-380 TJm +(a) 4.42339 Tj +-380 TJm +(\003e) 9.9626 Tj +15 TJm +(xible) 19.9252 Tj +-381 TJm +(library) 26.5603 Tj +-380 TJm +(for) 11.6164 Tj +-380 TJm +(compressing) 50.3609 Tj +-380 TJm +(and) 14.386 Tj +-380 TJm +(decompressing) 59.7656 Tj +-380 TJm +(data) 16.5977 Tj +-381 TJm +(in) 7.7509 Tj +-380 TJm +(the) 12.1743 Tj +[1 0 0 1 405.291 166.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -405.291 -166.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.291 166.664 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 435.178 166.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -435.178 -166.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.966 166.664 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-380 TJm +(format.) 29.0509 Tj +-1401 TJm +(Although) 37.6387 Tj +72 154.708 Td +(packaged) 37.6188 Tj +-285 TJm +(as) 8.29885 Tj +-284 TJm +(a) 4.42339 Tj +-285 TJm +(single) 23.8007 Tj +-285 TJm +(entity) 22.6948 Tj +65 TJm +(,) 2.49065 Tj +-293 TJm +(it) 5.53921 Tj +-285 TJm +(helps) 21.031 Tj +-285 TJm +(to) 7.7509 Tj +-284 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(ard) 12.7222 Tj +-285 TJm +(the) 12.1743 Tj +-285 TJm +(library) 26.5603 Tj +-284 TJm +(as) 8.29885 Tj +-285 TJm +(three) 19.9152 Tj +-285 TJm +(separate) 32.6375 Tj +-284 TJm +(parts:) 22.1369 Tj +-380 TJm +(the) 12.1743 Tj +-285 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +-284 TJm +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-285 TJm +(interf) 21.579 Tj +10 TJm +(ace,) 15.7608 Tj +-293 TJm +(and) 14.386 Tj +-285 TJm +(the) 12.1743 Tj +-285 TJm +(high) 17.7135 Tj +72 142.753 Td +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace,) 15.7608 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(utility) 23.8106 Tj +-250 TJm +(functions.) 39.5714 Tj +[1 0 0 1 72 140.596] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -130.634] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 120.835 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-349 TJm +(structure) 34.8591 Tj +-349 TJm +(of) 8.29885 Tj +[1 0 0 1 141.082 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -141.082 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +141.082 120.835 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 188.903 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -188.903 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.903 120.835 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-349 TJm +(interf) 21.579 Tj +10 TJm +(aces) 17.1456 Tj +-349 TJm +(is) 6.64505 Tj +-349 TJm +(similar) 27.6761 Tj +-349 TJm +(to) 7.7509 Tj +-349 TJm +(that) 14.9439 Tj +-349 TJm +(of) 8.29885 Tj +-349 TJm +(Jean-loup) 38.7346 Tj +-349 TJm +(Gailly') 28.224 Tj +55 TJm +(s) 3.87545 Tj +-349 TJm +(and) 14.386 Tj +-349 TJm +(Mark) 21.579 Tj +-349 TJm +(Adler') 26.0024 Tj +55 TJm +(s) 3.87545 Tj +-349 TJm +(e) 4.42339 Tj +15 TJm +(xcellent) 31.5416 Tj +[1 0 0 1 516.09 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.09 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.09 120.835 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 540 120.835] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -120.835] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 108.88 Td +/F130_0 9.9626 Tf +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 106.723] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -96.7608] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 86.9624 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-242 TJm +(e) 4.42339 Tj +15 TJm +(xternally) 35.417 Tj +-242 TJm +(visible) 26.5703 Tj +-241 TJm +(symbols) 33.2153 Tj +-242 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-242 TJm +(names) 25.4544 Tj +-242 TJm +(be) 9.40469 Tj +15 TJm +(ginning) 30.4457 Tj +[1 0 0 1 284.687 86.9624] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.687 -86.9624] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.687 86.9624 Td +/F134_0 9.9626 Tf +(BZ2_) 23.9102 Tj +[1 0 0 1 308.597 86.9624] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -308.597 -86.9624] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.597 86.9624 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-615 TJm +(This) 17.7135 Tj +-241 TJm +(is) 6.64505 Tj +-242 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-242 TJm +(in) 7.7509 Tj +-242 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-242 TJm +(1.0.) 14.9439 Tj +-614 TJm +(The) 15.4918 Tj +-242 TJm +(intention) 35.427 Tj +-242 TJm +(is) 6.64505 Tj +-241 TJm +(to) 7.7509 Tj +-242 TJm +(minimise) 37.0908 Tj +72 75.0073 Td +(pollution) 35.9849 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(namespaces) 47.5814 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(clients.) 28.503 Tj +[1 0 0 1 72 72.8505] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.9987] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.225 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +541.288 50.9514 Td +/F130_0 9.9626 Tf +(8) 4.9813 Tj +[1 0 0 1 455.161 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5986 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0366 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 12 12 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -344.462 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.96 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 498.449 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.449 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.449 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 546.269 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(part) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(need) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 240.567 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.567 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +240.567 710.037 Td +/F134_0 9.9626 Tf +(#include) 47.8205 Tj +-600 TJm +() 53.798 Tj +[1 0 0 1 348.163 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -348.163 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +350.654 710.037 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(sources.) 32.3685 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -697.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 679.416 Td +/F122_0 17.2154 Tf +(3.1.1.) 43.0729 Tj +-278 TJm +(Lo) 21.0372 Tj +15 TJm +(w-le) 33.484 Tj +15 TJm +(vel) 23.9294 Tj +-278 TJm +(summar) 66.9679 Tj +-10 TJm +(y) 9.57176 Tj +[1 0 0 1 72 675.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -665.89] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 657.498 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-212 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-212 TJm +(pro) 13.2801 Tj +15 TJm +(vides) 21.031 Tj +-212 TJm +(services) 32.0895 Tj +-212 TJm +(for) 11.6164 Tj +-212 TJm +(compressing) 50.3609 Tj +-212 TJm +(and) 14.386 Tj +-212 TJm +(decompress) 47.0334 Tj +1 TJm +(ing) 12.7322 Tj +-212 TJm +(data) 16.5977 Tj +-212 TJm +(in) 7.7509 Tj +-212 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +-595 TJm +(There') 26.5503 Tj +55 TJm +(s) 3.87545 Tj +-212 TJm +(no) 9.9626 Tj +-212 TJm +(pro) 13.2801 Tj +15 TJm +(vision) 24.3586 Tj +-212 TJm +(for) 11.6164 Tj +-212 TJm +(dealing) 29.3299 Tj +72 645.543 Td +(with) 17.7135 Tj +-213 TJm +(\002les,) 19.0983 Tj +-220 TJm +(streams) 30.4357 Tj +-213 TJm +(or) 8.29885 Tj +-213 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-213 TJm +(other) 20.4731 Tj +-213 TJm +(I/O) 13.2801 Tj +-213 TJm +(mechanisms,) 51.7457 Tj +-221 TJm +(just) 14.396 Tj +-213 TJm +(straight) 29.8878 Tj +-213 TJm +(memory-to-memory) 80.7967 Tj +-213 TJm +(w) 7.193 Tj +10 TJm +(ork.) 15.7708 Tj +-595 TJm +(In) 8.29885 Tj +-213 TJm +(f) 3.31755 Tj +10 TJm +(act,) 14.107 Tj +-221 TJm +(this) 14.396 Tj +-213 TJm +(part) 15.4918 Tj +-213 TJm +(of) 8.29885 Tj +-213 TJm +(the) 12.1743 Tj +-213 TJm +(library) 26.5603 Tj +72 633.588 Td +(can) 13.8281 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(compiled) 37.0808 Tj +-250 TJm +(without) 30.4457 Tj +-250 TJm +(inclusion) 36.5329 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 222.534 633.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.534 -633.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +222.534 633.588 Td +/F134_0 9.9626 Tf +(stdio.h) 41.8429 Tj +[1 0 0 1 264.377 633.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -264.377 -633.588] cm +[1 0 0 1 0 0] Tm +0 0 Td +264.377 633.588 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(helpful) 28.224 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(embedded) 40.9463 Tj +-250 TJm +(applications.) 50.6399 Tj +[1 0 0 1 72 631.431] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -621.469] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 611.67 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(part) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(global) 24.9065 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(ariables) 30.9837 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(therefore) 35.955 Tj +-250 TJm +(thread-safe.) 46.7445 Tj +[1 0 0 1 72 609.513] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -599.551] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 589.752 Td +/F130_0 9.9626 Tf +(Six) 13.2901 Tj +-875 TJm +(routines) 32.0995 Tj +-876 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-875 TJm +(up) 9.9626 Tj +-876 TJm +(the) 12.1743 Tj +-875 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +-876 TJm +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-875 TJm +(interf) 21.579 Tj +10 TJm +(ace:) 16.0398 Tj +[1 0 0 1 308.791 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -308.791 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.791 589.752 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 416.387 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -416.387 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +416.387 589.752 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 429.158 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -429.158 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.158 589.752 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 512.844 589.752] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -512.844 -589.752] cm +[1 0 0 1 0 0] Tm +0 0 Td +512.844 589.752 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-1032 TJm +(and) 14.386 Tj +[1 0 0 1 72 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 577.797 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 173.619 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +186.15 577.797 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-1258 TJm +(compression,) 52.8516 Tj +-1510 TJm +(and) 14.386 Tj +-1257 TJm +(a) 4.42339 Tj +-1258 TJm +(corresponding) 56.996 Tj +-1258 TJm +(trio) 13.8381 Tj +[1 0 0 1 417.958 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -417.958 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +417.958 577.797 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 537.509 577.797] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -577.797] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 577.797 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 565.842 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 167.641 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.641 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.707 565.842 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 192.158 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.158 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.158 565.842 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 305.732 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.732 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.798 565.842 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-508 TJm +(decompression.) 62.2563 Tj +-2171 TJm +(The) 15.4918 Tj +[1 0 0 1 431.918 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.918 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.918 564.099 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +437.895 565.842 Td +(Init) 23.9102 Tj +[1 0 0 1 461.805 565.842] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.805 -565.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +466.871 565.842 Td +/F130_0 9.9626 Tf +(functions) 37.0808 Tj +-508 TJm +(allocate) 30.9837 Tj +72 553.887 Td +(memory) 33.2053 Tj +-574 TJm +(for) 11.6164 Tj +-573 TJm +(compression/decompression) 112.896 Tj +-574 TJm +(and) 14.386 Tj +-574 TJm +(do) 9.9626 Tj +-573 TJm +(other) 20.4731 Tj +-574 TJm +(initialisations,) 56.1891 Tj +-654 TJm +(whilst) 24.3586 Tj +-574 TJm +(the) 12.1743 Tj +[1 0 0 1 419.502 553.887] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -419.502 -553.887] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.502 552.144 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +425.48 553.887 Td +(End) 17.9327 Tj +[1 0 0 1 443.413 553.887] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -443.413 -553.887] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.128 553.887 Td +/F130_0 9.9626 Tf +(functions) 37.0808 Tj +-574 TJm +(close) 20.4731 Tj +-573 TJm +(do) 9.9626 Tj +25 TJm +(wn) 12.1743 Tj +72 541.932 Td +(operations) 41.5042 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(release) 27.6562 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 539.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -529.812] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 520.014 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-303 TJm +(real) 14.9339 Tj +-303 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-303 TJm +(is) 6.64505 Tj +-303 TJm +(done) 19.3673 Tj +-303 TJm +(by) 9.9626 Tj +[1 0 0 1 176.892 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.892 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.892 520.014 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 260.578 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.578 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.598 520.014 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 281.003 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -281.003 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +281.003 520.014 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 376.645 520.014] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -376.645 -520.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +376.645 520.014 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-939 TJm +(These) 23.7907 Tj +-303 TJm +(compress) 37.6287 Tj +-303 TJm +(and) 14.386 Tj +-303 TJm +(decompress) 47.0334 Tj +-303 TJm +(data) 16.5977 Tj +72 508.059 Td +(from) 19.3673 Tj +-205 TJm +(a) 4.42339 Tj +-205 TJm +(user) 16.5977 Tj +20 TJm +(-supplied) 37.0808 Tj +-205 TJm +(input) 20.4831 Tj +-206 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-205 TJm +(to) 7.7509 Tj +-205 TJm +(a) 4.42339 Tj +-205 TJm +(user) 16.5977 Tj +20 TJm +(-supplied) 37.0808 Tj +-205 TJm +(output) 25.4644 Tj +-205 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +55 TJm +(.) 2.49065 Tj +-591 TJm +(These) 23.7907 Tj +-205 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers) 14.9339 Tj +-205 TJm +(can) 13.8281 Tj +-205 TJm +(be) 9.40469 Tj +-205 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-205 TJm +(size;) 18.2614 Tj +-220 TJm +(arbitrary) 34.3012 Tj +-206 TJm +(quantities) 38.7446 Tj +-205 TJm +(of) 8.29885 Tj +72 496.104 Td +(data) 16.5977 Tj +-258 TJm +(are) 12.1643 Tj +-258 TJm +(handled) 31.5416 Tj +-258 TJm +(by) 9.9626 Tj +-257 TJm +(making) 29.8878 Tj +-258 TJm +(repeated) 33.7433 Tj +-258 TJm +(calls) 18.2614 Tj +-258 TJm +(to) 7.7509 Tj +-258 TJm +(these) 20.4731 Tj +-258 TJm +(functions.) 39.5714 Tj +-667 TJm +(This) 17.7135 Tj +-258 TJm +(is) 6.64505 Tj +-258 TJm +(a) 4.42339 Tj +-257 TJm +(\003e) 9.9626 Tj +15 TJm +(xible) 19.9252 Tj +-258 TJm +(mechanism) 45.3796 Tj +-258 TJm +(allo) 14.9439 Tj +25 TJm +(wing) 19.9252 Tj +-258 TJm +(a) 4.42339 Tj +-258 TJm +(consumer) 38.7346 Tj +20 TJm +(-pull) 18.8194 Tj +72 484.148 Td +(style) 18.8194 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(acti) 14.386 Tj +25 TJm +(vity) 15.5018 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(producer) 35.4071 Tj +20 TJm +(-push,) 24.6275 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(mixture) 30.9936 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(both.) 20.2042 Tj +[1 0 0 1 72 481.992] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -472.029] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 453.527 Td +/F122_0 17.2154 Tf +(3.1.2.) 43.0729 Tj +-278 TJm +(High-le) 58.343 Tj +15 TJm +(vel) 23.9294 Tj +-278 TJm +(summar) 66.9679 Tj +-10 TJm +(y) 9.57176 Tj +[1 0 0 1 72 449.697] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -439.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 431.61 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-284 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-284 TJm +(pro) 13.2801 Tj +15 TJm +(vides) 21.031 Tj +-285 TJm +(some) 21.031 Tj +-284 TJm +(handy) 24.3486 Tj +-284 TJm +(wrappers) 36.5129 Tj +-284 TJm +(around) 27.6661 Tj +-284 TJm +(the) 12.1743 Tj +-284 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-285 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-284 TJm +(to) 7.7509 Tj +-284 TJm +(f) 3.31755 Tj +10 TJm +(acilitate) 31.5416 Tj +-284 TJm +(reading) 29.8778 Tj +-284 TJm +(and) 14.386 Tj +-285 TJm +(writ) 16.0497 Tj +1 TJm +(ing) 12.7322 Tj +[1 0 0 1 510.112 431.61] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -431.61] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 431.61 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 540 431.61] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -431.61] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 419.654 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-347 TJm +(\002les) 16.6077 Tj +-346 TJm +(\() 3.31755 Tj +[1 0 0 1 125.391 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.391 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +125.391 419.654 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 149.301 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.301 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.754 419.654 Td +/F130_0 9.9626 Tf +(\002les\).) 22.4159 Tj +-1200 TJm +(The) 15.4918 Tj +-346 TJm +(routines) 32.0995 Tj +-347 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-346 TJm +(hooks) 23.8007 Tj +-347 TJm +(to) 7.7509 Tj +-346 TJm +(f) 3.31755 Tj +10 TJm +(acilitate) 31.5416 Tj +-347 TJm +(reading) 29.8778 Tj +-347 TJm +(\002les) 16.6077 Tj +-346 TJm +(in) 7.7509 Tj +-347 TJm +(which) 24.3486 Tj +-346 TJm +(the) 12.1743 Tj +[1 0 0 1 460.049 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -460.049 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +460.049 419.654 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 489.937 419.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -489.937 -419.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.39 419.654 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-347 TJm +(stream) 26.5603 Tj +72 407.699 Td +(is) 6.64505 Tj +-339 TJm +(embedded) 40.9463 Tj +-339 TJm +(within) 25.4644 Tj +-339 TJm +(some) 21.031 Tj +-339 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +20 TJm +(-scale) 23.2328 Tj +-339 TJm +(\002le) 12.7322 Tj +-339 TJm +(structure,) 37.3498 Tj +-361 TJm +(or) 8.29885 Tj +-339 TJm +(wh) 12.1743 Tj +-1 TJm +(e) 4.42339 Tj +1 TJm +(re) 7.74094 Tj +-340 TJm +(there) 19.9152 Tj +-339 TJm +(are) 12.1643 Tj +-339 TJm +(multiple) 33.2153 Tj +[1 0 0 1 400.941 407.699] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -400.941 -407.699] cm +[1 0 0 1 0 0] Tm +0 0 Td +400.941 407.699 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 430.829 407.699] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -430.829 -407.699] cm +[1 0 0 1 0 0] Tm +0 0 Td +434.207 407.699 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-339 TJm +(streams) 30.4357 Tj +-339 TJm +(concatenated) 52.0048 Tj +72 395.744 Td +(end-to-end.) 45.6486 Tj +[1 0 0 1 72 395.644] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -385.682] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 373.826 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-332 TJm +(reading) 29.8778 Tj +-333 TJm +(\002les,) 19.0983 Tj +[1 0 0 1 144.803 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -144.803 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.803 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 228.489 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -228.489 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +228.489 373.826 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 234.496 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.496 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.496 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 294.272 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.272 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.272 373.826 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 300.279 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.279 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.279 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 389.942 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -389.942 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +393.253 373.826 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 410.951 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.951 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.951 373.826 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 524.525 373.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -524.525 -373.826] cm +[1 0 0 1 0 0] Tm +0 0 Td +527.836 373.826 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +72 361.871 Td +(supplied.) 36.2539 Tj +-620 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(writing) 28.782 Tj +-250 TJm +(\002les,) 19.0983 Tj +[1 0 0 1 183.471 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.471 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.471 361.871 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 273.135 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.135 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +273.135 361.871 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 278.116 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.116 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.116 361.871 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 343.869 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -343.869 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +346.36 361.871 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 363.237 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.237 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.237 361.871 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteFinish) 101.619 Tj +[1 0 0 1 464.856 361.871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -464.856 -361.871] cm +[1 0 0 1 0 0] Tm +0 0 Td +467.346 361.871 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 72 359.714] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -349.751] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 339.953 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-374 TJm +(with) 17.7135 Tj +-374 TJm +(the) 12.1743 Tj +-375 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-374 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-405 TJm +(no) 9.9626 Tj +-374 TJm +(global) 24.9065 Tj +-374 TJm +(v) 4.9813 Tj +25 TJm +(ariables) 30.9837 Tj +-375 TJm +(are) 12.1643 Tj +-374 TJm +(used) 18.2614 Tj +-374 TJm +(so) 8.85675 Tj +-374 TJm +(the) 12.1743 Tj +-374 TJm +(library) 26.5603 Tj +-375 TJm +(is) 6.64505 Tj +-374 TJm +(per) 12.7222 Tj +-374 TJm +(se) 8.29885 Tj +-374 TJm +(thread-safe.) 46.7445 Tj +-1365 TJm +(Ho) 12.1743 Tj +25 TJm +(we) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +40 TJm +(,) 2.49065 Tj +-406 TJm +(if) 6.08715 Tj +-374 TJm +(I/O) 13.2801 Tj +72 327.998 Td +(errors) 23.2328 Tj +-267 TJm +(occur) 22.1269 Tj +-267 TJm +(whilst) 24.3586 Tj +-267 TJm +(reading) 29.8778 Tj +-267 TJm +(or) 8.29885 Tj +-267 TJm +(writing) 28.782 Tj +-267 TJm +(the) 12.1743 Tj +-268 TJm +(underlying) 43.1679 Tj +-267 TJm +(compressed) 47.0334 Tj +-267 TJm +(\002les,) 19.0983 Tj +-271 TJm +(you) 14.9439 Tj +-267 TJm +(may) 17.1556 Tj +-267 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-267 TJm +(to) 7.7509 Tj +-267 TJm +(consult) 28.782 Tj +[1 0 0 1 457.199 327.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -457.199 -327.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +457.199 327.998 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 487.087 327.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -487.087 -327.998] cm +[1 0 0 1 0 0] Tm +0 0 Td +489.748 327.998 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-267 TJm +(determine) 39.8404 Tj +72 316.043 Td +(the) 12.1743 Tj +-366 TJm +(cause) 22.1269 Tj +-365 TJm +(of) 8.29885 Tj +-366 TJm +(the) 12.1743 Tj +-365 TJm +(error) 19.3573 Tj +55 TJm +(.) 2.49065 Tj +-1314 TJm +(In) 8.29885 Tj +-366 TJm +(that) 14.9439 Tj +-365 TJm +(case,) 19.6363 Tj +-395 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-366 TJm +(need) 18.8094 Tj +-365 TJm +(a) 4.42339 Tj +-366 TJm +(C) 6.64505 Tj +-365 TJm +(library) 26.5603 Tj +-366 TJm +(which) 24.3486 Tj +-366 TJm +(correctly) 35.4071 Tj +-365 TJm +(supports) 33.7633 Tj +[1 0 0 1 431.668 316.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.668 -316.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.668 316.043 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 461.556 316.043] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.556 -316.043] cm +[1 0 0 1 0 0] Tm +0 0 Td +465.199 316.043 Td +/F130_0 9.9626 Tf +(in) 7.7509 Tj +-366 TJm +(a) 4.42339 Tj +-365 TJm +(multithreaded) 55.3422 Tj +72 304.088 Td +(en) 9.40469 Tj +40 TJm +(vironment.) 43.4469 Tj +[1 0 0 1 72 303.988] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -294.025] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 282.17 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-243 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-243 TJm +(the) 12.1743 Tj +-242 TJm +(library) 26.5603 Tj +-243 TJm +(a) 4.42339 Tj +-243 TJm +(little) 18.2714 Tj +-242 TJm +(simpler) 29.8878 Tj +-243 TJm +(and) 14.386 Tj +-243 TJm +(more) 20.4731 Tj +-243 TJm +(portable,) 35.1381 Tj +[1 0 0 1 289.263 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.263 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.263 282.17 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 372.949 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -372.949 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +375.368 282.17 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 392.172 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.172 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.172 282.17 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 481.836 282.17] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -481.836 -282.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +484.254 282.17 Td +/F130_0 9.9626 Tf +(require) 28.2141 Tj +-243 TJm +(you) 14.9439 Tj +-242 TJm +(to) 7.7509 Tj +72 270.215 Td +(pass) 17.1556 Tj +-247 TJm +(them) 19.9252 Tj +-248 TJm +(\002le) 12.7322 Tj +-247 TJm +(handles) 30.4357 Tj +-247 TJm +(\() 3.31755 Tj +[1 0 0 1 165.421 270.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.421 -270.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.421 270.215 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +189.331 268.471 Td +(*) 5.97756 Tj +[1 0 0 1 195.309 270.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -195.309 -270.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +195.309 270.215 Td +/F130_0 9.9626 Tf +(s\)) 7.193 Tj +-247 TJm +(which) 24.3486 Tj +-248 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-247 TJm +(pre) 12.7222 Tj +25 TJm +(viously) 29.3399 Tj +-247 TJm +(been) 18.8094 Tj +-248 TJm +(opened) 28.772 Tj +-247 TJm +(for) 11.6164 Tj +-247 TJm +(reading) 29.8778 Tj +-247 TJm +(or) 8.29885 Tj +-248 TJm +(writing) 28.782 Tj +-247 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +-618 TJm +(That) 18.2614 Tj +-248 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(oids) 16.6077 Tj +72 258.26 Td +(portability) 41.5142 Tj +-272 TJm +(problems) 37.0808 Tj +-273 TJm +(associated) 40.9463 Tj +-272 TJm +(with) 17.7135 Tj +-272 TJm +(\002le) 12.7322 Tj +-273 TJm +(operations) 41.5042 Tj +-272 TJm +(and) 14.386 Tj +-272 TJm +(\002le) 12.7322 Tj +-273 TJm +(attrib) 21.031 Tj +20 TJm +(utes,) 18.5404 Tj +-278 TJm +(whilst) 24.3586 Tj +-272 TJm +(not) 12.7322 Tj +-272 TJm +(being) 22.1369 Tj +-273 TJm +(much) 22.1369 Tj +-272 TJm +(of) 8.29885 Tj +-273 TJm +(an) 9.40469 Tj +-272 TJm +(imposition) 42.63 Tj +-272 TJm +(on) 9.9626 Tj +-273 TJm +(the) 12.1743 Tj +72 246.304 Td +(programmer) 49.2451 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 244.147] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -234.185] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 215.683 Td +/F122_0 17.2154 Tf +(3.1.3.) 43.0729 Tj +-278 TJm +(Utility) 47.8244 Tj +-278 TJm +(functions) 77.4693 Tj +-278 TJm +(summar) 66.9679 Tj +-10 TJm +(y) 9.57176 Tj +[1 0 0 1 72 212.12] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -202.157] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 193.765 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-273 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-273 TJm +(simple) 26.5703 Tj +-273 TJm +(needs,) 25.1755 Tj +[1 0 0 1 165.929 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.929 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.929 193.765 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 309.391 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -309.391 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +312.112 193.765 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 329.219 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -329.219 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +329.219 193.765 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 484.636 193.765] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -484.636 -193.765] cm +[1 0 0 1 0 0] Tm +0 0 Td +487.357 193.765 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-273 TJm +(pro) 13.2801 Tj +15 TJm +(vided.) 24.6275 Tj +72 181.81 Td +(These) 23.7907 Tj +-374 TJm +(compress) 37.6287 Tj +-373 TJm +(data) 16.5977 Tj +-374 TJm +(in) 7.7509 Tj +-373 TJm +(memory) 33.2053 Tj +-374 TJm +(from) 19.3673 Tj +-373 TJm +(one) 14.386 Tj +-374 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-373 TJm +(to) 7.7509 Tj +-374 TJm +(another) 29.8778 Tj +-374 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-373 TJm +(in) 7.7509 Tj +-374 TJm +(a) 4.42339 Tj +-373 TJm +(single) 23.8007 Tj +-374 TJm +(function) 33.2053 Tj +-373 TJm +(call.) 16.8766 Tj +-1362 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-373 TJm +(should) 26.5703 Tj +-374 TJm +(assess) 24.3486 Tj +72 169.855 Td +(whether) 32.0895 Tj +-344 TJm +(these) 20.4731 Tj +-343 TJm +(functions) 37.0808 Tj +-344 TJm +(ful\002ll) 22.1469 Tj +-344 TJm +(your) 18.2614 Tj +-343 TJm +(memory-to-memory) 80.7967 Tj +-344 TJm +(compression/decompression) 112.896 Tj +-343 TJm +(requirements) 52.0147 Tj +-344 TJm +(before) 25.4445 Tj +-344 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(esting) 23.8007 Tj +72 157.9 Td +(ef) 7.74094 Tj +25 TJm +(fort) 14.386 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(understanding) 56.4481 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(general) 29.3199 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(comple) 29.3299 Tj +15 TJm +(x) 4.9813 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +[1 0 0 1 72 155.743] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -145.78] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 135.982 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-423 TJm +(Tsuneo) 29.3299 Tj +-422 TJm +(\() 3.31755 Tj +[1 0 0 1 150.16 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -150.16 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.16 135.982 Td +/F134_0 9.9626 Tf +(tsuneo@rr.iij4u.or.jp) 125.529 Tj +[1 0 0 1 275.69 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -275.69 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.69 135.982 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-423 TJm +(has) 13.2801 Tj +-422 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-423 TJm +(some) 21.031 Tj +-423 TJm +(functions) 37.0808 Tj +-422 TJm +(to) 7.7509 Tj +-423 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-423 TJm +(better) 22.6848 Tj +[1 0 0 1 476.462 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -476.462 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +476.462 135.982 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 500.372 135.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -500.372 -135.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.583 135.982 Td +/F130_0 9.9626 Tf +(compati-) 35.417 Tj +72 124.027 Td +(bility) 21.041 Tj +65 TJm +(.) 2.49065 Tj +-1446 TJm +(These) 23.7907 Tj +-388 TJm +(functions) 37.0808 Tj +-387 TJm +(are) 12.1643 Tj +[1 0 0 1 193.913 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.913 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.913 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzopen) 59.7756 Tj +[1 0 0 1 253.689 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.689 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.689 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 260.385 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.385 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +260.385 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzread) 59.7756 Tj +[1 0 0 1 320.161 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -320.161 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +320.161 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 326.857 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -326.857 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +326.857 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzwrite) 65.7532 Tj +[1 0 0 1 392.611 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.611 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.611 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 399.306 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -399.306 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.306 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzflush) 65.7532 Tj +[1 0 0 1 465.06 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -465.06 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +465.06 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 471.756 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -471.756 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +471.756 124.027 Td +/F134_0 9.9626 Tf +(BZ2_bzclose) 65.7532 Tj +[1 0 0 1 537.509 124.027] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -124.027] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 124.027 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 112.072 Td +/F134_0 9.9626 Tf +(BZ2_bzerror) 65.7532 Tj +[1 0 0 1 137.753 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.408 112.072 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 157.449 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.449 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +157.449 112.072 Td +/F134_0 9.9626 Tf +(BZ2_bzlibVersion) 95.641 Tj +[1 0 0 1 253.091 112.072] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.091 -112.072] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.091 112.072 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-719 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-266 TJm +(may) 17.1556 Tj +-267 TJm +(\002nd) 15.5018 Tj +-266 TJm +(these) 20.4731 Tj +-267 TJm +(functions) 37.0808 Tj +-266 TJm +(more) 20.4731 Tj +-267 TJm +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(enient) 24.3486 Tj +-266 TJm +(for) 11.6164 Tj +-267 TJm +(simple) 26.5703 Tj +-266 TJm +(\002le) 12.7322 Tj +-267 TJm +(reading) 29.8778 Tj +72 100.117 Td +(and) 14.386 Tj +-270 TJm +(wri) 13.2801 Tj +1 TJm +(ting,) 17.9925 Tj +-275 TJm +(than) 17.1556 Tj +-269 TJm +(those) 21.031 Tj +-270 TJm +(in) 7.7509 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(high-le) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-269 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +-737 TJm +(These) 23.7907 Tj +-270 TJm +(functions) 37.0808 Tj +-269 TJm +(are) 12.1643 Tj +-270 TJm +(not) 12.7322 Tj +-269 TJm +(\(yet\)) 18.8094 Tj +-270 TJm +(of) 8.29885 Tj +25 TJm +(\002cially) 27.6761 Tj +-269 TJm +(part) 15.4918 Tj +-270 TJm +(of) 8.29885 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-274 TJm +(and) 14.386 Tj +-270 TJm +(are) 12.1643 Tj +72 88.1614 Td +(minimally) 40.9662 Tj +-291 TJm +(documented) 48.6972 Tj +-291 TJm +(here.) 19.6363 Tj +-867 TJm +(If) 6.63509 Tj +-291 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-291 TJm +(break,) 24.6176 Tj +-301 TJm +(you) 14.9439 Tj +-291 TJm +(get) 12.1743 Tj +-292 TJm +(to) 7.7509 Tj +-291 TJm +(k) 4.9813 Tj +10 TJm +(eep) 13.8281 Tj +-291 TJm +(all) 9.9626 Tj +-291 TJm +(the) 12.1743 Tj +-291 TJm +(pieces.) 27.3872 Tj +-433 TJm +(I) 3.31755 Tj +-291 TJm +(hope) 19.3673 Tj +-291 TJm +(to) 7.7509 Tj +-291 TJm +(document) 39.2925 Tj +-292 TJm +(them) 19.9252 Tj +-291 TJm +(properly) 33.7533 Tj +-291 TJm +(when) 21.579 Tj +72 76.2062 Td +(time) 17.7135 Tj +-250 TJm +(permits.) 32.3785 Tj +[1 0 0 1 72 74.0494] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -23.1976] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.9737] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 43.0633 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.225 -51.071] cm +[1 0 0 1 0 0] Tm +0 0 Td +541.288 51.071 Td +/F130_0 9.9626 Tf +(9) 4.9813 Tj +[1 0 0 1 455.161 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5986 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0366 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 13 13 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-250 TJm +(also) 16.0497 Tj +-250 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-250 TJm +(modi\002cations) 54.2464 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uilt) 13.2901 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-250 TJm +(DLL.) 21.8579 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -698.137] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 675.504 Td +/F122_0 20.6585 Tf +(3.2.) 34.4584 Tj +-278 TJm +(Err) 29.8515 Tj +20 TJm +(or) 20.6585 Tj +-278 TJm +(handling) 86.084 Tj +[1 0 0 1 72 670.907] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -661.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 653.805 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-214 TJm +(library) 26.5603 Tj +-215 TJm +(is) 6.64505 Tj +-214 TJm +(designed) 35.417 Tj +-215 TJm +(to) 7.7509 Tj +-214 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-215 TJm +(cleanly) 28.772 Tj +-214 TJm +(in) 7.7509 Tj +-215 TJm +(all) 9.9626 Tj +-214 TJm +(situations,) 40.6873 Tj +-222 TJm +(including) 37.6387 Tj +-214 TJm +(the) 12.1743 Tj +-215 TJm +(w) 7.193 Tj +10 TJm +(orst-case) 35.4071 Tj +-214 TJm +(situation) 34.3212 Tj +-215 TJm +(of) 8.29885 Tj +-214 TJm +(decompressing) 59.7656 Tj +-215 TJm +(random) 30.4357 Tj +72 641.85 Td +(data.) 19.0883 Tj +-764 TJm +(I'm) 14.386 Tj +-274 TJm +(not) 12.7322 Tj +-275 TJm +(100%) 23.2427 Tj +-274 TJm +(sure) 16.5977 Tj +-274 TJm +(that) 14.9439 Tj +-274 TJm +(it) 5.53921 Tj +-274 TJm +(can) 13.8281 Tj +-274 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-274 TJm +(do) 9.9626 Tj +-274 TJm +(this,) 16.8866 Tj +-280 TJm +(so) 8.85675 Tj +-274 TJm +(you) 14.9439 Tj +-274 TJm +(might) 23.2527 Tj +-274 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-274 TJm +(to) 7.7509 Tj +-274 TJm +(add) 14.386 Tj +-274 TJm +(a) 4.42339 Tj +-275 TJm +(s) 3.87545 Tj +1 TJm +(ignal) 19.9252 Tj +-275 TJm +(handler) 29.8778 Tj +-274 TJm +(to) 7.7509 Tj +-274 TJm +(catch) 21.0211 Tj +-274 TJm +(se) 8.29885 Tj +15 TJm +(gmentation) 44.8317 Tj +72 629.894 Td +(violations) 39.3025 Tj +-273 TJm +(during) 26.0123 Tj +-273 TJm +(decompression) 59.7656 Tj +-273 TJm +(if) 6.08715 Tj +-273 TJm +(you) 14.9439 Tj +-273 TJm +(are) 12.1643 Tj +-273 TJm +(feeling) 27.6661 Tj +-274 TJm +(especiall) 34.8591 Tj +1 TJm +(y) 4.9813 Tj +-274 TJm +(paranoid.) 37.3498 Tj +-758 TJm +(I) 3.31755 Tj +-273 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-273 TJm +(be) 9.40469 Tj +-273 TJm +(interested) 38.7346 Tj +-273 TJm +(in) 7.7509 Tj +-274 TJm +(hearing) 29.8778 Tj +-273 TJm +(more) 20.4731 Tj +-273 TJm +(about) 22.1369 Tj +72 617.939 Td +(the) 12.1743 Tj +-250 TJm +(rob) 13.2801 Tj +20 TJm +(ustness) 28.782 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(corrupted) 38.1767 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 72 615.783] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -606.039] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 596.241 Td +/F130_0 9.9626 Tf +(V) 7.193 Tj +111 TJm +(ersion) 24.3486 Tj +-251 TJm +(1.0.3) 19.9252 Tj +-251 TJm +(more) 20.4731 Tj +-251 TJm +(rob) 13.2801 Tj +20 TJm +(ust) 11.6264 Tj +-251 TJm +(in) 7.7509 Tj +-251 TJm +(this) 14.396 Tj +-251 TJm +(respect) 28.2141 Tj +-252 TJm +(than) 17.1556 Tj +-251 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-251 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-251 TJm +(v) 4.9813 Tj +15 TJm +(ersion.) 26.8392 Tj +-626 TJm +(In) 8.29885 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(estig) 18.8194 Tj +5 TJm +(ations) 23.8007 Tj +-251 TJm +(with) 17.7135 Tj +-251 TJm +(V) 7.193 Tj +111 TJm +(algrind) 28.224 Tj +-251 TJm +(\(a) 7.74094 Tj +-252 TJm +(tool) 15.5018 Tj +-251 TJm +(for) 11.6164 Tj +-251 TJm +(detecting) 36.5229 Tj +72 584.285 Td +(problems) 37.0808 Tj +-422 TJm +(with) 17.7135 Tj +-421 TJm +(memory) 33.2053 Tj +-422 TJm +(management\)) 54.2264 Tj +-421 TJm +(indicate) 31.5416 Tj +-422 TJm +(that,) 17.4346 Tj +-464 TJm +(at) 7.193 Tj +-422 TJm +(least) 18.2614 Tj +-421 TJm +(for) 11.6164 Tj +-422 TJm +(the) 12.1743 Tj +-422 TJm +(f) 3.31755 Tj +1 TJm +(e) 4.42339 Tj +25 TJm +(w) 7.193 Tj +-422 TJm +(\002les) 16.6077 Tj +-422 TJm +(I) 3.31755 Tj +-421 TJm +(tested,) 25.7334 Tj +-464 TJm +(all) 9.9626 Tj +-422 TJm +(single-bit) 37.6387 Tj +-422 TJm +(errors) 23.2328 Tj +-421 TJm +(in) 7.7509 Tj +-422 TJm +(the) 12.1743 Tj +72 572.33 Td +(decompressed) 56.4381 Tj +-342 TJm +(data) 16.5977 Tj +-341 TJm +(are) 12.1643 Tj +-342 TJm +(caught) 26.5603 Tj +-342 TJm +(properly) 33.7533 Tj +65 TJm +(,) 2.49065 Tj +-365 TJm +(with) 17.7135 Tj +-341 TJm +(no) 9.9626 Tj +-342 TJm +(se) 8.29885 Tj +15 TJm +(gmentation) 44.8317 Tj +-342 TJm +(f) 3.31755 Tj +10 TJm +(aults,) 21.31 Tj +-365 TJm +(no) 9.9626 Tj +-341 TJm +(uses) 17.1556 Tj +-342 TJm +(of) 8.29885 Tj +-342 TJm +(uninitialised) 49.2651 Tj +-342 TJm +(data,) 19.0883 Tj +-364 TJm +(no) 9.9626 Tj +-342 TJm +(out) 12.7322 Tj +-342 TJm +(of) 8.29885 Tj +-342 TJm +(range) 22.1269 Tj +72 560.375 Td +(reads) 21.0211 Tj +-261 TJm +(or) 8.29885 Tj +-260 TJm +(writes,) 26.8392 Tj +-263 TJm +(and) 14.386 Tj +-261 TJm +(no) 9.9626 Tj +-261 TJm +(in\002nit) 23.8106 Tj +1 TJm +(e) 4.42339 Tj +-261 TJm +(looping) 30.4457 Tj +-261 TJm +(in) 7.7509 Tj +-260 TJm +(the) 12.1743 Tj +-261 TJm +(decompressor) 55.3323 Tj +55 TJm +(.) 2.49065 Tj +-342 TJm +(So) 10.5205 Tj +-260 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-261 TJm +(certainly) 34.8591 Tj +-260 TJm +(pretty) 23.2427 Tj +-261 TJm +(rob) 13.2801 Tj +20 TJm +(ust,) 14.117 Tj +-263 TJm +(although) 34.8691 Tj +-261 TJm +(I) 3.31755 Tj +-260 TJm +(w) 7.193 Tj +10 TJm +(ouldn') 26.0123 Tj +18 TJm +(t) 2.7696 Tj +-261 TJm +(claim) 22.1369 Tj +72 548.42 Td +(it) 5.53921 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(totally) 25.4644 Tj +-250 TJm +(bombproof.) 46.7644 Tj +[1 0 0 1 72 546.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -536.519] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 526.721 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-282 TJm +(\002le) 12.7322 Tj +[1 0 0 1 105.84 526.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -105.84 -526.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +105.84 526.721 Td +/F134_0 9.9626 Tf +(bzlib.h) 41.8429 Tj +[1 0 0 1 147.683 526.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.683 -526.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.491 526.721 Td +/F130_0 9.9626 Tf +(contains) 33.2053 Tj +-282 TJm +(all) 9.9626 Tj +-282 TJm +(de\002nitions) 42.0721 Tj +-282 TJm +(nee) 13.8281 Tj +1 TJm +(ded) 14.386 Tj +-282 TJm +(to) 7.7509 Tj +-282 TJm +(use) 13.2801 Tj +-282 TJm +(the) 12.1743 Tj +-282 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-811 TJm +(In) 8.29885 Tj +-282 TJm +(particular) 38.1767 Tj +40 TJm +(,) 2.49065 Tj +-290 TJm +(you) 14.9439 Tj +-282 TJm +(should) 26.5703 Tj +-281 TJm +(de\002nitely) 37.6387 Tj +-282 TJm +(not) 12.7322 Tj +-282 TJm +(include) 29.3299 Tj +[1 0 0 1 72 514.766] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -514.766] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 514.766 Td +/F134_0 9.9626 Tf +(bzlib_private.h) 89.6634 Tj +[1 0 0 1 161.664 514.766] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -514.766] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.664 514.766 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 513.232] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -503.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 493.067 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +[1 0 0 1 82.8075 493.067] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -82.8075 -493.067] cm +[1 0 0 1 0 0] Tm +0 0 Td +82.8075 493.067 Td +/F134_0 9.9626 Tf +(bzlib.h) 41.8429 Tj +[1 0 0 1 124.651 493.067] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -124.651 -493.067] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.651 493.067 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-252 TJm +(the) 12.1743 Tj +-252 TJm +(v) 4.9813 Tj +25 TJm +(arious) 24.3486 Tj +-252 TJm +(return) 23.7907 Tj +-252 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-251 TJm +(are) 12.1643 Tj +-252 TJm +(de\002ned.) 31.8205 Tj +-631 TJm +(The) 15.4918 Tj +-252 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-252 TJm +(list) 12.1843 Tj +-251 TJm +(is) 6.64505 Tj +-252 TJm +(not) 12.7322 Tj +-252 TJm +(intended) 34.3112 Tj +-252 TJm +(as) 8.29885 Tj +-252 TJm +(an) 9.40469 Tj +-251 TJm +(e) 4.42339 Tj +15 TJm +(xhausti) 28.782 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-252 TJm +(description) 44.2738 Tj +-252 TJm +(of) 8.29885 Tj +72 481.112 Td +(the) 12.1743 Tj +-236 TJm +(circumstances) 56.4381 Tj +-236 TJm +(in) 7.7509 Tj +-237 TJm +(which) 24.3486 Tj +-236 TJm +(a) 4.42339 Tj +-236 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-236 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-236 TJm +(may) 17.1556 Tj +-237 TJm +(be) 9.40469 Tj +-236 TJm +(returned) 33.1954 Tj +-236 TJm +(--) 6.63509 Tj +-236 TJm +(those) 21.031 Tj +-236 TJm +(descriptions) 48.1492 Tj +-236 TJm +(are) 12.1643 Tj +-237 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-236 TJm +(later) 17.7035 Tj +55 TJm +(.) 2.49065 Tj +-305 TJm +(Rather) 26.5603 Tj +40 TJm +(,) 2.49065 Tj +-239 TJm +(it) 5.53921 Tj +-236 TJm +(is) 6.64505 Tj +-237 TJm +(intended) 34.3112 Tj +-236 TJm +(to) 7.7509 Tj +72 469.157 Td +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +15 TJm +(y) 4.9813 Tj +-266 TJm +(the) 12.1743 Tj +-265 TJm +(rough) 23.2427 Tj +-266 TJm +(meaning) 34.3112 Tj +-265 TJm +(of) 8.29885 Tj +-266 TJm +(each) 18.2515 Tj +-266 TJm +(return) 23.7907 Tj +-265 TJm +(v) 4.9813 Tj +25 TJm +(alue.) 19.0883 Tj +-714 TJm +(The) 15.4918 Tj +-265 TJm +(\002rst) 15.5018 Tj +-266 TJm +(\002) 5.53921 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-265 TJm +(actions) 28.224 Tj +-266 TJm +(are) 12.1643 Tj +-266 TJm +(normal) 28.224 Tj +-265 TJm +(and) 14.386 Tj +-266 TJm +(not) 12.7322 Tj +-265 TJm +(intended) 34.3112 Tj +-266 TJm +(to) 7.7509 Tj +-266 TJm +(denote) 26.5603 Tj +-265 TJm +(an) 9.40469 Tj +-266 TJm +(error) 19.3573 Tj +72 457.202 Td +(situation.) 36.8118 Tj +[1 0 0 1 72 457.102] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -437.615] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 425.76 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 101.888 425.76] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -32.3786 -1.3101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -424.449] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 413.804 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(requested) 38.1767 Tj +-250 TJm +(action) 24.3486 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(completed) 41.5042 Tj +-250 TJm +(successfully) 48.6972 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 411.648] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.766] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -398.138] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 388.34 Td +/F134_0 9.9626 Tf +(BZ_RUN_OK,) 59.7756 Tj +-600 TJm +(BZ_FLUSH_OK,) 71.7307 Tj +-600 TJm +(BZ_FINISH_OK) 71.7307 Tj +[1 0 0 1 287.193 388.34] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -217.684 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -387.03] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 376.384 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +[1 0 0 1 118.79 376.384] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.79 -376.384] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.79 376.384 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 202.476 376.384] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.476 -376.384] cm +[1 0 0 1 0 0] Tm +0 0 Td +202.476 376.384 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(requested) 38.1767 Tj +-250 TJm +(\003ush/\002nish/nothing-special) 108.493 Tj +-250 TJm +(action) 24.3486 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(completed) 41.5042 Tj +-250 TJm +(successfully) 48.6972 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 374.228] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -360.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 350.92 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 149.709 350.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.1993 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -349.61] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 338.965 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(completed,) 43.9948 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(logical) 27.1182 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(end) 14.386 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(detected) 33.1954 Tj +-250 TJm +(during) 26.0123 Tj +-250 TJm +(decompression.) 62.2563 Tj +[1 0 0 1 72 336.808] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -313.555] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 303.756 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-250 TJm +(indicate) 31.5416 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(kind.) 20.2042 Tj +[1 0 0 1 72 301.6] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -282.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 272.314 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +[1 0 0 1 161.664 272.314] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -92.1544 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -271.004] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 260.359 Td +/F130_0 9.9626 Tf +(Indicates) 35.965 Tj +-386 TJm +(that) 14.9439 Tj +-385 TJm +(the) 12.1743 Tj +-386 TJm +(library) 26.5603 Tj +-386 TJm +(has) 13.2801 Tj +-386 TJm +(been) 18.8094 Tj +-385 TJm +(improperly) 44.2738 Tj +-386 TJm +(compiled) 37.0808 Tj +-386 TJm +(on) 9.9626 Tj +-386 TJm +(your) 18.2614 Tj +-385 TJm +(platform) 34.3112 Tj +-386 TJm +(--) 6.63509 Tj +-386 TJm +(a) 4.42339 Tj +-386 TJm +(major) 23.2427 Tj +-385 TJm +(con\002guration) 53.1305 Tj +-386 TJm +(error) 19.3573 Tj +55 TJm +(.) 2.49065 Tj +108 248.404 Td +(Speci\002cally) 47.0434 Tj +65 TJm +(,) 2.49065 Tj +-481 TJm +(it) 5.53921 Tj +-435 TJm +(means) 25.4544 Tj +-435 TJm +(that) 14.9439 Tj +[1 0 0 1 220.614 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.614 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.614 248.404 Td +/F134_0 9.9626 Tf +(sizeof\(char\)) 71.7307 Tj +[1 0 0 1 292.345 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.345 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.345 248.404 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 299.628 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.628 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.628 248.404 Td +/F134_0 9.9626 Tf +(sizeof\(short\)) 77.7083 Tj +[1 0 0 1 377.337 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -377.337 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +381.669 248.404 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 400.388 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -400.388 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +400.388 248.404 Td +/F134_0 9.9626 Tf +(sizeof\(int\)) 65.7532 Tj +[1 0 0 1 466.141 248.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -466.141 -248.404] cm +[1 0 0 1 0 0] Tm +0 0 Td +470.474 248.404 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-435 TJm +(not) 12.7322 Tj +-435 TJm +(1,) 7.47195 Tj +-481 TJm +(2) 4.9813 Tj +-435 TJm +(and) 14.386 Tj +108 236.449 Td +(4) 4.9813 Tj +-389 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(,) 2.49065 Tj +-424 TJm +(as) 8.29885 Tj +-390 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-389 TJm +(should) 26.5703 Tj +-389 TJm +(be.) 11.8953 Tj +-1456 TJm +(Note) 19.3673 Tj +-389 TJm +(that) 14.9439 Tj +-389 TJm +(the) 12.1743 Tj +-389 TJm +(library) 26.5603 Tj +-390 TJm +(should) 26.5703 Tj +-389 TJm +(still) 14.9539 Tj +-389 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-389 TJm +(properly) 33.7533 Tj +-390 TJm +(on) 9.9626 Tj +-389 TJm +(64-bit) 23.8007 Tj +-389 TJm +(platforms) 38.1866 Tj +108 224.493 Td +(which) 24.3486 Tj +-292 TJm +(follo) 18.8194 Tj +25 TJm +(w) 7.193 Tj +-292 TJm +(the) 12.1743 Tj +-292 TJm +(LP64) 21.589 Tj +-292 TJm +(programming) 54.2364 Tj +-293 TJm +(model) 24.9065 Tj +-292 TJm +(--) 6.63509 Tj +-292 TJm +(that) 14.9439 Tj +-292 TJm +(is,) 9.1357 Tj +-303 TJm +(where) 24.3386 Tj +[1 0 0 1 355.279 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -355.279 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +355.279 224.493 Td +/F134_0 9.9626 Tf +(sizeof\(long\)) 71.7307 Tj +[1 0 0 1 427.01 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.01 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.92 224.493 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 447.217 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -447.217 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +447.217 224.493 Td +/F134_0 9.9626 Tf +(sizeof\(void) 65.7532 Tj +512.97 222.75 Td +(*) 5.97756 Tj +518.948 224.493 Td +(\)) 5.97756 Tj +[1 0 0 1 524.925 224.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -524.925 -224.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +527.836 224.493 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +108 212.538 Td +(8.) 7.47195 Tj +-620 TJm +(Under) 24.8965 Tj +-250 TJm +(LP64,) 24.0796 Tj +[1 0 0 1 175.606 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -175.606 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +175.606 212.538 Td +/F134_0 9.9626 Tf +(sizeof\(int\)) 65.7532 Tj +[1 0 0 1 241.36 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -241.36 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.85 212.538 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(still) 14.9539 Tj +-250 TJm +(4,) 7.47195 Tj +-250 TJm +(so) 8.85675 Tj +[1 0 0 1 291.74 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -291.74 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +291.74 212.538 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 339.56 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.56 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.56 212.538 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 433.458 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -433.458 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +433.458 212.538 Td +/F134_0 9.9626 Tf +(long) 23.9102 Tj +[1 0 0 1 457.368 212.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -457.368 -212.538] cm +[1 0 0 1 0 0] Tm +0 0 Td +459.859 212.538 Td +/F130_0 9.9626 Tf +(type,) 19.6462 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(OK.) 16.8766 Tj +[1 0 0 1 72 210.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -196.872] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 187.074 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 173.619 187.074] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.11 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -185.764] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 175.118 Td +/F130_0 9.9626 Tf +(When) 23.7907 Tj +-291 TJm +(using) 21.589 Tj +-290 TJm +(the) 12.1743 Tj +-291 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-300 TJm +(it) 5.53921 Tj +-291 TJm +(is) 6.64505 Tj +-290 TJm +(important) 38.7446 Tj +-291 TJm +(to) 7.7509 Tj +-290 TJm +(call) 14.386 Tj +-291 TJm +(the) 12.1743 Tj +-290 TJm +(functions) 37.0808 Tj +-291 TJm +(in) 7.7509 Tj +-290 TJm +(the) 12.1743 Tj +-291 TJm +(correct) 27.6562 Tj +-290 TJm +(sequence) 36.5129 Tj +-291 TJm +(and) 14.386 Tj +-290 TJm +(with) 17.7135 Tj +-291 TJm +(data) 16.5977 Tj +-290 TJm +(structures) 38.7346 Tj +108 163.163 Td +(\(b) 8.29885 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers) 14.9339 Tj +-206 TJm +(etc\)) 14.9339 Tj +-205 TJm +(in) 7.7509 Tj +-206 TJm +(the) 12.1743 Tj +-205 TJm +(correct) 27.6562 Tj +-206 TJm +(states.) 24.6275 Tj +[1 0 0 1 239.409 163.163] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.409 -163.163] cm +[1 0 0 1 0 0] Tm +0 0 Td +239.409 163.163 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 287.23 163.163] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.23 -163.163] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.278 163.163 Td +/F130_0 9.9626 Tf +(checks) 27.1082 Tj +-206 TJm +(as) 8.29885 Tj +-205 TJm +(much) 22.1369 Tj +-206 TJm +(as) 8.29885 Tj +-205 TJm +(it) 5.53921 Tj +-206 TJm +(can) 13.8281 Tj +-206 TJm +(to) 7.7509 Tj +-205 TJm +(ensure) 26.0024 Tj +-206 TJm +(this) 14.396 Tj +-206 TJm +(is) 6.64505 Tj +-205 TJm +(happening,) 43.9948 Tj +-215 TJm +(and) 14.386 Tj +-205 TJm +(returns) 27.6661 Tj +[1 0 0 1 108 151.208] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -151.208] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 151.208 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 209.619 151.208] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -209.619 -151.208] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.27 151.208 Td +/F130_0 9.9626 Tf +(if) 6.08715 Tj +-367 TJm +(not.) 15.2229 Tj +-659 TJm +(Code) 21.031 Tj +-367 TJm +(which) 24.3486 Tj +-367 TJm +(complies) 35.9749 Tj +-366 TJm +(precisely) 35.965 Tj +-367 TJm +(with) 17.7135 Tj +-366 TJm +(the) 12.1743 Tj +-367 TJm +(function) 33.2053 Tj +-366 TJm +(semantics,) 41.7831 Tj +-396 TJm +(as) 8.29885 Tj +-367 TJm +(detailed) 31.5416 Tj +108 139.253 Td +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-250 TJm +(recei) 19.3573 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue;) 19.3673 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ent) 12.1743 Tj +-250 TJm +(denotes) 30.4357 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uggy) 19.9252 Tj +-250 TJm +(code) 18.8094 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(estig) 18.8194 Tj +5 TJm +(ate.) 14.107 Tj +[1 0 0 1 72 137.096] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7436] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -123.587] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 113.788 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +[1 0 0 1 155.686 113.788] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.1768 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -112.478] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 101.833 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-434 TJm +(when) 21.579 Tj +-434 TJm +(a) 4.42339 Tj +-434 TJm +(parameter) 39.8305 Tj +-434 TJm +(to) 7.7509 Tj +-434 TJm +(a) 4.42339 Tj +-433 TJm +(function) 33.2053 Tj +-434 TJm +(call) 14.386 Tj +-434 TJm +(is) 6.64505 Tj +-434 TJm +(out) 12.7322 Tj +-434 TJm +(of) 8.29885 Tj +-434 TJm +(range) 22.1269 Tj +-434 TJm +(or) 8.29885 Tj +-434 TJm +(otherwise) 38.7346 Tj +-434 TJm +(manifestly) 42.0621 Tj +-434 TJm +(incorrect.) 37.8977 Tj +-1723 TJm +(As) 11.0684 Tj +108 89.8778 Td +(with) 17.7135 Tj +[1 0 0 1 131.644 89.8778] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.644 -89.8778] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.644 89.8778 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 233.263 89.8778] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -233.263 -89.8778] cm +[1 0 0 1 0 0] Tm +0 0 Td +233.263 89.8778 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-595 TJm +(this) 14.396 Tj +-596 TJm +(denotes) 30.4357 Tj +-595 TJm +(a) 4.42339 Tj +-595 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-596 TJm +(in) 7.7509 Tj +-595 TJm +(the) 12.1743 Tj +-595 TJm +(client) 22.1369 Tj +-595 TJm +(code.) 21.3 Tj +-2692 TJm +(The) 15.4918 Tj +-596 TJm +(distinction) 42.0721 Tj +-595 TJm +(between) 33.1954 Tj +[1 0 0 1 108 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 77.9227 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +[1 0 0 1 191.686 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.686 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +194.177 77.9227 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 211.053 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -211.053 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.053 77.9227 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 312.672 77.9227] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -312.672 -77.9227] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.163 77.9227 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(bit) 10.5205 Tj +-250 TJm +(hazy) 18.8094 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(still) 14.9539 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(orth) 16.0497 Tj +-250 TJm +(making.) 32.3785 Tj +[1 0 0 1 72 75.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.7659] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(10) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 14 14 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 143.731 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -74.2217 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -708.727] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 698.082 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-228 TJm +(when) 21.579 Tj +-227 TJm +(a) 4.42339 Tj +-228 TJm +(request) 28.772 Tj +-227 TJm +(to) 7.7509 Tj +-228 TJm +(allocate) 30.9837 Tj +-228 TJm +(memory) 33.2053 Tj +-227 TJm +(f) 3.31755 Tj +10 TJm +(ailed.) 21.8579 Tj +-605 TJm +(Note) 19.3673 Tj +-228 TJm +(that) 14.9439 Tj +-228 TJm +(the) 12.1743 Tj +-227 TJm +(quantity) 32.6574 Tj +-228 TJm +(of) 8.29885 Tj +-227 TJm +(memory) 33.2053 Tj +-228 TJm +(needed) 28.2141 Tj +-228 TJm +(to) 7.7509 Tj +-227 TJm +(decompress) 47.0334 Tj +108 686.127 Td +(a) 4.42339 Tj +-351 TJm +(stream) 26.5603 Tj +-352 TJm +(cannot) 26.5603 Tj +-351 TJm +(be) 9.40469 Tj +-352 TJm +(determined) 44.8217 Tj +-351 TJm +(until) 18.2714 Tj +-352 TJm +(the) 12.1743 Tj +-351 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +-351 TJm +(header) 26.5503 Tj +-352 TJm +(has) 13.2801 Tj +-351 TJm +(been) 18.8094 Tj +-352 TJm +(read.) 19.6363 Tj +-1228 TJm +(So) 10.5205 Tj +[1 0 0 1 426.471 686.127] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -426.471 -686.127] cm +[1 0 0 1 0 0] Tm +0 0 Td +426.471 686.127 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 522.113 686.127] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -522.113 -686.127] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 686.127 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 108 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 167.776 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.776 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.13 674.172 Td +/F130_0 9.9626 Tf +(may) 17.1556 Tj +-437 TJm +(return) 23.7907 Tj +[1 0 0 1 221.784 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -221.784 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.784 674.172 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 293.515 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.515 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.867 674.172 Td +/F130_0 9.9626 Tf +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-437 TJm +(though) 27.6761 Tj +-437 TJm +(some) 21.031 Tj +-437 TJm +(of) 8.29885 Tj +-437 TJm +(the) 12.1743 Tj +-437 TJm +(compressed) 47.0334 Tj +-437 TJm +(data) 16.5977 Tj +-437 TJm +(has) 13.2801 Tj +-437 TJm +(been) 18.8094 Tj +-437 TJm +(read.) 19.6363 Tj +108 662.217 Td +(The) 15.4918 Tj +-479 TJm +(same) 20.4731 Tj +-478 TJm +(is) 6.64505 Tj +-479 TJm +(not) 12.7322 Tj +-478 TJm +(true) 15.4918 Tj +-479 TJm +(for) 11.6164 Tj +-479 TJm +(compression;) 53.1305 Tj +-593 TJm +(once) 18.8094 Tj +[1 0 0 1 301.675 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -301.675 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +301.675 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 409.271 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.271 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.04 662.217 Td +/F130_0 9.9626 Tf +(or) 8.29885 Tj +[1 0 0 1 427.107 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.107 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.107 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 516.771 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.771 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +521.539 662.217 Td +/F130_0 9.9626 Tf +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +108 650.262 Td +(successfully) 48.6972 Tj +-250 TJm +(completed,) 43.9948 Tj +[1 0 0 1 205.672 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -205.672 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +205.672 650.261 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 277.403 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.403 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +279.894 650.261 Td +/F130_0 9.9626 Tf +(cannot) 26.5603 Tj +-250 TJm +(occur) 22.1269 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 648.105] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -634.157] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 624.359 Td +/F134_0 9.9626 Tf +(BZ_DATA_ERROR) 77.7083 Tj +[1 0 0 1 149.709 624.359] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.1993 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -623.049] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 612.404 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-266 TJm +(when) 21.579 Tj +-265 TJm +(a) 4.42339 Tj +-266 TJm +(data) 16.5977 Tj +-265 TJm +(inte) 14.9439 Tj +15 TJm +(grity) 18.8194 Tj +-266 TJm +(error) 19.3573 Tj +-266 TJm +(is) 6.64505 Tj +-265 TJm +(detected) 33.1954 Tj +-266 TJm +(during) 26.0123 Tj +-265 TJm +(decompression.) 62.2563 Tj +-714 TJm +(Most) 20.4831 Tj +-266 TJm +(importantl) 41.5142 Tj +1 TJm +(y) 4.9813 Tj +64 TJm +(,) 2.49065 Tj +-269 TJm +(this) 14.396 Tj +-266 TJm +(means) 25.4544 Tj +-265 TJm +(when) 21.579 Tj +108 600.448 Td +(stored) 24.3486 Tj +-222 TJm +(and) 14.386 Tj +-223 TJm +(computed) 39.2925 Tj +-222 TJm +(CRCs) 23.8106 Tj +-222 TJm +(for) 11.6164 Tj +-222 TJm +(the) 12.1743 Tj +-223 TJm +(data) 16.5977 Tj +-222 TJm +(do) 9.9626 Tj +-222 TJm +(not) 12.7322 Tj +-222 TJm +(match.) 26.8392 Tj +-602 TJm +(This) 17.7135 Tj +-222 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-222 TJm +(is) 6.64505 Tj +-223 TJm +(also) 16.0497 Tj +-222 TJm +(returned) 33.1954 Tj +-222 TJm +(upon) 19.9252 Tj +-222 TJm +(detection) 36.5229 Tj +-223 TJm +(of) 8.29885 Tj +-222 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-222 TJm +(other) 20.4731 Tj +108 588.493 Td +(anomaly) 34.3112 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 72 586.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -572.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 562.59 Td +/F134_0 9.9626 Tf +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +[1 0 0 1 185.574 562.59] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.065 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -561.28] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 550.635 Td +/F130_0 9.9626 Tf +(As) 11.0684 Tj +-306 TJm +(a) 4.42339 Tj +-306 TJm +(special) 27.6661 Tj +-306 TJm +(case) 17.1456 Tj +-307 TJm +(of) 8.29885 Tj +[1 0 0 1 191.852 550.635] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -191.852 -550.635] cm +[1 0 0 1 0 0] Tm +0 0 Td +191.852 550.635 Td +/F134_0 9.9626 Tf +(BZ_DATA_ERROR) 77.7083 Tj +[1 0 0 1 269.561 550.635] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -269.561 -550.635] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.561 550.635 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-306 TJm +(it) 5.53921 Tj +-306 TJm +(is) 6.64505 Tj +-306 TJm +(sometimes) 42.62 Tj +-307 TJm +(usef) 16.5977 Tj +1 TJm +(ul) 7.7509 Tj +-307 TJm +(to) 7.7509 Tj +-306 TJm +(kno) 14.9439 Tj +25 TJm +(w) 7.193 Tj +-306 TJm +(when) 21.579 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(compressed) 47.0334 Tj +-306 TJm +(stream) 26.5603 Tj +-306 TJm +(does) 18.2614 Tj +108 538.68 Td +(not) 12.7322 Tj +-250 TJm +(start) 17.1556 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(correct) 27.6562 Tj +-250 TJm +(magic) 24.3486 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(\() 3.31755 Tj +[1 0 0 1 261.562 538.68] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.562 -538.68] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.562 538.68 Td +/F134_0 9.9626 Tf +('B') 17.9327 Tj +-600 TJm +('Z') 17.9327 Tj +-600 TJm +('h') 17.9327 Tj +[1 0 0 1 327.316 538.68] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -327.316 -538.68] cm +[1 0 0 1 0 0] Tm +0 0 Td +327.316 538.68 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +[1 0 0 1 72 536.523] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -522.576] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 512.777 Td +/F134_0 9.9626 Tf +(BZ_IO_ERROR) 65.7532 Tj +[1 0 0 1 137.753 512.777] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -68.2441 -1.3101] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -511.467] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 500.822 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-233 TJm +(by) 9.9626 Tj +[1 0 0 1 159.123 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.123 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.123 500.822 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 218.899 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.899 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.218 500.822 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 237.923 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -237.923 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.923 500.822 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 303.676 500.822] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.676 -500.822] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.995 500.822 Td +/F130_0 9.9626 Tf +(when) 21.579 Tj +-233 TJm +(there) 19.9152 Tj +-232 TJm +(is) 6.64505 Tj +-233 TJm +(an) 9.40469 Tj +-233 TJm +(error) 19.3573 Tj +-233 TJm +(reading) 29.8778 Tj +-232 TJm +(or) 8.29885 Tj +-233 TJm +(writing) 28.782 Tj +-233 TJm +(in) 7.7509 Tj +-233 TJm +(the) 12.1743 Tj +-232 TJm +(compressed) 47.0334 Tj +108 488.867 Td +(\002le,) 15.2229 Tj +-384 TJm +(and) 14.386 Tj +-357 TJm +(by) 9.9626 Tj +[1 0 0 1 158.511 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.511 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.511 488.867 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 242.197 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.197 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.755 488.867 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 263.698 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.698 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.698 488.867 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 353.362 488.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.362 -488.867] cm +[1 0 0 1 0 0] Tm +0 0 Td +356.92 488.867 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-357 TJm +(attempts) 33.7633 Tj +-357 TJm +(to) 7.7509 Tj +-357 TJm +(use) 13.2801 Tj +-357 TJm +(a) 4.42339 Tj +-357 TJm +(\002le) 12.7322 Tj +-357 TJm +(for) 11.6164 Tj +-358 TJm +(which) 24.3486 Tj +-357 TJm +(the) 12.1743 Tj +-357 TJm +(error) 19.3573 Tj +108 476.912 Td +(indicator) 35.417 Tj +-260 TJm +(\(viz,) 17.9825 Tj +[1 0 0 1 166.603 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -166.603 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.603 476.912 Td +/F134_0 9.9626 Tf +(ferror\(f\)) 53.798 Tj +[1 0 0 1 220.401 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.401 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.401 476.912 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-260 TJm +(is) 6.64505 Tj +-260 TJm +(set.) 13.5591 Tj +-679 TJm +(On) 12.1743 Tj +-260 TJm +(receipt) 27.1082 Tj +-260 TJm +(of) 8.29885 Tj +[1 0 0 1 311.223 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -311.223 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +311.223 476.912 Td +/F134_0 9.9626 Tf +(BZ_IO_ERROR) 65.7532 Tj +[1 0 0 1 376.976 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -376.976 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +376.976 476.912 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-260 TJm +(the) 12.1743 Tj +-260 TJm +(caller) 22.1269 Tj +-260 TJm +(should) 26.5703 Tj +-260 TJm +(consult) 28.782 Tj +[1 0 0 1 482.068 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -482.068 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.068 476.912 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 511.956 476.912] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.956 -476.912] cm +[1 0 0 1 0 0] Tm +0 0 Td +514.546 476.912 Td +/F130_0 9.9626 Tf +(and/or) 25.4544 Tj +[1 0 0 1 108 464.957] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -108 -464.957] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 464.957 Td +/F134_0 9.9626 Tf +(perror) 35.8654 Tj +[1 0 0 1 143.865 464.957] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.865 -464.957] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.356 464.957 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(acquire) 29.3199 Tj +-250 TJm +(operating-system) 68.6224 Tj +-250 TJm +(speci\002c) 30.4357 Tj +-250 TJm +(information) 47.0434 Tj +-250 TJm +(about) 22.1369 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem.) 35.696 Tj +[1 0 0 1 72 462.8] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.9849] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -448.852] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.054 Td +/F134_0 9.9626 Tf +(BZ_UNEXPECTED_EOF) 101.619 Tj +[1 0 0 1 173.619 439.054] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.11 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -437.744] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 427.099 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-250 TJm +(by) 9.9626 Tj +[1 0 0 1 159.467 427.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.467 -427.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.467 427.099 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 219.242 427.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -219.242 -427.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.733 427.099 Td +/F130_0 9.9626 Tf +(when) 21.579 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(\002nishes) 30.4457 Tj +-250 TJm +(before) 25.4445 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(logical) 27.1182 Tj +-250 TJm +(end) 14.386 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(detected.) 35.686 Tj +[1 0 0 1 72 424.942] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -410.994] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 401.196 Td +/F134_0 9.9626 Tf +(BZ_OUTBUFF_FULL) 89.6634 Tj +[1 0 0 1 161.664 401.196] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -92.1544 -1.31] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -399.886] cm +[1 0 0 1 0 0] Tm +0 0 Td +108 389.241 Td +/F130_0 9.9626 Tf +(Returned) 36.5229 Tj +-258 TJm +(by) 9.9626 Tj +[1 0 0 1 159.632 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.632 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.632 389.241 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 303.094 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.094 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.668 389.241 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 322.627 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.627 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +322.627 389.241 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 478.044 389.241] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -478.044 -389.241] cm +[1 0 0 1 0 0] Tm +0 0 Td +480.618 389.241 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-258 TJm +(indicate) 31.5416 Tj +-259 TJm +(that) 14.9439 Tj +108 377.286 Td +(the) 12.1743 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(\002t) 8.30881 Tj +-250 TJm +(into) 15.5018 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-250 TJm +(pro) 13.2801 Tj +15 TJm +(vided.) 24.6275 Tj +[1 0 0 1 72 375.129] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -3.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -351.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 328.585 Td +/F122_0 20.6585 Tf +(3.3.) 34.4584 Tj +-278 TJm +(Lo) 25.2447 Tj +15 TJm +(w-le) 40.1808 Tj +15 TJm +(vel) 28.7153 Tj +-278 TJm +(interface) 86.1046 Tj +[1 0 0 1 72 328.327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -318.364] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 297.964 Td +/F122_0 17.2154 Tf +(3.3.1.) 43.0729 Tj +[1 0 0 1 119.858 297.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -297.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 297.964 Td +/F392_0 17.2154 Tf +(BZ2_bzCompressInit) 185.926 Tj +[1 0 0 1 305.785 297.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -233.785 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -244.779] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(11) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 15 15 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -296.523] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 274.969 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 271.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(typedef) 41.8429 Tj +-426 TJm +(struct) 35.8654 Tj +-426 TJm +({) 5.97756 Tj +98.4879 699.676 Td +(char) 23.9102 Tj +126.642 697.933 Td +(*) 5.97756 Tj +132.62 699.676 Td +(next_in;) 47.8205 Tj +98.4879 687.721 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(avail_in;) 53.798 Tj +98.4879 675.766 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_in_lo32;) 83.6858 Tj +98.4879 663.811 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_in_hi32;) 83.6858 Tj +98.4879 639.9 Td +(char) 23.9102 Tj +126.642 638.157 Td +(*) 5.97756 Tj +132.62 639.9 Td +(next_out;) 53.798 Tj +98.4879 627.945 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(avail_out;) 59.7756 Tj +98.4879 615.99 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_out_lo32;) 89.6634 Tj +98.4879 604.035 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(total_out_hi32;) 89.6634 Tj +98.4879 580.125 Td +(void) 23.9102 Tj +126.642 578.381 Td +(*) 5.97756 Tj +132.62 580.125 Td +(state;) 35.8654 Tj +98.4879 556.214 Td +(void) 23.9102 Tj +126.642 554.471 Td +(*) 5.97756 Tj +132.62 556.214 Td +(\() 5.97756 Tj +138.597 554.471 Td +(*) 5.97756 Tj +144.575 556.214 Td +(bzalloc\)\(void) 77.7083 Tj +226.527 554.471 Td +(*) 5.97756 Tj +232.505 556.214 Td +(,int,int\);) 59.7756 Tj +98.4879 544.259 Td +(void) 23.9102 Tj +-426 TJm +(\() 5.97756 Tj +132.62 542.516 Td +(*) 5.97756 Tj +138.597 544.259 Td +(bzfree\)\(void) 71.7307 Tj +214.572 542.516 Td +(*) 5.97756 Tj +220.55 544.259 Td +(,void) 29.8878 Tj +254.682 542.516 Td +(*) 5.97756 Tj +260.659 544.259 Td +(\);) 11.9551 Tj +98.4879 532.304 Td +(void) 23.9102 Tj +126.642 530.56 Td +(*) 5.97756 Tj +132.62 532.304 Td +(opaque;) 41.8429 Tj +89.9999 520.349 Td +(}) 5.97756 Tj +-426 TJm +(bz_stream;) 59.7756 Tj +89.9999 496.438 Td +(int) 17.9327 Tj +-426 TJm +(BZ2_bzCompressInit) 107.596 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +292.281 494.695 Td +(*) 5.97756 Tj +298.258 496.438 Td +(strm,) 29.8878 Tj +196.099 484.483 Td +(int) 17.9327 Tj +-426 TJm +(blockSize100k,) 83.6858 Tj +196.099 472.528 Td +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +196.099 460.573 Td +(int) 17.9327 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -435.068] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 423.113 Td +/F130_0 9.9626 Tf +(Prepares) 34.3012 Tj +-356 TJm +(for) 11.6164 Tj +-356 TJm +(compression.) 52.8516 Tj +-1256 TJm +(The) 15.4918 Tj +[1 0 0 1 209.409 423.113] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -209.409 -423.113] cm +[1 0 0 1 0 0] Tm +0 0 Td +209.409 423.113 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 263.208 423.113] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.208 -423.113] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.754 423.113 Td +/F130_0 9.9626 Tf +(structure) 34.8591 Tj +-356 TJm +(holds) 21.589 Tj +-356 TJm +(all) 9.9626 Tj +-356 TJm +(data) 16.5977 Tj +-356 TJm +(pertaining) 40.3983 Tj +-356 TJm +(to) 7.7509 Tj +-356 TJm +(the) 12.1743 Tj +-356 TJm +(compression) 50.3609 Tj +-355 TJm +(acti) 14.386 Tj +25 TJm +(vity) 15.5018 Tj +65 TJm +(.) 2.49065 Tj +-1256 TJm +(A) 7.193 Tj +[1 0 0 1 72 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 411.158 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 125.798 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.798 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.581 411.158 Td +/F130_0 9.9626 Tf +(structure) 34.8591 Tj +-279 TJm +(should) 26.5703 Tj +-280 TJm +(be) 9.40469 Tj +-279 TJm +(allocated) 35.965 Tj +-279 TJm +(and) 14.386 Tj +-280 TJm +(initialised) 39.3025 Tj +-279 TJm +(prior) 19.3673 Tj +-279 TJm +(to) 7.7509 Tj +-279 TJm +(the) 12.1743 Tj +-280 TJm +(call.) 16.8766 Tj +-796 TJm +(The) 15.4918 Tj +-279 TJm +(\002elds) 21.589 Tj +-279 TJm +(of) 8.29885 Tj +[1 0 0 1 431.939 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.939 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.939 411.158 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 485.738 411.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -485.738 -411.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +488.52 411.158 Td +/F130_0 9.9626 Tf +(comprise) 36.5229 Tj +-279 TJm +(the) 12.1743 Tj +72 399.203 Td +(entirety) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(user) 16.5977 Tj +20 TJm +(-visible) 29.8878 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 204.422 399.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.422 -399.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.422 399.203 Td +/F134_0 9.9626 Tf +(state) 29.8878 Tj +[1 0 0 1 234.31 399.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.31 -399.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +236.8 399.203 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(pointer) 28.224 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(pri) 11.0684 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ate) 11.6164 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(structures) 38.7346 Tj +-250 TJm +(required) 33.1954 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(compression.) 52.8516 Tj +[1 0 0 1 72 397.046] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -387.083] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 377.285 Td +/F130_0 9.9626 Tf +(Custom) 31.0036 Tj +-372 TJm +(memory) 33.2053 Tj +-372 TJm +(allocators) 38.7346 Tj +-372 TJm +(are) 12.1643 Tj +-372 TJm +(supported,) 41.7831 Tj +-403 TJm +(via) 12.1743 Tj +-372 TJm +(\002elds) 21.589 Tj +[1 0 0 1 288.908 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -288.908 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +288.908 377.285 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 330.751 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.751 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +330.751 377.285 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 337.253 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -337.253 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +337.253 377.285 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 373.118 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -373.118 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +373.118 377.285 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-403 TJm +(and) 14.386 Tj +[1 0 0 1 397.714 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -397.714 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +397.714 377.285 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 433.579 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -433.579 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +433.579 377.285 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1353 TJm +(The) 15.4918 Tj +-372 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +[1 0 0 1 493.782 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.782 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.782 377.285 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 529.648 377.285] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -529.648 -377.285] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 377.285 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +72 365.33 Td +(passed) 26.5603 Tj +-306 TJm +(to) 7.7509 Tj +-306 TJm +(as) 8.29885 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(\002rst) 15.5018 Tj +-306 TJm +(ar) 7.74094 Tj +18 TJm +(gument) 29.8878 Tj +-306 TJm +(to) 7.7509 Tj +-306 TJm +(all) 9.9626 Tj +-306 TJm +(calls) 18.2614 Tj +-305 TJm +(to) 7.7509 Tj +[1 0 0 1 253.941 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.941 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.941 365.33 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 295.784 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.784 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +298.832 365.33 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 316.266 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.266 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +316.266 365.33 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 352.132 365.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.132 -365.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +352.132 365.33 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-320 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-306 TJm +(is) 6.64505 Tj +-306 TJm +(otherwise) 38.7346 Tj +-306 TJm +(ignored) 30.4357 Tj +-306 TJm +(by) 9.9626 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-955 TJm +(The) 15.4918 Tj +72 353.375 Td +(call) 14.386 Tj +[1 0 0 1 89.4309 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -89.4309 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +89.4309 353.375 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +-600 TJm +(\() 5.97756 Tj +-600 TJm +(opaque,) 41.8429 Tj +-600 TJm +(n,) 11.9551 Tj +-600 TJm +(m) 5.97756 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 232.893 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.893 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.938 353.375 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-306 TJm +(e) 4.42339 Tj +15 TJm +(xpected) 30.9837 Tj +-305 TJm +(to) 7.7509 Tj +-306 TJm +(return) 23.7907 Tj +-306 TJm +(a) 4.42339 Tj +-305 TJm +(pointer) 28.224 Tj +[1 0 0 1 360.3 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.3 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.3 353.375 Td +/F134_0 9.9626 Tf +(p) 5.97756 Tj +[1 0 0 1 366.277 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.277 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +369.322 353.375 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +[1 0 0 1 380.118 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -380.118 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +380.118 353.375 Td +/F134_0 9.9626 Tf +(n) 5.97756 Tj +392.073 351.631 Td +(*) 5.97756 Tj +404.029 353.375 Td +(m) 5.97756 Tj +[1 0 0 1 410.006 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.006 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.051 353.375 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-306 TJm +(of) 8.29885 Tj +-305 TJm +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-320 TJm +(and) 14.386 Tj +[1 0 0 1 504.135 353.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -504.135 -353.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.135 353.375 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +72 341.42 Td +(\() 5.97756 Tj +-600 TJm +(opaque,) 41.8429 Tj +-600 TJm +(p) 5.97756 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 149.709 341.42] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -341.42] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.199 341.42 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-250 TJm +(free) 15.4819 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 339.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -329.3] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 319.502 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-280 TJm +(you) 14.9439 Tj +-280 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-280 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-279 TJm +(to) 7.7509 Tj +-280 TJm +(use) 13.2801 Tj +-280 TJm +(a) 4.42339 Tj +-280 TJm +(custom) 28.782 Tj +-280 TJm +(memory) 33.2053 Tj +-279 TJm +(allocator) 34.8591 Tj +40 TJm +(,) 2.49065 Tj +-288 TJm +(set) 11.0684 Tj +[1 0 0 1 299.9 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.9 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.9 319.502 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 341.743 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -341.743 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.743 319.502 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 347.096 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -347.096 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +347.096 319.502 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 382.961 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.961 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +385.749 319.502 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 402.923 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.923 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +402.923 319.502 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 438.788 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.788 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.576 319.502 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +[1 0 0 1 452.115 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -452.115 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +452.115 319.502 Td +/F134_0 9.9626 Tf +(NULL) 23.9102 Tj +[1 0 0 1 476.025 319.502] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -476.025 -319.502] cm +[1 0 0 1 0 0] Tm +0 0 Td +476.025 319.502 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-280 TJm +(and) 14.386 Tj +-280 TJm +(the) 12.1743 Tj +-279 TJm +(library) 26.5603 Tj +72 307.547 Td +(will) 15.5018 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(standard) 33.7533 Tj +[1 0 0 1 176.318 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.318 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.318 307.547 Td +/F134_0 9.9626 Tf +(malloc) 35.8654 Tj +[1 0 0 1 212.183 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.183 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.674 307.547 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 219.934 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -219.934 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +219.934 307.547 Td +/F134_0 9.9626 Tf +(free) 23.9102 Tj +[1 0 0 1 243.844 307.547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.844 -307.547] cm +[1 0 0 1 0 0] Tm +0 0 Td +246.335 307.547 Td +/F130_0 9.9626 Tf +(routines.) 34.5901 Tj +[1 0 0 1 72 307.392] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -297.43] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 285.629 Td +/F130_0 9.9626 Tf +(Before) 27.1082 Tj +-362 TJm +(calling) 27.1182 Tj +[1 0 0 1 133.438 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -133.438 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +133.438 285.629 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 241.035 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -241.035 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +241.035 285.629 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-390 TJm +(\002elds) 21.589 Tj +[1 0 0 1 272.606 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.606 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.606 285.629 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 314.449 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -314.449 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +314.449 285.629 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 320.825 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -320.825 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +320.825 285.629 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 356.69 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.69 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.296 285.629 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 378.288 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -378.288 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +378.288 285.629 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 414.154 285.629] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -414.154 -285.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +417.76 285.629 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-362 TJm +(be) 9.40469 Tj +-362 TJm +(\002lled) 20.4831 Tj +-362 TJm +(appropriately) 53.1206 Tj +65 TJm +(,) 2.49065 Tj +72 273.674 Td +(as) 8.29885 Tj +-322 TJm +(just) 14.396 Tj +-323 TJm +(described.) 40.6673 Tj +-1055 TJm +(Upon) 22.1369 Tj +-322 TJm +(return,) 26.2813 Tj +-341 TJm +(the) 12.1743 Tj +-322 TJm +(internal) 30.4357 Tj +-323 TJm +(state) 18.2614 Tj +-322 TJm +(will) 15.5018 Tj +-323 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-322 TJm +(been) 18.8094 Tj +-323 TJm +(allocated) 35.965 Tj +-322 TJm +(and) 14.386 Tj +-323 TJm +(initialised,) 41.7931 Tj +-340 TJm +(and) 14.386 Tj +[1 0 0 1 459.801 273.674] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -459.801 -273.674] cm +[1 0 0 1 0 0] Tm +0 0 Td +459.801 273.674 Td +/F134_0 9.9626 Tf +(total_in_lo32) 77.7083 Tj +[1 0 0 1 537.509 273.674] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -273.674] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 273.674 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 261.718 Td +/F134_0 9.9626 Tf +(total_in_hi32) 77.7083 Tj +[1 0 0 1 149.709 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +149.709 261.718 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 155.006 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.006 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.006 261.718 Td +/F134_0 9.9626 Tf +(total_out_lo32) 83.6858 Tj +[1 0 0 1 238.692 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -238.692 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +241.435 261.718 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 258.564 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.564 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.564 261.718 Td +/F134_0 9.9626 Tf +(total_out_hi32) 83.6858 Tj +[1 0 0 1 342.25 261.718] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.25 -261.718] cm +[1 0 0 1 0 0] Tm +0 0 Td +344.994 261.718 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-275 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-276 TJm +(been) 18.8094 Tj +-275 TJm +(set) 11.0684 Tj +-275 TJm +(to) 7.7509 Tj +-276 TJm +(zero.) 19.6363 Tj +-772 TJm +(These) 23.7907 Tj +-275 TJm +(four) 16.5977 Tj +-276 TJm +(\002elds) 21.589 Tj +-275 TJm +(are) 12.1643 Tj +72 249.763 Td +(used) 18.2614 Tj +-340 TJm +(by) 9.9626 Tj +-339 TJm +(the) 12.1743 Tj +-340 TJm +(library) 26.5603 Tj +-339 TJm +(to) 7.7509 Tj +-340 TJm +(inform) 27.1182 Tj +-339 TJm +(the) 12.1743 Tj +-340 TJm +(caller) 22.1269 Tj +-339 TJm +(of) 8.29885 Tj +-340 TJm +(the) 12.1743 Tj +-339 TJm +(total) 17.7135 Tj +-340 TJm +(amount) 29.8878 Tj +-339 TJm +(of) 8.29885 Tj +-340 TJm +(data) 16.5977 Tj +-340 TJm +(passed) 26.5603 Tj +-339 TJm +(into) 15.5018 Tj +-340 TJm +(and) 14.386 Tj +-339 TJm +(out) 12.7322 Tj +-340 TJm +(of) 8.29885 Tj +-339 TJm +(the) 12.1743 Tj +-340 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-362 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +72 237.808 Td +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-376 TJm +(should) 26.5703 Tj +-377 TJm +(not) 12.7322 Tj +-376 TJm +(try) 11.0684 Tj +-376 TJm +(to) 7.7509 Tj +-377 TJm +(change) 28.2141 Tj +-376 TJm +(them.) 22.4159 Tj +-1378 TJm +(As) 11.0684 Tj +-377 TJm +(of) 8.29885 Tj +-376 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-377 TJm +(1.0,) 14.9439 Tj +-408 TJm +(64-bit) 23.8007 Tj +-376 TJm +(counts) 26.0123 Tj +-376 TJm +(are) 12.1643 Tj +-377 TJm +(maintained,) 46.7644 Tj +-408 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-376 TJm +(on) 9.9626 Tj +-376 TJm +(32-bit) 23.8007 Tj +-377 TJm +(platforms,) 40.6773 Tj +72 225.853 Td +(using) 21.589 Tj +-371 TJm +(the) 12.1743 Tj +[1 0 0 1 113.148 225.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.148 -225.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.148 225.853 Td +/F134_0 9.9626 Tf +(_hi32) 29.8878 Tj +[1 0 0 1 143.036 225.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.036 -225.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.729 225.853 Td +/F130_0 9.9626 Tf +(\002elds) 21.589 Tj +-371 TJm +(to) 7.7509 Tj +-370 TJm +(store) 19.3673 Tj +-371 TJm +(the) 12.1743 Tj +-371 TJm +(upper) 22.6848 Tj +-370 TJm +(32) 9.9626 Tj +-371 TJm +(bits) 14.396 Tj +-370 TJm +(of) 8.29885 Tj +-371 TJm +(the) 12.1743 Tj +-371 TJm +(count.) 24.6275 Tj +-1344 TJm +(So,) 13.0112 Tj +-400 TJm +(for) 11.6164 Tj +-371 TJm +(e) 4.42339 Tj +15 TJm +(xample,) 31.8205 Tj +-401 TJm +(the) 12.1743 Tj +-371 TJm +(total) 17.7135 Tj +-370 TJm +(amount) 29.8878 Tj +-371 TJm +(of) 8.29885 Tj +-370 TJm +(data) 16.5977 Tj +-371 TJm +(in) 7.7509 Tj +-371 TJm +(is) 6.64505 Tj +[1 0 0 1 72 213.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -213.898] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 213.898 Td +/F134_0 9.9626 Tf +(\(total_in_hi32) 83.6858 Tj +-600 TJm +(<<) 11.9551 Tj +-600 TJm +(32\)) 17.9327 Tj +-600 TJm +(+) 5.97756 Tj +-600 TJm +(total_in_lo32) 77.7083 Tj +[1 0 0 1 293.171 213.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.171 -213.898] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.171 213.898 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 212.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -202.625] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 191.98 Td +/F130_0 9.9626 Tf +(P) 5.53921 Tj +15 TJm +(arameter) 34.8492 Tj +[1 0 0 1 115.367 191.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -115.367 -191.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +115.367 191.98 Td +/F134_0 9.9626 Tf +(blockSize100k) 77.7083 Tj +[1 0 0 1 193.076 191.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.076 -191.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.204 191.98 Td +/F130_0 9.9626 Tf +(speci\002es) 34.3112 Tj +-314 TJm +(the) 12.1743 Tj +-314 TJm +(block) 22.1369 Tj +-314 TJm +(size) 15.4918 Tj +-314 TJm +(to) 7.7509 Tj +-314 TJm +(be) 9.40469 Tj +-314 TJm +(used) 18.2614 Tj +-314 TJm +(for) 11.6164 Tj +-314 TJm +(compression.) 52.8516 Tj +-1004 TJm +(It) 6.08715 Tj +-314 TJm +(should) 26.5703 Tj +-314 TJm +(be) 9.40469 Tj +-315 TJm +(a) 4.42339 Tj +-314 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-314 TJm +(between) 33.1954 Tj +-314 TJm +(1) 4.9813 Tj +72 180.025 Td +(and) 14.386 Tj +-289 TJm +(9) 4.9813 Tj +-289 TJm +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-299 TJm +(and) 14.386 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(actual) 23.7907 Tj +-289 TJm +(block) 22.1369 Tj +-289 TJm +(size) 15.4918 Tj +-289 TJm +(used) 18.2614 Tj +-289 TJm +(is) 6.64505 Tj +-289 TJm +(100000) 29.8878 Tj +-289 TJm +(x) 4.9813 Tj +-289 TJm +(this) 14.396 Tj +-289 TJm +(\002gure.) 25.7334 Tj +-854 TJm +(9) 4.9813 Tj +-290 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(best) 16.0497 Tj +-289 TJm +(compression) 50.3609 Tj +-289 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-289 TJm +(tak) 12.1743 Tj +10 TJm +(es) 8.29885 Tj +-289 TJm +(most) 19.3773 Tj +72 168.07 Td +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 165.913] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -155.95] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 146.152 Td +/F130_0 9.9626 Tf +(P) 5.53921 Tj +15 TJm +(arameter) 34.8492 Tj +[1 0 0 1 115.095 146.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -115.095 -146.152] cm +[1 0 0 1 0 0] Tm +0 0 Td +115.095 146.152 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 168.893 146.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.893 -146.152] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.75 146.152 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-287 TJm +(be) 9.40469 Tj +-286 TJm +(set) 11.0684 Tj +-287 TJm +(to) 7.7509 Tj +-287 TJm +(a) 4.42339 Tj +-287 TJm +(number) 30.4357 Tj +-286 TJm +(between) 33.1954 Tj +-287 TJm +(0) 4.9813 Tj +-287 TJm +(and) 14.386 Tj +-287 TJm +(4) 4.9813 Tj +-286 TJm +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +-841 TJm +(0) 4.9813 Tj +-286 TJm +(is) 6.64505 Tj +-287 TJm +(silent,) 24.0796 Tj +-296 TJm +(and) 14.386 Tj +-287 TJm +(greater) 27.6562 Tj +-287 TJm +(numbers) 34.3112 Tj +-286 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +72 134.197 Td +(increasingly) 48.6972 Tj +-342 TJm +(v) 4.9813 Tj +15 TJm +(erbose) 26.0024 Tj +-342 TJm +(monitoring/deb) 61.4394 Tj +20 TJm +(ugging) 27.6761 Tj +-342 TJm +(output.) 27.9551 Tj +-1173 TJm +(If) 6.63509 Tj +-343 TJm +(the) 12.1743 Tj +-342 TJm +(library) 26.5603 Tj +-342 TJm +(has) 13.2801 Tj +-342 TJm +(been) 18.8094 Tj +-342 TJm +(compiled) 37.0808 Tj +-342 TJm +(with) 17.7135 Tj +[1 0 0 1 446.429 134.197] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -446.429 -134.197] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.429 134.197 Td +/F134_0 9.9626 Tf +(-DBZ_NO_STDIO) 77.7083 Tj +[1 0 0 1 524.138 134.197] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -524.138 -134.197] cm +[1 0 0 1 0 0] Tm +0 0 Td +524.138 134.197 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-342 TJm +(no) 9.9626 Tj +72 122.242 Td +(such) 18.2614 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(appear) 26.5503 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(erbosity) 32.0995 Tj +-250 TJm +(setting.) 29.0609 Tj +[1 0 0 1 72 120.085] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -110.122] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 100.324 Td +/F130_0 9.9626 Tf +(P) 5.53921 Tj +15 TJm +(arameter) 34.8492 Tj +[1 0 0 1 116.619 100.324] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -116.619 -100.324] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.619 100.324 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 176.394 100.324] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.394 -100.324] cm +[1 0 0 1 0 0] Tm +0 0 Td +180.775 100.324 Td +/F130_0 9.9626 Tf +(controls) 32.0995 Tj +-440 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-439 TJm +(the) 12.1743 Tj +-440 TJm +(compression) 50.3609 Tj +-440 TJm +(phase) 22.6848 Tj +-439 TJm +(beha) 18.8094 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-440 TJm +(when) 21.579 Tj +-439 TJm +(presented) 38.1767 Tj +-440 TJm +(with) 17.7135 Tj +-440 TJm +(w) 7.193 Tj +10 TJm +(orst) 14.9439 Tj +-439 TJm +(case,) 19.6363 Tj +-487 TJm +(highly) 25.4644 Tj +72 88.3686 Td +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-433 TJm +(input) 20.4831 Tj +-396 TJm +(data.) 19.0883 Tj +-1496 TJm +(If) 6.63509 Tj +-396 TJm +(compression) 50.3609 Tj +-396 TJm +(runs) 17.1556 Tj +-397 TJm +(i) 2.7696 Tj +1 TJm +(nto) 12.7322 Tj +-397 TJm +(dif) 11.0684 Tj +25 TJm +(\002culties) 31.5516 Tj +-396 TJm +(caused) 27.1082 Tj +-396 TJm +(by) 9.9626 Tj +-396 TJm +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-396 TJm +(data,) 19.0883 Tj +-432 TJm +(the) 12.1743 Tj +-397 TJm +(library) 26.5603 Tj +-396 TJm +(switches) 34.3112 Tj +-396 TJm +(from) 19.3673 Tj +[1 0 0 1 72 50.8518] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(12) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 16 16 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(the) 12.1743 Tj +-255 TJm +(standard) 33.7533 Tj +-254 TJm +(sorting) 27.6761 Tj +-255 TJm +(algorithm) 38.7446 Tj +-254 TJm +(to) 7.7509 Tj +-255 TJm +(a) 4.42339 Tj +-255 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-254 TJm +(algorithm.) 41.2352 Tj +-648 TJm +(The) 15.4918 Tj +-255 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-254 TJm +(is) 6.64505 Tj +-255 TJm +(slo) 11.6264 Tj +25 TJm +(wer) 14.9339 Tj +-255 TJm +(than) 17.1556 Tj +-254 TJm +(the) 12.1743 Tj +-255 TJm +(standard) 33.7533 Tj +-254 TJm +(algorithm) 38.7446 Tj +-255 TJm +(by) 9.9626 Tj +-255 TJm +(perhaps) 30.9837 Tj +72 698.082 Td +(a) 4.42339 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(actor) 19.9152 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(three,) 22.4059 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-250 TJm +(reasonably) 43.158 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(matter) 25.4544 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(bad) 14.386 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(input.) 22.9738 Tj +[1 0 0 1 72 695.925] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -685.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.165 Td +/F130_0 9.9626 Tf +(Lo) 11.0684 Tj +25 TJm +(wer) 14.9339 Tj +-240 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-239 TJm +(of) 8.29885 Tj +[1 0 0 1 138.421 676.165] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.421 -676.165] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.421 676.165 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 198.197 676.165] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.197 -676.165] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.585 676.165 Td +/F130_0 9.9626 Tf +(reduce) 26.5503 Tj +-240 TJm +(the) 12.1743 Tj +-239 TJm +(amount) 29.8878 Tj +-240 TJm +(of) 8.29885 Tj +-240 TJm +(ef) 7.74094 Tj +25 TJm +(fort) 14.386 Tj +-239 TJm +(the) 12.1743 Tj +-240 TJm +(standard) 33.7533 Tj +-240 TJm +(algorithm) 38.7446 Tj +-239 TJm +(will) 15.5018 Tj +-240 TJm +(e) 4.42339 Tj +15 TJm +(xpend) 24.3486 Tj +-240 TJm +(before) 25.4445 Tj +-240 TJm +(resorting) 35.417 Tj +-239 TJm +(to) 7.7509 Tj +-240 TJm +(the) 12.1743 Tj +72 664.21 Td +(f) 3.31755 Tj +10 TJm +(allback.) 31.2626 Tj +-618 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-248 TJm +(should) 26.5703 Tj +-247 TJm +(set) 11.0684 Tj +-248 TJm +(this) 14.396 Tj +-247 TJm +(parameter) 39.8305 Tj +-248 TJm +(carefully;) 38.1767 Tj +-248 TJm +(too) 12.7322 Tj +-248 TJm +(lo) 7.7509 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-248 TJm +(and) 14.386 Tj +-247 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-248 TJm +(inputs) 24.3586 Tj +-248 TJm +(will) 15.5018 Tj +-247 TJm +(be) 9.40469 Tj +-248 TJm +(handled) 31.5416 Tj +-247 TJm +(by) 9.9626 Tj +-248 TJm +(the) 12.1743 Tj +-247 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-248 TJm +(algorithm) 38.7446 Tj +72 652.255 Td +(and) 14.386 Tj +-308 TJm +(so) 8.85675 Tj +-308 TJm +(compress) 37.6287 Tj +-308 TJm +(rather) 23.2328 Tj +-309 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +65 TJm +(,) 2.49065 Tj +-322 TJm +(too) 12.7322 Tj +-309 TJm +(high,) 20.2042 Tj +-322 TJm +(and) 14.386 Tj +-308 TJm +(your) 18.2614 Tj +-309 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(erage-to-w) 43.148 Tj +10 TJm +(orst) 14.9439 Tj +-308 TJm +(case) 17.1456 Tj +-308 TJm +(compression) 50.3609 Tj +-308 TJm +(times) 21.589 Tj +-308 TJm +(can) 13.8281 Tj +-308 TJm +(become) 30.9837 Tj +-309 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-308 TJm +(lar) 10.5105 Tj +18 TJm +(ge.) 11.8953 Tj +72 640.3 Td +(The) 15.4918 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(30) 9.9626 Tj +-250 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-250 TJm +(reasonable) 42.6001 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-250 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(wide) 19.3673 Tj +-250 TJm +(range) 22.1269 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(circumstances.) 58.9288 Tj +[1 0 0 1 72 638.143] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -628.181] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 618.383 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-250 TJm +(range) 22.1269 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(0) 4.9813 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(250) 14.9439 Tj +-250 TJm +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +-620 TJm +(0) 4.9813 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(special) 27.6661 Tj +-250 TJm +(case,) 19.6363 Tj +-250 TJm +(equi) 17.1556 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(alent) 19.3673 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(def) 12.7222 Tj +10 TJm +(ault) 14.9439 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(30.) 12.4533 Tj +[1 0 0 1 72 616.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -606.265] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 596.466 Td +/F130_0 9.9626 Tf +(Note) 19.3673 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(generated) 38.7246 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(same) 20.4731 Tj +-250 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(ardless) 27.6661 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(whether) 32.0895 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(allback) 28.772 Tj +-250 TJm +(algorithm) 38.7446 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(used.) 20.7521 Tj +[1 0 0 1 72 594.309] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -584.348] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 574.549 Td +/F130_0 9.9626 Tf +(Be) 11.0684 Tj +-303 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(are) 12.1643 Tj +-303 TJm +(also) 16.0497 Tj +-303 TJm +(that) 14.9439 Tj +-303 TJm +(this) 14.396 Tj +-304 TJm +(parameter) 39.8305 Tj +-303 TJm +(may) 17.1556 Tj +-303 TJm +(disappear) 38.1767 Tj +-303 TJm +(entirely) 30.4357 Tj +-303 TJm +(in) 7.7509 Tj +-303 TJm +(future) 23.7907 Tj +-303 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-303 TJm +(of) 8.29885 Tj +-303 TJm +(the) 12.1743 Tj +-304 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-938 TJm +(In) 8.29885 Tj +-303 TJm +(principle) 35.417 Tj +-303 TJm +(it) 5.53921 Tj +-304 TJm +(should) 26.5703 Tj +-303 TJm +(be) 9.40469 Tj +72 562.594 Td +(possible) 32.6574 Tj +-270 TJm +(to) 7.7509 Tj +-270 TJm +(de) 9.40469 Tj +25 TJm +(vise) 16.0497 Tj +-270 TJm +(a) 4.42339 Tj +-270 TJm +(good) 19.9252 Tj +-270 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-270 TJm +(to) 7.7509 Tj +-271 TJm +(automat) 32.0995 Tj +1 TJm +(ically) 22.1369 Tj +-271 TJm +(choose) 27.6661 Tj +-270 TJm +(which) 24.3486 Tj +-270 TJm +(algorithm) 38.7446 Tj +-270 TJm +(to) 7.7509 Tj +-270 TJm +(use.) 15.7708 Tj +-740 TJm +(Such) 19.9252 Tj +-270 TJm +(a) 4.42339 Tj +-271 TJm +(m) 7.7509 Tj +1 TJm +(echanism) 37.6287 Tj +-271 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-270 TJm +(render) 25.4445 Tj +-270 TJm +(the) 12.1743 Tj +72 550.639 Td +(parameter) 39.8305 Tj +-250 TJm +(obsolete.) 35.696 Tj +[1 0 0 1 72 548.482] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -538.521] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 528.722 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 528.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -144.458] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 143.462 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 139.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -519.258] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 519.258 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 507.303 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 495.348 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 483.392 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 471.437 Td +(or) 11.9551 Tj +-426 TJm +(blockSize) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(blockSize) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(9) 5.97756 Tj +98.4879 459.482 Td +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +98.4879 447.527 Td +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(250) 17.9327 Tj +90 435.572 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 423.617 Td +(if) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(enough) 35.8654 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 411.661 Td +(BZ_OK) 29.8878 Tj +98.4879 399.706 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 384.165] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5482] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -374.203] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 362.248 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 362.148] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -352.783] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 352.783 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +98.4879 340.828 Td +(if) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(returned) 47.8205 Tj +98.4879 328.873 Td +(no) 11.9551 Tj +-426 TJm +(specific) 47.8205 Tj +-426 TJm +(action) 35.8654 Tj +-426 TJm +(needed) 35.8654 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(case) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +[1 0 0 1 72 313.331] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -303.37] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 282.711 Td +/F122_0 17.2154 Tf +(3.3.2.) 43.0729 Tj +[1 0 0 1 119.858 282.711] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -282.711] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 282.711 Td +/F392_0 17.2154 Tf +(BZ2_bzCompress) 144.609 Tj +[1 0 0 1 264.468 282.711] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.468 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -271.014] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 271.014 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzCompress) 83.6858 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +268.371 269.27 Td +(*) 5.97756 Tj +274.348 271.014 Td +(strm,) 29.8878 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(action) 35.8654 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 255.472] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5482] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -245.51] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 233.555 Td +/F130_0 9.9626 Tf +(Pro) 13.8381 Tj +15 TJm +(vides) 21.031 Tj +-222 TJm +(more) 20.4731 Tj +-221 TJm +(input) 20.4831 Tj +-222 TJm +(and/or) 25.4544 Tj +-222 TJm +(output) 25.4644 Tj +-222 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-221 TJm +(space) 22.1269 Tj +-222 TJm +(for) 11.6164 Tj +-222 TJm +(the) 12.1743 Tj +-221 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-601 TJm +(The) 15.4918 Tj +-222 TJm +(caller) 22.1269 Tj +-222 TJm +(maintains) 38.7446 Tj +-222 TJm +(input) 20.4831 Tj +-221 TJm +(and) 14.386 Tj +-222 TJm +(output) 25.4644 Tj +-222 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers,) 17.4246 Tj +-227 TJm +(and) 14.386 Tj +-222 TJm +(calls) 18.2614 Tj +[1 0 0 1 72 221.6] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -221.6] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 221.6 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 221.6] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -221.6] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.177 221.6 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(transfer) 30.4258 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(between) 33.1954 Tj +-250 TJm +(them.) 22.4159 Tj +[1 0 0 1 72 220.066] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -210.104] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 199.683 Td +/F130_0 9.9626 Tf +(Before) 27.1082 Tj +-212 TJm +(each) 18.2515 Tj +-213 TJm +(call) 14.386 Tj +-212 TJm +(to) 7.7509 Tj +[1 0 0 1 147.961 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.961 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.961 199.683 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 231.647 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -231.647 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +231.647 199.683 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 236.329 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -236.329 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +236.329 199.683 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 278.172 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.172 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +280.288 199.683 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-212 TJm +(point) 20.4831 Tj +-213 TJm +(at) 7.193 Tj +-212 TJm +(the) 12.1743 Tj +-213 TJm +(data) 16.5977 Tj +-212 TJm +(to) 7.7509 Tj +-212 TJm +(be) 9.40469 Tj +-213 TJm +(compressed,) 49.5241 Tj +-220 TJm +(and) 14.386 Tj +[1 0 0 1 463.493 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -463.493 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +463.493 199.683 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 511.314 199.683] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.314 -199.683] cm +[1 0 0 1 0 0] Tm +0 0 Td +513.43 199.683 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +72 187.728 Td +(indicate) 31.5416 Tj +-246 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-247 TJm +(m) 7.7509 Tj +1 TJm +(an) 9.40469 Tj +14 TJm +(y) 4.9813 Tj +-246 TJm +(bytes) 21.031 Tj +-246 TJm +(the) 12.1743 Tj +-246 TJm +(library) 26.5603 Tj +-247 TJm +(may) 17.1556 Tj +-246 TJm +(read.) 19.6363 Tj +[1 0 0 1 259.242 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.242 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.242 187.728 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 342.929 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.929 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +345.382 187.728 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 378.271 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -378.271 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +378.271 187.728 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 420.114 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -420.114 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.114 187.728 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 425.066 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -425.066 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.066 187.728 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 472.886 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.886 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +475.34 187.728 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 492.179 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -492.179 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +492.179 187.728 Td +/F134_0 9.9626 Tf +(total_in) 47.8205 Tj +[1 0 0 1 540 187.728] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -187.728] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 175.773 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(read.) 19.6363 Tj +[1 0 0 1 72 173.616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -163.654] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 153.856 Td +/F130_0 9.9626 Tf +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 113.611 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.611 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.611 153.856 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 161.432 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.432 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.072 153.856 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-265 TJm +(point) 20.4831 Tj +-265 TJm +(to) 7.7509 Tj +-265 TJm +(a) 4.42339 Tj +-265 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-265 TJm +(in) 7.7509 Tj +-265 TJm +(which) 24.3486 Tj +-265 TJm +(the) 12.1743 Tj +-265 TJm +(compressed) 47.0334 Tj +-265 TJm +(data) 16.5977 Tj +-265 TJm +(is) 6.64505 Tj +-265 TJm +(to) 7.7509 Tj +-265 TJm +(be) 9.40469 Tj +-265 TJm +(placed,) 28.493 Tj +-269 TJm +(with) 17.7135 Tj +[1 0 0 1 464.742 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -464.742 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +464.742 153.856 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 518.54 153.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -518.54 -153.856] cm +[1 0 0 1 0 0] Tm +0 0 Td +521.181 153.856 Td +/F130_0 9.9626 Tf +(indi-) 18.8194 Tj +72 141.901 Td +(cating) 24.3486 Tj +-209 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-209 TJm +(much) 22.1369 Tj +-209 TJm +(output) 25.4644 Tj +-209 TJm +(space) 22.1269 Tj +-209 TJm +(is) 6.64505 Tj +-210 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 243.087 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.087 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.087 141.901 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 326.773 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -326.773 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +328.856 141.901 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 361.375 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.375 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +361.375 141.901 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 409.196 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.196 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +409.196 141.901 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 413.851 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.851 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.851 141.901 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 467.649 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -467.649 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +469.732 141.901 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 486.202 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 141.901 Td +/F134_0 9.9626 Tf +(total_out) 53.798 Tj +[1 0 0 1 540 141.901] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -141.901] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 129.946 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 127.789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9617] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -117.827] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 108.029 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-272 TJm +(may) 17.1556 Tj +-272 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-272 TJm +(and) 14.386 Tj +-272 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-272 TJm +(as) 8.29885 Tj +-272 TJm +(little) 18.2714 Tj +-272 TJm +(or) 8.29885 Tj +-272 TJm +(as) 8.29885 Tj +-272 TJm +(much) 22.1369 Tj +-271 TJm +(data) 16.5977 Tj +-272 TJm +(as) 8.29885 Tj +-272 TJm +(you) 14.9439 Tj +-272 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-272 TJm +(on) 9.9626 Tj +-272 TJm +(each) 18.2515 Tj +-272 TJm +(call) 14.386 Tj +-272 TJm +(of) 8.29885 Tj +[1 0 0 1 399.123 108.029] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -399.123 -108.029] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.123 108.029 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 482.809 108.029] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -482.809 -108.029] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.809 108.029 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-752 TJm +(In) 8.29885 Tj +-272 TJm +(the) 12.1743 Tj +-272 TJm +(limit,) 21.32 Tj +72 96.0736 Td +(it) 5.53921 Tj +-266 TJm +(is) 6.64505 Tj +-265 TJm +(acceptable) 42.0422 Tj +-266 TJm +(to) 7.7509 Tj +-266 TJm +(supply) 26.5703 Tj +-266 TJm +(and) 14.386 Tj +-265 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-266 TJm +(data) 16.5977 Tj +-266 TJm +(one) 14.386 Tj +-265 TJm +(byte) 17.1556 Tj +-266 TJm +(at) 7.193 Tj +-266 TJm +(a) 4.42339 Tj +-266 TJm +(time,) 20.2042 Tj +-269 TJm +(although) 34.8691 Tj +-266 TJm +(this) 14.396 Tj +-266 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-265 TJm +(be) 9.40469 Tj +-266 TJm +(terribly) 29.3299 Tj +-266 TJm +(inef) 15.4918 Tj +25 TJm +(\002cient.) 27.3972 Tj +-714 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-266 TJm +(should) 26.5703 Tj +72 84.1184 Td +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-250 TJm +(ensure) 26.0024 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(least) 18.2614 Tj +-250 TJm +(one) 14.386 Tj +-250 TJm +(byte) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(space) 22.1269 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(each) 18.2515 Tj +-250 TJm +(call.) 16.8766 Tj +[1 0 0 1 72 81.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9616] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(13) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 17 17 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(A) 7.193 Tj +-250 TJm +(second) 27.6661 Tj +-250 TJm +(purpose) 31.5416 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 156.662 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -156.662 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +156.662 710.037 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 240.348 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.348 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +242.839 710.037 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(request) 28.772 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(change) 28.2141 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(mode) 22.1369 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -697.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 688.12 Td +/F130_0 9.9626 Tf +(Conceptually) 53.1305 Tj +65 TJm +(,) 2.49065 Tj +-217 TJm +(a) 4.42339 Tj +-210 TJm +(compressed) 47.0334 Tj +-209 TJm +(stream) 26.5603 Tj +-209 TJm +(can) 13.8281 Tj +-209 TJm +(be) 9.40469 Tj +-210 TJm +(in) 7.7509 Tj +-209 TJm +(one) 14.386 Tj +-209 TJm +(of) 8.29885 Tj +-209 TJm +(four) 16.5977 Tj +-210 TJm +(states:) 24.9065 Tj +-289 TJm +(IDLE,) 25.1755 Tj +-209 TJm +(R) 6.64505 Tj +40 TJm +(UNNING,) 41.7732 Tj +-210 TJm +(FLUSHING) 49.2551 Tj +-209 TJm +(and) 14.386 Tj +-209 TJm +(FINISHING.) 52.2937 Tj +-419 TJm +(Be-) 14.386 Tj +72 676.164 Td +(fore) 16.0398 Tj +-264 TJm +(initialisation) 49.823 Tj +-263 TJm +(\() 3.31755 Tj +[1 0 0 1 146.434 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -146.434 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +146.434 676.164 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 254.031 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.031 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +254.031 676.164 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-264 TJm +(and) 14.386 Tj +-263 TJm +(after) 18.2515 Tj +-264 TJm +(termination) 45.9375 Tj +-264 TJm +(\() 3.31755 Tj +[1 0 0 1 349.75 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -349.75 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +349.75 676.164 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 451.369 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -451.369 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +451.369 676.164 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-267 TJm +(a) 4.42339 Tj +-264 TJm +(stream) 26.5603 Tj +-264 TJm +(is) 6.64505 Tj +-263 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(arded) 22.1269 Tj +72 664.209 Td +(as) 8.29885 Tj +-250 TJm +(IDLE.) 25.1755 Tj +[1 0 0 1 72 664.11] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -654.147] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 642.291 Td +/F130_0 9.9626 Tf +(Upon) 22.1369 Tj +-389 TJm +(initialisation) 49.823 Tj +-390 TJm +(\() 3.31755 Tj +[1 0 0 1 155.036 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.036 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.036 642.291 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 262.632 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -262.632 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +262.632 642.291 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-424 TJm +(the) 12.1743 Tj +-390 TJm +(stream) 26.5603 Tj +-389 TJm +(is) 6.64505 Tj +-389 TJm +(placed) 26.0024 Tj +-390 TJm +(in) 7.7509 Tj +-389 TJm +(the) 12.1743 Tj +-390 TJm +(R) 6.64505 Tj +40 TJm +(UNNING) 39.2825 Tj +-389 TJm +(state.) 20.7521 Tj +-1457 TJm +(Subsequent) 45.9375 Tj +-389 TJm +(calls) 18.2614 Tj +72 630.336 Td +(to) 7.7509 Tj +[1 0 0 1 83.818 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -83.818 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +83.818 630.336 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 167.504 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.504 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +171.571 630.336 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-408 TJm +(pass) 17.1556 Tj +[1 0 0 1 223.431 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.431 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +223.431 630.336 Td +/F134_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +[1 0 0 1 259.297 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.297 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.363 630.336 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-408 TJm +(the) 12.1743 Tj +-408 TJm +(requested) 38.1767 Tj +-409 TJm +(action;) 27.1182 Tj +-487 TJm +(other) 20.4731 Tj +-408 TJm +(actions) 28.224 Tj +-408 TJm +(are) 12.1643 Tj +-409 TJm +(ille) 12.7322 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(al) 7.193 Tj +-408 TJm +(and) 14.386 Tj +-408 TJm +(will) 15.5018 Tj +-408 TJm +(result) 22.1369 Tj +-409 TJm +(in) 7.7509 Tj +[1 0 0 1 72 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 618.381 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 173.619 618.381] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -618.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.619 618.381 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 617.071] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -607.108] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 596.463 Td +/F130_0 9.9626 Tf +(At) 9.9626 Tj +-279 TJm +(some) 21.031 Tj +-279 TJm +(point,) 22.9738 Tj +-286 TJm +(the) 12.1743 Tj +-279 TJm +(calling) 27.1182 Tj +-279 TJm +(program) 33.7533 Tj +-279 TJm +(will) 15.5018 Tj +-279 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-278 TJm +(pro) 13.2801 Tj +14 TJm +(vi) 7.7509 Tj +1 TJm +(ded) 14.386 Tj +-279 TJm +(all) 9.9626 Tj +-279 TJm +(the) 12.1743 Tj +-279 TJm +(input) 20.4831 Tj +-279 TJm +(data) 16.5977 Tj +-279 TJm +(it) 5.53921 Tj +-279 TJm +(w) 7.193 Tj +10 TJm +(ants) 16.0497 Tj +-279 TJm +(to.) 10.2416 Tj +-793 TJm +(It) 6.08715 Tj +-279 TJm +(will) 15.5018 Tj +-279 TJm +(then) 17.1556 Tj +-279 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-279 TJm +(to) 7.7509 Tj +-279 TJm +(\002nish) 22.1469 Tj +-279 TJm +(up) 9.9626 Tj +-279 TJm +(--) 6.63509 Tj +72 584.508 Td +(in) 7.7509 Tj +-287 TJm +(ef) 7.74094 Tj +25 TJm +(fect,) 17.4246 Tj +-297 TJm +(asking) 26.0123 Tj +-288 TJm +(the) 12.1743 Tj +-287 TJm +(library) 26.5603 Tj +-287 TJm +(to) 7.7509 Tj +-288 TJm +(process) 29.8778 Tj +-287 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-288 TJm +(data) 16.5977 Tj +-287 TJm +(it) 5.53921 Tj +-287 TJm +(might) 23.2527 Tj +-288 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-287 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fered) 20.4632 Tj +-288 TJm +(internally) 38.1866 Tj +65 TJm +(.) 2.49065 Tj +-844 TJm +(In) 8.29885 Tj +-288 TJm +(this) 14.396 Tj +-287 TJm +(state,) 20.7521 Tj +[1 0 0 1 456.314 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -456.314 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +456.314 584.508 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 540 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 572.553 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-258 TJm +(no) 9.9626 Tj +-257 TJm +(longer) 25.4544 Tj +-258 TJm +(attempt) 29.8878 Tj +-258 TJm +(to) 7.7509 Tj +-258 TJm +(read) 17.1456 Tj +-257 TJm +(data) 16.5977 Tj +-258 TJm +(from) 19.3673 Tj +[1 0 0 1 234.207 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.207 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.207 572.553 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 276.051 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -276.051 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +276.051 572.553 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-260 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-257 TJm +(it) 5.53921 Tj +-258 TJm +(will) 15.5018 Tj +-258 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-257 TJm +(to) 7.7509 Tj +-258 TJm +(write) 20.4731 Tj +-258 TJm +(data) 16.5977 Tj +-258 TJm +(to) 7.7509 Tj +[1 0 0 1 407.082 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -407.082 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +407.082 572.553 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 454.902 572.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -454.902 -572.553] cm +[1 0 0 1 0 0] Tm +0 0 Td +454.902 572.553 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-666 TJm +(Because) 33.1954 Tj +-258 TJm +(the) 12.1743 Tj +-258 TJm +(output) 25.4644 Tj +72 560.598 Td +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-228 TJm +(supplied) 33.7633 Tj +-228 TJm +(by) 9.9626 Tj +-229 TJm +(the) 12.1743 Tj +-228 TJm +(user) 16.5977 Tj +-228 TJm +(can) 13.8281 Tj +-228 TJm +(be) 9.40469 Tj +-228 TJm +(arbitrarily) 39.8404 Tj +-229 TJm +(sma) 16.0497 Tj +1 TJm +(ll,) 8.02986 Tj +-233 TJm +(the) 12.1743 Tj +-228 TJm +(\002nishing-up) 48.1592 Tj +-228 TJm +(operation) 37.6287 Tj +-229 TJm +(cannot) 26.5603 Tj +-228 TJm +(necessarily) 44.2638 Tj +-228 TJm +(be) 9.40469 Tj +-228 TJm +(done) 19.3673 Tj +-228 TJm +(with) 17.7135 Tj +-229 TJm +(a) 4.42339 Tj +-228 TJm +(single) 23.8007 Tj +72 548.643 Td +(call) 14.386 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 99.6659 548.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -99.6659 -548.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +99.6659 548.643 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 183.352 548.643] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.352 -548.643] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.352 548.643 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 547.108] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -537.146] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 526.725 Td +/F130_0 9.9626 Tf +(Instead,) 31.2626 Tj +-346 TJm +(the) 12.1743 Tj +-327 TJm +(calling) 27.1182 Tj +-326 TJm +(program) 33.7533 Tj +-327 TJm +(passes) 25.4544 Tj +[1 0 0 1 218.231 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.231 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +218.231 526.725 Td +/F134_0 9.9626 Tf +(BZ_FINISH) 53.798 Tj +[1 0 0 1 272.029 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.029 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.284 526.725 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-327 TJm +(an) 9.40469 Tj +-327 TJm +(action) 24.3486 Tj +-326 TJm +(to) 7.7509 Tj +[1 0 0 1 338.108 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -338.108 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +338.108 526.725 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 421.795 526.725] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -421.795 -526.725] cm +[1 0 0 1 0 0] Tm +0 0 Td +421.795 526.725 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1081 TJm +(This) 17.7135 Tj +-326 TJm +(changes) 32.0895 Tj +-327 TJm +(the) 12.1743 Tj +-327 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +72 514.77 Td +(state) 18.2614 Tj +-291 TJm +(to) 7.7509 Tj +-290 TJm +(FINISHING.) 52.2937 Tj +-581 TJm +(An) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-291 TJm +(remaining) 40.3983 Tj +-290 TJm +(input) 20.4831 Tj +-291 TJm +(\(ie,) 13.0012 Tj +[1 0 0 1 264.452 514.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -264.452 -514.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +264.452 514.77 Td +/F134_0 9.9626 Tf +(next_in[0) 53.798 Tj +-600 TJm +(..) 11.9551 Tj +-1200 TJm +(avail_in-1]) 65.7532 Tj +[1 0 0 1 413.892 514.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.892 -514.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.892 514.77 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-291 TJm +(is) 6.64505 Tj +-290 TJm +(compressed) 47.0334 Tj +-291 TJm +(and) 14.386 Tj +-290 TJm +(transferred) 43.148 Tj +72 502.814 Td +(to) 7.7509 Tj +-421 TJm +(the) 12.1743 Tj +-421 TJm +(output) 25.4644 Tj +-421 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +55 TJm +(.) 2.49065 Tj +-1646 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-421 TJm +(do) 9.9626 Tj +-422 TJm +(this) 14.396 Tj +1 TJm +(,) 2.49065 Tj +[1 0 0 1 222.339 502.814] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -222.339 -502.814] cm +[1 0 0 1 0 0] Tm +0 0 Td +222.339 502.814 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 306.025 502.814] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -306.025 -502.814] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.22 502.814 Td +/F130_0 9.9626 Tf +(must) 19.3773 Tj +-421 TJm +(be) 9.40469 Tj +-421 TJm +(called) 23.7907 Tj +-421 TJm +(repeatedly) 41.4942 Tj +-421 TJm +(until) 18.2714 Tj +-421 TJm +(all) 9.9626 Tj +-421 TJm +(the) 12.1743 Tj +-421 TJm +(output) 25.4644 Tj +-421 TJm +(has) 13.2801 Tj +-421 TJm +(been) 18.8094 Tj +72 490.859 Td +(consumed.) 42.889 Tj +-1397 TJm +(At) 9.9626 Tj +-379 TJm +(that) 14.9439 Tj +-380 TJm +(point,) 22.9738 Tj +[1 0 0 1 188.346 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -188.346 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.346 490.859 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 272.033 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.033 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.813 490.859 Td +/F130_0 9.9626 Tf +(returns) 27.6661 Tj +[1 0 0 1 307.259 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -307.259 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +307.259 490.859 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 384.968 490.859] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.968 -490.859] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.968 490.859 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-379 TJm +(and) 14.386 Tj +-380 TJm +(the) 12.1743 Tj +-379 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +-380 TJm +(state) 18.2614 Tj +-379 TJm +(is) 6.64505 Tj +-380 TJm +(set) 11.0684 Tj +-379 TJm +(back) 18.8094 Tj +-379 TJm +(to) 7.7509 Tj +72 478.904 Td +(IDLE.) 25.1755 Tj +[1 0 0 1 99.6662 478.904] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -99.6662 -478.904] cm +[1 0 0 1 0 0] Tm +0 0 Td +99.6662 478.904 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 201.285 478.904] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -201.285 -478.904] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.776 478.904 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(called.) 26.2813 Tj +[1 0 0 1 72 477.37] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -467.407] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 456.986 Td +/F130_0 9.9626 Tf +(Just) 15.5018 Tj +-380 TJm +(to) 7.7509 Tj +-380 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-379 TJm +(sure) 16.5977 Tj +-380 TJm +(the) 12.1743 Tj +-380 TJm +(calling) 27.1182 Tj +-380 TJm +(program) 33.7533 Tj +-379 TJm +(does) 18.2614 Tj +-380 TJm +(not) 12.7322 Tj +-380 TJm +(cheat,) 23.5117 Tj +-412 TJm +(the) 12.1743 Tj +-380 TJm +(library) 26.5603 Tj +-380 TJm +(mak) 17.1556 Tj +10 TJm +(es) 8.29885 Tj +-379 TJm +(a) 4.42339 Tj +-380 TJm +(note) 17.1556 Tj +-380 TJm +(of) 8.29885 Tj +[1 0 0 1 415.708 456.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -415.708 -456.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +415.708 456.986 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 463.528 456.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -463.528 -456.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +467.312 456.986 Td +/F130_0 9.9626 Tf +(at) 7.193 Tj +-380 TJm +(the) 12.1743 Tj +-380 TJm +(time) 17.7135 Tj +-379 TJm +(of) 8.29885 Tj +-380 TJm +(the) 12.1743 Tj +72 445.031 Td +(\002rst) 15.5018 Tj +-286 TJm +(call) 14.386 Tj +-286 TJm +(t) 2.7696 Tj +1 TJm +(o) 4.9813 Tj +[1 0 0 1 118.179 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.179 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.179 445.031 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 201.865 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -201.865 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.713 445.031 Td +/F130_0 9.9626 Tf +(which) 24.3486 Tj +-286 TJm +(has) 13.2801 Tj +[1 0 0 1 248.035 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.035 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.035 445.031 Td +/F134_0 9.9626 Tf +(BZ_FINISH) 53.798 Tj +[1 0 0 1 301.833 445.031] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -301.833 -445.031] cm +[1 0 0 1 0 0] Tm +0 0 Td +304.68 445.031 Td +/F130_0 9.9626 Tf +(as) 8.29885 Tj +-286 TJm +(an) 9.40469 Tj +-286 TJm +(action) 24.3486 Tj +-285 TJm +(\(ie,) 13.0012 Tj +-295 TJm +(at) 7.193 Tj +-286 TJm +(the) 12.1743 Tj +-286 TJm +(time) 17.7135 Tj +-285 TJm +(the) 12.1743 Tj +-286 TJm +(program) 33.7533 Tj +-286 TJm +(has) 13.2801 Tj +-286 TJm +(announced) 43.158 Tj +-285 TJm +(its) 9.41466 Tj +72 433.076 Td +(intention) 35.427 Tj +-292 TJm +(to) 7.7509 Tj +-292 TJm +(not) 12.7322 Tj +-291 TJm +(supply) 26.5703 Tj +-292 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-292 TJm +(more) 20.4731 Tj +-292 TJm +(input\).) 26.2913 Tj +-870 TJm +(By) 11.6264 Tj +-292 TJm +(comparing) 42.61 Tj +-292 TJm +(this) 14.396 Tj +-292 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-291 TJm +(with) 17.7135 Tj +-292 TJm +(that) 14.9439 Tj +-292 TJm +(of) 8.29885 Tj +[1 0 0 1 392.862 433.076] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.862 -433.076] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.862 433.076 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 440.682 433.076] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -440.682 -433.076] cm +[1 0 0 1 0 0] Tm +0 0 Td +443.589 433.076 Td +/F130_0 9.9626 Tf +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-292 TJm +(subsequent) 44.2738 Tj +-292 TJm +(calls) 18.2614 Tj +-291 TJm +(to) 7.7509 Tj +[1 0 0 1 72 421.121] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -421.121] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 421.121 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 421.121] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -421.121] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.686 421.121 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-247 TJm +(the) 12.1743 Tj +-247 TJm +(library) 26.5603 Tj +-246 TJm +(can) 13.8281 Tj +-247 TJm +(detect) 23.7907 Tj +-246 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-247 TJm +(att) 9.9626 Tj +1 TJm +(empts) 23.8007 Tj +-247 TJm +(to) 7.7509 Tj +-246 TJm +(slip) 14.396 Tj +-247 TJm +(in) 7.7509 Tj +-246 TJm +(more) 20.4731 Tj +-247 TJm +(data) 16.5977 Tj +-246 TJm +(to) 7.7509 Tj +-247 TJm +(compress.) 40.1194 Tj +-617 TJm +(An) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-247 TJm +(calls) 18.2614 Tj +-246 TJm +(for) 11.6164 Tj +-247 TJm +(which) 24.3486 Tj +-246 TJm +(this) 14.396 Tj +-247 TJm +(is) 6.64505 Tj +72 409.166 Td +(detected) 33.1954 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(return) 23.7907 Tj +[1 0 0 1 151.959 409.166] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.959 -409.166] cm +[1 0 0 1 0 0] Tm +0 0 Td +151.959 409.166 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 253.578 409.166] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.578 -409.166] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.578 409.166 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-500 TJm +(This) 17.7135 Tj +-250 TJm +(indicates) 35.417 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(programming) 54.2364 Tj +-250 TJm +(mistak) 26.5703 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(corrected.) 39.5515 Tj +[1 0 0 1 72 407.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -397.046] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 387.248 Td +/F130_0 9.9626 Tf +(Instead) 28.772 Tj +-224 TJm +(of) 8.29885 Tj +-223 TJm +(asking) 26.0123 Tj +-224 TJm +(to) 7.7509 Tj +-223 TJm +(\002nish,) 24.6375 Tj +-229 TJm +(the) 12.1743 Tj +-224 TJm +(calling) 27.1182 Tj +-223 TJm +(program) 33.7533 Tj +-224 TJm +(may) 17.1556 Tj +-224 TJm +(ask) 13.2801 Tj +[1 0 0 1 293.282 387.248] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.282 -387.248] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.282 387.248 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 376.968 387.248] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -376.968 -387.248] cm +[1 0 0 1 0 0] Tm +0 0 Td +379.196 387.248 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-224 TJm +(tak) 12.1743 Tj +10 TJm +(e) 4.42339 Tj +-223 TJm +(all) 9.9626 Tj +-224 TJm +(the) 12.1743 Tj +-223 TJm +(remaining) 40.3983 Tj +-224 TJm +(input,) 22.9738 Tj +-229 TJm +(compress) 37.6287 Tj +72 375.293 Td +(it) 5.53921 Tj +-278 TJm +(and) 14.386 Tj +-278 TJm +(terminate) 37.6287 Tj +-278 TJm +(the) 12.1743 Tj +-278 TJm +(current) 28.2141 Tj +-277 TJm +(\(Burro) 26.5603 Tj +25 TJm +(ws-Wheeler\)) 51.4469 Tj +-278 TJm +(compression) 50.3609 Tj +-278 TJm +(block.) 24.6275 Tj +-787 TJm +(Th) 11.0684 Tj +-1 TJm +(i) 2.7696 Tj +1 TJm +(s) 3.87545 Tj +-278 TJm +(could) 22.1369 Tj +-278 TJm +(be) 9.40469 Tj +-278 TJm +(useful) 24.3486 Tj +-278 TJm +(for) 11.6164 Tj +-278 TJm +(error) 19.3573 Tj +-278 TJm +(control) 28.224 Tj +-278 TJm +(purposes.) 37.9077 Tj +72 363.338 Td +(The) 15.4918 Tj +-328 TJm +(mechanism) 45.3796 Tj +-328 TJm +(is) 6.64505 Tj +-328 TJm +(analogous) 40.3983 Tj +-328 TJm +(to) 7.7509 Tj +-328 TJm +(that) 14.9439 Tj +-328 TJm +(for) 11.6164 Tj +-328 TJm +(\002nishing:) 37.6487 Tj +-466 TJm +(call) 14.386 Tj +[1 0 0 1 297.049 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -297.049 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +297.049 363.337 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 380.735 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -380.735 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.003 363.337 Td +/F130_0 9.9626 Tf +(with) 17.7135 Tj +-328 TJm +(an) 9.40469 Tj +-328 TJm +(action) 24.3486 Tj +-328 TJm +(of) 8.29885 Tj +[1 0 0 1 456.841 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -456.841 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +456.841 363.337 Td +/F134_0 9.9626 Tf +(BZ_FLUSH) 47.8205 Tj +[1 0 0 1 504.662 363.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -504.662 -363.337] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.662 363.337 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-328 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +72 351.382 Td +(output) 25.4644 Tj +-445 TJm +(data,) 19.0883 Tj +-494 TJm +(and) 14.386 Tj +-446 TJm +(persist) 26.0123 Tj +-445 TJm +(with) 17.7135 Tj +-445 TJm +(the) 12.1743 Tj +[1 0 0 1 213.94 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.94 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.94 351.382 Td +/F134_0 9.9626 Tf +(BZ_FLUSH) 47.8205 Tj +[1 0 0 1 261.761 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.761 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.195 351.382 Td +/F130_0 9.9626 Tf +(action) 24.3486 Tj +-445 TJm +(until) 18.2714 Tj +-445 TJm +(the) 12.1743 Tj +-446 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +[1 0 0 1 360.062 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.062 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.062 351.382 Td +/F134_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +[1 0 0 1 395.928 351.382] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -395.928 -351.382] cm +[1 0 0 1 0 0] Tm +0 0 Td +400.362 351.382 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-445 TJm +(returned.) 35.686 Tj +-1792 TJm +(As) 11.0684 Tj +-445 TJm +(with) 17.7135 Tj +-445 TJm +(\002nishing,) 37.3697 Tj +[1 0 0 1 72 339.427] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.427] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 339.427 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 339.427] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -339.427] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.177 339.427 Td +/F130_0 9.9626 Tf +(detects) 27.6661 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(attempt) 29.8878 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(input) 20.4831 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(once) 18.8094 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\003ush) 19.3773 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(be) 9.40469 Tj +15 TJm +(gun.) 17.4346 Tj +[1 0 0 1 72 337.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -327.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 317.509 Td +/F130_0 9.9626 Tf +(Once) 21.0211 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\003ush) 19.3773 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(complete,) 39.0135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(returns) 27.6661 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(R) 6.64505 Tj +40 TJm +(UNNING) 39.2825 Tj +-250 TJm +(state.) 20.7521 Tj +[1 0 0 1 72 315.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -305.39] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 295.591 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-344 TJm +(all) 9.9626 Tj +-343 TJm +(sounds) 27.6761 Tj +-344 TJm +(pretty) 23.2427 Tj +-344 TJm +(comple) 29.3299 Tj +15 TJm +(x,) 7.47195 Tj +-367 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-344 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-344 TJm +(really) 22.6848 Tj +65 TJm +(.) 2.49065 Tj +-1182 TJm +(Here') 22.6749 Tj +55 TJm +(s) 3.87545 Tj +-344 TJm +(a) 4.42339 Tj +-344 TJm +(table) 19.3673 Tj +-343 TJm +(which) 24.3486 Tj +-344 TJm +(sho) 13.8381 Tj +25 TJm +(ws) 11.0684 Tj +-344 TJm +(which) 24.3486 Tj +-344 TJm +(actions) 28.224 Tj +-343 TJm +(are) 12.1643 Tj +-344 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-344 TJm +(in) 7.7509 Tj +-344 TJm +(each) 18.2515 Tj +72 283.636 Td +(state,) 20.7521 Tj +-281 TJm +(what) 19.3673 Tj +-274 TJm +(action) 24.3486 Tj +-275 TJm +(will) 15.5018 Tj +-274 TJm +(be) 9.40469 Tj +-275 TJm +(tak) 12.1743 Tj +10 TJm +(en,) 11.8953 Tj +-280 TJm +(what) 19.3673 Tj +-275 TJm +(the) 12.1743 Tj +-274 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-275 TJm +(state) 18.2614 Tj +-274 TJm +(is,) 9.1357 Tj +-281 TJm +(and) 14.386 Tj +-274 TJm +(what) 19.3673 Tj +-275 TJm +(the) 12.1743 Tj +-275 TJm +(non-error) 37.6188 Tj +-274 TJm +(return) 23.7907 Tj +-275 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-274 TJm +(are.) 14.655 Tj +-767 TJm +(Note) 19.3673 Tj +-275 TJm +(that) 14.9439 Tj +-274 TJm +(you) 14.9439 Tj +-275 TJm +(can') 17.1456 Tj +18 TJm +(t) 2.7696 Tj +72 271.681 Td +(e) 4.42339 Tj +15 TJm +(xplicitly) 33.2153 Tj +-347 TJm +(ask) 13.2801 Tj +-348 TJm +(what) 19.3673 Tj +-347 TJm +(state) 18.2614 Tj +-348 TJm +(the) 12.1743 Tj +-347 TJm +(stream) 26.5603 Tj +-348 TJm +(is) 6.64505 Tj +-347 TJm +(in,) 10.2416 Tj +-372 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-347 TJm +(nor) 13.2801 Tj +-348 TJm +(do) 9.9626 Tj +-347 TJm +(you) 14.9439 Tj +-348 TJm +(need) 18.8094 Tj +-347 TJm +(to) 7.7509 Tj +-348 TJm +(--) 6.63509 Tj +-347 TJm +(it) 5.53921 Tj +-348 TJm +(can) 13.8281 Tj +-347 TJm +(be) 9.40469 Tj +-347 TJm +(inferred) 31.5316 Tj +-348 TJm +(from) 19.3673 Tj +-347 TJm +(the) 12.1743 Tj +-348 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-347 TJm +(returned) 33.1954 Tj +-348 TJm +(by) 9.9626 Tj +[1 0 0 1 72 259.726] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -259.726] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 259.726 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 155.686 259.726] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.686 -259.726] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.686 259.726 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 258.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -207.34] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(14) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 18 18 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -595.402] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 573.848 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 570.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(IDLE/any) 47.8205 Tj +98.4879 699.676 Td +(Illegal.) 47.8205 Tj +-852 TJm +(IDLE) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(only) 23.9102 Tj +-426 TJm +(exists) 35.8654 Tj +-426 TJm +(after) 29.8878 Tj +-426 TJm +(BZ2_bzCompressEnd) 101.619 Tj +-426 TJm +(or) 11.9551 Tj +98.4879 687.721 Td +(before) 35.8654 Tj +-426 TJm +(BZ2_bzCompressInit.) 113.574 Tj +98.4879 675.766 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_SEQUENCE_ERROR) 101.619 Tj +90 651.856 Td +(RUNNING/BZ_RUN) 83.6858 Tj +98.4879 639.9 Td +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible.) 53.798 Tj +98.4879 627.945 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(RUNNING) 41.8429 Tj +98.4879 615.99 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_RUN_OK) 53.798 Tj +90 592.08 Td +(RUNNING/BZ_FLUSH) 95.641 Tj +98.4879 580.125 Td +(Remember) 47.8205 Tj +-426 TJm +(current) 41.8429 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(next_in.) 47.8205 Tj +-426 TJm +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +98.4879 568.169 Td +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +-426 TJm +(but) 17.9327 Tj +-426 TJm +(do) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 556.214 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FLUSHING) 47.8205 Tj +98.4879 544.259 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FLUSH_OK) 65.7532 Tj +90 520.349 Td +(RUNNING/BZ_FINISH) 101.619 Tj +98.4879 508.394 Td +(Remember) 47.8205 Tj +-426 TJm +(current) 41.8429 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(next_in.) 47.8205 Tj +-426 TJm +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +98.4879 496.438 Td +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +-426 TJm +(but) 17.9327 Tj +-426 TJm +(do) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 484.483 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FINISHING) 53.798 Tj +98.4879 472.528 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FINISH_OK) 71.7307 Tj +90 448.618 Td +(FLUSHING/BZ_FLUSH) 101.619 Tj +98.4879 436.663 Td +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +98.4879 424.707 Td +(but) 17.9327 Tj +-426 TJm +(do) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 412.752 Td +(If) 11.9551 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(existing) 47.8205 Tj +-426 TJm +(input) 29.8878 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(used) 23.9102 Tj +-426 TJm +(up) 11.9551 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +98.4879 400.797 Td +(output) 35.8654 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(removed) 41.8429 Tj +106.976 388.842 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(RUNNING;) 47.8205 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_RUN_OK) 53.798 Tj +98.4879 376.887 Td +(else) 23.9102 Tj +106.976 364.932 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FLUSHING;) 53.798 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FLUSH_OK) 65.7532 Tj +90 341.021 Td +(FLUSHING/other) 83.6858 Tj +98.4879 329.066 Td +(Illegal.) 47.8205 Tj +98.4879 317.111 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_SEQUENCE_ERROR) 101.619 Tj +90 293.201 Td +(FINISHING/BZ_FINISH) 113.574 Tj +98.4879 281.245 Td +(Compress) 47.8205 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(next_in) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(next_out) 47.8205 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(much) 23.9102 Tj +-426 TJm +(as) 11.9551 Tj +-426 TJm +(possible,) 53.798 Tj +98.4879 269.29 Td +(but) 17.9327 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(accept) 35.8654 Tj +-426 TJm +(any) 17.9327 Tj +-426 TJm +(more) 23.9102 Tj +-426 TJm +(input.) 35.8654 Tj +98.4879 257.335 Td +(If) 11.9551 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(existing) 47.8205 Tj +-426 TJm +(input) 29.8878 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(used) 23.9102 Tj +-426 TJm +(up) 11.9551 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(all) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +98.4879 245.38 Td +(output) 35.8654 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(removed) 41.8429 Tj +106.976 233.425 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(IDLE;) 29.8878 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +98.4879 221.47 Td +(else) 23.9102 Tj +106.976 209.514 Td +(Next) 23.9102 Tj +-426 TJm +(state) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(FINISHING;) 59.7756 Tj +-426 TJm +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_FINISH_OK) 71.7307 Tj +90 185.604 Td +(FINISHING/other) 89.6634 Tj +98.4879 173.649 Td +(Illegal.) 47.8205 Tj +98.4879 161.694 Td +(Return) 35.8654 Tj +-426 TJm +(value) 29.8878 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 72 146.152] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -136.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 124.234 Td +/F130_0 9.9626 Tf +(That) 18.2614 Tj +-250 TJm +(still) 14.9539 Tj +-250 TJm +(looks) 21.589 Tj +-250 TJm +(complicated?) 53.1206 Tj +-620 TJm +(W) 9.40469 Tj +80 TJm +(ell,) 12.4533 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(air) 10.5105 Tj +-250 TJm +(enough.) 31.8205 Tj +-620 TJm +(The) 15.4918 Tj +-250 TJm +(usual) 21.031 Tj +-250 TJm +(sequence) 36.5129 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(calls) 18.2614 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(compressing) 50.3609 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(load) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(is:) 9.41466 Tj +[1 0 0 1 72 122.077] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 92.3537 Td +/F130_0 9.9626 Tf +(1.) 7.47195 Tj +[1 0 0 1 86.8444 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 92.3537 Td +/F130_0 9.9626 Tf +(Get) 14.386 Tj +-250 TJm +(started) 26.5603 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 158.056 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.056 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.056 92.3537 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 265.653 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -265.653 -92.3537] cm +[1 0 0 1 0 0] Tm +0 0 Td +265.653 92.3537 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 268.144 92.3537] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.144 -41.5019] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.893 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(15) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 19 19 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 710.037 Td +/F130_0 9.9626 Tf +(2.) 7.47195 Tj +[1 0 0 1 86.8444 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 710.037 Td +/F130_0 9.9626 Tf +(Sho) 15.5018 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-240 TJm +(data) 16.5977 Tj +-240 TJm +(in) 7.7509 Tj +-241 TJm +(and) 14.386 Tj +-240 TJm +(shlurp) 24.9065 Tj +-240 TJm +(out) 12.7322 Tj +-240 TJm +(its) 9.41466 Tj +-240 TJm +(compressed) 47.0334 Tj +-241 TJm +(form) 19.3673 Tj +-240 TJm +(using) 21.589 Tj +-240 TJm +(zero) 17.1456 Tj +-240 TJm +(or) 8.29885 Tj +-240 TJm +(more) 20.4731 Tj +-241 TJm +(calls) 18.2614 Tj +-240 TJm +(of) 8.29885 Tj +[1 0 0 1 401.454 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.454 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +401.454 710.037 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 485.14 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -485.14 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +487.533 710.037 Td +/F130_0 9.9626 Tf +(with) 17.7135 Tj +-240 TJm +(action) 24.3486 Tj +-240 TJm +(=) 5.61891 Tj +[1 0 0 1 91.9253 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 698.082 Td +/F134_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +[1 0 0 1 127.791 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -127.791 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +127.791 698.082 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 130.281 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -58.2814 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 676.164 Td +/F130_0 9.9626 Tf +(3.) 7.47195 Tj +[1 0 0 1 86.8444 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 676.164 Td +/F130_0 9.9626 Tf +(Finish) 24.9165 Tj +-242 TJm +(up.) 12.4533 Tj +-307 TJm +(Repeatedly) 44.8217 Tj +-241 TJm +(call) 14.386 Tj +[1 0 0 1 198.784 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -198.784 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.784 676.164 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 282.471 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.471 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.878 676.164 Td +/F130_0 9.9626 Tf +(with) 17.7135 Tj +-242 TJm +(action) 24.3486 Tj +-241 TJm +(=) 5.61891 Tj +[1 0 0 1 339.78 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.78 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.78 676.164 Td +/F134_0 9.9626 Tf +(BZ_FINISH) 53.798 Tj +[1 0 0 1 393.579 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.579 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +393.579 676.164 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-242 TJm +(cop) 14.386 Tj +10 TJm +(ying) 17.7135 Tj +-241 TJm +(out) 12.7322 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(compres) 33.7533 Tj +1 TJm +(sed) 13.2801 Tj +-242 TJm +(output,) 27.9551 Tj +91.9253 664.209 Td +(until) 18.2714 Tj +[1 0 0 1 112.687 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -112.687 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +112.687 664.209 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 190.396 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -190.396 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.886 664.209 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(returned.) 35.686 Tj +[1 0 0 1 237.708 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.708 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 7.3724 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -79.3724 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +79.3724 642.291 Td +/F130_0 9.9626 Tf +(4.) 7.47195 Tj +[1 0 0 1 86.8444 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.9253 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.9253 642.291 Td +/F130_0 9.9626 Tf +(Close) 22.6948 Tj +-250 TJm +(up) 9.9626 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(go) 9.9626 Tj +-250 TJm +(home.) 24.6275 Tj +-620 TJm +(Call) 16.6077 Tj +[1 0 0 1 208.796 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.796 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.796 642.291 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 310.415 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -310.415 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.415 642.291 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 312.906 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.906 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -630.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 620.374 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(data) 16.5977 Tj +-269 TJm +(you) 14.9439 Tj +-270 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-269 TJm +(to) 7.7509 Tj +-270 TJm +(compress) 37.6287 Tj +-269 TJm +(\002ts) 12.1843 Tj +-270 TJm +(into) 15.5018 Tj +-269 TJm +(your) 18.2614 Tj +-270 TJm +(input) 20.4831 Tj +-269 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-270 TJm +(all) 9.9626 Tj +-269 TJm +(at) 7.193 Tj +-270 TJm +(once,) 21.3 Tj +-274 TJm +(you) 14.9439 Tj +-269 TJm +(can) 13.8281 Tj +-270 TJm +(skip) 16.6077 Tj +-269 TJm +(the) 12.1743 Tj +-270 TJm +(calls) 18.2614 Tj +-269 TJm +(of) 8.29885 Tj +[1 0 0 1 456.314 620.374] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -456.314 -620.374] cm +[1 0 0 1 0 0] Tm +0 0 Td +456.314 620.374 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +72 608.418 Td +(\() 5.97756 Tj +-600 TJm +(...,) 23.9102 Tj +-600 TJm +(BZ_RUN) 35.8654 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 161.664 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.154 608.418 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(do) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +[1 0 0 1 225.036 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -225.036 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +225.036 608.418 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +-600 TJm +(\() 5.97756 Tj +-600 TJm +(...,) 23.9102 Tj +-600 TJm +(BZ_FINISH) 53.798 Tj +-600 TJm +(\)) 5.97756 Tj +[1 0 0 1 422.296 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.296 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +424.786 608.418 Td +/F130_0 9.9626 Tf +(calls.) 20.7521 Tj +[1 0 0 1 72 606.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -596.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 586.501 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-278 TJm +(required) 33.1954 Tj +-277 TJm +(memory) 33.2053 Tj +-278 TJm +(is) 6.64505 Tj +-277 TJm +(allocated) 35.965 Tj +-278 TJm +(by) 9.9626 Tj +[1 0 0 1 220.295 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.295 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.295 586.501 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 327.891 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -327.891 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +327.891 586.501 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-785 TJm +(The) 15.4918 Tj +-278 TJm +(compression) 50.3609 Tj +-277 TJm +(library) 26.5603 Tj +-278 TJm +(can) 13.8281 Tj +-277 TJm +(accept) 25.4445 Tj +-278 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-277 TJm +(data) 16.5977 Tj +-278 TJm +(at) 7.193 Tj +-278 TJm +(all) 9.9626 Tj +72 574.545 Td +(\(ob) 13.2801 Tj +15 TJm +(viously\).) 35.1481 Tj +-612 TJm +(So) 10.5205 Tj +-238 TJm +(you) 14.9439 Tj +-237 TJm +(shouldn') 34.8691 Tj +18 TJm +(t) 2.7696 Tj +-238 TJm +(get) 12.1743 Tj +-238 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-237 TJm +(error) 19.3573 Tj +-238 TJm +(return) 23.7907 Tj +-238 TJm +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +-238 TJm +(from) 19.3673 Tj +-237 TJm +(the) 12.1743 Tj +[1 0 0 1 339.287 574.545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.287 -574.545] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.287 574.545 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 422.973 574.545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.973 -574.545] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.342 574.545 Td +/F130_0 9.9626 Tf +(calls.) 20.7521 Tj +-612 TJm +(If) 6.63509 Tj +-238 TJm +(you) 14.9439 Tj +-237 TJm +(do,) 12.4533 Tj +-240 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-238 TJm +(will) 15.5018 Tj +-238 TJm +(be) 9.40469 Tj +[1 0 0 1 72 562.59] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -562.59] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 562.59 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +[1 0 0 1 173.619 562.59] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.619 -562.59] cm +[1 0 0 1 0 0] Tm +0 0 Td +173.619 562.59 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(indicate) 31.5416 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(programming.) 56.727 Tj +[1 0 0 1 72 560.433] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -550.471] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 540.673 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +35 TJm +(ri) 6.08715 Tj +25 TJm +(vial) 14.9439 Tj +-250 TJm +(other) 20.4731 Tj +-250 TJm +(possible) 32.6574 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 538.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8617] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -529.151] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 529.151 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 517.196 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL,) 29.8878 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +[1 0 0 1 72 501.654] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -491.691] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.033 Td +/F122_0 17.2154 Tf +(3.3.3.) 43.0729 Tj +[1 0 0 1 119.858 471.033] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -471.033] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 471.033 Td +/F392_0 17.2154 Tf +(BZ2_bzCompressEnd) 175.597 Tj +[1 0 0 1 295.455 471.033] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.455 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -459.335] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 459.335 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzCompressEnd) 101.619 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +286.303 457.592 Td +(*) 5.97756 Tj +292.281 459.335 Td +(strm) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 443.793] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -433.831] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 421.876 Td +/F130_0 9.9626 Tf +(Releases) 34.8591 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(associated) 40.9463 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(compression) 50.3609 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 419.719] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -409.756] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 399.958 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 399.858] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -390.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 390.493 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +-852 TJm +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +90 378.538 Td +(BZ_OK) 29.8878 Tj +-4686 TJm +(otherwise) 53.798 Tj +[1 0 0 1 72 362.996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -353.034] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 332.375 Td +/F122_0 17.2154 Tf +(3.3.4.) 43.0729 Tj +[1 0 0 1 119.858 332.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -332.375] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 332.375 Td +/F392_0 17.2154 Tf +(BZ2_bzDecompressInit) 206.585 Tj +[1 0 0 1 326.443 332.375] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.443 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -320.678] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 320.678 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzDecompressInit) 119.551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +304.236 318.934 Td +(*) 5.97756 Tj +310.214 320.678 Td +(strm,) 29.8878 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 305.136] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -295.173] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 283.218 Td +/F130_0 9.9626 Tf +(Prepares) 34.3012 Tj +-351 TJm +(for) 11.6164 Tj +-351 TJm +(decompression.) 62.2563 Tj +-1228 TJm +(As) 11.0684 Tj +-351 TJm +(with) 17.7135 Tj +[1 0 0 1 235.177 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -235.177 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.177 283.218 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 342.773 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.773 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +342.773 283.218 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-377 TJm +(a) 4.42339 Tj +[1 0 0 1 356.937 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.937 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +356.937 283.218 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 410.736 283.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.736 -283.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.235 283.218 Td +/F130_0 9.9626 Tf +(record) 25.4445 Tj +-351 TJm +(should) 26.5703 Tj +-351 TJm +(be) 9.40469 Tj +-352 TJm +(allocated) 35.965 Tj +-351 TJm +(and) 14.386 Tj +72 271.263 Td +(initialised) 39.3025 Tj +-306 TJm +(before) 25.4445 Tj +-305 TJm +(the) 12.1743 Tj +-306 TJm +(call.) 16.8766 Tj +-953 TJm +(Fields) 24.3586 Tj +[1 0 0 1 211.833 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -211.833 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +211.833 271.263 Td +/F134_0 9.9626 Tf +(bzalloc) 41.8429 Tj +[1 0 0 1 253.676 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -253.676 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +253.676 271.263 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 259.35 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.35 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.35 271.263 Td +/F134_0 9.9626 Tf +(bzfree) 35.8654 Tj +[1 0 0 1 295.215 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.215 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +298.26 271.263 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 315.69 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -315.69 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.69 271.263 Td +/F134_0 9.9626 Tf +(opaque) 35.8654 Tj +[1 0 0 1 351.556 271.263] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -351.556 -271.263] cm +[1 0 0 1 0 0] Tm +0 0 Td +354.6 271.263 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-306 TJm +(be) 9.40469 Tj +-305 TJm +(set) 11.0684 Tj +-306 TJm +(if) 6.08715 Tj +-305 TJm +(a) 4.42339 Tj +-306 TJm +(custom) 28.782 Tj +-305 TJm +(memory) 33.2053 Tj +-306 TJm +(allocator) 34.8591 Tj +-306 TJm +(is) 6.64505 Tj +72 259.308 Td +(required,) 35.686 Tj +-350 TJm +(or) 8.29885 Tj +-331 TJm +(made) 21.579 Tj +[1 0 0 1 147.635 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.635 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.635 259.308 Td +/F134_0 9.9626 Tf +(NULL) 23.9102 Tj +[1 0 0 1 171.546 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -171.546 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +174.835 259.308 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-330 TJm +(the) 12.1743 Tj +-331 TJm +(normal) 28.224 Tj +[1 0 0 1 236.722 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -236.722 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +236.722 259.308 Td +/F134_0 9.9626 Tf +(malloc) 35.8654 Tj +[1 0 0 1 272.587 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.587 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +275.878 259.308 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 281.938 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -281.938 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +281.938 259.308 Td +/F134_0 9.9626 Tf +(free) 23.9102 Tj +[1 0 0 1 305.848 259.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.848 -259.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.139 259.308 Td +/F130_0 9.9626 Tf +(routines.) 34.5901 Tj +-1102 TJm +(Upon) 22.1369 Tj +-330 TJm +(return,) 26.2813 Tj +-350 TJm +(the) 12.1743 Tj +-331 TJm +(internal) 30.4357 Tj +-330 TJm +(state) 18.2614 Tj +-330 TJm +(will) 15.5018 Tj +-330 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-331 TJm +(been) 18.8094 Tj +72 247.353 Td +(initialised,) 41.7931 Tj +-250 TJm +(and) 14.386 Tj +[1 0 0 1 133.16 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -133.16 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +133.16 247.353 Td +/F134_0 9.9626 Tf +(total_in) 47.8205 Tj +[1 0 0 1 180.98 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -180.98 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.471 247.353 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 200.348 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -200.348 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.348 247.353 Td +/F134_0 9.9626 Tf +(total_out) 53.798 Tj +[1 0 0 1 254.146 247.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.146 -247.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +256.637 247.353 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(zero.) 19.6363 Tj +[1 0 0 1 72 245.913] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -235.951] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 225.435 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(meaning) 34.3112 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(parameter) 39.8305 Tj +[1 0 0 1 192.756 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.756 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.756 225.435 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 246.554 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -246.554 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +246.554 225.435 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(see) 12.7222 Tj +[1 0 0 1 266.748 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -266.748 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.748 225.435 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 374.345 225.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.345 -225.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.345 225.435 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 223.278] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -213.315] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 203.517 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 81.4975 203.517] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -81.4975 -203.517] cm +[1 0 0 1 0 0] Tm +0 0 Td +81.4975 203.517 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 111.385 203.517] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -111.385 -203.517] cm +[1 0 0 1 0 0] Tm +0 0 Td +114.248 203.517 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-287 TJm +(nonzero,) 34.5802 Tj +-297 TJm +(the) 12.1743 Tj +-287 TJm +(library) 26.5603 Tj +-288 TJm +(will) 15.5018 Tj +-287 TJm +(use) 13.2801 Tj +-287 TJm +(an) 9.40469 Tj +-287 TJm +(alternati) 32.6474 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-288 TJm +(decompression) 59.7656 Tj +-287 TJm +(algorithm) 38.7446 Tj +-287 TJm +(which) 24.3486 Tj +-288 TJm +(uses) 17.1556 Tj +-287 TJm +(less) 14.9439 Tj +-287 TJm +(memory) 33.2053 Tj +-287 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-288 TJm +(at) 7.193 Tj +-287 TJm +(the) 12.1743 Tj +72 191.562 Td +(cost) 16.0497 Tj +-289 TJm +(of) 8.29885 Tj +-290 TJm +(decompressing) 59.7656 Tj +-289 TJm +(more) 20.4731 Tj +-289 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +-290 TJm +(\(roughly) 34.3112 Tj +-289 TJm +(speaking,) 37.9077 Tj +-299 TJm +(half) 15.4918 Tj +-290 TJm +(the) 12.1743 Tj +-289 TJm +(speed,) 25.1755 Tj +-299 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-289 TJm +(the) 12.1743 Tj +-290 TJm +(maximum) 40.4083 Tj +-289 TJm +(memory) 33.2053 Tj +-289 TJm +(requirement) 48.1393 Tj +-290 TJm +(drops) 22.1369 Tj +72 179.607 Td +(to) 7.7509 Tj +-250 TJm +(around) 27.6661 Tj +-250 TJm +(2300k\).) 30.7147 Tj +-620 TJm +(See) 14.386 Tj +[1 0 0 1 166.166 179.607] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -166.166 -179.607] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.166 179.607 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(bzip2) 22.1369 Tj +[1 0 0 1 235.924 179.607] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +[1 0 0 1 -235.924 -179.607] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.415 179.607 Td +/F130_0 9.9626 Tf +([2]) 11.6164 Tj +[1 0 0 1 250.031 179.607] cm +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0 0 1] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -250.031 -179.607] cm +[1 0 0 1 0 0] Tm +0 0 Td +252.522 179.607 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(information) 47.0434 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(management.) 53.3995 Tj +[1 0 0 1 72 177.45] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -167.487] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 157.689 Td +/F130_0 9.9626 Tf +(Note) 19.3673 Tj +-289 TJm +(that) 14.9439 Tj +-290 TJm +(the) 12.1743 Tj +-289 TJm +(amount) 29.8878 Tj +-289 TJm +(of) 8.29885 Tj +-289 TJm +(memory) 33.2053 Tj +-290 TJm +(needed) 28.2141 Tj +-289 TJm +(to) 7.7509 Tj +-289 TJm +(decompress) 47.0334 Tj +-289 TJm +(a) 4.42339 Tj +-290 TJm +(stream) 26.5603 Tj +-289 TJm +(cannot) 26.5603 Tj +-289 TJm +(be) 9.40469 Tj +-289 TJm +(determined) 44.8217 Tj +-290 TJm +(until) 18.2714 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(stream') 29.8778 Tj +55 TJm +(s) 3.87545 Tj +-289 TJm +(header) 26.5503 Tj +-290 TJm +(has) 13.2801 Tj +72 145.734 Td +(been) 18.8094 Tj +-342 TJm +(read,) 19.6363 Tj +-366 TJm +(so) 8.85675 Tj +-342 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-342 TJm +(if) 6.08715 Tj +[1 0 0 1 161.081 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.081 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.081 145.734 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 280.633 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -280.633 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.043 145.734 Td +/F130_0 9.9626 Tf +(succeeds,) 37.8977 Tj +-365 TJm +(a) 4.42339 Tj +-343 TJm +(subsequent) 44.2738 Tj +[1 0 0 1 381.098 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -381.098 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +381.098 145.734 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 476.739 145.734] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -476.739 -145.734] cm +[1 0 0 1 0 0] Tm +0 0 Td +480.149 145.734 Td +/F130_0 9.9626 Tf +(could) 22.1369 Tj +-342 TJm +(f) 3.31755 Tj +10 TJm +(ail) 9.9626 Tj +-343 TJm +(with) 17.7135 Tj +[1 0 0 1 72 133.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -133.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 133.779 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 143.731 133.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -133.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.731 133.779 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 132.469] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -122.506] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 111.861 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 111.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.9095] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(16) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 20 20 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -117.195] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 95.6413 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 92.0547] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 687.721 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(\)) 5.97756 Tj +98.4879 663.811 Td +(or) 11.9551 Tj +-426 TJm +(\(verbosity) 59.7756 Tj +-426 TJm +(<;) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(||) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4\)) 11.9551 Tj +90 651.856 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 639.9 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +[1 0 0 1 72 624.359] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5865] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -614.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 602.441 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 602.341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -592.976] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 592.976 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +98.4879 581.021 Td +(if) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(returned) 47.8205 Tj +98.4879 569.066 Td +(no) 11.9551 Tj +-426 TJm +(specific) 47.8205 Tj +-426 TJm +(action) 35.8654 Tj +-426 TJm +(required) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(case) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +[1 0 0 1 72 553.524] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -543.562] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 522.903 Td +/F122_0 17.2154 Tf +(3.3.5.) 43.0729 Tj +[1 0 0 1 119.858 522.903] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -522.903] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 522.903 Td +/F392_0 17.2154 Tf +(BZ2_bzDecompress) 165.268 Tj +[1 0 0 1 285.126 522.903] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.126 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -511.206] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 511.206 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzDecompress) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +280.326 509.462 Td +(*) 5.97756 Tj +286.303 511.206 Td +(strm) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 495.664] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 473.746 Td +/F130_0 9.9626 Tf +(Pro) 13.8381 Tj +15 TJm +(vides) 21.031 Tj +-301 TJm +(more) 20.4731 Tj +-302 TJm +(input) 20.4831 Tj +-301 TJm +(and/out) 29.8878 Tj +-302 TJm +(output) 25.4644 Tj +-301 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-301 TJm +(space) 22.1269 Tj +-302 TJm +(for) 11.6164 Tj +-301 TJm +(the) 12.1743 Tj +-302 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-928 TJm +(The) 15.4918 Tj +-301 TJm +(caller) 22.1269 Tj +-302 TJm +(maintains) 38.7446 Tj +-301 TJm +(input) 20.4831 Tj +-302 TJm +(and) 14.386 Tj +-301 TJm +(output) 25.4644 Tj +-301 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fers,) 17.4246 Tj +-315 TJm +(and) 14.386 Tj +72 461.791 Td +(uses) 17.1556 Tj +[1 0 0 1 91.6461 461.791] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -91.6461 -461.791] cm +[1 0 0 1 0 0] Tm +0 0 Td +91.6461 461.791 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 187.287 461.791] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -187.287 -461.791] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.778 461.791 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(transfer) 30.4258 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(between) 33.1954 Tj +-250 TJm +(them.) 22.4159 Tj +[1 0 0 1 72 460.257] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -450.294] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.873 Td +/F130_0 9.9626 Tf +(Before) 27.1082 Tj +-498 TJm +(each) 18.2515 Tj +-499 TJm +(call) 14.386 Tj +-498 TJm +(to) 7.7509 Tj +[1 0 0 1 159.356 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.356 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.356 439.873 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 254.997 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.997 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +254.997 439.873 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 263.071 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.071 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +263.071 439.873 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 304.914 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -304.914 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.879 439.873 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-498 TJm +(point) 20.4831 Tj +-499 TJm +(at) 7.193 Tj +-498 TJm +(the) 12.1743 Tj +-498 TJm +(compressed) 47.0334 Tj +-499 TJm +(data,) 19.0883 Tj +-560 TJm +(and) 14.386 Tj +[1 0 0 1 492.179 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -492.179 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +492.179 439.873 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 540 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 427.918 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-308 TJm +(indicate) 31.5416 Tj +-308 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-309 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-308 TJm +(bytes) 21.031 Tj +-308 TJm +(the) 12.1743 Tj +-308 TJm +(library) 26.5603 Tj +-308 TJm +(may) 17.1556 Tj +-309 TJm +(read.) 19.6363 Tj +[1 0 0 1 294.955 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.955 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.955 427.918 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 390.597 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -390.597 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +393.667 427.918 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 427.173 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.173 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.173 427.918 Td +/F134_0 9.9626 Tf +(next_in) 41.8429 Tj +[1 0 0 1 469.016 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -469.016 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +469.016 427.918 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 474.723 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -474.723 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +474.723 427.918 Td +/F134_0 9.9626 Tf +(avail_in) 47.8205 Tj +[1 0 0 1 522.543 427.918] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -522.543 -427.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 427.918 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 72 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 415.963 Td +/F134_0 9.9626 Tf +(total_in) 47.8205 Tj +[1 0 0 1 119.821 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.311 415.963 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(read.) 19.6363 Tj +[1 0 0 1 72 413.806] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -403.843] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 394.045 Td +/F130_0 9.9626 Tf +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 113.799 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.799 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.799 394.045 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 161.62 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.62 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.41 394.045 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-280 TJm +(point) 20.4831 Tj +-280 TJm +(to) 7.7509 Tj +-280 TJm +(a) 4.42339 Tj +-280 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-280 TJm +(in) 7.7509 Tj +-281 TJm +(which) 24.3486 Tj +-280 TJm +(the) 12.1743 Tj +-280 TJm +(uncompressed) 56.996 Tj +-280 TJm +(output) 25.4644 Tj +-280 TJm +(is) 6.64505 Tj +-280 TJm +(to) 7.7509 Tj +-280 TJm +(be) 9.40469 Tj +-280 TJm +(placed,) 28.493 Tj +-288 TJm +(with) 17.7135 Tj +[1 0 0 1 486.202 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 394.045 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 540 394.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -394.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 382.09 Td +/F130_0 9.9626 Tf +(indicating) 39.8504 Tj +-525 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-524 TJm +(much) 22.1369 Tj +-525 TJm +(output) 25.4644 Tj +-524 TJm +(space) 22.1269 Tj +-525 TJm +(is) 6.64505 Tj +-525 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 285.792 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -285.792 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +285.792 382.09 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 369.478 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -369.478 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.705 382.09 Td +/F130_0 9.9626 Tf +(updates) 30.4357 Tj +[1 0 0 1 410.367 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.367 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.367 382.09 Td +/F134_0 9.9626 Tf +(next_out) 47.8205 Tj +[1 0 0 1 458.188 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -458.188 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +458.188 382.09 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 466.589 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -466.589 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +466.589 382.09 Td +/F134_0 9.9626 Tf +(avail_out) 53.798 Tj +[1 0 0 1 520.387 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -520.387 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 382.09 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 72 370.135] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -370.135] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 370.135 Td +/F134_0 9.9626 Tf +(total_out) 53.798 Tj +[1 0 0 1 125.798 370.135] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.798 -370.135] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.289 370.135 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(re\003ect) 24.8965 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(bytes) 21.031 Tj +-250 TJm +(output.) 27.9551 Tj +[1 0 0 1 72 367.978] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -358.015] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 348.217 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-320 TJm +(may) 17.1556 Tj +-321 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-320 TJm +(and) 14.386 Tj +-321 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-320 TJm +(as) 8.29885 Tj +-321 TJm +(little) 18.2714 Tj +-320 TJm +(or) 8.29885 Tj +-320 TJm +(as) 8.29885 Tj +-321 TJm +(much) 22.1369 Tj +-320 TJm +(data) 16.5977 Tj +-321 TJm +(as) 8.29885 Tj +-320 TJm +(you) 14.9439 Tj +-321 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-320 TJm +(on) 9.9626 Tj +-320 TJm +(each) 18.2515 Tj +-321 TJm +(call) 14.386 Tj +-320 TJm +(of) 8.29885 Tj +[1 0 0 1 407.816 348.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -407.816 -348.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +407.816 348.217 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 503.457 348.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -503.457 -348.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +503.457 348.217 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1043 TJm +(In) 8.29885 Tj +-320 TJm +(the) 12.1743 Tj +72 336.262 Td +(limit,) 21.32 Tj +-295 TJm +(it) 5.53921 Tj +-286 TJm +(is) 6.64505 Tj +-287 TJm +(acceptable) 42.0422 Tj +-286 TJm +(to) 7.7509 Tj +-286 TJm +(supply) 26.5703 Tj +-286 TJm +(and) 14.386 Tj +-287 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-286 TJm +(data) 16.5977 Tj +-286 TJm +(one) 14.386 Tj +-286 TJm +(byte) 17.1556 Tj +-287 TJm +(at) 7.193 Tj +-286 TJm +(a) 4.42339 Tj +-286 TJm +(time,) 20.2042 Tj +-295 TJm +(although) 34.8691 Tj +-286 TJm +(this) 14.396 Tj +-287 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-286 TJm +(be) 9.40469 Tj +-286 TJm +(terribly) 29.3299 Tj +-286 TJm +(inef) 15.4918 Tj +25 TJm +(\002cient.) 27.3972 Tj +-838 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +72 324.306 Td +(should) 26.5703 Tj +-250 TJm +(al) 7.193 Tj +10 TJm +(w) 7.193 Tj +10 TJm +(ays) 13.2801 Tj +-250 TJm +(ensure) 26.0024 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(least) 18.2614 Tj +-250 TJm +(one) 14.386 Tj +-250 TJm +(byte) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(space) 22.1269 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(each) 18.2515 Tj +-250 TJm +(call.) 16.8766 Tj +[1 0 0 1 72 322.15] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -312.187] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 302.389 Td +/F130_0 9.9626 Tf +(Use) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 100.772 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -100.772 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +100.772 302.389 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 196.413 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.413 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +198.904 302.389 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(simpler) 29.8878 Tj +-250 TJm +(than) 17.1556 Tj +[1 0 0 1 260.064 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.064 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +260.064 302.389 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 343.75 302.389] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -343.75 -302.389] cm +[1 0 0 1 0 0] Tm +0 0 Td +343.75 302.389 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 300.232] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -290.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 280.471 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-346 TJm +(should) 26.5703 Tj +-347 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-346 TJm +(input) 20.4831 Tj +-346 TJm +(and) 14.386 Tj +-346 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-347 TJm +(output) 25.4644 Tj +-346 TJm +(as) 8.29885 Tj +-346 TJm +(described) 38.1767 Tj +-346 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-371 TJm +(and) 14.386 Tj +-346 TJm +(repeatedly) 41.4942 Tj +-346 TJm +(call) 14.386 Tj +[1 0 0 1 422.638 280.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.638 -280.471] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.638 280.471 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 518.279 280.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -518.279 -280.471] cm +[1 0 0 1 0 0] Tm +0 0 Td +521.729 280.471 Td +/F130_0 9.9626 Tf +(until) 18.2714 Tj +[1 0 0 1 72 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 268.516 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 149.709 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +152.314 268.516 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-262 TJm +(returned.) 35.686 Tj +-344 TJm +(Appearance) 47.5714 Tj +-262 TJm +(of) 8.29885 Tj +[1 0 0 1 261.767 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.767 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.767 268.516 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 339.475 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -339.475 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +342.081 268.516 Td +/F130_0 9.9626 Tf +(denotes) 30.4357 Tj +-262 TJm +(that) 14.9439 Tj +[1 0 0 1 392.672 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.672 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.672 268.516 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 488.313 268.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -488.313 -268.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +490.919 268.516 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-262 TJm +(detected) 33.1954 Tj +72 256.561 Td +(the) 12.1743 Tj +-212 TJm +(logical) 27.1182 Tj +-212 TJm +(end) 14.386 Tj +-211 TJm +(of) 8.29885 Tj +-212 TJm +(the) 12.1743 Tj +-212 TJm +(compressed) 47.0334 Tj +-212 TJm +(stream.) 29.0509 Tj +[1 0 0 1 237.858 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -237.858 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.858 256.561 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 333.499 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -333.499 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.609 256.561 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-212 TJm +(not) 12.7322 Tj +-212 TJm +(produce) 32.0895 Tj +[1 0 0 1 402.263 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.263 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +402.263 256.561 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 479.972 256.561] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.972 -256.561] cm +[1 0 0 1 0 0] Tm +0 0 Td +482.082 256.561 Td +/F130_0 9.9626 Tf +(until) 18.2714 Tj +-212 TJm +(all) 9.9626 Tj +-212 TJm +(output) 25.4644 Tj +72 244.605 Td +(data) 16.5977 Tj +-256 TJm +(has) 13.2801 Tj +-256 TJm +(been) 18.8094 Tj +-255 TJm +(placed) 26.0024 Tj +-256 TJm +(into) 15.5018 Tj +-256 TJm +(the) 12.1743 Tj +-256 TJm +(output) 25.4644 Tj +-256 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +-257 TJm +(so) 8.85675 Tj +-256 TJm +(once) 18.8094 Tj +[1 0 0 1 278.978 244.605] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.978 -244.605] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.978 244.605 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 356.687 244.605] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.687 -244.605] cm +[1 0 0 1 0 0] Tm +0 0 Td +359.236 244.605 Td +/F130_0 9.9626 Tf +(appears,) 32.9164 Tj +-257 TJm +(you) 14.9439 Tj +-256 TJm +(are) 12.1643 Tj +-256 TJm +(guaranteed) 43.7059 Tj +-256 TJm +(to) 7.7509 Tj +-256 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-255 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +72 232.65 Td +(all) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(decompressed) 56.4381 Tj +-250 TJm +(output,) 27.9551 Tj +-250 TJm +(and) 14.386 Tj +[1 0 0 1 205.369 232.65] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -205.369 -232.65] cm +[1 0 0 1 0 0] Tm +0 0 Td +205.369 232.65 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 318.943 232.65] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -318.943 -232.65] cm +[1 0 0 1 0 0] Tm +0 0 Td +321.433 232.65 Td +/F130_0 9.9626 Tf +(can) 13.8281 Tj +-250 TJm +(safely) 23.7907 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(called.) 26.2813 Tj +[1 0 0 1 72 230.493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -220.531] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 210.732 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-250 TJm +(case) 17.1456 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue,) 19.0883 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(call) 14.386 Tj +[1 0 0 1 261.259 210.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -261.259 -210.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +261.259 210.732 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 374.833 210.732] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.833 -210.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +377.323 210.732 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(clean) 21.0211 Tj +-250 TJm +(up) 9.9626 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(release) 27.6562 Tj +-250 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 208.576] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -198.613] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 188.815 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 188.715] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -137.863] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(17) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 21 21 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -200.882] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 179.328 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 175.741] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 687.721 Td +(or) 11.9551 Tj +-426 TJm +(strm->avail_out) 89.6634 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +90 675.766 Td +(BZ_DATA_ERROR) 77.7083 Tj +98.4879 663.811 Td +(if) 11.9551 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(integrity) 53.798 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(stream) 35.8654 Tj +90 651.856 Td +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +98.4879 639.9 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(doesn't) 41.8429 Tj +-426 TJm +(begin) 29.8878 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(right) 29.8878 Tj +-426 TJm +(magic) 29.8878 Tj +-426 TJm +(bytes) 29.8878 Tj +90 627.945 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 615.99 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(wasn't) 35.8654 Tj +-426 TJm +(enough) 35.8654 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(available) 53.798 Tj +90 604.035 Td +(BZ_STREAM_END) 77.7083 Tj +98.4879 592.08 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(logical) 41.8429 Tj +-426 TJm +(end) 17.9327 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(all) 17.9327 Tj +98.4879 580.125 Td +(output) 35.8654 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(consumed,) 53.798 Tj +-426 TJm +(eg) 11.9551 Tj +-426 TJm +(s-->avail_out) 77.7083 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +90 568.169 Td +(BZ_OK) 29.8878 Tj +98.4879 556.214 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 540.673] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 518.755 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 518.655] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -509.29] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 509.29 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +98.4879 497.335 Td +(if) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(returned) 47.8205 Tj +90 485.38 Td +(BZ2_bzDecompressEnd) 113.574 Tj +98.4879 473.425 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 457.883] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -447.92] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 427.262 Td +/F122_0 17.2154 Tf +(3.3.6.) 43.0729 Tj +[1 0 0 1 119.858 427.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -427.262] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 427.262 Td +/F392_0 17.2154 Tf +(BZ2_bzDecompressEnd) 196.256 Tj +[1 0 0 1 316.114 427.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -244.114 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -415.564] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 415.564 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzDecompressEnd) 113.574 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bz_stream) 53.798 Tj +298.259 413.821 Td +(*) 5.97756 Tj +304.236 415.564 Td +(strm) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 400.023] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -390.06] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 378.105 Td +/F130_0 9.9626 Tf +(Releases) 34.8591 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(memory) 33.2053 Tj +-250 TJm +(associated) 40.9463 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(decompression) 59.7656 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 375.948] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -365.985] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 356.187 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 356.087] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -346.723] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 346.723 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 334.767 Td +(if) 11.9551 Tj +-426 TJm +(strm) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(strm->s) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +90 322.812 Td +(BZ_OK) 29.8878 Tj +98.4879 310.857 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 295.315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -285.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 273.397 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 273.298] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -263.933] cm +[1 0 0 1 0 0] Tm +0 0 Td +98.4879 263.933 Td +/F134_0 9.9626 Tf +(None.) 29.8878 Tj +[1 0 0 1 72 248.391] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -238.429] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 213.639 Td +/F122_0 20.6585 Tf +(3.4.) 34.4584 Tj +-278 TJm +(High-le) 70.0117 Tj +15 TJm +(vel) 28.7153 Tj +-278 TJm +(interface) 86.1046 Tj +[1 0 0 1 72 209.042] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -199.08] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 191.721 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-250 TJm +(pro) 13.2801 Tj +15 TJm +(vides) 21.031 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(reading) 29.8778 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(writing) 28.782 Tj +[1 0 0 1 300.292 191.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.292 -191.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.292 191.721 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 330.18 191.721] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -330.18 -191.721] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.67 191.721 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-250 TJm +(\002les.) 19.0983 Tj +-620 TJm +(First,) 20.7621 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(general) 29.3199 Tj +-250 TJm +(points.) 26.8492 Tj +[1 0 0 1 72 189.564] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 159.84 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 159.84 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-332 TJm +(of) 8.29885 Tj +-331 TJm +(the) 12.1743 Tj +-332 TJm +(functions) 37.0808 Tj +-332 TJm +(tak) 12.1743 Tj +10 TJm +(e) 4.42339 Tj +-331 TJm +(an) 9.40469 Tj +[1 0 0 1 202.958 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.958 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +202.958 159.84 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +220.891 158.097 Td +(*) 5.97756 Tj +[1 0 0 1 226.868 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.868 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.172 159.84 Td +/F130_0 9.9626 Tf +(\002rst) 15.5018 Tj +-332 TJm +(ar) 7.74094 Tj +18 TJm +(gument,) 32.3785 Tj +[1 0 0 1 292.426 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.426 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.426 159.84 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 334.269 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -334.269 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +334.269 159.84 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1110 TJm +(After) 21.0211 Tj +-332 TJm +(each) 18.2515 Tj +-331 TJm +(call,) 16.8766 Tj +[1 0 0 1 414.083 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -414.083 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.083 159.84 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 455.926 159.84] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.926 -159.84] cm +[1 0 0 1 0 0] Tm +0 0 Td +459.23 159.84 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-332 TJm +(be) 9.40469 Tj +-331 TJm +(consulted) 38.1866 Tj +86.944 147.885 Td +(\002rst) 15.5018 Tj +-349 TJm +(to) 7.7509 Tj +-349 TJm +(determine) 39.8404 Tj +-348 TJm +(the) 12.1743 Tj +-349 TJm +(outcome) 34.3112 Tj +-349 TJm +(of) 8.29885 Tj +-349 TJm +(the) 12.1743 Tj +-348 TJm +(call.) 16.8766 Tj +-1213 TJm +(If) 6.63509 Tj +[1 0 0 1 280.386 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -280.386 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +280.386 147.885 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 322.229 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.229 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +325.704 147.885 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +[1 0 0 1 335.824 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -335.824 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.824 147.885 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 365.711 147.885] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -365.711 -147.885] cm +[1 0 0 1 0 0] Tm +0 0 Td +365.711 147.885 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-349 TJm +(the) 12.1743 Tj +-349 TJm +(call) 14.386 Tj +-348 TJm +(completed) 41.5042 Tj +-349 TJm +(successfully) 48.6972 Tj +65 TJm +(,) 2.49065 Tj +-374 TJm +(and) 14.386 Tj +-348 TJm +(only) 17.7135 Tj +86.944 135.93 Td +(then) 17.1556 Tj +-271 TJm +(should) 26.5703 Tj +-270 TJm +(the) 12.1743 Tj +-271 TJm +(return) 23.7907 Tj +-270 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-271 TJm +(of) 8.29885 Tj +-271 TJm +(the) 12.1743 Tj +-270 TJm +(function) 33.2053 Tj +-271 TJm +(\(if) 9.40469 Tj +-270 TJm +(an) 9.40469 Tj +15 TJm +(y\)) 8.29885 Tj +-271 TJm +(be) 9.40469 Tj +-271 TJm +(cons) 18.2614 Tj +1 TJm +(u) 4.9813 Tj +-1 TJm +(l) 2.7696 Tj +1 TJm +(ted.) 14.6649 Tj +-744 TJm +(If) 6.63509 Tj +[1 0 0 1 365.077 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -365.077 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +365.077 135.93 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 406.92 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.92 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +409.616 135.93 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +[1 0 0 1 418.956 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.956 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +418.956 135.93 Td +/F134_0 9.9626 Tf +(BZ_IO_ERROR) 65.7532 Tj +[1 0 0 1 484.71 135.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -484.71 -135.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +484.71 135.93 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-271 TJm +(there) 19.9152 Tj +-270 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-271 TJm +(an) 9.40469 Tj +86.944 123.975 Td +(error) 19.3573 Tj +-246 TJm +(reading/writing) 61.4294 Tj +-245 TJm +(the) 12.1743 Tj +-246 TJm +(underlying) 43.1679 Tj +-246 TJm +(compressed) 47.0334 Tj +-245 TJm +(\002le,) 15.2229 Tj +-247 TJm +(and) 14.386 Tj +-245 TJm +(you) 14.9439 Tj +-246 TJm +(should) 26.5703 Tj +-246 TJm +(then) 17.1556 Tj +-245 TJm +(consult) 28.782 Tj +[1 0 0 1 414.096 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -414.096 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +414.096 123.975 Td +/F134_0 9.9626 Tf +(errno) 29.8878 Tj +[1 0 0 1 443.984 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -443.984 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.432 123.975 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 451.649 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -451.649 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +451.649 123.975 Td +/F134_0 9.9626 Tf +(perror) 35.8654 Tj +[1 0 0 1 487.514 123.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -487.514 -123.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +489.962 123.975 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-246 TJm +(determine) 39.8404 Tj +86.944 112.02 Td +(the) 12.1743 Tj +-356 TJm +(cause) 22.1269 Tj +-356 TJm +(of) 8.29885 Tj +-355 TJm +(the) 12.1743 Tj +-356 TJm +(dif) 11.0684 Tj +25 TJm +(\002culty) 25.4644 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 206.528 112.02] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -206.528 -112.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +206.528 112.02 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 248.371 112.02] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.371 -112.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +251.916 112.02 Td +/F130_0 9.9626 Tf +(may) 17.1556 Tj +-356 TJm +(also) 16.0497 Tj +-356 TJm +(be) 9.40469 Tj +-355 TJm +(set) 11.0684 Tj +-356 TJm +(to) 7.7509 Tj +-356 TJm +(v) 4.9813 Tj +25 TJm +(arious) 24.3486 Tj +-356 TJm +(other) 20.4731 Tj +-356 TJm +(v) 4.9813 Tj +25 TJm +(alues;) 23.2427 Tj +-408 TJm +(precise) 28.2141 Tj +-356 TJm +(details) 26.0123 Tj +-356 TJm +(are) 12.1643 Tj +-356 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-356 TJm +(on) 9.9626 Tj +-356 TJm +(a) 4.42339 Tj +86.944 100.064 Td +(per) 12.7222 Tj +20 TJm +(-function) 36.5229 Tj +-250 TJm +(basis) 19.9252 Tj +-250 TJm +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 186.839 100.064] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -114.838 -49.2126] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(18) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 22 22 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 710.037 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 710.037 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 95.9576 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -95.9576 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +95.9576 710.037 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 137.801 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.801 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.179 710.037 Td +/F130_0 9.9626 Tf +(indicates) 35.417 Tj +-239 TJm +(an) 9.40469 Tj +-238 TJm +(error) 19.3573 Tj +-239 TJm +(\(ie,) 13.0012 Tj +-241 TJm +(an) 9.40469 Tj +15 TJm +(ything) 25.4644 Tj +-239 TJm +(e) 4.42339 Tj +15 TJm +(xcept) 21.579 Tj +[1 0 0 1 292.225 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.225 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.225 710.037 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 322.113 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.113 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +324.492 710.037 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 341.256 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -341.256 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.256 710.037 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 418.965 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -418.965 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +418.965 710.037 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-239 TJm +(you) 14.9439 Tj +-239 TJm +(should) 26.5703 Tj +-238 TJm +(immediately) 49.813 Tj +-239 TJm +(call) 14.386 Tj +[1 0 0 1 86.944 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 176.608 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.608 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.343 698.082 Td +/F130_0 9.9626 Tf +(\(or) 11.6164 Tj +[1 0 0 1 193.695 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.695 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.695 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 289.337 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -289.337 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +289.337 698.082 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-281 TJm +(depending) 41.5042 Tj +-274 TJm +(on) 9.9626 Tj +-275 TJm +(whether) 32.0895 Tj +-274 TJm +(you) 14.9439 Tj +-275 TJm +(are) 12.1643 Tj +-275 TJm +(attempting) 42.62 Tj +-274 TJm +(to) 7.7509 Tj +-275 TJm +(read) 17.1456 Tj +-274 TJm +(or) 8.29885 Tj +-275 TJm +(to) 7.7509 Tj +-274 TJm +(write\)) 23.7907 Tj +86.944 686.127 Td +(to) 7.7509 Tj +-242 TJm +(free) 15.4819 Tj +-242 TJm +(up) 9.9626 Tj +-241 TJm +(all) 9.9626 Tj +-242 TJm +(resources) 37.6188 Tj +-242 TJm +(associated) 40.9463 Tj +-242 TJm +(wi) 9.9626 Tj +1 TJm +(th) 7.7509 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(stream.) 29.0509 Tj +-614 TJm +(Once) 21.0211 Tj +-242 TJm +(an) 9.40469 Tj +-242 TJm +(error) 19.3573 Tj +-242 TJm +(has) 13.2801 Tj +-242 TJm +(been) 18.8094 Tj +-241 TJm +(indicated,) 39.0135 Tj +-244 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-241 TJm +(of) 8.29885 Tj +-242 TJm +(all) 9.9626 Tj +-242 TJm +(calls) 18.2614 Tj +-242 TJm +(e) 4.42339 Tj +15 TJm +(xcept) 21.579 Tj +[1 0 0 1 86.944 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 176.608 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.608 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.705 674.172 Td +/F130_0 9.9626 Tf +(\() 3.31755 Tj +[1 0 0 1 183.022 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.022 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.022 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 278.664 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.664 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.664 674.172 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-311 TJm +(is) 6.64505 Tj +-311 TJm +(unde\002ned.) 41.7831 Tj +-985 TJm +(The) 15.4918 Tj +-311 TJm +(implication) 45.3896 Tj +-310 TJm +(is) 6.64505 Tj +-311 TJm +(that) 14.9439 Tj +-311 TJm +(\(1\)) 11.6164 Tj +[1 0 0 1 455.988 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.988 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +455.988 674.172 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 497.831 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -497.831 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +500.928 674.172 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-311 TJm +(be) 9.40469 Tj +86.944 662.217 Td +(check) 23.2328 Tj +10 TJm +(ed) 9.40469 Tj +-291 TJm +(after) 18.2515 Tj +-291 TJm +(each) 18.2515 Tj +-291 TJm +(call,) 16.8766 Tj +-301 TJm +(and) 14.386 Tj +-291 TJm +(\(2\)) 11.6164 Tj +-291 TJm +(if) 6.08715 Tj +[1 0 0 1 225.347 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -225.347 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +225.347 662.217 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 267.19 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -267.19 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +270.09 662.217 Td +/F130_0 9.9626 Tf +(indicates) 35.417 Tj +-291 TJm +(an) 9.40469 Tj +-291 TJm +(error) 19.3573 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 345.161 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -345.161 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +345.161 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 434.824 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -434.824 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +437.724 662.217 Td +/F130_0 9.9626 Tf +(\() 3.31755 Tj +[1 0 0 1 441.041 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.041 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.041 662.217 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 536.683 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -536.683 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +536.683 662.217 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +86.944 650.262 Td +(should) 26.5703 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(called) 23.7907 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(clean) 21.0211 Tj +-250 TJm +(up.) 12.4533 Tj +[1 0 0 1 220.034 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -148.034 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 628.344 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 628.344 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +[1 0 0 1 106.362 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -106.362 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +106.362 628.344 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +130.273 626.6 Td +(*) 5.97756 Tj +[1 0 0 1 136.25 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.25 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.177 628.344 Td +/F130_0 9.9626 Tf +(ar) 7.74094 Tj +18 TJm +(guments) 33.7633 Tj +-394 TJm +(passed) 26.5603 Tj +-394 TJm +(to) 7.7509 Tj +[1 0 0 1 227.592 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -227.592 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +227.592 628.344 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 311.278 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -311.278 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.205 628.344 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 321.901 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -321.901 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +321.901 628.344 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteOpen) 89.6634 Tj +[1 0 0 1 411.565 628.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -411.565 -628.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +415.491 628.344 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-394 TJm +(be) 9.40469 Tj +-394 TJm +(set) 11.0684 Tj +-394 TJm +(to) 7.7509 Tj +-394 TJm +(binary) 25.4544 Tj +-395 TJm +(mode.) 24.6275 Tj +86.944 616.389 Td +(Most) 20.4831 Tj +-229 TJm +(Unix) 19.9252 Tj +-229 TJm +(systems) 31.5516 Tj +-228 TJm +(will) 15.5018 Tj +-229 TJm +(do) 9.9626 Tj +-229 TJm +(this) 14.396 Tj +-229 TJm +(by) 9.9626 Tj +-229 TJm +(def) 12.7222 Tj +10 TJm +(ault,) 17.4346 Tj +-233 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-229 TJm +(other) 20.4731 Tj +-229 TJm +(platforms,) 40.6773 Tj +-233 TJm +(including) 37.6387 Tj +-229 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-228 TJm +(and) 14.386 Tj +-229 TJm +(Mac,) 20.1942 Tj +-233 TJm +(will) 15.5018 Tj +-229 TJm +(not.) 15.2229 Tj +-606 TJm +(If) 6.63509 Tj +-229 TJm +(you) 14.9439 Tj +-229 TJm +(omit) 18.2714 Tj +86.944 604.433 Td +(this,) 16.8866 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(encounter) 39.2825 Tj +-250 TJm +(problems) 37.0808 Tj +-250 TJm +(when) 21.579 Tj +-250 TJm +(mo) 12.7322 Tj +15 TJm +(ving) 17.7135 Tj +-250 TJm +(code) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(platforms.) 40.6773 Tj +[1 0 0 1 372.66 604.433] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.66 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 582.516 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 582.516 Td +/F130_0 9.9626 Tf +(Memory) 34.3112 Tj +-348 TJm +(allocation) 39.2925 Tj +-348 TJm +(requests) 32.6474 Tj +-348 TJm +(are) 12.1643 Tj +-348 TJm +(handled) 31.5416 Tj +-348 TJm +(by) 9.9626 Tj +[1 0 0 1 267.67 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -267.67 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +267.67 582.516 Td +/F134_0 9.9626 Tf +(malloc) 35.8654 Tj +[1 0 0 1 303.535 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.535 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +307.003 582.516 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 313.241 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -313.241 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +313.241 582.516 Td +/F134_0 9.9626 Tf +(free) 23.9102 Tj +[1 0 0 1 337.151 582.516] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -337.151 -582.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +337.151 582.516 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1209 TJm +(At) 9.9626 Tj +-348 TJm +(present) 28.772 Tj +-348 TJm +(there) 19.9152 Tj +-348 TJm +(is) 6.64505 Tj +-348 TJm +(no) 9.9626 Tj +-348 TJm +(f) 3.31755 Tj +10 TJm +(acility) 24.9065 Tj +-348 TJm +(for) 11.6164 Tj +-348 TJm +(user) 16.5977 Tj +20 TJm +(-de\002ned) 32.6474 Tj +86.944 570.56 Td +(memory) 33.2053 Tj +-250 TJm +(allocators) 38.7346 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(I/O) 13.2801 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(\(could) 25.4544 Tj +-250 TJm +(easily) 23.2427 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(added,) 26.2813 Tj +-250 TJm +(though\).) 33.4843 Tj +[1 0 0 1 387.165 570.56] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -315.165 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -548.478] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 529.977 Td +/F122_0 17.2154 Tf +(3.4.1.) 43.0729 Tj +[1 0 0 1 119.858 529.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -529.977] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 529.977 Td +/F392_0 17.2154 Tf +(BZ2_bzReadOpen) 144.609 Tj +[1 0 0 1 264.468 529.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.468 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -72.7272] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 71.731 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 68.1444] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -518.279] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 518.279 Td +/F134_0 9.9626 Tf +(typedef) 41.8429 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(BZFILE;) 41.8429 Tj +90 494.369 Td +(BZFILE) 35.8654 Tj +130.109 492.625 Td +(*) 5.97756 Tj +136.087 494.369 Td +(BZ2_bzReadOpen\() 89.6634 Tj +-426 TJm +(int) 17.9327 Tj +252.171 492.625 Td +(*) 5.97756 Tj +258.149 494.369 Td +(bzerror,) 47.8205 Tj +-426 TJm +(FILE) 23.9102 Tj +338.368 492.625 Td +(*) 5.97756 Tj +344.346 494.369 Td +(f,) 11.9551 Tj +191.855 482.414 Td +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(small,) 35.8654 Tj +191.855 470.458 Td +(void) 23.9102 Tj +220.01 468.715 Td +(*) 5.97756 Tj +225.987 470.458 Td +(unused,) 41.8429 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 454.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -444.954] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 432.999 Td +/F130_0 9.9626 Tf +(Prepare) 30.4258 Tj +-290 TJm +(to) 7.7509 Tj +-289 TJm +(read) 17.1456 Tj +-290 TJm +(compressed) 47.0334 Tj +-290 TJm +(data) 16.5977 Tj +-289 TJm +(from) 19.3673 Tj +-290 TJm +(\002le) 12.7322 Tj +-289 TJm +(handle) 26.5603 Tj +[1 0 0 1 272.697 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.697 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.697 432.999 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 278.675 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.675 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +278.675 432.999 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 285.439 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -285.439 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +285.439 432.999 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 291.417 432.999] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -291.417 -432.999] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.303 432.999 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-290 TJm +(refer) 18.7994 Tj +-289 TJm +(to) 7.7509 Tj +-290 TJm +(a) 4.42339 Tj +-290 TJm +(\002le) 12.7322 Tj +-289 TJm +(which) 24.3486 Tj +-290 TJm +(has) 13.2801 Tj +-289 TJm +(been) 18.8094 Tj +-290 TJm +(opened) 28.772 Tj +-290 TJm +(for) 11.6164 Tj +-289 TJm +(reading,) 32.3685 Tj +-300 TJm +(and) 14.386 Tj +72 421.044 Td +(for) 11.6164 Tj +-306 TJm +(which) 24.3486 Tj +-305 TJm +(the) 12.1743 Tj +-306 TJm +(error) 19.3573 Tj +-306 TJm +(indicator) 35.417 Tj +-305 TJm +(\() 3.31755 Tj +[1 0 0 1 193.457 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -193.457 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +193.457 421.044 Td +/F134_0 9.9626 Tf +(ferror\(f\)) 53.798 Tj +[1 0 0 1 247.255 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -247.255 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +247.255 421.044 Td +/F130_0 9.9626 Tf +(\)is) 9.9626 Tj +-306 TJm +(not) 12.7322 Tj +-305 TJm +(set.) 13.5591 Tj +-954 TJm +(If) 6.63509 Tj +[1 0 0 1 308.784 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -308.784 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +308.784 421.044 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 338.671 421.044] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -338.671 -421.044] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.717 421.044 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-306 TJm +(1,) 7.47195 Tj +-319 TJm +(the) 12.1743 Tj +-306 TJm +(library) 26.5603 Tj +-306 TJm +(will) 15.5018 Tj +-305 TJm +(try) 11.0684 Tj +-306 TJm +(to) 7.7509 Tj +-306 TJm +(dec) 13.8281 Tj +1 TJm +(ompress) 33.2053 Tj +-306 TJm +(using) 21.589 Tj +-306 TJm +(less) 14.9439 Tj +72 409.089 Td +(memory) 33.2053 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xpense) 27.6661 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(speed.) 25.1755 Tj +[1 0 0 1 72 406.932] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -396.969] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 387.171 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-227 TJm +(reasons) 29.8778 Tj +-227 TJm +(e) 4.42339 Tj +15 TJm +(xplained) 34.3112 Tj +-228 TJm +(belo) 17.1556 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 189.193 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.193 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.193 387.171 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 248.969 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -248.969 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +251.232 387.171 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-227 TJm +(decompress) 47.0334 Tj +-227 TJm +(the) 12.1743 Tj +[1 0 0 1 332.732 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -332.732 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.732 387.171 Td +/F134_0 9.9626 Tf +(nUnused) 41.8429 Tj +[1 0 0 1 374.575 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.575 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +376.838 387.171 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-227 TJm +(starting) 29.8878 Tj +-227 TJm +(at) 7.193 Tj +[1 0 0 1 441.74 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.74 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.74 387.171 Td +/F134_0 9.9626 Tf +(unused) 35.8654 Tj +[1 0 0 1 477.605 387.171] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -477.605 -387.171] cm +[1 0 0 1 0 0] Tm +0 0 Td +477.605 387.171 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-232 TJm +(before) 25.4445 Tj +-227 TJm +(starting) 29.8878 Tj +72 375.216 Td +(to) 7.7509 Tj +-280 TJm +(read) 17.1456 Tj +-279 TJm +(from) 19.3673 Tj +-280 TJm +(the) 12.1743 Tj +-279 TJm +(\002le) 12.7322 Tj +[1 0 0 1 155.094 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.094 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.094 375.215 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 161.072 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.072 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.072 375.215 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-797 TJm +(At) 9.9626 Tj +-280 TJm +(most) 19.3773 Tj +[1 0 0 1 206.414 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -206.414 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +206.414 375.215 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 284.122 375.215] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.122 -375.215] cm +[1 0 0 1 0 0] Tm +0 0 Td +286.907 375.215 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-280 TJm +(may) 17.1556 Tj +-279 TJm +(be) 9.40469 Tj +-280 TJm +(supplied) 33.7633 Tj +-279 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-280 TJm +(this.) 16.8866 Tj +-797 TJm +(If) 6.63509 Tj +-279 TJm +(this) 14.396 Tj +-280 TJm +(f) 3.31755 Tj +10 TJm +(acility) 24.9065 Tj +-279 TJm +(is) 6.64505 Tj +-280 TJm +(not) 12.7322 Tj +-279 TJm +(required,) 35.686 Tj +72 363.26 Td +(you) 14.9439 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(pass) 17.1556 Tj +[1 0 0 1 138.141 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.141 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.141 363.26 Td +/F134_0 9.9626 Tf +(NULL) 23.9102 Tj +[1 0 0 1 162.052 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -162.052 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.542 363.26 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 181.419 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -181.419 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.419 363.26 Td +/F134_0 9.9626 Tf +(0) 5.97756 Tj +[1 0 0 1 187.397 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -187.397 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.887 363.26 Td +/F130_0 9.9626 Tf +(for) 11.6164 Tj +[1 0 0 1 203.994 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -203.994 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.994 363.26 Td +/F134_0 9.9626 Tf +(unused) 35.8654 Tj +[1 0 0 1 239.86 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -239.86 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +242.351 363.26 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-250 TJm +(n) 4.9813 Tj +[1 0 0 1 264.208 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -264.208 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +264.208 363.26 Td +/F134_0 9.9626 Tf +(Unused) 35.8654 Tj +[1 0 0 1 300.074 363.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.074 -363.26] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.565 363.26 Td +/F130_0 9.9626 Tf +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 361.103] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -351.141] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 341.343 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(meaning) 34.3112 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(parameters) 43.7059 Tj +[1 0 0 1 196.631 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.631 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.631 341.343 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 226.519 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.519 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.01 341.343 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 245.887 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.887 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.887 341.343 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 299.685 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.685 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.685 341.343 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(see) 12.7222 Tj +[1 0 0 1 319.879 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -319.879 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +319.879 341.343 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 439.431 341.343] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -439.431 -341.343] cm +[1 0 0 1 0 0] Tm +0 0 Td +439.431 341.343 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 339.186] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -329.223] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 319.425 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-402 TJm +(amount) 29.8878 Tj +-402 TJm +(of) 8.29885 Tj +-402 TJm +(memory) 33.2053 Tj +-402 TJm +(needed) 28.2141 Tj +-402 TJm +(to) 7.7509 Tj +-402 TJm +(decompress) 47.0334 Tj +-402 TJm +(a) 4.42339 Tj +-401 TJm +(\002le) 12.7322 Tj +-402 TJm +(cannot) 26.5603 Tj +-402 TJm +(be) 9.40469 Tj +-402 TJm +(determined) 44.8217 Tj +-402 TJm +(until) 18.2714 Tj +-402 TJm +(the) 12.1743 Tj +-402 TJm +(\002le') 16.0497 Tj +55 TJm +(s) 3.87545 Tj +-402 TJm +(header) 26.5503 Tj +-402 TJm +(has) 13.2801 Tj +-402 TJm +(been) 18.8094 Tj +-402 TJm +(read.) 19.6363 Tj +72 307.47 Td +(So) 10.5205 Tj +-492 TJm +(it) 5.53921 Tj +-491 TJm +(is) 6.64505 Tj +-492 TJm +(possible) 32.6574 Tj +-492 TJm +(that) 14.9439 Tj +[1 0 0 1 166.797 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -166.797 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.797 307.47 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 250.483 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -250.483 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +255.381 307.47 Td +/F130_0 9.9626 Tf +(returns) 27.6661 Tj +[1 0 0 1 287.945 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.945 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +287.945 307.47 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 317.833 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -317.833 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +322.729 307.47 Td +/F130_0 9.9626 Tf +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-492 TJm +(a) 4.42339 Tj +-491 TJm +(subsequent) 44.2738 Tj +-492 TJm +(call) 14.386 Tj +-492 TJm +(of) 8.29885 Tj +[1 0 0 1 431.135 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.135 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.135 307.47 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 490.911 307.47] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -490.911 -307.47] cm +[1 0 0 1 0 0] Tm +0 0 Td +495.81 307.47 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-492 TJm +(return) 23.7907 Tj +[1 0 0 1 72 295.514] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -295.514] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 295.514 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 143.731 295.514] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.731 -295.514] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.731 295.514 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 294.204] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -284.242] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 273.597 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 273.597] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -273.597] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 273.597 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 273.597] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -273.597] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 273.597 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 271.44] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -168.369] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 167.372 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 163.786] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -262.075] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 262.075 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 250.12 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 238.165 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 226.209 Td +(if) 11.9551 Tj +-426 TJm +(f) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 214.254 Td +(or) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(neither) 41.8429 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(nor) 17.9327 Tj +-426 TJm +(1) 5.97756 Tj +98.4879 202.299 Td +(or) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(unused) 35.8654 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(\)) 5.97756 Tj +98.4879 190.344 Td +(or) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(unused) 35.8654 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(!\(0) 17.9327 Tj +-426 TJm +(<=) 11.9551 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(<=) 11.9551 Tj +-426 TJm +(BZ_MAX_UNUSED\)) 83.6858 Tj +-426 TJm +(\)) 5.97756 Tj +90 178.389 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 166.434 Td +(if) 11.9551 Tj +-426 TJm +(ferror\(f\)) 53.798 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(nonzero) 41.8429 Tj +90 154.478 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 142.523 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 130.568 Td +(BZ_OK) 29.8878 Tj +98.4879 118.613 Td +(otherwise.) 59.7756 Tj +[1 0 0 1 72 103.071] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -93.1085] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 81.1533 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 81.0538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -30.202] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.9737] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -51.071] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 51.071 Td +/F130_0 9.9626 Tf +(19) 9.9626 Tj +[1 0 0 1 453.269 50.8519] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 23 23 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -81.33] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(Pointer) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(abstract) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 687.721 Td +(NULL) 23.9102 Tj +98.4879 675.766 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 660.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5493] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 638.306 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 638.207] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -628.842] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 628.842 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +98.4879 616.887 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 604.932 Td +(BZ2_bzClose) 65.7532 Tj +98.4879 592.976 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 577.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -567.472] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 546.813 Td +/F122_0 17.2154 Tf +(3.4.2.) 43.0729 Tj +[1 0 0 1 119.858 546.813] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -546.813] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 546.813 Td +/F392_0 17.2154 Tf +(BZ2_bzRead) 103.292 Tj +[1 0 0 1 223.15 546.813] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.15 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -535.116] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 535.116 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzRead) 59.7756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +208.595 533.373 Td +(*) 5.97756 Tj +214.572 535.116 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +306.747 533.373 Td +(*) 5.97756 Tj +312.724 535.116 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +357.077 533.373 Td +(*) 5.97756 Tj +363.055 535.116 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 519.574] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -509.612] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 497.656 Td +/F130_0 9.9626 Tf +(Reads) 24.3486 Tj +-285 TJm +(up) 9.9626 Tj +-284 TJm +(to) 7.7509 Tj +[1 0 0 1 122.569 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -122.569 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.569 497.656 Td +/F134_0 9.9626 Tf +(len) 17.9327 Tj +[1 0 0 1 140.501 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.501 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.337 497.656 Td +/F130_0 9.9626 Tf +(\(uncompressed\)) 63.6311 Tj +-285 TJm +(bytes) 21.031 Tj +-284 TJm +(from) 19.3673 Tj +-285 TJm +(the) 12.1743 Tj +-284 TJm +(compressed) 47.0334 Tj +-285 TJm +(\002le) 12.7322 Tj +[1 0 0 1 336.319 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -336.319 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +336.319 497.656 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 342.296 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.296 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +345.132 497.656 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-285 TJm +(the) 12.1743 Tj +-284 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +[1 0 0 1 405.205 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -405.205 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.205 497.656 Td +/F134_0 9.9626 Tf +(buf) 17.9327 Tj +[1 0 0 1 423.137 497.656] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -423.137 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +423.137 497.656 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-828 TJm +(If) 6.63509 Tj +-284 TJm +(the) 12.1743 Tj +-285 TJm +(read) 17.1456 Tj +-285 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-284 TJm +(successful,) 43.4369 Tj +[1 0 0 1 72 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 485.701 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 113.843 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.36 485.701 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-353 TJm +(set) 11.0684 Tj +-353 TJm +(to) 7.7509 Tj +[1 0 0 1 153.374 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -153.374 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +153.374 485.701 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 183.262 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.262 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +186.778 485.701 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-353 TJm +(the) 12.1743 Tj +-353 TJm +(number) 30.4357 Tj +-353 TJm +(of) 8.29885 Tj +-353 TJm +(bytes) 21.031 Tj +-353 TJm +(read) 17.1456 Tj +-353 TJm +(is) 6.64505 Tj +-353 TJm +(returned.) 35.686 Tj +-1238 TJm +(If) 6.63509 Tj +-353 TJm +(the) 12.1743 Tj +-353 TJm +(logical) 27.1182 Tj +-353 TJm +(end-of-stream) 55.8802 Tj +-353 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-353 TJm +(detected,) 35.686 Tj +[1 0 0 1 72 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 473.746 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 113.843 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.795 473.746 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-296 TJm +(be) 9.40469 Tj +-297 TJm +(set) 11.0684 Tj +-296 TJm +(to) 7.7509 Tj +[1 0 0 1 172.329 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.329 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.329 473.746 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 250.037 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -250.037 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +250.037 473.746 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-296 TJm +(and) 14.386 Tj +-297 TJm +(the) 12.1743 Tj +-296 TJm +(number) 30.4357 Tj +-296 TJm +(of) 8.29885 Tj +-297 TJm +(bytes) 21.031 Tj +-296 TJm +(read) 17.1456 Tj +-296 TJm +(is) 6.64505 Tj +-296 TJm +(returned.) 35.686 Tj +-898 TJm +(All) 12.7322 Tj +-297 TJm +(other) 20.4731 Tj +[1 0 0 1 470 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -470 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +470 473.746 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 511.843 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -511.843 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +514.795 473.746 Td +/F130_0 9.9626 Tf +(v) 4.9813 Tj +25 TJm +(alues) 20.4731 Tj +72 461.791 Td +(denote) 26.5603 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(error) 19.3573 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 461.691] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -451.729] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.873 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 131.776 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.224 439.873 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-246 TJm +(supply) 26.5703 Tj +[1 0 0 1 181.193 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -181.193 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.193 439.873 Td +/F134_0 9.9626 Tf +(len) 17.9327 Tj +[1 0 0 1 199.126 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -199.126 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.575 439.873 Td +/F130_0 9.9626 Tf +(bytes,) 23.5217 Tj +-247 TJm +(unless) 24.9065 Tj +-245 TJm +(the) 12.1743 Tj +-246 TJm +(logical) 27.1182 Tj +-246 TJm +(stream) 26.5603 Tj +-246 TJm +(end) 14.386 Tj +-245 TJm +(is) 6.64505 Tj +-246 TJm +(detected) 33.1954 Tj +-246 TJm +(or) 8.29885 Tj +-246 TJm +(an) 9.40469 Tj +-246 TJm +(error) 19.3573 Tj +-245 TJm +(occurs.) 28.493 Tj +-617 TJm +(Because) 33.1954 Tj +-246 TJm +(of) 8.29885 Tj +-246 TJm +(this,) 16.8866 Tj +-247 TJm +(it) 5.53921 Tj +72 427.918 Td +(is) 6.64505 Tj +-231 TJm +(possible) 32.6574 Tj +-231 TJm +(to) 7.7509 Tj +-231 TJm +(detect) 23.7907 Tj +-231 TJm +(the) 12.1743 Tj +-231 TJm +(stream) 26.5603 Tj +-231 TJm +(end) 14.386 Tj +-232 TJm +(by) 9.9626 Tj +-231 TJm +(observing) 39.2925 Tj +-231 TJm +(when) 21.579 Tj +-231 TJm +(the) 12.1743 Tj +-231 TJm +(number) 30.4357 Tj +-231 TJm +(of) 8.29885 Tj +-231 TJm +(bytes) 21.031 Tj +-231 TJm +(returned) 33.1954 Tj +-231 TJm +(is) 6.64505 Tj +-231 TJm +(less) 14.9439 Tj +-231 TJm +(than) 17.1556 Tj +-232 TJm +(the) 12.1743 Tj +-231 TJm +(number) 30.4357 Tj +-231 TJm +(requested.) 40.6673 Tj +72 415.963 Td +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-309 TJm +(this) 14.396 Tj +-297 TJm +(is) 6.64505 Tj +-298 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(arded) 22.1269 Tj +-297 TJm +(as) 8.29885 Tj +-297 TJm +(inadvisable;) 48.1492 Tj +-321 TJm +(you) 14.9439 Tj +-298 TJm +(should) 26.5703 Tj +-297 TJm +(instead) 28.224 Tj +-297 TJm +(check) 23.2328 Tj +[1 0 0 1 360.631 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.631 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.631 415.963 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 402.475 415.963] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.475 -415.963] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.437 415.963 Td +/F130_0 9.9626 Tf +(after) 18.2515 Tj +-297 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-298 TJm +(call) 14.386 Tj +-297 TJm +(and) 14.386 Tj +-297 TJm +(w) 7.193 Tj +10 TJm +(atch) 16.5977 Tj +-298 TJm +(out) 12.7322 Tj +-297 TJm +(for) 11.6164 Tj +[1 0 0 1 72 404.008] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -404.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 404.008 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 149.709 404.008] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -404.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +149.709 404.008 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 402.698] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -392.735] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 382.09 Td +/F130_0 9.9626 Tf +(Internally) 38.7346 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 117.541 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -117.541 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.541 382.09 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 177.317 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.317 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +181.786 382.09 Td +/F130_0 9.9626 Tf +(copies) 25.4544 Tj +-449 TJm +(data) 16.5977 Tj +-448 TJm +(from) 19.3673 Tj +-449 TJm +(the) 12.1743 Tj +-448 TJm +(compressed) 47.0334 Tj +-449 TJm +(\002le) 12.7322 Tj +-448 TJm +(in) 7.7509 Tj +-449 TJm +(chunks) 28.224 Tj +-449 TJm +(of) 8.29885 Tj +-448 TJm +(size) 15.4918 Tj +[1 0 0 1 419.602 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -419.602 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.602 382.09 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 497.31 382.09] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -497.31 -382.09] cm +[1 0 0 1 0 0] Tm +0 0 Td +501.778 382.09 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-449 TJm +(be-) 12.7222 Tj +72 370.135 Td +(fore) 16.0398 Tj +-414 TJm +(decompressing) 59.7656 Tj +-414 TJm +(it.) 8.02986 Tj +-1605 TJm +(If) 6.63509 Tj +-415 TJm +(the) 12.1743 Tj +-414 TJm +(\002le) 12.7322 Tj +-414 TJm +(contains) 33.2053 Tj +-414 TJm +(more) 20.4731 Tj +-414 TJm +(bytes) 21.031 Tj +-415 TJm +(than) 17.1556 Tj +-414 TJm +(strictly) 27.6761 Tj +-414 TJm +(needed) 28.2141 Tj +-414 TJm +(to) 7.7509 Tj +-414 TJm +(reach) 21.569 Tj +-414 TJm +(the) 12.1743 Tj +-415 TJm +(logical) 27.1182 Tj +-414 TJm +(end-of-stream,) 58.3709 Tj +[1 0 0 1 72 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 358.18 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 131.776 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.749 358.18 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-298 TJm +(almost) 26.5703 Tj +-299 TJm +(certainly) 34.8591 Tj +-298 TJm +(read) 17.1456 Tj +-299 TJm +(some) 21.031 Tj +-298 TJm +(of) 8.29885 Tj +-299 TJm +(the) 12.1743 Tj +-298 TJm +(trailing) 28.782 Tj +-298 TJm +(data) 16.5977 Tj +-299 TJm +(before) 25.4445 Tj +-298 TJm +(signalling) 39.3025 Tj +[1 0 0 1 413.162 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.162 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +413.162 358.18 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_END) 89.6634 Tj +[1 0 0 1 502.826 358.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -502.826 -358.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +502.826 358.18 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-597 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-298 TJm +(col-) 15.4918 Tj +72 346.224 Td +(lect) 14.386 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(read) 17.1456 Tj +-243 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-242 TJm +(unused) 28.224 Tj +-242 TJm +(data) 16.5977 Tj +-242 TJm +(once) 18.8094 Tj +[1 0 0 1 208.759 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.759 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.759 346.224 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_END) 89.6634 Tj +[1 0 0 1 298.423 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.423 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.835 346.224 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-242 TJm +(appeared,) 38.4457 Tj +-244 TJm +(call) 14.386 Tj +[1 0 0 1 374.201 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -374.201 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.201 346.224 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 487.775 346.224] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -487.775 -346.224] cm +[1 0 0 1 0 0] Tm +0 0 Td +490.188 346.224 Td +/F130_0 9.9626 Tf +(immediately) 49.813 Tj +72 334.269 Td +(before) 25.4445 Tj +[1 0 0 1 99.935 334.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -99.935 -334.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +99.935 334.269 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 189.599 334.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -189.599 -334.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +189.599 334.269 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 332.959] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -322.996] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.351 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 312.351 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 312.351 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 310.195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -259.343] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(20) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 24 24 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -284.568] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 263.014 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 259.427] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(buf) 17.9327 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +90 687.721 Td +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzWriteOpen) 89.6634 Tj +90 663.811 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 651.856 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(reading) 41.8429 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file) 23.9102 Tj +90 639.9 Td +(BZ_UNEXPECTED_EOF) 101.619 Tj +98.4879 627.945 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file) 23.9102 Tj +-426 TJm +(ended) 29.8878 Tj +-426 TJm +(before) 35.8654 Tj +98.4879 615.99 Td +(the) 17.9327 Tj +-426 TJm +(logical) 41.8429 Tj +-426 TJm +(end-of-stream) 77.7083 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +90 604.035 Td +(BZ_DATA_ERROR) 77.7083 Tj +98.4879 592.08 Td +(if) 11.9551 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(integrity) 53.798 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(stream) 35.8654 Tj +90 580.125 Td +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +98.4879 568.169 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(does) 23.9102 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(begin) 29.8878 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(requisite) 53.798 Tj +-426 TJm +(header) 35.8654 Tj +-426 TJm +(bytes) 29.8878 Tj +98.4879 556.214 Td +(\(ie,) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(bzip2) 29.8878 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(file\).) 35.8654 Tj +-852 TJm +(This) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(really) 35.8654 Tj +98.4879 544.259 Td +(a) 5.97756 Tj +-426 TJm +(special) 41.8429 Tj +-426 TJm +(case) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(BZ_DATA_ERROR.) 83.6858 Tj +90 532.304 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 520.349 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(available) 53.798 Tj +90 508.394 Td +(BZ_STREAM_END) 77.7083 Tj +98.4879 496.438 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(logical) 41.8429 Tj +-426 TJm +(end) 17.9327 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(stream) 35.8654 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected.) 53.798 Tj +90 484.483 Td +(BZ_OK) 29.8878 Tj +98.4879 472.528 Td +(otherwise.) 59.7756 Tj +[1 0 0 1 72 456.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -447.024] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 435.068 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 434.969] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -425.604] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 425.604 Td +/F134_0 9.9626 Tf +(number) 35.8654 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(bytes) 29.8878 Tj +-426 TJm +(read) 23.9102 Tj +98.4879 413.649 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +90 401.694 Td +(undefined) 53.798 Tj +98.4879 389.739 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 374.197] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -364.234] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 352.279 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 352.18] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6825] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -342.815] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 342.815 Td +/F134_0 9.9626 Tf +(collect) 41.8429 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(then) 23.9102 Tj +-426 TJm +(BZ2_bzRead) 59.7756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(BZ2_bzReadClose) 89.6634 Tj +98.4879 330.859 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 318.904 Td +(collect) 41.8429 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(then) 23.9102 Tj +-426 TJm +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(BZ2_bzReadGetUnused) 113.574 Tj +98.4879 306.949 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_SEQUENCE_END) 89.6634 Tj +90 294.994 Td +(BZ2_bzReadClose) 89.6634 Tj +98.4879 283.039 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 267.497] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -257.534] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 236.876 Td +/F122_0 17.2154 Tf +(3.4.3.) 43.0729 Tj +[1 0 0 1 119.858 236.876] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -236.876] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 236.876 Td +/F392_0 17.2154 Tf +(BZ2_bzReadGetUnused) 196.256 Tj +[1 0 0 1 316.114 236.876] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -244.114 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8617] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -225.178] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 225.178 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzReadGetUnused\() 119.551 Tj +-426 TJm +(int) 17.9327 Tj +259.883 223.435 Td +(*) 5.97756 Tj +270.104 225.178 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +362.278 223.435 Td +(*) 5.97756 Tj +368.256 225.178 Td +(b,) 11.9551 Tj +200.343 213.223 Td +(void) 23.9102 Tj +224.254 211.48 Td +(**) 11.9551 Tj +240.453 213.223 Td +(unused,) 41.8429 Tj +-426 TJm +(int) 17.9327 Tj +304.473 211.48 Td +(*) 5.97756 Tj +314.694 213.223 Td +(nUnused) 41.8429 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 197.681] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -187.719] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 175.764 Td +/F130_0 9.9626 Tf +(Returns) 30.9936 Tj +-435 TJm +(data) 16.5977 Tj +-435 TJm +(which) 24.3486 Tj +-435 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-435 TJm +(read) 17.1456 Tj +-435 TJm +(from) 19.3673 Tj +-435 TJm +(the) 12.1743 Tj +-435 TJm +(compressed) 47.0334 Tj +-435 TJm +(\002le) 12.7322 Tj +-435 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-435 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-435 TJm +(not) 12.7322 Tj +-435 TJm +(needed) 28.2141 Tj +-435 TJm +(to) 7.7509 Tj +-435 TJm +(get) 12.1743 Tj +-435 TJm +(to) 7.7509 Tj +-435 TJm +(the) 12.1743 Tj +-435 TJm +(logical) 27.1182 Tj +-435 TJm +(end-of-stream.) 58.3709 Tj +[1 0 0 1 72 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 162.065 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +77.9776 163.809 Td +(unused) 35.8654 Tj +[1 0 0 1 113.843 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +117.2 163.809 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-337 TJm +(set) 11.0684 Tj +-337 TJm +(to) 7.7509 Tj +-337 TJm +(the) 12.1743 Tj +-337 TJm +(address) 29.8778 Tj +-337 TJm +(of) 8.29885 Tj +-336 TJm +(the) 12.1743 Tj +-337 TJm +(data,) 19.0883 Tj +-359 TJm +(and) 14.386 Tj +[1 0 0 1 269.089 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -269.089 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.089 162.065 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +275.067 163.809 Td +(nUnused) 41.8429 Tj +[1 0 0 1 316.91 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.91 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +320.267 163.809 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-337 TJm +(the) 12.1743 Tj +-337 TJm +(number) 30.4357 Tj +-337 TJm +(of) 8.29885 Tj +-337 TJm +(bytes.) 23.5217 Tj +[1 0 0 1 427.247 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.247 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.247 162.065 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +433.225 163.809 Td +(nUnused) 41.8429 Tj +[1 0 0 1 475.068 163.809] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -475.068 -163.809] cm +[1 0 0 1 0 0] Tm +0 0 Td +478.425 163.809 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-337 TJm +(be) 9.40469 Tj +-337 TJm +(set) 11.0684 Tj +-337 TJm +(to) 7.7509 Tj +-337 TJm +(a) 4.42339 Tj +72 151.853 Td +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(between) 33.1954 Tj +[1 0 0 1 131.506 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.506 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.506 151.853 Td +/F134_0 9.9626 Tf +(0) 5.97756 Tj +[1 0 0 1 137.484 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.484 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +139.975 151.853 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 156.851 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -156.851 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +156.851 151.853 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 234.56 151.853] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.56 -151.853] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.05 151.853 Td +/F130_0 9.9626 Tf +(inclusi) 26.5703 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e.) 6.91404 Tj +[1 0 0 1 72 150.543] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -140.581] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 129.935 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-882 TJm +(function) 33.2053 Tj +-883 TJm +(may) 17.1556 Tj +-882 TJm +(only) 17.7135 Tj +-883 TJm +(be) 9.40469 Tj +-882 TJm +(called) 23.7907 Tj +-883 TJm +(once) 18.8094 Tj +[1 0 0 1 271.332 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -271.332 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +271.332 129.935 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 331.108 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.108 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +339.9 129.935 Td +/F130_0 9.9626 Tf +(has) 13.2801 Tj +-882 TJm +(signalled) 35.9749 Tj +[1 0 0 1 406.737 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.737 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.737 129.935 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 484.446 129.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -484.446 -129.935] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.231 129.935 Td +/F130_0 9.9626 Tf +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-882 TJm +(before) 25.4445 Tj +[1 0 0 1 72 117.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -117.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 117.98 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 161.664 117.98] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.664 -117.98] cm +[1 0 0 1 0 0] Tm +0 0 Td +161.664 117.98 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 116.67] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -106.708] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 96.0625 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 96.0625] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -96.0625] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 96.0625 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 96.0625] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -96.0625] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 96.0625 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 93.9057] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -43.0539] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(21) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 25 25 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -129.151] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 107.597 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 104.01] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 687.721 Td +(or) 11.9551 Tj +-426 TJm +(unused) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(nUnused) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +90 675.766 Td +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 663.811 Td +(if) 11.9551 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(not) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(signalled) 53.798 Tj +98.4879 651.856 Td +(or) 11.9551 Tj +-426 TJm +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzWriteOpen) 89.6634 Tj +90 639.9 Td +(BZ_OK) 29.8878 Tj +98.4879 627.945 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 612.404] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -602.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 590.486 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 590.386] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3238] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -581.021] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 581.021 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 72 565.48] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -555.517] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 534.858 Td +/F122_0 17.2154 Tf +(3.4.4.) 43.0729 Tj +[1 0 0 1 119.858 534.858] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -534.858] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 534.858 Td +/F392_0 17.2154 Tf +(BZ2_bzReadClose) 154.939 Tj +[1 0 0 1 274.797 534.858] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.797 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -523.161] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 523.161 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +244.46 521.417 Td +(*) 5.97756 Tj +250.438 523.161 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +342.612 521.417 Td +(*) 5.97756 Tj +348.59 523.161 Td +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 507.619] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -497.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 485.701 Td +/F130_0 9.9626 Tf +(Releases) 34.8591 Tj +-430 TJm +(all) 9.9626 Tj +-429 TJm +(memory) 33.2053 Tj +-430 TJm +(pertaining) 40.3983 Tj +-429 TJm +(to) 7.7509 Tj +-430 TJm +(the) 12.1743 Tj +-429 TJm +(compressed) 47.0334 Tj +-430 TJm +(\002le) 12.7322 Tj +[1 0 0 1 304.352 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -304.352 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +304.352 485.701 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 310.33 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -310.33 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.33 485.701 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 321.276 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -321.276 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +321.276 485.701 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 410.94 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.94 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +415.22 485.701 Td +/F130_0 9.9626 Tf +(does) 18.2614 Tj +-430 TJm +(not) 12.7322 Tj +-429 TJm +(call) 14.386 Tj +[1 0 0 1 473.438 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -473.438 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +473.438 485.701 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 509.304 485.701] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.304 -485.701] cm +[1 0 0 1 0 0] Tm +0 0 Td +513.584 485.701 Td +/F130_0 9.9626 Tf +(on) 9.9626 Tj +-430 TJm +(the) 12.1743 Tj +72 473.746 Td +(underlying) 43.1679 Tj +-264 TJm +(\002le) 12.7322 Tj +-264 TJm +(handle,) 29.0509 Tj +-267 TJm +(so) 8.85675 Tj +-264 TJm +(you) 14.9439 Tj +-264 TJm +(should) 26.5703 Tj +-264 TJm +(do) 9.9626 Tj +-264 TJm +(that) 14.9439 Tj +-264 TJm +(yourself) 32.6474 Tj +-264 TJm +(if) 6.08715 Tj +-263 TJm +(appropriate.) 47.8603 Tj +[1 0 0 1 348.653 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -348.653 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +348.653 473.746 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 438.317 473.746] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.317 -473.746] cm +[1 0 0 1 0 0] Tm +0 0 Td +440.946 473.746 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-264 TJm +(be) 9.40469 Tj +-264 TJm +(called) 23.7907 Tj +-264 TJm +(to) 7.7509 Tj +-264 TJm +(clean) 21.0211 Tj +72 461.791 Td +(up) 9.9626 Tj +-250 TJm +(after) 18.2515 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(situations.) 40.6873 Tj +[1 0 0 1 72 459.634] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -449.671] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.873 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 439.873 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 439.873] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -439.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 439.873 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 437.716] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -428.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 428.351 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 416.396 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzOpenWrite) 89.6634 Tj +90 404.441 Td +(BZ_OK) 29.8878 Tj +98.4879 392.486 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 376.944] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -366.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 355.026 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 354.927] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -345.562] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 345.562 Td +/F134_0 9.9626 Tf +(none) 23.9102 Tj +[1 0 0 1 72 330.02] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -320.058] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 299.399 Td +/F122_0 17.2154 Tf +(3.4.5.) 43.0729 Tj +[1 0 0 1 119.858 299.399] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -299.399] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 299.399 Td +/F392_0 17.2154 Tf +(BZ2_bzWriteOpen) 154.939 Tj +[1 0 0 1 274.797 299.399] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -202.797 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -287.702] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 287.702 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +130.109 285.958 Td +(*) 5.97756 Tj +136.087 287.702 Td +(BZ2_bzWriteOpen\() 95.641 Tj +-426 TJm +(int) 17.9327 Tj +258.149 285.958 Td +(*) 5.97756 Tj +264.127 287.702 Td +(bzerror,) 47.8205 Tj +-426 TJm +(FILE) 23.9102 Tj +344.346 285.958 Td +(*) 5.97756 Tj +350.323 287.702 Td +(f,) 11.9551 Tj +196.099 275.746 Td +(int) 17.9327 Tj +-426 TJm +(blockSize100k,) 83.6858 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(verbosity,) 59.7756 Tj +196.099 263.791 Td +(int) 17.9327 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 248.249] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -238.287] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 226.332 Td +/F130_0 9.9626 Tf +(Prepare) 30.4258 Tj +-268 TJm +(to) 7.7509 Tj +-269 TJm +(write) 20.4731 Tj +-268 TJm +(compressed) 47.0334 Tj +-269 TJm +(data) 16.5977 Tj +-268 TJm +(to) 7.7509 Tj +-269 TJm +(\002le) 12.7322 Tj +-268 TJm +(handle) 26.5603 Tj +[1 0 0 1 262.72 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -262.72 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +262.72 226.332 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 268.698 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -268.698 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +268.698 226.332 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 274.829 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -274.829 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +274.829 226.332 Td +/F134_0 9.9626 Tf +(f) 5.97756 Tj +[1 0 0 1 280.807 226.332] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -280.807 -226.332] cm +[1 0 0 1 0 0] Tm +0 0 Td +283.481 226.332 Td +/F130_0 9.9626 Tf +(should) 26.5703 Tj +-268 TJm +(refer) 18.7994 Tj +-269 TJm +(to) 7.7509 Tj +-268 TJm +(a) 4.42339 Tj +-269 TJm +(\002le) 12.7322 Tj +-268 TJm +(which) 24.3486 Tj +-269 TJm +(has) 13.2801 Tj +-268 TJm +(been) 18.8094 Tj +-269 TJm +(opened) 28.772 Tj +-268 TJm +(for) 11.6164 Tj +-269 TJm +(writing,) 31.2726 Tj +-273 TJm +(and) 14.386 Tj +-268 TJm +(for) 11.6164 Tj +72 214.377 Td +(which) 24.3486 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(indicator) 35.417 Tj +-250 TJm +(\() 3.31755 Tj +[1 0 0 1 176.577 214.376] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -176.577 -214.376] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.577 214.376 Td +/F134_0 9.9626 Tf +(ferror\(f\)) 53.798 Tj +[1 0 0 1 230.375 214.376] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -230.375 -214.376] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.375 214.376 Td +/F130_0 9.9626 Tf +(\)is) 9.9626 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(set.) 13.5591 Tj +[1 0 0 1 72 212.593] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -202.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 192.459 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-223 TJm +(the) 12.1743 Tj +-224 TJm +(meaning) 34.3112 Tj +-223 TJm +(of) 8.29885 Tj +-224 TJm +(parameters) 43.7059 Tj +[1 0 0 1 195.306 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -195.306 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +195.306 192.459 Td +/F134_0 9.9626 Tf +(blockSize100k) 77.7083 Tj +[1 0 0 1 273.015 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.015 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +273.015 192.459 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 277.784 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.784 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +277.784 192.459 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 331.583 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.583 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.808 192.459 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 350.42 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -350.42 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +350.42 192.459 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 410.196 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.196 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.196 192.459 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-229 TJm +(see) 12.7222 Tj +[1 0 0 1 429.913 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -429.913 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.913 192.459 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 537.509 192.459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -192.459] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 192.459 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 190.302] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -180.339] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 170.541 Td +/F130_0 9.9626 Tf +(All) 12.7322 Tj +-382 TJm +(required) 33.1954 Tj +-382 TJm +(memory) 33.2053 Tj +-382 TJm +(is) 6.64505 Tj +-382 TJm +(allocated) 35.965 Tj +-383 TJm +(at) 7.193 Tj +-382 TJm +(this) 14.396 Tj +-382 TJm +(stage,) 22.9638 Tj +-415 TJm +(so) 8.85675 Tj +-382 TJm +(if) 6.08715 Tj +-382 TJm +(the) 12.1743 Tj +-382 TJm +(call) 14.386 Tj +-382 TJm +(completes) 40.3983 Tj +-382 TJm +(successfully) 48.6972 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 424.691 170.541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -424.691 -170.541] cm +[1 0 0 1 0 0] Tm +0 0 Td +424.691 170.541 Td +/F134_0 9.9626 Tf +(BZ_MEM_ERROR) 71.7307 Tj +[1 0 0 1 496.422 170.541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.422 -170.541] cm +[1 0 0 1 0 0] Tm +0 0 Td +500.228 170.541 Td +/F130_0 9.9626 Tf +(cannot) 26.5603 Tj +-382 TJm +(be) 9.40469 Tj +72 158.586 Td +(signalled) 35.9749 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(subsequent) 44.2738 Tj +-250 TJm +(call) 14.386 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 203.715 158.586] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -203.715 -158.586] cm +[1 0 0 1 0 0] Tm +0 0 Td +203.715 158.586 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 269.468 158.586] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -269.468 -158.586] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.468 158.586 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 156.429] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -146.466] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 136.668 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 136.668] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -136.668] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 136.668 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 136.668] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -136.668] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 136.668 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 134.511] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -83.6593] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8518] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(22) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 26 26 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -165.016] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 143.462 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 139.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 687.721 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(f) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 663.811 Td +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(9) 5.97756 Tj +90 651.856 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 639.9 Td +(if) 11.9551 Tj +-426 TJm +(ferror\(f\)) 53.798 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(nonzero) 41.8429 Tj +90 627.945 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 615.99 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 604.035 Td +(BZ_OK) 29.8878 Tj +98.4879 592.08 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 576.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -566.575] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 554.62 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 554.521] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -545.156] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 545.156 Td +/F134_0 9.9626 Tf +(Pointer) 41.8429 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(abstract) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +98.4879 533.201 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +90 521.245 Td +(NULL) 23.9102 Tj +98.4879 509.29 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 493.748] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -483.786] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.831 Td +/F130_0 9.9626 Tf +(Allo) 17.7135 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able) 16.5977 Tj +-250 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(actions:) 30.9936 Tj +[1 0 0 1 72 471.731] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6825] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -462.366] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 462.366 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +98.4879 450.411 Td +(if) 11.9551 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +98.4879 438.456 Td +(\(you) 23.9102 Tj +-426 TJm +(could) 29.8878 Tj +-426 TJm +(go) 11.9551 Tj +-426 TJm +(directly) 47.8205 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(BZ2_bzWriteClose,) 101.619 Tj +-426 TJm +(but) 17.9327 Tj +-426 TJm +(this) 23.9102 Tj +-426 TJm +(would) 29.8878 Tj +-426 TJm +(be) 11.9551 Tj +-426 TJm +(pretty) 35.8654 Tj +485.505 434.212 Td +/F564_0 9.9626 Tf +( ) 9.9626 Tj +493.808 434.212 Td +/F147_0 9.9626 Tf +(-) 2.7696 Tj +90 426.501 Td +/F134_0 9.9626 Tf +(pointless\)) 59.7756 Tj +90 414.546 Td +(BZ2_bzWriteClose) 95.641 Tj +98.4879 402.59 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 387.049] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -377.086] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 356.428 Td +/F122_0 17.2154 Tf +(3.4.6.) 43.0729 Tj +[1 0 0 1 119.858 356.428] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -356.428] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 356.428 Td +/F392_0 17.2154 Tf +(BZ2_bzWrite) 113.622 Tj +[1 0 0 1 233.48 356.428] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.48 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -344.73] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 344.73 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzWrite) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +220.55 342.987 Td +(*) 5.97756 Tj +226.528 344.73 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +318.702 342.987 Td +(*) 5.97756 Tj +324.679 344.73 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +369.033 342.987 Td +(*) 5.97756 Tj +375.01 344.73 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 329.188] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -319.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 307.27 Td +/F130_0 9.9626 Tf +(Absorbs) 33.2053 Tj +[1 0 0 1 107.696 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -107.696 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +107.696 307.27 Td +/F134_0 9.9626 Tf +(len) 17.9327 Tj +[1 0 0 1 125.629 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.629 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.119 307.27 Td +/F130_0 9.9626 Tf +(bytes) 21.031 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +[1 0 0 1 214.544 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -214.544 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +214.544 307.27 Td +/F134_0 9.9626 Tf +(buf) 17.9327 Tj +[1 0 0 1 232.477 307.27] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.477 -307.27] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.477 307.27 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(entually) 32.0995 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(written) 28.224 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(\002le.) 15.2229 Tj +[1 0 0 1 72 305.114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -295.151] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 285.353 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 285.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -285.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 285.353 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 285.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -285.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 285.353 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 283.196] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -108.593] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 107.597 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 104.01] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -273.831] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 273.831 Td +/F134_0 9.9626 Tf +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 261.876 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(buf) 17.9327 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +90 249.921 Td +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 237.965 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzReadOpen) 83.6858 Tj +90 226.01 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 214.055 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(writing) 41.8429 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file.) 29.8878 Tj +90 202.1 Td +(BZ_OK) 29.8878 Tj +98.4879 190.145 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 174.603] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -164.64] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 143.982 Td +/F122_0 17.2154 Tf +(3.4.7.) 43.0729 Tj +[1 0 0 1 119.858 143.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -143.982] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 143.982 Td +/F392_0 17.2154 Tf +(BZ2_bzWriteClose) 165.268 Tj +[1 0 0 1 285.126 143.982] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.126 -2.3326] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -90.7975] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(23) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 27 27 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -165.016] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 143.462 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 139.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(void) 23.9102 Tj +-426 TJm +(BZ2_bzWriteClose\() 101.619 Tj +-426 TJm +(int) 17.9327 Tj +246.194 709.888 Td +(*) 5.97756 Tj +252.171 711.631 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +340.102 709.888 Td +(*) 5.97756 Tj +350.323 711.631 Td +(f,) 11.9551 Tj +187.611 699.676 Td +(int) 17.9327 Tj +-426 TJm +(abandon,) 47.8205 Tj +187.611 687.721 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +257.609 685.978 Td +(*) 5.97756 Tj +267.83 687.721 Td +(nbytes_in,) 59.7756 Tj +187.611 675.766 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +257.609 674.023 Td +(*) 5.97756 Tj +267.83 675.766 Td +(nbytes_out) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +90 651.856 Td +(void) 23.9102 Tj +-426 TJm +(BZ2_bzWriteClose64\() 113.574 Tj +-426 TJm +(int) 17.9327 Tj +258.149 650.112 Td +(*) 5.97756 Tj +264.127 651.856 Td +(bzerror,) 47.8205 Tj +-426 TJm +(BZFILE) 35.8654 Tj +352.057 650.112 Td +(*) 5.97756 Tj +362.278 651.856 Td +(f,) 11.9551 Tj +196.099 639.9 Td +(int) 17.9327 Tj +-426 TJm +(abandon,) 47.8205 Tj +196.099 627.945 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 626.202 Td +(*) 5.97756 Tj +276.318 627.945 Td +(nbytes_in_lo32,) 89.6634 Tj +196.099 615.99 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 614.247 Td +(*) 5.97756 Tj +276.318 615.99 Td +(nbytes_in_hi32,) 89.6634 Tj +196.099 604.035 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 602.292 Td +(*) 5.97756 Tj +276.318 604.035 Td +(nbytes_out_lo32,) 95.641 Tj +196.099 592.08 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +266.097 590.336 Td +(*) 5.97756 Tj +276.318 592.08 Td +(nbytes_out_hi32) 89.6634 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 576.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -566.575] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 554.62 Td +/F130_0 9.9626 Tf +(Compresses) 48.1492 Tj +-403 TJm +(and) 14.386 Tj +-402 TJm +(\003ushes) 27.6761 Tj +-403 TJm +(to) 7.7509 Tj +-403 TJm +(the) 12.1743 Tj +-402 TJm +(compressed) 47.0334 Tj +-403 TJm +(\002le) 12.7322 Tj +-403 TJm +(a) 4.42339 Tj +1 TJm +(ll) 5.53921 Tj +-403 TJm +(data) 16.5977 Tj +-403 TJm +(so) 8.85675 Tj +-402 TJm +(f) 3.31755 Tj +10 TJm +(ar) 7.74094 Tj +-403 TJm +(supplied) 33.7633 Tj +-403 TJm +(by) 9.9626 Tj +[1 0 0 1 384.152 554.62] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.152 -554.62] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.152 554.62 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 449.906 554.62] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -449.906 -554.62] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.906 554.62 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-768 TJm +(The) 15.4918 Tj +-403 TJm +(logical) 27.1182 Tj +-402 TJm +(end-of-) 29.3199 Tj +72 542.665 Td +(stream) 26.5603 Tj +-352 TJm +(mark) 20.4731 Tj +10 TJm +(ers) 11.6164 Tj +-352 TJm +(are) 12.1643 Tj +-353 TJm +(also) 16.0497 Tj +-352 TJm +(written,) 30.7147 Tj +-378 TJm +(so) 8.85675 Tj +-352 TJm +(subsequent) 44.2738 Tj +-352 TJm +(calls) 18.2614 Tj +-352 TJm +(to) 7.7509 Tj +[1 0 0 1 300.456 542.665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -300.456 -542.665] cm +[1 0 0 1 0 0] Tm +0 0 Td +300.456 542.665 Td +/F134_0 9.9626 Tf +(BZ2_bzWrite) 65.7532 Tj +[1 0 0 1 366.209 542.665] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.209 -542.665] cm +[1 0 0 1 0 0] Tm +0 0 Td +369.718 542.665 Td +/F130_0 9.9626 Tf +(are) 12.1643 Tj +-352 TJm +(ille) 12.7322 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(al.) 9.68365 Tj +-1234 TJm +(All) 12.7322 Tj +-352 TJm +(memory) 33.2053 Tj +-352 TJm +(associated) 40.9463 Tj +-352 TJm +(with) 17.7135 Tj +72 530.71 Td +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +[1 0 0 1 151.411 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -151.411 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +151.411 530.71 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 157.389 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.389 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.879 530.71 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(released.) 35.1281 Tj +[1 0 0 1 207.231 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -207.231 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +207.231 530.71 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 243.097 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.097 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.587 530.71 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(called) 23.7907 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le,) 15.2229 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(not) 12.7322 Tj +[1 0 0 1 422.771 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.771 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.771 530.71 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 458.636 530.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -458.636 -530.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +458.636 530.71 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +50 TJm +(d.) 7.47195 Tj +[1 0 0 1 72 528.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -518.59] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 508.792 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 81.5743 508.792] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -81.5743 -508.792] cm +[1 0 0 1 0 0] Tm +0 0 Td +81.5743 508.792 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 177.216 508.792] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.216 -508.792] cm +[1 0 0 1 0 0] Tm +0 0 Td +180.155 508.792 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-295 TJm +(called) 23.7907 Tj +-295 TJm +(to) 7.7509 Tj +-295 TJm +(clean) 21.0211 Tj +-295 TJm +(up) 9.9626 Tj +-295 TJm +(after) 18.2515 Tj +-295 TJm +(an) 9.40469 Tj +-295 TJm +(error) 19.3573 Tj +40 TJm +(,) 2.49065 Tj +-306 TJm +(the) 12.1743 Tj +-295 TJm +(only) 17.7135 Tj +-295 TJm +(action) 24.3486 Tj +-295 TJm +(is) 6.64505 Tj +-295 TJm +(to) 7.7509 Tj +-295 TJm +(release) 27.6562 Tj +-295 TJm +(the) 12.1743 Tj +-295 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +-891 TJm +(The) 15.4918 Tj +-295 TJm +(library) 26.5603 Tj +72 496.837 Td +(records) 29.3199 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(error) 19.3573 Tj +-289 TJm +(codes) 22.6848 Tj +-289 TJm +(issued) 24.9065 Tj +-289 TJm +(by) 9.9626 Tj +-289 TJm +(pre) 12.7222 Tj +25 TJm +(vious) 21.589 Tj +-289 TJm +(calls,) 20.7521 Tj +-299 TJm +(so) 8.85675 Tj +-289 TJm +(this) 14.396 Tj +-289 TJm +(situation) 34.3212 Tj +-289 TJm +(will) 15.5018 Tj +-289 TJm +(be) 9.40469 Tj +-289 TJm +(detected) 33.1954 Tj +-289 TJm +(automatically) 54.2364 Tj +65 TJm +(.) 2.49065 Tj +-427 TJm +(There) 23.2328 Tj +-289 TJm +(is) 6.64505 Tj +-289 TJm +(no) 9.9626 Tj +-289 TJm +(attempt) 29.8878 Tj +72 484.882 Td +(to) 7.7509 Tj +-263 TJm +(complete) 36.5229 Tj +-262 TJm +(the) 12.1743 Tj +-263 TJm +(compression) 50.3609 Tj +-263 TJm +(operation,) 40.1194 Tj +-265 TJm +(nor) 13.2801 Tj +-263 TJm +(to) 7.7509 Tj +[1 0 0 1 258.308 484.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -258.308 -484.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.308 484.882 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 294.173 484.882] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.173 -484.882] cm +[1 0 0 1 0 0] Tm +0 0 Td +296.79 484.882 Td +/F130_0 9.9626 Tf +(the) 12.1743 Tj +-263 TJm +(compressed) 47.0334 Tj +-262 TJm +(\002le.) 15.2229 Tj +-696 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-263 TJm +(can) 13.8281 Tj +-263 TJm +(force) 20.4632 Tj +-262 TJm +(this) 14.396 Tj +-263 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-263 TJm +(to) 7.7509 Tj +-262 TJm +(happen) 28.772 Tj +72 472.926 Td +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(case) 17.1456 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(error) 19.3573 Tj +40 TJm +(,) 2.49065 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(passing) 29.8878 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(nonzero) 32.0895 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 305.014 472.926] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -305.014 -472.926] cm +[1 0 0 1 0 0] Tm +0 0 Td +305.014 472.926 Td +/F134_0 9.9626 Tf +(abandon) 41.8429 Tj +[1 0 0 1 346.858 472.926] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -346.858 -472.926] cm +[1 0 0 1 0 0] Tm +0 0 Td +346.858 472.926 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 470.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -460.807] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 451.009 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 80.5974 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -80.5974 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +80.5974 451.009 Td +/F134_0 9.9626 Tf +(nbytes_in) 53.798 Tj +[1 0 0 1 134.396 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -134.396 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +136.358 451.009 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-197 TJm +(non-null,) 36.2539 Tj +[1 0 0 1 183.287 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -183.287 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +183.287 449.265 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +189.265 451.009 Td +(nbytes_in) 53.798 Tj +[1 0 0 1 243.063 451.009] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.063 -451.009] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.025 451.009 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-197 TJm +(be) 9.40469 Tj +-197 TJm +(set) 11.0684 Tj +-197 TJm +(to) 7.7509 Tj +-197 TJm +(be) 9.40469 Tj +-197 TJm +(the) 12.1743 Tj +-197 TJm +(total) 17.7135 Tj +-197 TJm +(v) 4.9813 Tj +20 TJm +(olume) 24.9065 Tj +-197 TJm +(of) 8.29885 Tj +-197 TJm +(uncompressed) 56.996 Tj +-197 TJm +(data) 16.5977 Tj +-197 TJm +(handled.) 34.0322 Tj +-584 TJm +(Similarly) 37.0908 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 72 439.053] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -439.053] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 439.053 Td +/F134_0 9.9626 Tf +(nbytes_out) 59.7756 Tj +[1 0 0 1 131.776 439.053] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -439.053] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.716 439.053 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-295 TJm +(be) 9.40469 Tj +-295 TJm +(set) 11.0684 Tj +-295 TJm +(to) 7.7509 Tj +-295 TJm +(the) 12.1743 Tj +-295 TJm +(total) 17.7135 Tj +-295 TJm +(v) 4.9813 Tj +20 TJm +(olume) 24.9065 Tj +-296 TJm +(of) 8.29885 Tj +-295 TJm +(compressed) 47.0334 Tj +-295 TJm +(data) 16.5977 Tj +-295 TJm +(written.) 30.7147 Tj +-890 TJm +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-295 TJm +(compatibility) 53.1405 Tj +-295 TJm +(with) 17.7135 Tj +-295 TJm +(older) 20.4731 Tj +-296 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-295 TJm +(of) 8.29885 Tj +72 427.098 Td +(the) 12.1743 Tj +-283 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 118.294 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -118.294 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +118.294 427.098 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose) 95.641 Tj +[1 0 0 1 213.936 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -213.936 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.753 427.098 Td +/F130_0 9.9626 Tf +(only) 17.7135 Tj +-283 TJm +(yields) 23.8007 Tj +-283 TJm +(the) 12.1743 Tj +-282 TJm +(lo) 7.7509 Tj +25 TJm +(wer) 14.9339 Tj +-283 TJm +(32) 9.9626 Tj +-283 TJm +(bits) 14.396 Tj +-283 TJm +(of) 8.29885 Tj +-283 TJm +(these) 20.4731 Tj +-282 TJm +(counts.) 28.503 Tj +-817 TJm +(Use) 15.4918 Tj +[1 0 0 1 423.499 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -423.499 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +423.499 427.098 Td +/F134_0 9.9626 Tf +(BZ2_bzWriteClose64) 107.596 Tj +[1 0 0 1 531.095 427.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -531.095 -427.098] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.913 427.098 Td +/F130_0 9.9626 Tf +(if) 6.08715 Tj +72 415.143 Td +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(full) 13.8381 Tj +-250 TJm +(64) 9.9626 Tj +-250 TJm +(bit) 10.5205 Tj +-250 TJm +(counts.) 28.503 Tj +-620 TJm +(These) 23.7907 Tj +-250 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(otherwise) 38.7346 Tj +-250 TJm +(absolutely) 40.9562 Tj +-250 TJm +(identical.) 36.8018 Tj +[1 0 0 1 72 412.986] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -403.024] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 393.225 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(assignments) 48.7072 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 169.144 393.225] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -169.144 -393.225] cm +[1 0 0 1 0 0] Tm +0 0 Td +169.144 393.225 Td +/F134_0 9.9626 Tf +(bzerror) 41.8429 Tj +[1 0 0 1 210.987 393.225] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.987 -393.225] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.987 393.225 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 391.069] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6825] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -381.704] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 381.704 Td +/F134_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.619 Tj +98.4879 369.748 Td +(if) 11.9551 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(opened) 35.8654 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(BZ2_bzReadOpen) 83.6858 Tj +90 357.793 Td +(BZ_IO_ERROR) 65.7532 Tj +98.4879 345.838 Td +(if) 11.9551 Tj +-426 TJm +(there) 29.8878 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(writing) 41.8429 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(file) 23.9102 Tj +90 333.883 Td +(BZ_OK) 29.8878 Tj +98.4879 321.928 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 306.386] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -296.423] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 275.765 Td +/F122_0 17.2154 Tf +(3.4.8.) 43.0729 Tj +-278 TJm +(Handling) 73.6475 Tj +-278 TJm +(embed) 55.4852 Tj +10 TJm +(ded) 30.609 Tj +-278 TJm +(compressed) 101.416 Tj +-278 TJm +(data) 35.3949 Tj +-278 TJm +(streams) 66.0211 Tj +[1 0 0 1 72 271.935] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -261.972] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 253.847 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-203 TJm +(high-le) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-203 TJm +(library) 26.5603 Tj +-203 TJm +(f) 3.31755 Tj +10 TJm +(acilitates) 35.417 Tj +-203 TJm +(use) 13.2801 Tj +-203 TJm +(of) 8.29885 Tj +[1 0 0 1 226.404 253.847] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.404 -253.847] cm +[1 0 0 1 0 0] Tm +0 0 Td +226.404 253.847 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 256.292 253.847] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -256.292 -253.847] cm +[1 0 0 1 0 0] Tm +0 0 Td +258.316 253.847 Td +/F130_0 9.9626 Tf +(data) 16.5977 Tj +-203 TJm +(streams) 30.4357 Tj +-203 TJm +(which) 24.3486 Tj +-203 TJm +(form) 19.3673 Tj +-203 TJm +(some) 21.031 Tj +-203 TJm +(part) 15.4918 Tj +-203 TJm +(of) 8.29885 Tj +-204 TJm +(a) 4.42339 Tj +-203 TJm +(surrounding,) 50.6399 Tj +-212 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-203 TJm +(data) 16.5977 Tj +-203 TJm +(stream.) 29.0509 Tj +[1 0 0 1 72 251.69] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.7236] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 221.967 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 221.967 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-240 TJm +(writing,) 31.2726 Tj +-243 TJm +(the) 12.1743 Tj +-240 TJm +(library) 26.5603 Tj +-241 TJm +(tak) 12.1743 Tj +10 TJm +(es) 8.29885 Tj +-240 TJm +(an) 9.40469 Tj +-241 TJm +(open) 19.3673 Tj +-240 TJm +(\002le) 12.7322 Tj +-241 TJm +(handle,) 29.0509 Tj +-242 TJm +(writes) 24.3486 Tj +-241 TJm +(compres) 33.7533 Tj +1 TJm +(sed) 13.2801 Tj +-241 TJm +(data) 16.5977 Tj +-240 TJm +(to) 7.7509 Tj +-241 TJm +(it,) 8.02986 Tj +[1 0 0 1 398.926 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -398.926 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +398.926 221.967 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 434.791 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -434.791 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +434.791 221.967 Td +/F130_0 9.9626 Tf +(es) 8.29885 Tj +-240 TJm +(it) 5.53921 Tj +-241 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-240 TJm +(does) 18.2614 Tj +-241 TJm +(not) 12.7322 Tj +[1 0 0 1 504.135 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -504.135 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +504.135 221.967 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 540 221.967] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -221.967] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 210.011 Td +/F130_0 9.9626 Tf +(it.) 8.02986 Tj +-610 TJm +(The) 15.4918 Tj +-235 TJm +(calling) 27.1182 Tj +-235 TJm +(application) 44.2738 Tj +-235 TJm +(can) 13.8281 Tj +-235 TJm +(write) 20.4731 Tj +-235 TJm +(its) 9.41466 Tj +-235 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-235 TJm +(data) 16.5977 Tj +-235 TJm +(before) 25.4445 Tj +-235 TJm +(and) 14.386 Tj +-235 TJm +(after) 18.2515 Tj +-235 TJm +(the) 12.1743 Tj +-235 TJm +(compressed) 47.0334 Tj +-235 TJm +(data) 16.5977 Tj +-235 TJm +(stream,) 29.0509 Tj +-238 TJm +(using) 21.589 Tj +-235 TJm +(that) 14.9439 Tj +-235 TJm +(same) 20.4731 Tj +-235 TJm +(\002le) 12.7322 Tj +86.944 198.056 Td +(handle.) 29.0509 Tj +[1 0 0 1 115.995 198.056] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -43.9948 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -176.139] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 176.139 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 176.139] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -176.139] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 176.139 Td +/F130_0 9.9626 Tf +(Reading) 33.2053 Tj +-236 TJm +(is) 6.64505 Tj +-236 TJm +(more) 20.4731 Tj +-236 TJm +(comple) 29.3299 Tj +15 TJm +(x,) 7.47195 Tj +-238 TJm +(and) 14.386 Tj +-236 TJm +(the) 12.1743 Tj +-236 TJm +(f) 3.31755 Tj +10 TJm +(acilities) 30.9936 Tj +-236 TJm +(are) 12.1643 Tj +-236 TJm +(not) 12.7322 Tj +-235 TJm +(as) 8.29885 Tj +-236 TJm +(general) 29.3199 Tj +-236 TJm +(as) 8.29885 Tj +-236 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-236 TJm +(could) 22.1369 Tj +-236 TJm +(be) 9.40469 Tj +-236 TJm +(since) 20.4731 Tj +-235 TJm +(generality) 39.8404 Tj +-236 TJm +(is) 6.64505 Tj +-236 TJm +(hard) 17.7035 Tj +-236 TJm +(to) 7.7509 Tj +-236 TJm +(reconcile) 36.5129 Tj +86.944 164.183 Td +(with) 17.7135 Tj +-404 TJm +(ef) 7.74094 Tj +25 TJm +(\002cienc) 26.5603 Tj +15 TJm +(y) 4.9813 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 164.811 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.811 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.811 164.183 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 224.587 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -224.587 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +228.614 164.183 Td +/F130_0 9.9626 Tf +(reads) 21.0211 Tj +-404 TJm +(from) 19.3673 Tj +-405 TJm +(the) 12.1743 Tj +-404 TJm +(compressed) 47.0334 Tj +-404 TJm +(\002le) 12.7322 Tj +-404 TJm +(in) 7.7509 Tj +-405 TJm +(blocks) 26.0123 Tj +-404 TJm +(of) 8.29885 Tj +-404 TJm +(size) 15.4918 Tj +[1 0 0 1 434.744 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -434.744 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +434.744 164.183 Td +/F134_0 9.9626 Tf +(BZ_MAX_UNUSED) 77.7083 Tj +[1 0 0 1 512.452 164.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -512.452 -164.183] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.479 164.183 Td +/F130_0 9.9626 Tf +(bytes,) 23.5217 Tj +86.944 152.228 Td +(and) 14.386 Tj +-413 TJm +(in) 7.7509 Tj +-413 TJm +(doing) 22.6948 Tj +-413 TJm +(so) 8.85675 Tj +-413 TJm +(probably) 35.417 Tj +-413 TJm +(will) 15.5018 Tj +-413 TJm +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ershoot) 29.3299 Tj +-413 TJm +(the) 12.1743 Tj +-413 TJm +(logical) 27.1182 Tj +-413 TJm +(end) 14.386 Tj +-413 TJm +(of) 8.29885 Tj +-413 TJm +(compressed) 47.0334 Tj +-413 TJm +(stream.) 29.0509 Tj +-1598 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-413 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-413 TJm +(this) 14.396 Tj +-413 TJm +(data) 16.5977 Tj +-413 TJm +(once) 18.8094 Tj +86.944 140.273 Td +(decompression) 59.7656 Tj +-252 TJm +(has) 13.2801 Tj +-252 TJm +(ended,) 26.2813 Tj +-253 TJm +(call) 14.386 Tj +[1 0 0 1 210.705 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.705 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.705 140.273 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 324.279 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -324.279 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +326.789 140.273 Td +/F130_0 9.9626 Tf +(after) 18.2515 Tj +-252 TJm +(the) 12.1743 Tj +-252 TJm +(last) 13.8381 Tj +-252 TJm +(call) 14.386 Tj +-252 TJm +(of) 8.29885 Tj +[1 0 0 1 406.291 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -406.291 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +406.291 140.273 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 466.067 140.273] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -466.067 -140.273] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.578 140.273 Td +/F130_0 9.9626 Tf +(\(the) 15.4918 Tj +-252 TJm +(one) 14.386 Tj +-252 TJm +(returning) 36.5229 Tj +[1 0 0 1 86.944 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 128.318 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 164.653 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.653 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.653 128.318 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(before) 25.4445 Tj +-250 TJm +(calling) 27.1182 Tj +[1 0 0 1 243.028 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -243.028 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.028 128.318 Td +/F134_0 9.9626 Tf +(BZ2_bzReadClose) 89.6634 Tj +[1 0 0 1 332.692 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -332.692 -128.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.692 128.318 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 335.182 128.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -263.182 -77.466] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.8519] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.8518 Td +/F130_0 9.9626 Tf +(24) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 28 28 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-271 TJm +(mechanism) 45.3796 Tj +-272 TJm +(mak) 17.1556 Tj +10 TJm +(es) 8.29885 Tj +-271 TJm +(it) 5.53921 Tj +-271 TJm +(easy) 17.7035 Tj +-271 TJm +(to) 7.7509 Tj +-272 TJm +(decompress) 47.0334 Tj +-271 TJm +(multiple) 33.2153 Tj +[1 0 0 1 293.312 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -293.312 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +293.312 710.037 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 323.2 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -323.2 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +325.903 710.037 Td +/F130_0 9.9626 Tf +(streams) 30.4357 Tj +-271 TJm +(placed) 26.0024 Tj +-272 TJm +(end-to-end.) 45.6486 Tj +-374 TJm +(As) 11.0684 Tj +-271 TJm +(the) 12.1743 Tj +-271 TJm +(end) 14.386 Tj +-271 TJm +(of) 8.29885 Tj +-272 TJm +(one) 14.386 Tj +-271 TJm +(stream,) 29.0509 Tj +72 698.082 Td +(when) 21.579 Tj +[1 0 0 1 96.1948 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -96.1948 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +96.1948 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzRead) 59.7756 Tj +[1 0 0 1 155.971 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.971 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.586 698.082 Td +/F130_0 9.9626 Tf +(returns) 27.6661 Tj +[1 0 0 1 188.868 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -188.868 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.868 698.082 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 266.577 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -266.577 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +266.577 698.082 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-263 TJm +(call) 14.386 Tj +[1 0 0 1 288.685 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -288.685 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +288.685 698.082 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 402.259 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -402.259 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +404.875 698.082 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-263 TJm +(collect) 26.5603 Tj +-262 TJm +(the) 12.1743 Tj +-263 TJm +(unused) 28.224 Tj +-262 TJm +(data) 16.5977 Tj +-263 TJm +(\(cop) 17.7035 Tj +10 TJm +(y) 4.9813 Tj +-262 TJm +(it) 5.53921 Tj +72 686.127 Td +(into) 15.5018 Tj +-265 TJm +(your) 18.2614 Tj +-265 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-265 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-265 TJm +(some) 21.031 Tj +25 TJm +(where\).) 30.1468 Tj +-711 TJm +(That) 18.2614 Tj +-265 TJm +(data) 16.5977 Tj +-265 TJm +(forms) 23.2427 Tj +-265 TJm +(the) 12.1743 Tj +-265 TJm +(start) 17.1556 Tj +-265 TJm +(of) 8.29885 Tj +-265 TJm +(the) 12.1743 Tj +-265 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-265 TJm +(compressed) 47.0334 Tj +-265 TJm +(stream.) 29.0509 Tj +-711 TJm +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-265 TJm +(start) 17.1556 Tj +-265 TJm +(uncompressing) 60.3235 Tj +72 674.172 Td +(that) 14.9439 Tj +-246 TJm +(ne) 9.40469 Tj +15 TJm +(xt) 7.7509 Tj +-246 TJm +(stream,) 29.0509 Tj +-247 TJm +(call) 14.386 Tj +[1 0 0 1 157.205 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -157.205 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +157.205 674.172 Td +/F134_0 9.9626 Tf +(BZ2_bzReadOpen) 83.6858 Tj +[1 0 0 1 240.891 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.891 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +243.344 674.172 Td +/F130_0 9.9626 Tf +(ag) 9.40469 Tj +5 TJm +(ain,) 14.6649 Tj +-247 TJm +(feeding) 29.8778 Tj +-246 TJm +(in) 7.7509 Tj +-246 TJm +(the) 12.1743 Tj +-247 TJm +(unused) 28.224 Tj +-246 TJm +(data) 16.5977 Tj +-246 TJm +(via) 12.1743 Tj +-246 TJm +(the) 12.1743 Tj +[1 0 0 1 405.967 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -405.967 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.967 674.172 Td +/F134_0 9.9626 Tf +(unused) 35.8654 Tj +[1 0 0 1 441.833 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.833 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +444.286 674.172 Td +/F130_0 9.9626 Tf +(/) 2.7696 Tj +[1 0 0 1 449.508 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -449.508 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +449.508 674.172 Td +/F134_0 9.9626 Tf +(nUnused) 41.8429 Tj +[1 0 0 1 491.351 674.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -491.351 -674.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.804 674.172 Td +/F130_0 9.9626 Tf +(parameters.) 46.1966 Tj +72 662.217 Td +(K) 7.193 Tj +25 TJm +(eep) 13.8281 Tj +-263 TJm +(doing) 22.6948 Tj +-263 TJm +(this) 14.396 Tj +-264 TJm +(until) 18.2714 Tj +[1 0 0 1 158.622 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.622 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +158.622 662.217 Td +/F134_0 9.9626 Tf +(BZ_STREAM_END) 77.7083 Tj +[1 0 0 1 236.33 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -236.33 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +238.952 662.217 Td +/F130_0 9.9626 Tf +(return) 23.7907 Tj +-263 TJm +(coincides) 37.6287 Tj +-263 TJm +(with) 17.7135 Tj +-263 TJm +(the) 12.1743 Tj +-264 TJm +(ph) 9.9626 Tj +5 TJm +(ysical) 23.2427 Tj +-263 TJm +(end) 14.386 Tj +-263 TJm +(of) 8.29885 Tj +-263 TJm +(\002le) 12.7322 Tj +-263 TJm +(\() 3.31755 Tj +[1 0 0 1 423.125 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -423.125 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +423.125 662.217 Td +/F134_0 9.9626 Tf +(feof\(f\)) 41.8429 Tj +[1 0 0 1 464.968 662.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -464.968 -662.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +464.968 662.217 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +-699 TJm +(In) 8.29885 Tj +-263 TJm +(this) 14.396 Tj +-263 TJm +(situation) 34.3212 Tj +[1 0 0 1 72 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 650.261 Td +/F134_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.574 Tj +[1 0 0 1 185.574 650.261] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -185.574 -650.261] cm +[1 0 0 1 0 0] Tm +0 0 Td +188.065 650.261 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(course) 26.0024 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(no) 9.9626 Tj +-250 TJm +(data.) 19.0883 Tj +[1 0 0 1 72 648.951] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -638.989] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 628.344 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-240 TJm +(should) 26.5703 Tj +-241 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-240 TJm +(some) 21.031 Tj +-241 TJm +(feel) 14.9339 Tj +-240 TJm +(for) 11.6164 Tj +-241 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-240 TJm +(the) 12.1743 Tj +-240 TJm +(high-le) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-241 TJm +(interf) 21.579 Tj +10 TJm +(ace) 13.2702 Tj +-240 TJm +(can) 13.8281 Tj +-241 TJm +(be) 9.40469 Tj +-240 TJm +(used.) 20.7521 Tj +-614 TJm +(If) 6.63509 Tj +-240 TJm +(you) 14.9439 Tj +-241 TJm +(require) 28.2141 Tj +-240 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +-241 TJm +(\003e) 9.9626 Tj +15 TJm +(xibi) 15.5018 Tj +1 TJm +(lity) 13.2901 Tj +65 TJm +(,) 2.49065 Tj +-243 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-240 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-241 TJm +(to) 7.7509 Tj +72 616.389 Td +(bite) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ullet) 17.7135 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(get) 12.1743 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(grips) 19.9252 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +[1 0 0 1 72 614.232] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -604.269] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 585.767 Td +/F122_0 17.2154 Tf +(3.4.9.) 43.0729 Tj +-278 TJm +(Standar) 64.0929 Tj +20 TJm +(d) 10.5186 Tj +-278 TJm +(\002le-reading/writing) 154.009 Tj +-278 TJm +(code) 40.1807 Tj +[1 0 0 1 72 581.937] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -571.975] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 563.85 Td +/F130_0 9.9626 Tf +(Here') 22.6749 Tj +55 TJm +(s) 3.87545 Tj +-250 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(you') 18.2614 Tj +50 TJm +(d) 4.9813 Tj +-250 TJm +(write) 20.4731 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le:) 15.5018 Tj +[1 0 0 1 72 561.693] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -371.606] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 370.61 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 367.024] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -552.328] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 552.328 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +113.91 550.584 Td +(*) 5.97756 Tj +132.62 552.328 Td +(f;) 11.9551 Tj +90 540.373 Td +(BZFILE) 35.8654 Tj +125.865 538.629 Td +(*) 5.97756 Tj +136.087 540.373 Td +(b;) 11.9551 Tj +90 528.418 Td +(int) 17.9327 Tj +-2130 TJm +(nBuf;) 29.8878 Tj +90 516.462 Td +(char) 23.9102 Tj +-1704 TJm +(buf[) 23.9102 Tj +-426 TJm +(/) 5.97756 Tj +165.018 514.719 Td +(*) 5.97756 Tj +175.24 516.462 Td +(whatever) 47.8205 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(you) 17.9327 Tj +-426 TJm +(like) 23.9102 Tj +305.79 514.719 Td +(*) 5.97756 Tj +311.767 516.462 Td +(/) 5.97756 Tj +-426 TJm +(];) 11.9551 Tj +90 504.507 Td +(int) 17.9327 Tj +-2130 TJm +(bzerror;) 47.8205 Tj +90 492.552 Td +(int) 17.9327 Tj +-2130 TJm +(nWritten;) 53.798 Tj +90 468.642 Td +(f) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(fopen) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +("myfile.bz2",) 77.7083 Tj +-426 TJm +("w") 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +90 456.687 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(!f) 11.9551 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +94.244 444.731 Td +(/) 5.97756 Tj +100.222 442.988 Td +(*) 5.97756 Tj +110.443 444.731 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +184.685 442.988 Td +(*) 5.97756 Tj +190.662 444.731 Td +(/) 5.97756 Tj +90 432.776 Td +(}) 5.97756 Tj +90 420.821 Td +(b) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzWriteOpen\() 95.641 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(f,) 11.9551 Tj +-426 TJm +(9) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 408.866 Td +(if) 11.9551 Tj +-426 TJm +(\(bzerror) 47.8205 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(BZ_OK\)) 35.8654 Tj +-426 TJm +({) 5.97756 Tj +94.244 396.911 Td +(BZ2_bzWriteClose) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +94.244 384.956 Td +(/) 5.97756 Tj +100.222 383.212 Td +(*) 5.97756 Tj +110.443 384.956 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +184.685 383.212 Td +(*) 5.97756 Tj +190.662 384.956 Td +(/) 5.97756 Tj +90 373 Td +(}) 5.97756 Tj +90 349.09 Td +(while) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(/) 5.97756 Tj +140.331 347.347 Td +(*) 5.97756 Tj +150.553 349.09 Td +(condition) 53.798 Tj +208.595 347.347 Td +(*) 5.97756 Tj +214.572 349.09 Td +(/) 5.97756 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +94.244 337.135 Td +(/) 5.97756 Tj +100.222 335.391 Td +(*) 5.97756 Tj +110.443 337.135 Td +(get) 17.9327 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(write) 29.8878 Tj +-426 TJm +(into) 23.9102 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(set) 17.9327 Tj +-426 TJm +(nBuf) 23.9102 Tj +-426 TJm +(appropriately) 77.7083 Tj +421.874 335.391 Td +(*) 5.97756 Tj +427.852 337.135 Td +(/) 5.97756 Tj +94.2439 325.18 Td +(nWritten) 47.8205 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzWrite) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b,) 11.9551 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(nBuf) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +94.2439 313.225 Td +(if) 11.9551 Tj +-426 TJm +(\(bzerror) 47.8205 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_IO_ERROR\)) 71.7307 Tj +-426 TJm +({) 5.97756 Tj +102.732 301.269 Td +(BZ2_bzWriteClose) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +102.732 289.314 Td +(/) 5.97756 Tj +108.709 287.571 Td +(*) 5.97756 Tj +118.931 289.314 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +193.172 287.571 Td +(*) 5.97756 Tj +199.15 289.314 Td +(/) 5.97756 Tj +94.2439 277.359 Td +(}) 5.97756 Tj +90 265.404 Td +(}) 5.97756 Tj +90 241.494 Td +(BZ2_bzWriteClose\() 101.619 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 229.538 Td +(if) 11.9551 Tj +-426 TJm +(\(bzerror) 47.8205 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_IO_ERROR\)) 71.7307 Tj +-426 TJm +({) 5.97756 Tj +94.2439 217.583 Td +(/) 5.97756 Tj +100.221 215.84 Td +(*) 5.97756 Tj +110.443 217.583 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +184.684 215.84 Td +(*) 5.97756 Tj +190.662 217.583 Td +(/) 5.97756 Tj +89.9999 205.628 Td +(}) 5.97756 Tj +[1 0 0 1 72 190.086] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -180.124] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 168.168 Td +/F130_0 9.9626 Tf +(And) 17.1556 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(read) 17.1456 Tj +-250 TJm +(from) 19.3673 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le:) 15.5018 Tj +[1 0 0 1 72 166.012] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -115.16] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9513] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9513 Td +/F130_0 9.9626 Tf +(25) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 29 29 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -392.164] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 370.61 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 367.024] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(FILE) 23.9102 Tj +113.91 709.888 Td +(*) 5.97756 Tj +132.62 711.631 Td +(f;) 11.9551 Tj +90 699.676 Td +(BZFILE) 35.8654 Tj +125.865 697.933 Td +(*) 5.97756 Tj +136.087 699.676 Td +(b;) 11.9551 Tj +90 687.721 Td +(int) 17.9327 Tj +-2130 TJm +(nBuf;) 29.8878 Tj +90 675.766 Td +(char) 23.9102 Tj +-1704 TJm +(buf[) 23.9102 Tj +-426 TJm +(/) 5.97756 Tj +165.018 674.023 Td +(*) 5.97756 Tj +175.24 675.766 Td +(whatever) 47.8205 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(you) 17.9327 Tj +-426 TJm +(like) 23.9102 Tj +305.79 674.023 Td +(*) 5.97756 Tj +311.767 675.766 Td +(/) 5.97756 Tj +-426 TJm +(];) 11.9551 Tj +90 663.811 Td +(int) 17.9327 Tj +-2130 TJm +(bzerror;) 47.8205 Tj +90 651.856 Td +(int) 17.9327 Tj +-2130 TJm +(nWritten;) 53.798 Tj +90 627.945 Td +(f) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(fopen) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +("myfile.bz2",) 77.7083 Tj +-426 TJm +("r") 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +90 615.99 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(!f) 11.9551 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +98.488 604.035 Td +(/) 5.97756 Tj +104.466 602.292 Td +(*) 5.97756 Tj +114.687 604.035 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +188.929 602.292 Td +(*) 5.97756 Tj +194.906 604.035 Td +(/) 5.97756 Tj +90 592.08 Td +(}) 5.97756 Tj +90 580.125 Td +(b) 5.97756 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzReadOpen) 83.6858 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(f,) 11.9551 Tj +-426 TJm +(0,) 11.9551 Tj +-426 TJm +(NULL,) 29.8878 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 568.169 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +98.488 556.214 Td +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +98.488 544.259 Td +(/) 5.97756 Tj +104.466 542.516 Td +(*) 5.97756 Tj +114.687 544.259 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +188.929 542.516 Td +(*) 5.97756 Tj +194.906 544.259 Td +(/) 5.97756 Tj +90 532.304 Td +(}) 5.97756 Tj +90 508.394 Td +(bzerror) 41.8429 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ_OK;) 35.8654 Tj +90 496.438 Td +(while) 29.8878 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(/) 5.97756 Tj +252.948 494.695 Td +(*) 5.97756 Tj +263.17 496.438 Td +(arbitrary) 53.798 Tj +-426 TJm +(other) 29.8878 Tj +-426 TJm +(conditions) 59.7756 Tj +419.364 494.695 Td +(*) 5.97756 Tj +425.341 496.438 Td +(/\)) 11.9551 Tj +-426 TJm +({) 5.97756 Tj +98.488 484.483 Td +(nBuf) 23.9102 Tj +-426 TJm +(=) 5.97756 Tj +-426 TJm +(BZ2_bzRead) 59.7756 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b,) 11.9551 Tj +-426 TJm +(buf,) 23.9102 Tj +-426 TJm +(/) 5.97756 Tj +319.478 482.74 Td +(*) 5.97756 Tj +329.7 484.483 Td +(size) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(buf) 17.9327 Tj +396.23 482.74 Td +(*) 5.97756 Tj +402.208 484.483 Td +(/) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +98.488 472.528 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(==) 11.9551 Tj +-426 TJm +(BZ_OK) 29.8878 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +106.976 460.573 Td +(/) 5.97756 Tj +112.953 458.829 Td +(*) 5.97756 Tj +123.175 460.573 Td +(do) 11.9551 Tj +-426 TJm +(something) 53.798 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(buf[0) 29.8878 Tj +-426 TJm +(..) 11.9551 Tj +-426 TJm +(nBuf-1]) 41.8429 Tj +321.989 458.829 Td +(*) 5.97756 Tj +327.966 460.573 Td +(/) 5.97756 Tj +98.4879 448.618 Td +(}) 5.97756 Tj +90 436.663 Td +(}) 5.97756 Tj +90 424.707 Td +(if) 11.9551 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(bzerror) 41.8429 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(BZ_STREAM_END) 77.7083 Tj +-426 TJm +(\)) 5.97756 Tj +-426 TJm +({) 5.97756 Tj +102.732 412.752 Td +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +102.732 400.797 Td +(/) 5.97756 Tj +108.709 399.054 Td +(*) 5.97756 Tj +118.931 400.797 Td +(handle) 35.8654 Tj +-426 TJm +(error) 29.8878 Tj +193.172 399.054 Td +(*) 5.97756 Tj +199.15 400.797 Td +(/) 5.97756 Tj +90 388.842 Td +(}) 5.97756 Tj +-426 TJm +(else) 23.9102 Tj +-426 TJm +({) 5.97756 Tj +102.732 376.887 Td +(BZ2_bzReadClose) 89.6634 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(&bzerror,) 53.798 Tj +-426 TJm +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 364.932 Td +(}) 5.97756 Tj +[1 0 0 1 72 349.39] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.427] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 314.637 Td +/F122_0 20.6585 Tf +(3.5.) 34.4584 Tj +-278 TJm +(Utility) 57.3893 Tj +-278 TJm +(functions) 92.9633 Tj +[1 0 0 1 72 310.361] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -300.398] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 284.016 Td +/F122_0 17.2154 Tf +(3.5.1.) 43.0729 Tj +[1 0 0 1 119.858 284.016] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -284.016] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 284.016 Td +/F392_0 17.2154 Tf +(BZ2_bzBuffToBuffCompress) 247.902 Tj +[1 0 0 1 367.76 284.016] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.76 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -96.6376] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 95.6413 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 92.0548] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -272.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 272.318 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzBuffToBuffCompress\() 149.439 Tj +-426 TJm +(char) 23.9102 Tj +289.771 270.575 Td +(*) 5.97756 Tj +333.944 272.318 Td +(dest,) 29.8878 Tj +217.319 260.363 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +287.317 258.62 Td +(*) 5.97756 Tj +297.538 260.363 Td +(destLen,) 47.8205 Tj +217.319 248.408 Td +(char) 23.9102 Tj +241.23 246.664 Td +(*) 5.97756 Tj +285.403 248.408 Td +(source,) 41.8429 Tj +217.319 236.453 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-852 TJm +(sourceLen,) 59.7756 Tj +217.319 224.498 Td +(int) 17.9327 Tj +-4686 TJm +(blockSize100k,) 83.6858 Tj +217.319 212.542 Td +(int) 17.9327 Tj +-4686 TJm +(verbosity,) 59.7756 Tj +217.319 200.587 Td +(int) 17.9327 Tj +-4686 TJm +(workFactor) 59.7756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 185.045] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -175.083] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 163.128 Td +/F130_0 9.9626 Tf +(Attempts) 36.5329 Tj +-442 TJm +(to) 7.7509 Tj +-442 TJm +(compress) 37.6287 Tj +-443 TJm +(the) 12.1743 Tj +-442 TJm +(data) 16.5977 Tj +-442 TJm +(in) 7.7509 Tj +[1 0 0 1 216.87 163.128] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.87 -163.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.87 163.128 Td +/F134_0 9.9626 Tf +(source[0) 47.8205 Tj +-600 TJm +(..) 11.9551 Tj +-1200 TJm +(sourceLen-1]) 71.7307 Tj +[1 0 0 1 366.31 163.128] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.31 -163.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.715 163.128 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-442 TJm +(the) 12.1743 Tj +-442 TJm +(destination) 43.7259 Tj +-443 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 486.202 163.128] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -163.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 163.128 Td +/F134_0 9.9626 Tf +(dest[0) 35.8654 Tj +-600 TJm +(..) 11.9551 Tj +72 149.429 Td +(*) 5.97756 Tj +77.9776 151.173 Td +(destLen-1]) 59.7756 Tj +[1 0 0 1 137.753 151.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -151.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.753 151.172 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1393 TJm +(If) 6.63509 Tj +-379 TJm +(the) 12.1743 Tj +-379 TJm +(destination) 43.7259 Tj +-379 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-378 TJm +(is) 6.64505 Tj +-379 TJm +(big) 12.7322 Tj +-379 TJm +(enough,) 31.8205 Tj +[1 0 0 1 318.486 151.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -318.486 -151.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +318.486 149.429 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +324.464 151.173 Td +(destLen) 41.8429 Tj +[1 0 0 1 366.307 151.172] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -366.307 -151.172] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.081 151.172 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-379 TJm +(set) 11.0684 Tj +-379 TJm +(to) 7.7509 Tj +-378 TJm +(the) 12.1743 Tj +-379 TJm +(size) 15.4918 Tj +-379 TJm +(of) 8.29885 Tj +-379 TJm +(the) 12.1743 Tj +-379 TJm +(compressed) 47.0334 Tj +-379 TJm +(data,) 19.0883 Tj +72 139.217 Td +(and) 14.386 Tj +[1 0 0 1 89.5273 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -89.5273 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +89.5273 139.217 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 119.415 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.415 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.556 139.217 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(returned.) 35.686 Tj +-1012 TJm +(If) 6.63509 Tj +-315 TJm +(the) 12.1743 Tj +-316 TJm +(compressed) 47.0334 Tj +-315 TJm +(data) 16.5977 Tj +-315 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-316 TJm +(\002t,) 10.7995 Tj +[1 0 0 1 313.322 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -313.322 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +313.322 137.474 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +319.3 139.217 Td +(destLen) 41.8429 Tj +[1 0 0 1 361.143 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.143 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +364.284 139.217 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(unchanged,) 45.6486 Tj +-332 TJm +(and) 14.386 Tj +[1 0 0 1 440.551 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -440.551 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +440.551 139.217 Td +/F134_0 9.9626 Tf +(BZ_OUTBUFF_FULL) 89.6634 Tj +[1 0 0 1 530.215 139.217] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -530.215 -139.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 139.217 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +72 127.262 Td +(returned.) 35.686 Tj +[1 0 0 1 72 127.163] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -117.2] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 105.344 Td +/F130_0 9.9626 Tf +(Compression) 52.5826 Tj +-297 TJm +(in) 7.7509 Tj +-297 TJm +(this) 14.396 Tj +-297 TJm +(manner) 29.8778 Tj +-297 TJm +(is) 6.64505 Tj +-297 TJm +(a) 4.42339 Tj +-297 TJm +(one-shot) 34.3112 Tj +-297 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ent,) 14.6649 Tj +-309 TJm +(done) 19.3673 Tj +-297 TJm +(with) 17.7135 Tj +-297 TJm +(a) 4.42339 Tj +-297 TJm +(single) 23.8007 Tj +-297 TJm +(call) 14.386 Tj +-297 TJm +(to) 7.7509 Tj +-297 TJm +(this) 14.396 Tj +-297 TJm +(function.) 35.696 Tj +-903 TJm +(The) 15.4918 Tj +-297 TJm +(resulting) 34.8691 Tj +-297 TJm +(compressed) 47.0334 Tj +72 93.3892 Td +(data) 16.5977 Tj +-296 TJm +(is) 6.64505 Tj +-296 TJm +(a) 4.42339 Tj +-296 TJm +(complete) 36.5229 Tj +[1 0 0 1 147.988 93.3892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.988 -93.3892] cm +[1 0 0 1 0 0] Tm +0 0 Td +147.988 93.3892 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 177.875 93.3892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -177.875 -93.3892] cm +[1 0 0 1 0 0] Tm +0 0 Td +180.825 93.3892 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-296 TJm +(data) 16.5977 Tj +-296 TJm +(stream.) 29.0509 Tj +-897 TJm +(There) 23.2328 Tj +-296 TJm +(is) 6.64505 Tj +-296 TJm +(no) 9.9626 Tj +-296 TJm +(mechanism) 45.3796 Tj +-296 TJm +(for) 11.6164 Tj +-296 TJm +(making) 29.8878 Tj +-296 TJm +(additional) 39.8504 Tj +-296 TJm +(calls) 18.2614 Tj +-296 TJm +(to) 7.7509 Tj +-296 TJm +(pro) 13.2801 Tj +15 TJm +(vide) 17.1556 Tj +-296 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +72 81.434 Td +(input) 20.4831 Tj +-250 TJm +(data.) 19.0883 Tj +-620 TJm +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(kind) 17.7135 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(mechanism,) 47.8703 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(lo) 7.7509 Tj +25 TJm +(w-le) 17.7035 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(el) 7.193 Tj +-250 TJm +(interf) 21.579 Tj +10 TJm +(ace.) 15.7608 Tj +[1 0 0 1 72 79.2772] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -28.4254] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(26) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 30 30 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-223 TJm +(the) 12.1743 Tj +-224 TJm +(meaning) 34.3112 Tj +-223 TJm +(of) 8.29885 Tj +-224 TJm +(parameters) 43.7059 Tj +[1 0 0 1 195.306 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -195.306 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +195.306 710.037 Td +/F134_0 9.9626 Tf +(blockSize100k) 77.7083 Tj +[1 0 0 1 273.015 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.015 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +273.015 710.037 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 277.784 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.784 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +277.784 710.037 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 331.583 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.583 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +333.808 710.037 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 350.42 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -350.42 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +350.42 710.037 Td +/F134_0 9.9626 Tf +(workFactor) 59.7756 Tj +[1 0 0 1 410.196 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -410.196 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +410.196 710.037 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-229 TJm +(see) 12.7222 Tj +[1 0 0 1 429.913 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -429.913 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +429.913 710.037 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 537.509 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 710.037 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -697.918] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 688.12 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +80 TJm +(o) 4.9813 Tj +-410 TJm +(guarantee) 38.7246 Tj +-410 TJm +(that) 14.9439 Tj +-410 TJm +(the) 12.1743 Tj +-410 TJm +(compressed) 47.0334 Tj +-410 TJm +(data) 16.5977 Tj +-410 TJm +(will) 15.5018 Tj +-410 TJm +(\002t) 8.30881 Tj +-410 TJm +(in) 7.7509 Tj +-410 TJm +(its) 9.41466 Tj +-410 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +-450 TJm +(allocate) 30.9837 Tj +-410 TJm +(an) 9.40469 Tj +-410 TJm +(output) 25.4644 Tj +-410 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-411 TJm +(of) 8.29885 Tj +-410 TJm +(size) 15.4918 Tj +-410 TJm +(1%) 13.2801 Tj +-410 TJm +(lar) 10.5105 Tj +18 TJm +(ger) 12.7222 Tj +-410 TJm +(than) 17.1556 Tj +-410 TJm +(the) 12.1743 Tj +72 676.164 Td +(uncompressed) 56.996 Tj +-250 TJm +(data,) 19.0883 Tj +-250 TJm +(plus) 16.6077 Tj +-250 TJm +(six) 11.6264 Tj +-250 TJm +(hundred) 32.6474 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +-250 TJm +(bytes.) 23.5217 Tj +[1 0 0 1 72 674.007] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -664.045] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 654.247 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 227.417 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -227.417 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.553 654.247 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-315 TJm +(not) 12.7322 Tj +-315 TJm +(write) 20.4731 Tj +-314 TJm +(data) 16.5977 Tj +-315 TJm +(at) 7.193 Tj +-315 TJm +(or) 8.29885 Tj +-315 TJm +(be) 9.40469 Tj +15 TJm +(yond) 19.9252 Tj +[1 0 0 1 362.484 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -362.484 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +362.484 654.247 Td +/F134_0 9.9626 Tf +(dest[) 29.8878 Tj +392.372 652.503 Td +(*) 5.97756 Tj +398.349 654.247 Td +(destLen]) 47.8205 Tj +[1 0 0 1 446.17 654.247] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -446.17 -654.247] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.17 654.247 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-331 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-315 TJm +(in) 7.7509 Tj +-315 TJm +(case) 17.1456 Tj +-314 TJm +(of) 8.29885 Tj +-315 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +72 642.291 Td +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er\003o) 18.2614 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 642.192] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -632.229] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 620.374 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 620.274] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -168.369] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 167.372 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 163.786] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -610.909] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 610.909 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 598.954 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 586.999 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 575.044 Td +(if) 11.9551 Tj +-426 TJm +(dest) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(destLen) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 563.088 Td +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(1) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(blockSize100k) 77.7083 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(9) 5.97756 Tj +98.4879 551.133 Td +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +98.4879 539.178 Td +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(workFactor) 59.7756 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(250) 17.9327 Tj +90 527.223 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 515.268 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 503.313 Td +(BZ_OUTBUFF_FULL) 89.6634 Tj +98.4879 491.357 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(exceeds) 41.8429 Tj +341.655 489.614 Td +(*) 5.97756 Tj +347.633 491.357 Td +(destLen) 41.8429 Tj +90 479.402 Td +(BZ_OK) 29.8878 Tj +98.4879 467.447 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 451.905] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -441.943] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 421.284 Td +/F122_0 17.2154 Tf +(3.5.2.) 43.0729 Tj +[1 0 0 1 119.858 421.284] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.858 -421.284] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.858 421.284 Td +/F392_0 17.2154 Tf +(BZ2_bzBuffToBuffDecompress) 268.56 Tj +[1 0 0 1 388.419 421.284] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -316.419 -2.3327] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -84.6824] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 83.6862 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 80.0996] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -409.587] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 409.587 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzBuffToBuffDecompress\() 161.394 Tj +-426 TJm +(char) 23.9102 Tj +301.726 407.843 Td +(*) 5.97756 Tj +345.899 409.587 Td +(dest,) 29.8878 Tj +225.807 397.632 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +295.805 395.888 Td +(*) 5.97756 Tj +306.026 397.632 Td +(destLen,) 47.8205 Tj +225.807 385.676 Td +(char) 23.9102 Tj +249.718 383.933 Td +(*) 5.97756 Tj +293.891 385.676 Td +(source,) 41.8429 Tj +225.807 373.721 Td +(unsigned) 47.8205 Tj +-426 TJm +(int) 17.9327 Tj +-852 TJm +(sourceLen,) 59.7756 Tj +225.807 361.766 Td +(int) 17.9327 Tj +-4686 TJm +(small,) 35.8654 Tj +225.807 349.811 Td +(int) 17.9327 Tj +-4686 TJm +(verbosity) 53.798 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 334.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -324.306] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 312.351 Td +/F130_0 9.9626 Tf +(Attempts) 36.5329 Tj +-358 TJm +(to) 7.7509 Tj +-359 TJm +(decompress) 47.0334 Tj +-358 TJm +(the) 12.1743 Tj +-358 TJm +(data) 16.5977 Tj +-359 TJm +(in) 7.7509 Tj +[1 0 0 1 221.259 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -221.259 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.259 312.351 Td +/F134_0 9.9626 Tf +(source[0) 47.8205 Tj +-600 TJm +(..) 11.9551 Tj +-1200 TJm +(sourceLen-1]) 71.7307 Tj +[1 0 0 1 370.698 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -370.698 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +374.268 312.351 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-358 TJm +(the) 12.1743 Tj +-359 TJm +(destination) 43.7259 Tj +-358 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +40 TJm +(,) 2.49065 Tj +[1 0 0 1 486.202 312.351] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -486.202 -312.351] cm +[1 0 0 1 0 0] Tm +0 0 Td +486.202 312.351 Td +/F134_0 9.9626 Tf +(dest[0) 35.8654 Tj +-600 TJm +(..) 11.9551 Tj +72 298.653 Td +(*) 5.97756 Tj +77.9776 300.396 Td +(destLen-1]) 59.7756 Tj +[1 0 0 1 137.753 300.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -300.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.753 300.396 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1123 TJm +(If) 6.63509 Tj +-334 TJm +(the) 12.1743 Tj +-334 TJm +(destination) 43.7259 Tj +-334 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-334 TJm +(is) 6.64505 Tj +-334 TJm +(big) 12.7322 Tj +-334 TJm +(enough,) 31.8205 Tj +[1 0 0 1 312.554 300.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -312.554 -300.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +312.554 298.653 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +318.531 300.396 Td +(destLen) 41.8429 Tj +[1 0 0 1 360.374 300.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.374 -300.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.701 300.396 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-334 TJm +(set) 11.0684 Tj +-334 TJm +(to) 7.7509 Tj +-334 TJm +(the) 12.1743 Tj +-334 TJm +(size) 15.4918 Tj +-333 TJm +(of) 8.29885 Tj +-334 TJm +(the) 12.1743 Tj +-334 TJm +(uncompressed) 56.996 Tj +-334 TJm +(data,) 19.0883 Tj +72 288.441 Td +(and) 14.386 Tj +[1 0 0 1 89.5273 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -89.5273 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +89.5273 288.441 Td +/F134_0 9.9626 Tf +(BZ_OK) 29.8878 Tj +[1 0 0 1 119.415 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.415 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.556 288.441 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(returned.) 35.686 Tj +-1012 TJm +(If) 6.63509 Tj +-315 TJm +(the) 12.1743 Tj +-316 TJm +(compressed) 47.0334 Tj +-315 TJm +(data) 16.5977 Tj +-315 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-316 TJm +(\002t,) 10.7995 Tj +[1 0 0 1 313.322 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -313.322 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +313.322 286.698 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +319.3 288.441 Td +(destLen) 41.8429 Tj +[1 0 0 1 361.143 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.143 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +364.284 288.441 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-315 TJm +(unchanged,) 45.6486 Tj +-332 TJm +(and) 14.386 Tj +[1 0 0 1 440.551 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -440.551 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +440.551 288.441 Td +/F134_0 9.9626 Tf +(BZ_OUTBUFF_FULL) 89.6634 Tj +[1 0 0 1 530.215 288.441] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -530.215 -288.441] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 288.441 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +72 276.486 Td +(returned.) 35.686 Tj +[1 0 0 1 72 276.386] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -266.424] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 254.568 Td +/F134_0 9.9626 Tf +(source) 35.8654 Tj +[1 0 0 1 107.865 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -107.865 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +110.981 254.568 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-313 TJm +(assumed) 34.3112 Tj +-312 TJm +(to) 7.7509 Tj +-313 TJm +(hold) 17.7135 Tj +-313 TJm +(a) 4.42339 Tj +-313 TJm +(complete) 36.5229 Tj +[1 0 0 1 237.04 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -237.04 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +237.04 254.568 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 266.928 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -266.928 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +270.044 254.568 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-313 TJm +(data) 16.5977 Tj +-312 TJm +(stream.) 29.0509 Tj +[1 0 0 1 353.446 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.446 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.446 254.568 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 508.863 254.568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -508.863 -254.568] cm +[1 0 0 1 0 0] Tm +0 0 Td +511.978 254.568 Td +/F130_0 9.9626 Tf +(tries) 17.1556 Tj +-313 TJm +(to) 7.7509 Tj +72 242.613 Td +(decompress) 47.0334 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(entirety) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(stream) 26.5603 Tj +-250 TJm +(into) 15.5018 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(output) 25.4644 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 240.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -230.493] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 220.695 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(meaning) 34.3112 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(parameters) 43.7059 Tj +[1 0 0 1 196.631 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.631 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.631 220.695 Td +/F134_0 9.9626 Tf +(small) 29.8878 Tj +[1 0 0 1 226.519 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.519 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.01 220.695 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 245.887 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.887 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +245.887 220.695 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 299.685 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -299.685 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.685 220.695 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(see) 12.7222 Tj +[1 0 0 1 319.879 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -319.879 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +319.879 220.695 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 439.431 220.695] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -439.431 -220.695] cm +[1 0 0 1 0 0] Tm +0 0 Td +439.431 220.695 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 218.538] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -208.576] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 198.777 Td +/F130_0 9.9626 Tf +(Because) 33.1954 Tj +-250 TJm +(the) 12.1743 Tj +-249 TJm +(compression) 50.3609 Tj +-250 TJm +(ratio) 18.2614 Tj +-249 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-249 TJm +(compressed) 47.0334 Tj +-250 TJm +(data) 16.5977 Tj +-249 TJm +(cannot) 26.5603 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(kno) 14.9439 Tj +25 TJm +(wn) 12.1743 Tj +-249 TJm +(in) 7.7509 Tj +-250 TJm +(adv) 14.386 Tj +25 TJm +(ance,) 20.7421 Tj +-249 TJm +(there) 19.9152 Tj +-250 TJm +(is) 6.64505 Tj +-249 TJm +(no) 9.9626 Tj +-250 TJm +(easy) 17.7035 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-249 TJm +(to) 7.7509 Tj +-250 TJm +(guarantee) 38.7246 Tj +72 186.822 Td +(that) 14.9439 Tj +-286 TJm +(the) 12.1743 Tj +-287 TJm +(output) 25.4644 Tj +-286 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +-287 TJm +(will) 15.5018 Tj +-286 TJm +(be) 9.40469 Tj +-286 TJm +(big) 12.7322 Tj +-287 TJm +(enough.) 31.8205 Tj +-838 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-287 TJm +(may) 17.1556 Tj +-286 TJm +(of) 8.29885 Tj +-287 TJm +(course) 26.0024 Tj +-286 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-286 TJm +(arrangements) 53.6685 Tj +-287 TJm +(in) 7.7509 Tj +-286 TJm +(your) 18.2614 Tj +-287 TJm +(code) 18.8094 Tj +-286 TJm +(to) 7.7509 Tj +-286 TJm +(record) 25.4445 Tj +-287 TJm +(the) 12.1743 Tj +-286 TJm +(size) 15.4918 Tj +-287 TJm +(of) 8.29885 Tj +72 174.867 Td +(the) 12.1743 Tj +-250 TJm +(uncompressed) 56.996 Tj +-250 TJm +(data,) 19.0883 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(mechanism) 45.3796 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(be) 9.40469 Tj +15 TJm +(yond) 19.9252 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(scope) 22.6848 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 172.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -162.747] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 152.949 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 227.417 152.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -227.417 -152.949] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.553 152.949 Td +/F130_0 9.9626 Tf +(will) 15.5018 Tj +-315 TJm +(not) 12.7322 Tj +-315 TJm +(write) 20.4731 Tj +-314 TJm +(data) 16.5977 Tj +-315 TJm +(at) 7.193 Tj +-315 TJm +(or) 8.29885 Tj +-315 TJm +(be) 9.40469 Tj +15 TJm +(yond) 19.9252 Tj +[1 0 0 1 362.484 152.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -362.484 -152.949] cm +[1 0 0 1 0 0] Tm +0 0 Td +362.484 152.949 Td +/F134_0 9.9626 Tf +(dest[) 29.8878 Tj +392.372 151.206 Td +(*) 5.97756 Tj +398.349 152.949 Td +(destLen]) 47.8205 Tj +[1 0 0 1 446.17 152.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -446.17 -152.949] cm +[1 0 0 1 0 0] Tm +0 0 Td +446.17 152.949 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-331 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(en) 9.40469 Tj +-315 TJm +(in) 7.7509 Tj +-315 TJm +(case) 17.1456 Tj +-314 TJm +(of) 8.29885 Tj +-315 TJm +(b) 4.9813 Tj +20 TJm +(uf) 8.29885 Tj +25 TJm +(fer) 11.0585 Tj +72 140.994 Td +(o) 4.9813 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(er\003o) 18.2614 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 140.894] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -130.932] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 119.076 Td +/F130_0 9.9626 Tf +(Possible) 33.2153 Tj +-250 TJm +(return) 23.7907 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues:) 23.2427 Tj +[1 0 0 1 72 118.977] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -68.1248] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(27) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 31 31 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -344.462 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.96 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 498.449 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -498.449 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.449 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 546.269 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -248.702] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 227.148 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 223.562] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -711.631] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 711.631 Td +/F134_0 9.9626 Tf +(BZ_CONFIG_ERROR) 89.6634 Tj +98.4879 699.676 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(library) 41.8429 Tj +-426 TJm +(has) 17.9327 Tj +-426 TJm +(been) 23.9102 Tj +-426 TJm +(mis-compiled) 71.7307 Tj +90 687.721 Td +(BZ_PARAM_ERROR) 83.6858 Tj +98.4879 675.766 Td +(if) 11.9551 Tj +-426 TJm +(dest) 23.9102 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(destLen) 41.8429 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(NULL) 23.9102 Tj +98.4879 663.811 Td +(or) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(&&) 11.9551 Tj +-426 TJm +(small) 29.8878 Tj +-426 TJm +(!=) 11.9551 Tj +-426 TJm +(1) 5.97756 Tj +98.4879 651.856 Td +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(<) 5.97756 Tj +-426 TJm +(0) 5.97756 Tj +-426 TJm +(or) 11.9551 Tj +-426 TJm +(verbosity) 53.798 Tj +-426 TJm +(>) 5.97756 Tj +-426 TJm +(4) 5.97756 Tj +90 639.9 Td +(BZ_MEM_ERROR) 71.7307 Tj +98.4879 627.945 Td +(if) 11.9551 Tj +-426 TJm +(insufficient) 71.7307 Tj +-426 TJm +(memory) 35.8654 Tj +-426 TJm +(is) 11.9551 Tj +-426 TJm +(available) 53.798 Tj +90 615.99 Td +(BZ_OUTBUFF_FULL) 89.6634 Tj +98.4879 604.035 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(size) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(exceeds) 41.8429 Tj +341.655 602.291 Td +(*) 5.97756 Tj +347.633 604.035 Td +(destLen) 41.8429 Tj +90 592.08 Td +(BZ_DATA_ERROR) 77.7083 Tj +98.4879 580.125 Td +(if) 11.9551 Tj +-426 TJm +(a) 5.97756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(integrity) 53.798 Tj +-426 TJm +(error) 29.8878 Tj +-426 TJm +(was) 17.9327 Tj +-426 TJm +(detected) 47.8205 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +90 568.169 Td +(BZ_DATA_ERROR_MAGIC) 113.574 Tj +98.4879 556.214 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(doesn't) 41.8429 Tj +-426 TJm +(begin) 29.8878 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(right) 29.8878 Tj +-426 TJm +(magic) 29.8878 Tj +-426 TJm +(bytes) 29.8878 Tj +90 544.259 Td +(BZ_UNEXPECTED_EOF) 101.619 Tj +98.4879 532.304 Td +(if) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compressed) 59.7756 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(ends) 23.9102 Tj +-426 TJm +(unexpectedly) 71.7307 Tj +90 520.349 Td +(BZ_OK) 29.8878 Tj +98.4879 508.394 Td +(otherwise) 53.798 Tj +[1 0 0 1 72 492.852] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -482.889] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 458.099 Td +/F122_0 20.6585 Tf +(3.6.) 34.4584 Tj +[1 0 0 1 112.201 458.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -112.201 -458.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +112.201 458.099 Td +/F392_0 20.6585 Tf +(zlib) 49.5804 Tj +[1 0 0 1 161.781 458.099] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -161.781 -458.099] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.524 458.099 Td +/F122_0 20.6585 Tf +(compatibility) 127.422 Tj +-278 TJm +(functions) 92.9633 Tj +[1 0 0 1 72 453.823] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -443.86] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 436.181 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-604 TJm +(Tsuneo) 29.3299 Tj +-604 TJm +(has) 13.2801 Tj +-604 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-604 TJm +(some) 21.031 Tj +-604 TJm +(functions) 37.0808 Tj +-604 TJm +(to) 7.7509 Tj +-604 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-604 TJm +(better) 22.6848 Tj +[1 0 0 1 356.347 436.181] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -356.347 -436.181] cm +[1 0 0 1 0 0] Tm +0 0 Td +356.347 436.181 Td +/F134_0 9.9626 Tf +(zlib) 23.9102 Tj +[1 0 0 1 380.257 436.181] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -380.257 -436.181] cm +[1 0 0 1 0 0] Tm +0 0 Td +386.275 436.181 Td +/F130_0 9.9626 Tf +(compatibility) 53.1405 Tj +65 TJm +(.) 2.49065 Tj +-1372 TJm +(These) 23.7907 Tj +-604 TJm +(functions) 37.0808 Tj +-604 TJm +(are) 12.1643 Tj +[1 0 0 1 72 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzopen) 59.7756 Tj +[1 0 0 1 131.776 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.776 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 144.283 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -144.283 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.283 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzread) 59.7756 Tj +[1 0 0 1 204.059 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.059 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.059 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 216.566 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -216.566 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +216.566 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzwrite) 65.7532 Tj +[1 0 0 1 282.32 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.32 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.32 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 294.827 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.827 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.827 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzflush) 65.7532 Tj +[1 0 0 1 360.581 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.581 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +360.581 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 373.088 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -373.088 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +373.088 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzclose) 65.7532 Tj +[1 0 0 1 438.842 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -438.842 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +438.842 424.226 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 451.349 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -451.349 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +451.349 424.226 Td +/F134_0 9.9626 Tf +(BZ2_bzerror) 65.7532 Tj +[1 0 0 1 517.102 424.226] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -517.102 -424.226] cm +[1 0 0 1 0 0] Tm +0 0 Td +525.614 424.226 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 72 412.271] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -412.271] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 412.271 Td +/F134_0 9.9626 Tf +(BZ2_bzlibVersion) 95.641 Tj +[1 0 0 1 167.641 412.271] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.641 -412.271] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.641 412.271 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1420 TJm +(Thes) 19.3673 Tj +1 TJm +(e) 4.42339 Tj +-384 TJm +(functions) 37.0808 Tj +-383 TJm +(are) 12.1643 Tj +-383 TJm +(not) 12.7322 Tj +-383 TJm +(\(yet\)) 18.8094 Tj +-384 TJm +(of) 8.29885 Tj +25 TJm +(\002cially) 27.6761 Tj +-383 TJm +(part) 15.4918 Tj +-383 TJm +(of) 8.29885 Tj +-383 TJm +(the) 12.1743 Tj +-384 TJm +(library) 26.5603 Tj +65 TJm +(.) 2.49065 Tj +-1419 TJm +(If) 6.63509 Tj +-383 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-384 TJm +(break,) 24.6176 Tj +-416 TJm +(you) 14.9439 Tj +-383 TJm +(get) 12.1743 Tj +-384 TJm +(to) 7.7509 Tj +72 400.316 Td +(k) 4.9813 Tj +10 TJm +(eep) 13.8281 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(pieces.) 27.3872 Tj +-620 TJm +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(think) 20.4831 Tj +-250 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-250 TJm +(ok.) 12.4533 Tj +[1 0 0 1 72 398.159] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -48.8169] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 47.8207 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 44.2341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -388.794] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 388.794 Td +/F134_0 9.9626 Tf +(typedef) 41.8429 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(BZFILE;) 41.8429 Tj +90 364.884 Td +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +152.286 363.14 Td +(*) 5.97756 Tj +162.508 364.884 Td +(BZ2_bzlibVersion) 95.641 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 349.342] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -339.379] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 327.424 Td +/F130_0 9.9626 Tf +(Returns) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(string) 22.6948 Tj +-250 TJm +(indicating) 39.8504 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersion.) 26.8392 Tj +[1 0 0 1 72 325.267] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -315.902] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 315.902 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +130.109 314.159 Td +(*) 5.97756 Tj +140.331 315.902 Td +(BZ2_bzopen) 59.7756 Tj +-852 TJm +(\() 5.97756 Tj +-426 TJm +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +281.103 314.159 Td +(*) 5.97756 Tj +287.08 315.902 Td +(path,) 29.8878 Tj +-426 TJm +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +383.498 314.159 Td +(*) 5.97756 Tj +389.476 315.902 Td +(mode) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +90 303.947 Td +(BZFILE) 35.8654 Tj +130.109 302.204 Td +(*) 5.97756 Tj +140.331 303.947 Td +(BZ2_bzdopen) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +-3408 TJm +(fd,) 17.9327 Tj +-1704 TJm +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +369.629 302.204 Td +(*) 5.97756 Tj +375.607 303.947 Td +(mode) 23.9102 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 288.405] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -278.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 266.488 Td +/F130_0 9.9626 Tf +(Opens) 25.4544 Tj +-243 TJm +(a) 4.42339 Tj +[1 0 0 1 106.713 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -106.713 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +106.713 266.488 Td +/F134_0 9.9626 Tf +(.bz2) 23.9102 Tj +[1 0 0 1 130.624 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -130.624 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +133.041 266.488 Td +/F130_0 9.9626 Tf +(\002le) 12.7322 Tj +-243 TJm +(for) 11.6164 Tj +-242 TJm +(reading) 29.8778 Tj +-243 TJm +(or) 8.29885 Tj +-243 TJm +(writing,) 31.2726 Tj +-244 TJm +(using) 21.589 Tj +-243 TJm +(ei) 7.193 Tj +1 TJm +(ther) 15.4918 Tj +-243 TJm +(its) 9.41466 Tj +-243 TJm +(name) 21.579 Tj +-242 TJm +(o) 4.9813 Tj +-1 TJm +(r) 3.31755 Tj +-242 TJm +(a) 4.42339 Tj +-243 TJm +(pre-e) 20.4632 Tj +15 TJm +(xisting) 27.1282 Tj +-243 TJm +(\002le) 12.7322 Tj +-242 TJm +(descriptor) 39.8404 Tj +55 TJm +(.) 2.49065 Tj +-615 TJm +(Analogous) 43.1679 Tj +-243 TJm +(to) 7.7509 Tj +[1 0 0 1 510.112 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 266.488 Td +/F134_0 9.9626 Tf +(fopen) 29.8878 Tj +[1 0 0 1 540 266.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -266.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 254.532 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 88.8767 254.532] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -88.8767 -254.532] cm +[1 0 0 1 0 0] Tm +0 0 Td +88.8767 254.532 Td +/F134_0 9.9626 Tf +(fdopen) 35.8654 Tj +[1 0 0 1 124.742 254.532] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -124.742 -254.532] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.742 254.532 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 252.998] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -243.633] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 243.633 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-426 TJm +(BZ2_bzread) 59.7756 Tj +-852 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +226.528 241.89 Td +(*) 5.97756 Tj +236.749 243.633 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +276.859 241.89 Td +(*) 5.97756 Tj +287.08 243.633 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +90 231.678 Td +(int) 17.9327 Tj +-426 TJm +(BZ2_bzwrite) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +228.261 229.935 Td +(*) 5.97756 Tj +238.483 231.678 Td +(b,) 11.9551 Tj +-426 TJm +(void) 23.9102 Tj +278.592 229.935 Td +(*) 5.97756 Tj +288.814 231.678 Td +(buf,) 23.9102 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(len) 17.9327 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 216.136] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -206.174] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 194.219 Td +/F130_0 9.9626 Tf +(Reads/writes) 51.4668 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(from/to) 29.8878 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(pre) 12.7222 Tj +25 TJm +(viously) 29.3399 Tj +-250 TJm +(opened) 28.772 Tj +[1 0 0 1 259.903 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -259.903 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +259.903 194.219 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +[1 0 0 1 295.769 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -295.769 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +295.769 194.219 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-500 TJm +(Analogous) 43.1679 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 359.141 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -359.141 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +359.141 194.219 Td +/F134_0 9.9626 Tf +(fread) 29.8878 Tj +[1 0 0 1 389.029 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -389.029 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +391.519 194.219 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 408.396 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -408.396 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +408.396 194.219 Td +/F134_0 9.9626 Tf +(fwrite) 35.8654 Tj +[1 0 0 1 444.261 194.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.261 -194.219] cm +[1 0 0 1 0 0] Tm +0 0 Td +444.261 194.219 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 192.062] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -182.697] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 182.697 Td +/F134_0 9.9626 Tf +(int) 17.9327 Tj +-852 TJm +(BZ2_bzflush) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +232.505 180.954 Td +(*) 5.97756 Tj +242.727 182.697 Td +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +90 170.742 Td +(void) 23.9102 Tj +-426 TJm +(BZ2_bzclose) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +234.239 168.998 Td +(*) 5.97756 Tj +244.46 170.742 Td +(b) 5.97756 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 155.2] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -145.237] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 133.282 Td +/F130_0 9.9626 Tf +(Flushes/closes) 57.5639 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 138.968 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -138.968 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +138.968 133.282 Td +/F134_0 9.9626 Tf +(BZFILE) 35.8654 Tj +[1 0 0 1 174.833 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.833 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +174.833 133.282 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 179.815 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -179.815 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.815 133.282 Td +/F134_0 9.9626 Tf +(BZ2_bzflush) 65.7532 Tj +[1 0 0 1 245.568 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -245.568 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +248.059 133.282 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(actually) 31.5416 Tj +-250 TJm +(do) 9.9626 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(ything.) 27.9551 Tj +-620 TJm +(Analogous) 43.1679 Tj +-250 TJm +(to) 7.7509 Tj +[1 0 0 1 425.472 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -425.472 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +425.472 133.282 Td +/F134_0 9.9626 Tf +(fflush) 35.8654 Tj +[1 0 0 1 461.338 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.338 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +463.828 133.282 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 480.705 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -480.705 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +480.705 133.282 Td +/F134_0 9.9626 Tf +(fclose) 35.8654 Tj +[1 0 0 1 516.57 133.282] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -516.57 -133.282] cm +[1 0 0 1 0 0] Tm +0 0 Td +516.57 133.282 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 131.125] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -121.761] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 121.761 Td +/F134_0 9.9626 Tf +(const) 29.8878 Tj +-426 TJm +(char) 23.9102 Tj +152.286 120.017 Td +(*) 5.97756 Tj +162.508 121.761 Td +(BZ2_bzerror) 65.7532 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(BZFILE) 35.8654 Tj +282.836 120.017 Td +(*) 5.97756 Tj +288.814 121.761 Td +(b,) 11.9551 Tj +-426 TJm +(int) 17.9327 Tj +327.19 120.017 Td +(*) 5.97756 Tj +333.167 121.761 Td +(errnum) 35.8654 Tj +-426 TJm +(\)) 5.97756 Tj +[1 0 0 1 72 106.219] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -96.2563] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 84.3011 Td +/F130_0 9.9626 Tf +(Returns) 30.9936 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(string) 22.6948 Tj +-250 TJm +(describing) 41.5042 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(more) 20.4731 Tj +-250 TJm +(recent) 24.3386 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(status) 22.6948 Tj +-250 TJm +(of) 8.29885 Tj +[1 0 0 1 303.858 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.858 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +303.858 84.3011 Td +/F134_0 9.9626 Tf +(b) 5.97756 Tj +[1 0 0 1 309.835 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -309.835 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +309.835 84.3011 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(also) 16.0497 Tj +-250 TJm +(sets) 14.9439 Tj +[1 0 0 1 367.668 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -367.668 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +367.668 82.5576 Td +/F134_0 9.9626 Tf +(*) 5.97756 Tj +373.645 84.3011 Td +(errnum) 35.8654 Tj +[1 0 0 1 409.511 84.3011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.511 -84.3011] cm +[1 0 0 1 0 0] Tm +0 0 Td +412.001 84.3011 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(its) 9.41466 Tj +-250 TJm +(numerical) 39.8404 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alue.) 19.0883 Tj +[1 0 0 1 72 82.1443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.3298] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 4.3836 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -495.734 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +536.307 50.9514 Td +/F130_0 9.9626 Tf +(28) 9.9626 Tj +[1 0 0 1 455.161 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -15.0365 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 32 32 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 704.93 Td +/F122_0 20.6585 Tf +(3.7.) 34.4584 Tj +-278 TJm +(Using) 57.3893 Tj +-278 TJm +(the) 30.9877 Tj +-278 TJm +(librar) 51.6669 Tj +-10 TJm +(y) 11.4861 Tj +-278 TJm +(in) 18.3654 Tj +-278 TJm +(a) 11.4861 Tj +[1 0 0 1 322.501 704.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -322.501 -704.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +322.501 704.93 Td +/F392_0 20.6585 Tf +(stdio) 61.9755 Tj +[1 0 0 1 384.477 704.93] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -384.477 -704.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +384.477 704.93 Td +/F122_0 20.6585 Tf +(-free) 44.767 Tj +72 680.139 Td +(en) 24.1085 Tj +40 TJm +(vir) 25.2653 Tj +20 TJm +(onment) 74.5978 Tj +[1 0 0 1 72 679.881] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -669.983] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 649.583 Td +/F122_0 17.2154 Tf +(3.7.1.) 43.0729 Tj +-278 TJm +(Getting) 60.2539 Tj +-278 TJm +(rid) 22.0013 Tj +-278 TJm +(of) 16.2513 Tj +[1 0 0 1 232.721 649.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.721 -649.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +232.721 649.583 Td +/F392_0 17.2154 Tf +(stdio) 51.6462 Tj +[1 0 0 1 284.367 649.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.367 -3.8303] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -635.855] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 627.73 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +-319 TJm +(a) 4.42339 Tj +-319 TJm +(deeply) 26.5603 Tj +-319 TJm +(embedded) 40.9463 Tj +-319 TJm +(application,) 46.7644 Tj +-336 TJm +(you) 14.9439 Tj +-319 TJm +(might) 23.2527 Tj +-319 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-319 TJm +(to) 7.7509 Tj +-319 TJm +(use) 13.2801 Tj +-319 TJm +(just) 14.396 Tj +-319 TJm +(the) 12.1743 Tj +-319 TJm +(memory-to-memory) 80.7967 Tj +-319 TJm +(functions.) 39.5714 Tj +-1035 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-319 TJm +(can) 13.8281 Tj +-319 TJm +(do) 9.9626 Tj +-319 TJm +(this) 14.396 Tj +72 615.775 Td +(con) 14.386 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(eniently) 32.0995 Tj +-327 TJm +(by) 9.9626 Tj +-327 TJm +(compiling) 40.4083 Tj +-327 TJm +(the) 12.1743 Tj +-327 TJm +(library) 26.5603 Tj +-327 TJm +(with) 17.7135 Tj +-328 TJm +(preproces) 38.7246 Tj +1 TJm +(sor) 12.1743 Tj +-328 TJm +(symbol) 29.3399 Tj +[1 0 0 1 336.046 615.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -336.046 -615.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +336.046 615.775 Td +/F134_0 9.9626 Tf +(BZ_NO_STDIO) 65.7532 Tj +[1 0 0 1 401.799 615.775] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.799 -615.775] cm +[1 0 0 1 0 0] Tm +0 0 Td +405.057 615.775 Td +/F130_0 9.9626 Tf +(de\002ned.) 31.8205 Tj +-1083 TJm +(Doing) 24.9065 Tj +-327 TJm +(this) 14.396 Tj +-327 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-327 TJm +(you) 14.9439 Tj +-327 TJm +(a) 4.42339 Tj +72 603.819 Td +(library) 26.5603 Tj +-250 TJm +(containing) 42.0621 Tj +-250 TJm +(only) 17.7135 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-250 TJm +(eight) 19.9252 Tj +-250 TJm +(functions:) 39.8504 Tj +[1 0 0 1 72 601.662] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -591.764] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressInit) 107.596 Tj +[1 0 0 1 179.596 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -179.596 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +179.596 581.966 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 199.079 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -199.079 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +199.079 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +[1 0 0 1 282.765 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.765 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.765 581.966 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 302.247 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.247 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.247 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.619 Tj +[1 0 0 1 403.866 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 14.0915 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -417.958 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +417.958 581.966 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.551 Tj +[1 0 0 1 537.509 581.966] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -581.966] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 581.966 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompress) 95.641 Tj +[1 0 0 1 167.641 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.641 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +167.641 570.011 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 172.144 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -172.144 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.144 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.574 Tj +[1 0 0 1 285.719 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.611 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +287.611 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.461 Tj +[1 0 0 1 431.073 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -431.073 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +431.073 570.011 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 435.577 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -435.577 -570.011] cm +[1 0 0 1 0 0] Tm +0 0 Td +435.577 570.011 Td +/F134_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.417 Tj +[1 0 0 1 590.994 570.011] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -518.994 -1.5341] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -558.579] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 548.158 Td +/F130_0 9.9626 Tf +(When) 23.7907 Tj +-250 TJm +(compiled) 37.0808 Tj +-250 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(this,) 16.8866 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(functions) 37.0808 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(ignore) 25.4544 Tj +[1 0 0 1 272.526 548.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.526 -548.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.526 548.158 Td +/F134_0 9.9626 Tf +(verbosity) 53.798 Tj +[1 0 0 1 326.324 548.158] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -326.324 -548.158] cm +[1 0 0 1 0 0] Tm +0 0 Td +328.815 548.158 Td +/F130_0 9.9626 Tf +(settings.) 32.9364 Tj +[1 0 0 1 72 546.001] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -536.103] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 517.601 Td +/F122_0 17.2154 Tf +(3.7.2.) 43.0729 Tj +-278 TJm +(Critical) 58.3602 Tj +-278 TJm +(err) 22.9653 Tj +20 TJm +(or) 17.2154 Tj +-278 TJm +(handling) 71.7366 Tj +[1 0 0 1 72 513.771] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -503.873] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 495.748 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 119.821 495.748] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -495.748] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.529 495.748 Td +/F130_0 9.9626 Tf +(contains) 33.2053 Tj +-473 TJm +(a) 4.42339 Tj +-472 TJm +(number) 30.4357 Tj +-473 TJm +(of) 8.29885 Tj +-472 TJm +(internal) 30.4357 Tj +-473 TJm +(assertion) 35.417 Tj +-472 TJm +(checks) 27.1082 Tj +-473 TJm +(which) 24.3486 Tj +-472 TJm +(should,) 29.0609 Tj +-529 TJm +(needless) 33.7533 Tj +-472 TJm +(to) 7.7509 Tj +-473 TJm +(say) 13.2801 Tj +65 TJm +(,) 2.49065 Tj +-528 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-473 TJm +(be) 9.40469 Tj +-472 TJm +(acti) 14.386 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ated.) 19.0883 Tj +72 483.793 Td +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-533 TJm +(if) 6.08715 Tj +-476 TJm +(an) 9.40469 Tj +-476 TJm +(assertion) 35.417 Tj +-476 TJm +(should) 26.5703 Tj +-476 TJm +(f) 3.31755 Tj +10 TJm +(ail,) 12.4533 Tj +-532 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +-476 TJm +(depends) 32.6474 Tj +-476 TJm +(on) 9.9626 Tj +-476 TJm +(whether) 32.0895 Tj +-476 TJm +(or) 8.29885 Tj +-477 TJm +(not) 12.7322 Tj +-476 TJm +(the) 12.1743 Tj +-476 TJm +(library) 26.5603 Tj +-476 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-476 TJm +(compiled) 37.0808 Tj +-476 TJm +(with) 17.7135 Tj +[1 0 0 1 72 471.838] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -471.838] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 471.838 Td +/F134_0 9.9626 Tf +(BZ_NO_STDIO) 65.7532 Tj +[1 0 0 1 137.753 471.838] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -471.838] cm +[1 0 0 1 0 0] Tm +0 0 Td +140.244 471.838 Td +/F130_0 9.9626 Tf +(set.) 13.5591 Tj +[1 0 0 1 72 470.528] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -460.63] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 449.985 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(compile,) 34.5901 Tj +-250 TJm +(an) 9.40469 Tj +-250 TJm +(assertion) 35.417 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(ailure) 22.6848 Tj +-250 TJm +(yields) 23.8007 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(message:) 36.5229 Tj +[1 0 0 1 72 447.828] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -437.93] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 428.131 Td +/F130_0 9.9626 Tf +(bzip2/libbzip2:) 60.3335 Tj +-310 TJm +(internal) 30.4357 Tj +-250 TJm +(error) 19.3573 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(N.) 9.68365 Tj +[1 0 0 1 72 425.975] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -416.077] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 406.278 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-332 TJm +(is) 6.64505 Tj +-331 TJm +(a) 4.42339 Tj +-332 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-332 TJm +(in) 7.7509 Tj +-331 TJm +(bzip2/libbzip2,) 60.0546 Tj +-352 TJm +(1.0.5) 19.9252 Tj +-332 TJm +(of) 8.29885 Tj +-332 TJm +(10) 9.9626 Tj +-332 TJm +(December) 40.9363 Tj +-331 TJm +(2007.) 22.4159 Tj +-555 TJm +(Please) 25.4544 Tj +-332 TJm +(report) 23.7907 Tj +-332 TJm +(it) 5.53921 Tj +-331 TJm +(to) 7.7509 Tj +-332 TJm +(me) 12.1743 Tj +-332 TJm +(at:) 9.9626 Tj +-473 TJm +(jse) 11.0684 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard@bzip.or) 49.8429 Tj +18 TJm +(g.) 7.47195 Tj +-1110 TJm +(If) 6.63509 Tj +-332 TJm +(this) 14.396 Tj +72 394.323 Td +(happened) 38.1767 Tj +-297 TJm +(when) 21.579 Tj +-298 TJm +(you) 14.9439 Tj +-297 TJm +(were) 19.3573 Tj +-297 TJm +(using) 21.589 Tj +-297 TJm +(some) 21.031 Tj +-298 TJm +(program) 33.7533 Tj +-297 TJm +(which) 24.3486 Tj +-297 TJm +(uses) 17.1556 Tj +-297 TJm +(libbzip2) 32.6574 Tj +-298 TJm +(as) 8.29885 Tj +-297 TJm +(a) 4.42339 Tj +-297 TJm +(component,) 46.7644 Tj +-309 TJm +(you) 14.9439 Tj +-298 TJm +(should) 26.5703 Tj +-297 TJm +(also) 16.0497 Tj +-297 TJm +(report) 23.7907 Tj +-297 TJm +(this) 14.396 Tj +-298 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +72 382.368 Td +(to) 7.7509 Tj +-264 TJm +(the) 12.1743 Tj +-264 TJm +(author\(s\)) 35.965 Tj +-264 TJm +(of) 8.29885 Tj +-264 TJm +(that) 14.9439 Tj +-264 TJm +(program.) 36.2439 Tj +-703 TJm +(Please) 25.4544 Tj +-264 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-264 TJm +(an) 9.40469 Tj +-264 TJm +(ef) 7.74094 Tj +25 TJm +(fort) 14.386 Tj +-264 TJm +(to) 7.7509 Tj +-264 TJm +(report) 23.7907 Tj +-263 TJm +(this) 14.396 Tj +-264 TJm +(b) 4.9813 Tj +20 TJm +(ug;) 12.7322 Tj +-271 TJm +(timely) 25.4644 Tj +-264 TJm +(and) 14.386 Tj +-264 TJm +(accurate) 33.1854 Tj +-264 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-264 TJm +(reports) 27.6661 Tj +-264 TJm +(e) 4.42339 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(entually) 32.0995 Tj +72 370.413 Td +(lead) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(higher) 25.4544 Tj +-250 TJm +(quality) 27.6761 Tj +-250 TJm +(softw) 22.1369 Tj +10 TJm +(are.) 14.655 Tj +-620 TJm +(Thanks.) 31.8205 Tj +-620 TJm +(Julian) 23.8007 Tj +-250 TJm +(Se) 9.9626 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(ard,) 15.2129 Tj +-250 TJm +(10) 9.9626 Tj +-250 TJm +(December) 40.9363 Tj +-250 TJm +(2007.) 22.4159 Tj +[1 0 0 1 72 368.256] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.801] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -348.557] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 338.758 Td +/F130_0 9.9626 Tf +(where) 24.3386 Tj +[1 0 0 1 98.8312 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -98.8312 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +98.8312 338.758 Td +/F134_0 9.9626 Tf +(N) 5.97756 Tj +[1 0 0 1 104.809 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.809 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +107.302 338.758 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(error) 19.3573 Tj +-251 TJm +(code) 18.8094 Tj +-250 TJm +(number) 30.4357 Tj +55 TJm +(.) 2.49065 Tj +-621 TJm +(If) 6.63509 Tj +[1 0 0 1 230.81 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -230.81 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +230.81 338.758 Td +/F134_0 9.9626 Tf +(N) 5.97756 Tj +-600 TJm +(==) 11.9551 Tj +-600 TJm +(1007) 23.9102 Tj +[1 0 0 1 284.608 338.758] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -284.608 -338.758] cm +[1 0 0 1 0 0] Tm +0 0 Td +284.608 338.758 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(also) 16.0497 Tj +-251 TJm +(prints) 22.6948 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xtra) 15.4918 Tj +-250 TJm +(te) 7.193 Tj +15 TJm +(xt) 7.7509 Tj +-250 TJm +(advising) 33.7633 Tj +-251 TJm +(the) 12.1743 Tj +-250 TJm +(reader) 24.8866 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(unreliable) 39.8404 Tj +72 326.803 Td +(memory) 33.2053 Tj +-425 TJm +(is) 6.64505 Tj +-424 TJm +(often) 20.4731 Tj +-425 TJm +(associated) 40.9463 Tj +-425 TJm +(with) 17.7135 Tj +-424 TJm +(internal) 30.4357 Tj +-425 TJm +(error) 19.3573 Tj +-424 TJm +(1007.) 22.4159 Tj +-834 TJm +(\(This) 21.031 Tj +-425 TJm +(is) 6.64505 Tj +-425 TJm +(a) 4.42339 Tj +-424 TJm +(frequently-observ) 70.8241 Tj +15 TJm +(ed-phenomenon) 64.189 Tj +-425 TJm +(with) 17.7135 Tj +-425 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +72 314.848 Td +(1.0.0/1.0.1\).) 48.4282 Tj +[1 0 0 1 72 313.065] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -303.167] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 292.995 Td +/F134_0 9.9626 Tf +(exit\(3\)) 41.8429 Tj +[1 0 0 1 113.843 292.995] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -292.995] cm +[1 0 0 1 0 0] Tm +0 0 Td +116.334 292.995 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(then) 17.1556 Tj +-250 TJm +(called.) 26.2813 Tj +[1 0 0 1 72 291.899] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.8981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -282.001] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 271.142 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +[1 0 0 1 95.0933 271.142] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -95.0933 -271.142] cm +[1 0 0 1 0 0] Tm +0 0 Td +95.0933 271.142 Td +/F134_0 9.9626 Tf +(stdio) 29.8878 Tj +[1 0 0 1 124.981 271.142] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -124.981 -271.142] cm +[1 0 0 1 0 0] Tm +0 0 Td +124.981 271.142 Td +/F130_0 9.9626 Tf +(-free) 18.7994 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(assertion) 35.417 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(ailures) 26.5603 Tj +-250 TJm +(result) 22.1369 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(call) 14.386 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(function) 33.2053 Tj +-250 TJm +(declared) 33.7433 Tj +-250 TJm +(as:) 11.0684 Tj +[1 0 0 1 72 268.985] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -259.62] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 259.62 Td +/F134_0 9.9626 Tf +(extern) 35.8654 Tj +-426 TJm +(void) 23.9102 Tj +-426 TJm +(bz_internal_error) 101.619 Tj +-426 TJm +(\() 5.97756 Tj +-426 TJm +(int) 17.9327 Tj +-426 TJm +(errcode) 41.8429 Tj +-426 TJm +(\);) 11.9551 Tj +[1 0 0 1 72 244.078] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.4846] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -234.18] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 222.225 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(rele) 14.9339 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant) 12.1743 Tj +-250 TJm +(code) 18.8094 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(passed) 26.5603 Tj +-250 TJm +(as) 8.29885 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(parameter) 39.8305 Tj +55 TJm +(.) 2.49065 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(supply) 26.5703 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(function.) 35.696 Tj +[1 0 0 1 72 220.068] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -210.17] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 200.372 Td +/F130_0 9.9626 Tf +(In) 8.29885 Tj +-294 TJm +(either) 22.6848 Tj +-294 TJm +(case,) 19.6363 Tj +-306 TJm +(once) 18.8094 Tj +-294 TJm +(an) 9.40469 Tj +-294 TJm +(assertion) 35.417 Tj +-294 TJm +(f) 3.31755 Tj +10 TJm +(ailure) 22.6848 Tj +-294 TJm +(has) 13.2801 Tj +-295 TJm +(occurred,) 37.3398 Tj +-305 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +[1 0 0 1 306.541 200.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -306.541 -200.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +306.541 200.372 Td +/F134_0 9.9626 Tf +(bz_stream) 53.798 Tj +[1 0 0 1 360.339 200.372] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -360.339 -200.372] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.271 200.372 Td +/F130_0 9.9626 Tf +(records) 29.3199 Tj +-294 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +20 TJm +(olv) 12.7322 Tj +15 TJm +(ed) 9.40469 Tj +-294 TJm +(can) 13.8281 Tj +-295 TJm +(be) 9.40469 Tj +-294 TJm +(re) 7.74094 Tj +15 TJm +(g) 4.9813 Tj +5 TJm +(arded) 22.1269 Tj +-294 TJm +(as) 8.29885 Tj +-294 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +25 TJm +(alid.) 17.4346 Tj +72 188.417 Td +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(attempt) 29.8878 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(resume) 28.772 Tj +-250 TJm +(normal) 28.224 Tj +-250 TJm +(operation) 37.6287 Tj +-250 TJm +(with) 17.7135 Tj +-250 TJm +(them.) 22.4159 Tj +[1 0 0 1 72 186.26] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -176.362] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 166.564 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-299 TJm +(may) 17.1556 Tj +65 TJm +(,) 2.49065 Tj +-310 TJm +(of) 8.29885 Tj +-299 TJm +(course,) 28.493 Tj +-311 TJm +(change) 28.2141 Tj +-298 TJm +(critical) 27.6661 Tj +-299 TJm +(error) 19.3573 Tj +-298 TJm +(handling) 34.8691 Tj +-299 TJm +(to) 7.7509 Tj +-298 TJm +(suit) 14.396 Tj +-299 TJm +(your) 18.2614 Tj +-298 TJm +(needs.) 25.1755 Tj +-912 TJm +(As) 11.0684 Tj +-298 TJm +(I) 3.31755 Tj +-299 TJm +(said) 16.0497 Tj +-298 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-311 TJm +(critical) 27.6661 Tj +-299 TJm +(errors) 23.2328 Tj +-298 TJm +(indicate) 31.5416 Tj +-299 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +72 154.608 Td +(in) 7.7509 Tj +-263 TJm +(the) 12.1743 Tj +-263 TJm +(library) 26.5603 Tj +-263 TJm +(and) 14.386 Tj +-263 TJm +(should) 26.5703 Tj +-263 TJm +(not) 12.7322 Tj +-263 TJm +(occur) 22.1269 Tj +55 TJm +(.) 2.49065 Tj +-697 TJm +(All) 12.7322 Tj +-263 TJm +("normal") 36.3535 Tj +-263 TJm +(error) 19.3573 Tj +-263 TJm +(situations) 38.1966 Tj +-263 TJm +(are) 12.1643 Tj +-263 TJm +(indicated) 36.5229 Tj +-263 TJm +(via) 12.1743 Tj +-263 TJm +(error) 19.3573 Tj +-263 TJm +(return) 23.7907 Tj +-263 TJm +(codes) 22.6848 Tj +-263 TJm +(from) 19.3673 Tj +-263 TJm +(functions,) 39.5714 Tj +72 142.653 Td +(and) 14.386 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(reco) 17.1456 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ered) 17.1456 Tj +-250 TJm +(from.) 21.8579 Tj +[1 0 0 1 72 142.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -132.656] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 107.965 Td +/F122_0 20.6585 Tf +(3.8.) 34.4584 Tj +-278 TJm +(Making) 71.1685 Tj +-278 TJm +(a) 11.4861 Tj +-278 TJm +(Windo) 63.1117 Tj +15 TJm +(ws) 27.5584 Tj +-278 TJm +(DLL) 40.1601 Tj +[1 0 0 1 72 103.369] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.898] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -93.4708] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 86.112 Td +/F130_0 9.9626 Tf +(Ev) 11.0684 Tj +15 TJm +(erything) 33.2053 Tj +-328 TJm +(related) 27.1082 Tj +-327 TJm +(to) 7.7509 Tj +-328 TJm +(W) 9.40469 Tj +40 TJm +(indo) 17.7135 Tj +25 TJm +(ws) 11.0684 Tj +-328 TJm +(has) 13.2801 Tj +-327 TJm +(been) 18.8094 Tj +-328 TJm +(contrib) 28.224 Tj +20 TJm +(uted) 17.1556 Tj +-328 TJm +(by) 9.9626 Tj +-327 TJm +(Y) 7.193 Tj +110 TJm +(oshioka) 30.9936 Tj +-328 TJm +(Tsuneo) 29.3299 Tj +-328 TJm +(\() 3.31755 Tj +[1 0 0 1 378.139 86.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -378.139 -86.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +378.139 86.112 Td +/F134_0 9.9626 Tf +(tsuneo@rr.iij4u.or.jp) 125.529 Tj +[1 0 0 1 503.668 86.112] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -503.668 -86.112] cm +[1 0 0 1 0 0] Tm +0 0 Td +503.668 86.112 Td +/F130_0 9.9626 Tf +(\),) 5.8082 Tj +-347 TJm +(so) 8.85675 Tj +-328 TJm +(you) 14.9439 Tj +72 74.1568 Td +(should) 26.5703 Tj +-250 TJm +(send) 18.2614 Tj +-250 TJm +(your) 18.2614 Tj +-250 TJm +(queries) 28.772 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(him) 15.5018 Tj +-250 TJm +(\(b) 8.29885 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(perhaps) 30.9837 Tj +-250 TJm +(Cc:) 13.8381 Tj +-310 TJm +(me,) 14.6649 Tj +[1 0 0 1 287.958 74.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -287.958 -74.1568] cm +[1 0 0 1 0 0] Tm +0 0 Td +287.958 74.1568 Td +/F134_0 9.9626 Tf +(jseward@bzip.org) 95.641 Tj +[1 0 0 1 383.6 74.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -383.6 -74.1568] cm +[1 0 0 1 0 0] Tm +0 0 Td +383.6 74.1568 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +[1 0 0 1 72 72] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.1482] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.9738] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -51.071] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 51.071 Td +/F130_0 9.9626 Tf +(29) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 33 33 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 8.9114] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 76.4979 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -342.569 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +419.067 749.245 Td +/F130_0 9.9626 Tf +(Programming) 54.7943 Tj +-250 TJm +(with) 17.7135 Tj +[1 0 0 1 496.556 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -496.556 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.556 749.245 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 544.376 749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -278.305 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -5.0363] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(My) 13.8381 Tj +-367 TJm +(v) 4.9813 Tj +25 TJm +(ague) 18.8094 Tj +-367 TJm +(understanding) 56.4481 Tj +-367 TJm +(of) 8.29885 Tj +-367 TJm +(what) 19.3673 Tj +-368 TJm +(to) 7.7509 Tj +-367 TJm +(do) 9.9626 Tj +-367 TJm +(is:) 9.41466 Tj +-544 TJm +(using) 21.589 Tj +-367 TJm +(V) 7.193 Tj +60 TJm +(isual) 18.8194 Tj +-367 TJm +(C++) 17.8829 Tj +-367 TJm +(5.0,) 14.9439 Tj +-397 TJm +(open) 19.3673 Tj +-367 TJm +(the) 12.1743 Tj +-367 TJm +(project) 27.6661 Tj +-367 TJm +(\002le) 12.7322 Tj +[1 0 0 1 432.966 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -432.966 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +432.966 710.037 Td +/F134_0 9.9626 Tf +(libbz2.dsp) 59.7756 Tj +[1 0 0 1 492.742 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -492.742 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +492.742 710.037 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-396 TJm +(and) 14.386 Tj +-368 TJm +(b) 4.9813 Tj +20 TJm +(uild.) 17.9925 Tj +72 698.082 Td +(That') 21.579 Tj +55 TJm +(s) 3.87545 Tj +-250 TJm +(all.) 12.4533 Tj +[1 0 0 1 72 697.983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -688.02] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 676.164 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-284 TJm +(you) 14.9439 Tj +-284 TJm +(can') 17.1456 Tj +18 TJm +(t) 2.7696 Tj +-285 TJm +(open) 19.3673 Tj +-284 TJm +(the) 12.1743 Tj +-284 TJm +(project) 27.6661 Tj +-284 TJm +(\002le) 12.7322 Tj +-284 TJm +(for) 11.6164 Tj +-285 TJm +(some) 21.031 Tj +-284 TJm +(reason,) 28.493 Tj +-293 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-284 TJm +(a) 4.42339 Tj +-284 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-284 TJm +(one,) 16.8766 Tj +-293 TJm +(naming) 29.8878 Tj +-284 TJm +(these) 20.4731 Tj +-284 TJm +(\002les:) 19.3773 Tj +[1 0 0 1 424.505 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -424.505 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +424.505 676.164 Td +/F134_0 9.9626 Tf +(blocksort.c) 65.7532 Tj +[1 0 0 1 490.259 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -490.259 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +490.259 676.164 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 495.666 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -495.666 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +495.666 676.164 Td +/F134_0 9.9626 Tf +(bzlib.c) 41.8429 Tj +[1 0 0 1 537.509 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -537.509 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +537.509 676.164 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 72 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 664.209 Td +/F134_0 9.9626 Tf +(compress.c) 59.7756 Tj +[1 0 0 1 131.776 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -131.776 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +131.776 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 136.436 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -136.436 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +136.436 664.209 Td +/F134_0 9.9626 Tf +(crctable.c) 59.7756 Tj +[1 0 0 1 196.211 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.211 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.211 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 200.871 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -200.871 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +200.871 664.209 Td +/F134_0 9.9626 Tf +(decompress.c) 71.7307 Tj +[1 0 0 1 272.602 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -272.602 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +272.602 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 277.262 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -277.262 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +277.262 664.209 Td +/F134_0 9.9626 Tf +(huffman.c) 53.798 Tj +[1 0 0 1 331.06 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -331.06 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +331.06 664.209 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 335.72 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -335.72 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.72 664.209 Td +/F134_0 9.9626 Tf +(randtable.c) 65.7532 Tj +[1 0 0 1 401.473 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.473 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +403.562 664.209 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 420.037 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -420.037 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +420.037 664.209 Td +/F134_0 9.9626 Tf +(libbz2.def) 59.7756 Tj +[1 0 0 1 479.812 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.812 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +479.812 664.209 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-593 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-210 TJm +(will) 15.5018 Tj +-209 TJm +(also) 16.0497 Tj +72 652.254 Td +(need) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(name) 21.579 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(header) 26.5503 Tj +-250 TJm +(\002les) 16.6077 Tj +[1 0 0 1 190.415 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -190.415 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +190.415 652.254 Td +/F134_0 9.9626 Tf +(bzlib.h) 41.8429 Tj +[1 0 0 1 232.258 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -232.258 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.748 652.254 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 251.625 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -251.625 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +251.625 652.254 Td +/F134_0 9.9626 Tf +(bzlib_private.h) 89.6634 Tj +[1 0 0 1 341.289 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -341.289 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +341.289 652.254 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 650.72] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -640.757] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 630.336 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(VC++,) 27.5665 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(need) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(de\002ne) 24.3486 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(proprocessor) 51.4568 Tj +-250 TJm +(symbol) 29.3399 Tj +[1 0 0 1 363.634 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.634 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.634 630.336 Td +/F134_0 9.9626 Tf +(_WIN32) 35.8654 Tj +[1 0 0 1 399.5 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -399.5 -630.336] cm +[1 0 0 1 0 0] Tm +0 0 Td +399.5 630.336 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 628.179] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -618.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 608.418 Td +/F130_0 9.9626 Tf +(Finally) 28.234 Tj +65 TJm +(,) 2.49065 Tj +[1 0 0 1 104.568 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -104.568 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.568 608.418 Td +/F134_0 9.9626 Tf +(dlltest.c) 53.798 Tj +[1 0 0 1 158.366 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -158.366 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +160.856 608.418 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(sample) 28.224 Tj +-250 TJm +(program) 33.7533 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(DLL.) 21.8579 Tj +-500 TJm +(It) 6.08715 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(project) 27.6661 Tj +-250 TJm +(\002le,) 15.2229 Tj +[1 0 0 1 388.58 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -388.58 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +388.58 608.418 Td +/F134_0 9.9626 Tf +(dlltest.dsp) 65.7532 Tj +[1 0 0 1 454.333 608.418] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -454.333 -608.418] cm +[1 0 0 1 0 0] Tm +0 0 Td +454.333 608.418 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 606.262] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -596.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 586.501 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(mak) 17.1556 Tj +10 TJm +(e\002le) 17.1556 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(V) 7.193 Tj +60 TJm +(isual) 18.8194 Tj +-250 TJm +(C,) 9.1357 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(look) 17.7135 Tj +-250 TJm +(at) 7.193 Tj +[1 0 0 1 292.212 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -292.212 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +292.212 586.501 Td +/F134_0 9.9626 Tf +(makefile.msc) 71.7307 Tj +[1 0 0 1 363.943 586.501] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.943 -586.501] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.943 586.501 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 584.344] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -574.381] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 564.583 Td +/F130_0 9.9626 Tf +(Be) 11.0684 Tj +-291 TJm +(a) 4.42339 Tj +15 TJm +(w) 7.193 Tj +10 TJm +(are) 12.1643 Tj +-291 TJm +(that) 14.9439 Tj +-291 TJm +(if) 6.08715 Tj +-291 TJm +(you) 14.9439 Tj +-291 TJm +(compile) 32.0995 Tj +[1 0 0 1 192.069 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -192.069 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +192.069 564.583 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 221.958 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -221.958 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +224.857 564.583 Td +/F130_0 9.9626 Tf +(itself) 19.9252 Tj +-291 TJm +(on) 9.9626 Tj +-291 TJm +(W) 9.40469 Tj +40 TJm +(in32,) 20.2042 Tj +-301 TJm +(you) 14.9439 Tj +-291 TJm +(must) 19.3773 Tj +-291 TJm +(set) 11.0684 Tj +[1 0 0 1 346.841 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -346.841 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +346.841 564.583 Td +/F134_0 9.9626 Tf +(BZ_UNIX) 41.8429 Tj +[1 0 0 1 388.685 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -388.685 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +391.583 564.583 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-291 TJm +(0) 4.9813 Tj +-291 TJm +(and) 14.386 Tj +[1 0 0 1 427.399 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -427.399 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +427.399 564.583 Td +/F134_0 9.9626 Tf +(BZ_LCCWIN32) 65.7532 Tj +[1 0 0 1 493.153 564.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.153 -564.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +496.052 564.583 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-291 TJm +(1,) 7.47195 Tj +-301 TJm +(in) 7.7509 Tj +-291 TJm +(the) 12.1743 Tj +72 552.628 Td +(\002le) 12.7322 Tj +[1 0 0 1 87.2227 552.628] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -87.2227 -552.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +87.2227 552.628 Td +/F134_0 9.9626 Tf +(bzip2.c) 41.8429 Tj +[1 0 0 1 129.066 552.628] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -129.066 -552.628] cm +[1 0 0 1 0 0] Tm +0 0 Td +129.066 552.628 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(before) 25.4445 Tj +-250 TJm +(compiling.) 42.899 Tj +-310 TJm +(Otherwise) 40.9463 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(resulting) 34.8691 Tj +-250 TJm +(binary) 25.4544 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-250 TJm +(correctly) 35.4071 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 550.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -540.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 530.71 Td +/F130_0 9.9626 Tf +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(en') 12.7222 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(tried) 18.2614 Tj +-250 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(stuf) 14.9439 Tj +25 TJm +(f) 3.31755 Tj +-250 TJm +(myself,) 29.6088 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(looks) 21.589 Tj +-250 TJm +(plausible.) 38.4656 Tj +[1 0 0 1 72 528.553] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -477.701] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(30) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 34 34 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -140.398 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -13.9477] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -720] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 701.916 Td +/F122_0 24.7902 Tf +(4.) 20.675 Tj +-278 TJm +(Miscellanea) 139.172 Tj +[1 0 0 1 72 701.606] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.1347] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -14.1161] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -678.355] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 658.006 Td +/F122_0 17.2154 Tf +(T) 10.5186 Tj +80 TJm +(ab) 20.0904 Tj +10 TJm +(le) 14.3576 Tj +-278 TJm +(of) 16.2513 Tj +-278 TJm +(Contents) 74.5943 Tj +[1 0 0 1 72 649.183] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -11.7401] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -637.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 637.443 Td +/F130_0 9.9626 Tf +(4.1.) 14.9439 Tj +-310 TJm +(Limitations) 45.9475 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(format) 26.5603 Tj +[1 0 0 1 255.231 637.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -260.212 -637.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +269.154 637.443 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 637.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -637.443] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 637.443 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 516.09 637.443] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -625.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 625.488 Td +/F130_0 9.9626 Tf +(4.2.) 14.9439 Tj +-310 TJm +(Portability) 42.0721 Tj +-250 TJm +(issues) 23.8007 Tj +[1 0 0 1 158.395 625.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.376 -625.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +172.03 625.488 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 625.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -625.488] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 625.488 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 625.488] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -613.533] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 613.533 Td +/F130_0 9.9626 Tf +(4.3.) 14.9439 Tj +-310 TJm +(Reporting) 39.8504 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +[1 0 0 1 150.993 613.533] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -155.975 -613.533] cm +[1 0 0 1 0 0] Tm +0 0 Td +166.115 613.533 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 613.533] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -613.533] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 613.533 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 516.09 613.533] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7983] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -601.578] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 601.578 Td +/F130_0 9.9626 Tf +(4.4.) 14.9439 Tj +-310 TJm +(Did) 14.9439 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(get) 12.1743 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(right) 18.8194 Tj +-250 TJm +(package?) 37.0609 Tj +[1 0 0 1 212.602 601.578] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 3.0884 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -218.778 -601.578] cm +[1 0 0 1 0 0] Tm +0 0 Td +229.109 601.578 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 601.578] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -601.578] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 601.578 Td +/F130_0 9.9626 Tf +(33) 9.9626 Tj +[1 0 0 1 516.09 601.578] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.7984] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -589.623] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 589.623 Td +/F130_0 9.9626 Tf +(4.5.) 14.9439 Tj +-310 TJm +(Further) 29.3299 Tj +-250 TJm +(Reading) 33.2053 Tj +[1 0 0 1 155.058 589.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4906 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -160.039 -589.623] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.361 589.623 Td +/F147_0 9.9626 Tf +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +-166 TJm +(:) 2.7696 Tj +-167 TJm +(:) 2.7696 Tj +[1 0 0 1 506.127 589.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -506.127 -589.623] cm +[1 0 0 1 0 0] Tm +0 0 Td +506.127 589.623 Td +/F130_0 9.9626 Tf +(34) 9.9626 Tj +[1 0 0 1 516.09 589.623] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -444.09 -2.1568] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.1348] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -568.7] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 558.901 Td +/F130_0 9.9626 Tf +(These) 23.7907 Tj +-250 TJm +(are) 12.1643 Tj +-250 TJm +(just) 14.396 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(random) 30.4357 Tj +-250 TJm +(thoughts) 34.3212 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(mine.) 22.4159 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(our) 13.2801 Tj +-250 TJm +(mileage) 31.5416 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(ary) 12.7222 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 556.744] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -547.113] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 524.48 Td +/F122_0 20.6585 Tf +(4.1.) 34.4584 Tj +-278 TJm +(Limitations) 110.192 Tj +-278 TJm +(of) 19.5016 Tj +-278 TJm +(the) 30.9877 Tj +-278 TJm +(compressed) 121.699 Tj +-278 TJm +(\002le) 29.8515 Tj +-278 TJm +(f) 6.87928 Tj +20 TJm +(ormat) 57.3893 Tj +[1 0 0 1 72 520.203] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -510.572] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 502.893 Td +/F134_0 9.9626 Tf +(bzip2-1.0.X) 65.7532 Tj +[1 0 0 1 137.753 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.753 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.753 502.893 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +[1 0 0 1 143.405 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -143.405 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +143.405 502.893 Td +/F134_0 9.9626 Tf +(0.9.5) 29.8878 Tj +[1 0 0 1 173.293 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -173.293 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +176.453 502.893 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 194 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -194 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +194 502.893 Td +/F134_0 9.9626 Tf +(0.9.0) 29.8878 Tj +[1 0 0 1 223.888 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -223.888 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +227.048 502.893 Td +/F130_0 9.9626 Tf +(use) 13.2801 Tj +-317 TJm +(e) 4.42339 Tj +15 TJm +(xactly) 24.3486 Tj +-317 TJm +(the) 12.1743 Tj +-318 TJm +(same) 20.4731 Tj +-317 TJm +(\002le) 12.7322 Tj +-317 TJm +(format) 26.5603 Tj +-317 TJm +(as) 8.29885 Tj +-318 TJm +(the) 12.1743 Tj +-317 TJm +(original) 30.9936 Tj +-317 TJm +(v) 4.9813 Tj +15 TJm +(ersion,) 26.8392 Tj +[1 0 0 1 455.801 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.801 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +455.801 502.893 Td +/F134_0 9.9626 Tf +(bzip2-0.1) 53.798 Tj +[1 0 0 1 509.599 502.893] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.599 -502.893] cm +[1 0 0 1 0 0] Tm +0 0 Td +509.599 502.893 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-1023 TJm +(This) 17.7135 Tj +72 490.938 Td +(decision) 33.2053 Tj +-222 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-222 TJm +(made) 21.579 Tj +-222 TJm +(in) 7.7509 Tj +-221 TJm +(the) 12.1743 Tj +-222 TJm +(interests) 33.2053 Tj +-222 TJm +(of) 8.29885 Tj +-222 TJm +(stability) 32.1095 Tj +65 TJm +(.) 2.49065 Tj +-601 TJm +(Creating) 34.3112 Tj +-222 TJm +(yet) 12.1743 Tj +-222 TJm +(another) 29.8778 Tj +-222 TJm +(incompatible) 52.0247 Tj +-221 TJm +(compressed) 47.0334 Tj +-222 TJm +(\002le) 12.7322 Tj +-222 TJm +(format) 26.5603 Tj +-222 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-222 TJm +(create) 23.7807 Tj +72 478.983 Td +(further) 27.1082 Tj +-250 TJm +(confusion) 39.2925 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(disruption) 40.4083 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(users.) 22.9638 Tj +[1 0 0 1 72 476.826] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -467.194] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 457.396 Td +/F130_0 9.9626 Tf +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-234 TJm +(this) 14.396 Tj +-229 TJm +(is) 6.64505 Tj +-230 TJm +(not) 12.7322 Tj +-229 TJm +(a) 4.42339 Tj +-230 TJm +(painless) 32.0995 Tj +-229 TJm +(decision.) 35.696 Tj +-606 TJm +(De) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(elopment) 37.0808 Tj +-230 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-230 TJm +(since) 20.4731 Tj +-229 TJm +(the) 12.1743 Tj +-230 TJm +(release) 27.6562 Tj +-229 TJm +(of) 8.29885 Tj +[1 0 0 1 407.317 457.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -407.317 -457.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +407.317 457.396 Td +/F134_0 9.9626 Tf +(bzip2-0.1) 53.798 Tj +[1 0 0 1 461.115 457.396] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -461.115 -457.396] cm +[1 0 0 1 0 0] Tm +0 0 Td +463.402 457.396 Td +/F130_0 9.9626 Tf +(in) 7.7509 Tj +-230 TJm +(August) 28.782 Tj +-229 TJm +(1997) 19.9252 Tj +-230 TJm +(has) 13.2801 Tj +72 445.441 Td +(sho) 13.8381 Tj +25 TJm +(wn) 12.1743 Tj +-226 TJm +(comple) 29.3299 Tj +15 TJm +(xities) 21.589 Tj +-226 TJm +(in) 7.7509 Tj +-225 TJm +(the) 12.1743 Tj +-226 TJm +(\002le) 12.7322 Tj +-226 TJm +(format) 26.5603 Tj +-226 TJm +(which) 24.3486 Tj +-226 TJm +(slo) 11.6264 Tj +25 TJm +(w) 7.193 Tj +-225 TJm +(do) 9.9626 Tj +25 TJm +(wn) 12.1743 Tj +-226 TJm +(decompression) 59.7656 Tj +-226 TJm +(and,) 16.8766 Tj +-231 TJm +(in) 7.7509 Tj +-226 TJm +(retrospect,) 41.7732 Tj +-230 TJm +(are) 12.1643 Tj +-226 TJm +(unnecessary) 48.6872 Tj +65 TJm +(.) 2.49065 Tj +-604 TJm +(These) 23.7907 Tj +-226 TJm +(are:) 14.9339 Tj +[1 0 0 1 72 443.284] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.0613] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -414.222] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 414.222 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 414.222] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -414.222] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 414.222 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-265 TJm +(run-length) 41.5042 Tj +-266 TJm +(encoder) 31.5316 Tj +40 TJm +(,) 2.49065 Tj +-269 TJm +(which) 24.3486 Tj +-265 TJm +(is) 6.64505 Tj +-265 TJm +(the) 12.1743 Tj +-266 TJm +(\002rst) 15.5018 Tj +-265 TJm +(of) 8.29885 Tj +-265 TJm +(the) 12.1743 Tj +-266 TJm +(compression) 50.3609 Tj +-265 TJm +(transformations,) 65.0259 Tj +-269 TJm +(is) 6.64505 Tj +-265 TJm +(entirely) 30.4357 Tj +-266 TJm +(irrele) 21.0211 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant.) 14.6649 Tj +-711 TJm +(The) 15.4918 Tj +-266 TJm +(original) 30.9936 Tj +86.944 402.267 Td +(purpose) 31.5416 Tj +-301 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-301 TJm +(to) 7.7509 Tj +-301 TJm +(protect) 27.6661 Tj +-301 TJm +(the) 12.1743 Tj +-301 TJm +(sorting) 27.6761 Tj +-301 TJm +(algorithm) 38.7446 Tj +-301 TJm +(from) 19.3673 Tj +-301 TJm +(the) 12.1743 Tj +-301 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-301 TJm +(w) 7.193 Tj +10 TJm +(orst) 14.9439 Tj +-301 TJm +(case) 17.1456 Tj +-301 TJm +(input:) 23.2527 Tj +-412 TJm +(a) 4.42339 Tj +-301 TJm +(string) 22.6948 Tj +-301 TJm +(of) 8.29885 Tj +-301 TJm +(repeated) 33.7433 Tj +-301 TJm +(symbols.) 35.706 Tj +-927 TJm +(But) 14.396 Tj +86.944 390.312 Td +(algorithm) 38.7446 Tj +-274 TJm +(steps) 19.9252 Tj +-275 TJm +(Q6a) 16.5977 Tj +-274 TJm +(and) 14.386 Tj +-274 TJm +(Q6b) 17.1556 Tj +-275 TJm +(in) 7.7509 Tj +-274 TJm +(the) 12.1743 Tj +-274 TJm +(original) 30.9936 Tj +-275 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheel) 40.3884 Tj +1 TJm +(er) 7.74094 Tj +-275 TJm +(technical) 35.965 Tj +-274 TJm +(report) 23.7907 Tj +-274 TJm +(\(SRC-124\)) 43.7259 Tj +-275 TJm +(sho) 13.8381 Tj +25 TJm +(w) 7.193 Tj +-274 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-274 TJm +(repeats) 28.2141 Tj +-275 TJm +(can) 13.8281 Tj +86.944 378.357 Td +(be) 9.40469 Tj +-250 TJm +(handled) 31.5416 Tj +-250 TJm +(without) 30.4457 Tj +-250 TJm +(dif) 11.0684 Tj +25 TJm +(\002culty) 25.4644 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(sorting.) 30.1668 Tj +[1 0 0 1 269.617 378.357] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -197.617 -21.5867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -356.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 356.77 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 356.77] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -356.77] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 356.77 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-293 TJm +(randomisation) 57.006 Tj +-293 TJm +(mechanism) 45.3796 Tj +-293 TJm +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-294 TJm +(really) 22.6848 Tj +-293 TJm +(need) 18.8094 Tj +-293 TJm +(to) 7.7509 Tj +-293 TJm +(be) 9.40469 Tj +-293 TJm +(there.) 22.4059 Tj +-879 TJm +(Udi) 14.9439 Tj +-294 TJm +(Manber) 30.9837 Tj +-293 TJm +(and) 14.386 Tj +-293 TJm +(Gene) 21.0211 Tj +-293 TJm +(Myers) 25.4544 Tj +-293 TJm +(published) 38.7446 Tj +-294 TJm +(a) 4.42339 Tj +-293 TJm +(suf) 12.1743 Tj +25 TJm +(\002x) 10.5205 Tj +86.944 344.815 Td +(array) 20.4632 Tj +-238 TJm +(construction) 49.2551 Tj +-239 TJm +(algorithm) 38.7446 Tj +-238 TJm +(a) 4.42339 Tj +-238 TJm +(fe) 7.74094 Tj +25 TJm +(w) 7.193 Tj +-239 TJm +(years) 21.0211 Tj +-238 TJm +(back,) 21.3 Tj +-241 TJm +(which) 24.3486 Tj +-238 TJm +(can) 13.8281 Tj +-238 TJm +(be) 9.40469 Tj +-239 TJm +(emplo) 24.9065 Tj +10 TJm +(yed) 14.386 Tj +-238 TJm +(to) 7.7509 Tj +-238 TJm +(sort) 14.9439 Tj +-239 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-238 TJm +(block,) 24.6275 Tj +-241 TJm +(no) 9.9626 Tj +-238 TJm +(matter) 25.4544 Tj +-238 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-239 TJm +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +86.944 332.86 Td +(in) 7.7509 Tj +-229 TJm +(O\(N) 17.7035 Tj +-230 TJm +(log) 12.7322 Tj +-229 TJm +(N\)) 10.5105 Tj +-230 TJm +(time.) 20.2042 Tj +-606 TJm +(Subsequent) 45.9375 Tj +-230 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-229 TJm +(by) 9.9626 Tj +-230 TJm +(K) 7.193 Tj +15 TJm +(unihik) 25.4644 Tj +10 TJm +(o) 4.9813 Tj +-229 TJm +(Sadakane) 38.1767 Tj +-229 TJm +(has) 13.2801 Tj +-230 TJm +(produced) 37.0708 Tj +-229 TJm +(a) 4.42339 Tj +-230 TJm +(deri) 15.4918 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ati) 9.9626 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-229 TJm +(O\(N) 17.7035 Tj +-230 TJm +(\(log) 16.0497 Tj +-229 TJm +(N\)^2\)) 23.4818 Tj +-230 TJm +(algorithm) 38.7446 Tj +86.944 320.905 Td +(which) 24.3486 Tj +-250 TJm +(usually) 28.782 Tj +-250 TJm +(outperforms) 48.6972 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(Manber) 30.9837 Tj +20 TJm +(-Myers) 28.772 Tj +-250 TJm +(algorithm.) 41.2352 Tj +[1 0 0 1 314.189 320.905] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.189 -11.7883] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -309.116] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 299.318 Td +/F130_0 9.9626 Tf +(I) 3.31755 Tj +-248 TJm +(could) 22.1369 Tj +-248 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-248 TJm +(changed) 33.1954 Tj +-248 TJm +(to) 7.7509 Tj +-248 TJm +(Sadakane') 41.4942 Tj +55 TJm +(s) 3.87545 Tj +-248 TJm +(algorithm,) 41.2352 Tj +-249 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-248 TJm +(I) 3.31755 Tj +-248 TJm +(\002nd) 15.5018 Tj +-248 TJm +(it) 5.53921 Tj +-248 TJm +(to) 7.7509 Tj +-248 TJm +(be) 9.40469 Tj +-248 TJm +(slo) 11.6264 Tj +25 TJm +(wer) 14.9339 Tj +-248 TJm +(than) 17.1556 Tj +[1 0 0 1 392.444 299.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -392.444 -299.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +392.444 299.318 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 422.332 299.318] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -422.332 -299.318] cm +[1 0 0 1 0 0] Tm +0 0 Td +422.332 299.318 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-248 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-248 TJm +(algorithm) 38.7446 Tj +-248 TJm +(for) 11.6164 Tj +-248 TJm +(most) 19.3773 Tj +86.944 287.363 Td +(inputs,) 26.8492 Tj +-370 TJm +(and) 14.386 Tj +-345 TJm +(the) 12.1743 Tj +-346 TJm +(randomisation) 57.006 Tj +-346 TJm +(mechanism) 45.3796 Tj +-345 TJm +(protects) 31.5416 Tj +-346 TJm +(adequately) 43.158 Tj +-345 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-346 TJm +(bad) 14.386 Tj +-346 TJm +(cases.) 23.5117 Tj +-1194 TJm +(I) 3.31755 Tj +-345 TJm +(didn') 21.031 Tj +18 TJm +(t) 2.7696 Tj +-346 TJm +(think) 20.4831 Tj +-346 TJm +(it) 5.53921 Tj +-345 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-346 TJm +(a) 4.42339 Tj +-346 TJm +(good) 19.9252 Tj +86.944 275.408 Td +(tradeof) 28.2141 Tj +25 TJm +(f) 3.31755 Tj +-262 TJm +(to) 7.7509 Tj +-261 TJm +(mak) 17.1556 Tj +10 TJm +(e.) 6.91404 Tj +-690 TJm +(P) 5.53921 Tj +15 TJm +(artly) 18.2614 Tj +-262 TJm +(this) 14.396 Tj +-261 TJm +(is) 6.64505 Tj +-262 TJm +(due) 14.386 Tj +-261 TJm +(to) 7.7509 Tj +-262 TJm +(the) 12.1743 Tj +-262 TJm +(f) 3.31755 Tj +10 TJm +(act) 11.6164 Tj +-261 TJm +(that) 14.9439 Tj +-262 TJm +(I) 3.31755 Tj +-261 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-262 TJm +(not) 12.7322 Tj +-262 TJm +(\003ooded) 29.8878 Tj +-261 TJm +(with) 17.7135 Tj +-262 TJm +(email) 22.1369 Tj +-261 TJm +(complaints) 43.7259 Tj +-262 TJm +(about) 22.1369 Tj +[1 0 0 1 479.557 275.408] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -479.557 -275.408] cm +[1 0 0 1 0 0] Tm +0 0 Td +479.557 275.408 Td +/F134_0 9.9626 Tf +(bzip2-0.1) 53.798 Tj +[1 0 0 1 533.355 275.408] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -533.355 -275.408] cm +[1 0 0 1 0 0] Tm +0 0 Td +533.355 275.408 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +86.944 263.453 Td +(performance) 50.341 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(repetiti) 28.224 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(data,) 19.0883 Tj +-250 TJm +(so) 8.85675 Tj +-250 TJm +(perhaps) 30.9837 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(problem) 33.2053 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(real) 14.9339 Tj +-250 TJm +(inputs.) 26.8492 Tj +[1 0 0 1 72 261.296] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -251.664] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 241.866 Td +/F130_0 9.9626 Tf +(Probably) 35.9749 Tj +-289 TJm +(the) 12.1743 Tj +-288 TJm +(best) 16.0497 Tj +-289 TJm +(long-term) 39.2925 Tj +-289 TJm +(solution,) 34.6001 Tj +-298 TJm +(and) 14.386 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(one) 14.386 Tj +-288 TJm +(I) 3.31755 Tj +-289 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-289 TJm +(incorporated) 50.351 Tj +-288 TJm +(into) 15.5018 Tj +-289 TJm +(0.9.5) 19.9252 Tj +-289 TJm +(and) 14.386 Tj +-288 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +14 TJm +(e,) 6.91404 Tj +-298 TJm +(is) 6.64505 Tj +-289 TJm +(to) 7.7509 Tj +-288 TJm +(use) 13.2801 Tj +-289 TJm +(the) 12.1743 Tj +-289 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +86.944 229.911 Td +(sorting) 27.6761 Tj +-451 TJm +(algorithm) 38.7446 Tj +-452 TJm +(initially) 31.0036 Tj +65 TJm +(,) 2.49065 Tj +-501 TJm +(and) 14.386 Tj +-452 TJm +(f) 3.31755 Tj +10 TJm +(all) 9.9626 Tj +-451 TJm +(back) 18.8094 Tj +-452 TJm +(to) 7.7509 Tj +-451 TJm +(a) 4.42339 Tj +-451 TJm +(O\(N) 17.7035 Tj +-452 TJm +(\(log) 16.0497 Tj +-451 TJm +(N\)^2\)) 23.4818 Tj +-451 TJm +(algorithm) 38.7446 Tj +-452 TJm +(if) 6.08715 Tj +-451 TJm +(the) 12.1743 Tj +-452 TJm +(standard) 33.7533 Tj +-451 TJm +(algorithm) 38.7446 Tj +-451 TJm +(gets) 16.0497 Tj +-452 TJm +(into) 15.5018 Tj +86.944 217.956 Td +(dif) 11.0684 Tj +25 TJm +(\002culties.) 34.0422 Tj +[1 0 0 1 72 217.856] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -21.4871] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -196.369] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 196.369 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 196.369] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -196.369] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 196.369 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-299 TJm +(compressed) 47.0334 Tj +-299 TJm +(\002le) 12.7322 Tj +-299 TJm +(format) 26.5603 Tj +-299 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-300 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-299 TJm +(designed) 35.417 Tj +-299 TJm +(to) 7.7509 Tj +-299 TJm +(be) 9.40469 Tj +-299 TJm +(handled) 31.5416 Tj +-299 TJm +(by) 9.9626 Tj +-299 TJm +(a) 4.42339 Tj +-299 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-312 TJm +(and) 14.386 Tj +-299 TJm +(I) 3.31755 Tj +-299 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-299 TJm +(had) 14.386 Tj +-299 TJm +(to) 7.7509 Tj +-299 TJm +(jump) 20.4831 Tj +-300 TJm +(though) 27.6761 Tj +-299 TJm +(some) 21.031 Tj +86.944 184.414 Td +(hoops) 23.8007 Tj +-278 TJm +(to) 7.7509 Tj +-277 TJm +(produce) 32.0895 Tj +-278 TJm +(an) 9.40469 Tj +-278 TJm +(ef) 7.74094 Tj +25 TJm +(\002cient) 24.9065 Tj +-277 TJm +(implementation) 62.5452 Tj +-278 TJm +(of) 8.29885 Tj +-278 TJm +(decompression.) 62.2563 Tj +-786 TJm +(It') 9.40469 Tj +55 TJm +(s) 3.87545 Tj +-278 TJm +(a) 4.42339 Tj +-277 TJm +(bit) 10.5205 Tj +-278 TJm +(hairy) 20.4731 Tj +65 TJm +(.) 2.49065 Tj +-786 TJm +(T) 6.08715 Tj +35 TJm +(ry) 8.29885 Tj +-278 TJm +(passing) 29.8878 Tj +[1 0 0 1 468.269 184.414] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468.269 -184.414] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.269 184.414 Td +/F134_0 9.9626 Tf +(decompress.c) 71.7307 Tj +[1 0 0 1 540 184.414] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -184.414] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 172.459 Td +/F130_0 9.9626 Tf +(through) 30.9936 Tj +-268 TJm +(the) 12.1743 Tj +-268 TJm +(C) 6.64505 Tj +-268 TJm +(preprocessor) 50.8989 Tj +-269 TJm +(and) 14.386 Tj +-268 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-268 TJm +(see) 12.7222 Tj +-268 TJm +(what) 19.3673 Tj +-268 TJm +(I) 3.31755 Tj +-268 TJm +(mean.) 24.0696 Tj +-729 TJm +(Much) 23.2427 Tj +-268 TJm +(of) 8.29885 Tj +-269 TJm +(this) 14.396 Tj +-268 TJm +(comple) 29.3299 Tj +15 TJm +(xity) 15.5018 Tj +-268 TJm +(could) 22.1369 Tj +-268 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-268 TJm +(been) 18.8094 Tj +-268 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(oided) 22.1369 Tj +-269 TJm +(if) 6.08715 Tj +-268 TJm +(the) 12.1743 Tj +86.944 160.503 Td +(compressed) 47.0334 Tj +-250 TJm +(size) 15.4918 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(each) 18.2515 Tj +-250 TJm +(block) 22.1369 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(recorded) 34.8492 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(data) 16.5977 Tj +-250 TJm +(stream.) 29.0509 Tj +[1 0 0 1 368.754 160.503] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -296.754 -21.5867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -138.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 138.917 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 138.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -138.917] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 138.917 Td +/F130_0 9.9626 Tf +(An) 12.1743 Tj +-250 TJm +(Adler) 22.6848 Tj +20 TJm +(-32) 13.2801 Tj +-250 TJm +(checksum,) 42.3311 Tj +-250 TJm +(rather) 23.2328 Tj +-250 TJm +(than) 17.1556 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(CRC32) 29.8978 Tj +-250 TJm +(checksum,) 42.3311 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(compute.) 36.8018 Tj +[1 0 0 1 424.934 138.917] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.934 -11.7883] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -127.128] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 117.33 Td +/F130_0 9.9626 Tf +(It) 6.08715 Tj +-349 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-349 TJm +(be) 9.40469 Tj +-349 TJm +(f) 3.31755 Tj +10 TJm +(air) 10.5105 Tj +-348 TJm +(to) 7.7509 Tj +-349 TJm +(say) 13.2801 Tj +-349 TJm +(that) 14.9439 Tj +-349 TJm +(the) 12.1743 Tj +[1 0 0 1 201.979 117.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -201.979 -117.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +201.979 117.33 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 231.867 117.33] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -231.867 -117.33] cm +[1 0 0 1 0 0] Tm +0 0 Td +235.342 117.33 Td +/F130_0 9.9626 Tf +(format) 26.5603 Tj +-349 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-349 TJm +(frozen) 25.4445 Tj +-348 TJm +(before) 25.4445 Tj +-349 TJm +(I) 3.31755 Tj +-349 TJm +(properly) 33.7533 Tj +-349 TJm +(and) 14.386 Tj +-349 TJm +(fully) 18.8194 Tj +-349 TJm +(understood) 44.2738 Tj +-348 TJm +(the) 12.1743 Tj +-349 TJm +(performance) 50.341 Tj +72 105.375 Td +(consequences) 54.7744 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(doing) 22.6948 Tj +-250 TJm +(so.) 11.3474 Tj +[1 0 0 1 72 103.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -93.5867] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 83.7883 Td +/F130_0 9.9626 Tf +(Impro) 24.3486 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(ements) 28.224 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(as) 8.29885 Tj +-250 TJm +(able) 16.5977 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(incorporate) 45.3697 Tj +-250 TJm +(into) 15.5018 Tj +-250 TJm +(0.9.0,) 22.4159 Tj +-250 TJm +(despite) 28.224 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(same) 20.4731 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(format,) 29.0509 Tj +-250 TJm +(are:) 14.9339 Tj +[1 0 0 1 72 81.6315] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -30.7796] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(31) 9.9626 Tj +[1 0 0 1 453.269 50.8519] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 35 35 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 710.037 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 710.037 Td +/F130_0 9.9626 Tf +(Single) 25.4644 Tj +-202 TJm +(array) 20.4632 Tj +-201 TJm +(implementation) 62.5452 Tj +-202 TJm +(of) 8.29885 Tj +-202 TJm +(the) 12.1743 Tj +-201 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(erse) 16.0398 Tj +-202 TJm +(BWT) 22.1369 Tj +74 TJm +(.) 2.49065 Tj +-403 TJm +(This) 17.7135 Tj +-202 TJm +(signi\002cantly) 49.2651 Tj +-201 TJm +(speeds) 26.5603 Tj +-202 TJm +(up) 9.9626 Tj +-202 TJm +(decompression,) 62.2563 Tj +-211 TJm +(presumably) 46.4855 Tj +-202 TJm +(because) 31.5316 Tj +86.944 698.082 Td +(it) 5.53921 Tj +-250 TJm +(reduces) 30.4258 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(number) 30.4357 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(cache) 22.6749 Tj +-250 TJm +(misses.) 29.0609 Tj +[1 0 0 1 240.496 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -168.496 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 676.164 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 676.164] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -676.164] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 676.164 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(aster) 18.8094 Tj +-314 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(erse) 16.0398 Tj +-315 TJm +(MTF) 20.4831 Tj +-314 TJm +(transform) 38.7346 Tj +-315 TJm +(for) 11.6164 Tj +-314 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-315 TJm +(MTF) 20.4831 Tj +-314 TJm +(v) 4.9813 Tj +25 TJm +(alues.) 22.9638 Tj +-504 TJm +(The) 15.4918 Tj +-314 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-314 TJm +(implementation) 62.5452 Tj +-315 TJm +(is) 6.64505 Tj +-314 TJm +(based) 22.6848 Tj +-315 TJm +(on) 9.9626 Tj +-314 TJm +(the) 12.1743 Tj +-315 TJm +(notion) 25.4644 Tj +-314 TJm +(of) 8.29885 Tj +-315 TJm +(sliding) 27.1282 Tj +86.944 664.209 Td +(blocks) 26.0123 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(v) 4.9813 Tj +25 TJm +(alues.) 22.9638 Tj +[1 0 0 1 153.932 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -81.9321 -21.9178] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 642.291 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 642.291 Td +/F134_0 9.9626 Tf +(bzip2-0.9.0) 65.7532 Tj +[1 0 0 1 152.697 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -152.697 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.412 642.291 Td +/F130_0 9.9626 Tf +(no) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-272 TJm +(reads) 21.0211 Tj +-273 TJm +(and) 14.386 Tj +-272 TJm +(writes) 24.3486 Tj +-273 TJm +(\002les) 16.6077 Tj +-272 TJm +(with) 17.7135 Tj +[1 0 0 1 282.68 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -282.68 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +282.68 642.291 Td +/F134_0 9.9626 Tf +(fread) 29.8878 Tj +[1 0 0 1 312.568 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -312.568 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +315.282 642.291 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 332.383 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -332.383 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +332.383 642.291 Td +/F134_0 9.9626 Tf +(fwrite) 35.8654 Tj +[1 0 0 1 368.248 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -368.248 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +368.248 642.291 Td +/F130_0 9.9626 Tf +(;) 2.7696 Tj +-284 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-272 TJm +(0.1) 12.4533 Tj +-273 TJm +(used) 18.2614 Tj +[1 0 0 1 441.882 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -441.882 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +441.882 642.291 Td +/F134_0 9.9626 Tf +(putc) 23.9102 Tj +[1 0 0 1 465.792 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -465.792 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +468.507 642.291 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 485.607 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -485.607 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +485.607 642.291 Td +/F134_0 9.9626 Tf +(getc) 23.9102 Tj +[1 0 0 1 509.517 642.291] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.517 -642.291] cm +[1 0 0 1 0 0] Tm +0 0 Td +509.517 642.291 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-755 TJm +(Duh!) 20.4731 Tj +86.944 630.336 Td +(W) 9.40469 Tj +80 TJm +(ell,) 12.4533 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(li) 5.53921 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(learn.) 22.4059 Tj +[1 0 0 1 184.248 630.336] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -112.248 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -618.217] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 608.418 Td +/F130_0 9.9626 Tf +(Further) 29.3299 Tj +-304 TJm +(ahead,) 25.7234 Tj +-318 TJm +(it) 5.53921 Tj +-305 TJm +(w) 7.193 Tj +10 TJm +(ould) 17.7135 Tj +-304 TJm +(be) 9.40469 Tj +-305 TJm +(nice) 16.5977 Tj +-304 TJm +(to) 7.7509 Tj +-305 TJm +(be) 9.40469 Tj +-304 TJm +(able) 16.5977 Tj +-304 TJm +(to) 7.7509 Tj +-305 TJm +(do) 9.9626 Tj +-304 TJm +(random) 30.4357 Tj +-305 TJm +(access) 25.4445 Tj +-304 TJm +(into) 15.5018 Tj +-305 TJm +(\002les.) 19.0983 Tj +-946 TJm +(This) 17.7135 Tj +-305 TJm +(will) 15.5018 Tj +-304 TJm +(require) 28.2141 Tj +-304 TJm +(some) 21.031 Tj +-305 TJm +(careful) 27.6562 Tj +-304 TJm +(design) 26.0123 Tj +-305 TJm +(of) 8.29885 Tj +72 596.463 Td +(compressed) 47.0334 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(formats.) 32.9264 Tj +[1 0 0 1 72 594.306] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -584.344] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 561.71 Td +/F122_0 20.6585 Tf +(4.2.) 34.4584 Tj +-278 TJm +(P) 13.7792 Tj +40 TJm +(or) 20.6585 Tj +-20 TJm +(tability) 66.5823 Tj +-278 TJm +(issues) 64.3099 Tj +[1 0 0 1 72 557.434] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -547.472] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 539.793 Td +/F130_0 9.9626 Tf +(After) 21.0211 Tj +-250 TJm +(some) 21.031 Tj +-250 TJm +(consideration,) 56.1691 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(decided) 30.9837 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(use) 13.2801 Tj +-250 TJm +(GNU) 21.579 Tj +[1 0 0 1 303.231 539.793] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -303.231 -539.793] cm +[1 0 0 1 0 0] Tm +0 0 Td +303.231 539.793 Td +/F134_0 9.9626 Tf +(autoconf) 47.8205 Tj +[1 0 0 1 351.052 539.793] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -351.052 -539.793] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.542 539.793 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-250 TJm +(con\002gure) 37.6287 Tj +-250 TJm +(0.9.5) 19.9252 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(1.0.) 14.9439 Tj +[1 0 0 1 72 537.636] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -527.673] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 517.875 Td +/F134_0 9.9626 Tf +(autoconf) 47.8205 Tj +[1 0 0 1 119.821 517.875] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -119.821 -517.875] cm +[1 0 0 1 0 0] Tm +0 0 Td +119.821 517.875 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-502 TJm +(admirable) 39.8404 Tj +-452 TJm +(and) 14.386 Tj +-452 TJm +(w) 7.193 Tj +10 TJm +(onderful) 33.7533 Tj +-452 TJm +(though) 27.6761 Tj +-452 TJm +(it) 5.53921 Tj +-452 TJm +(is,) 9.1357 Tj +-502 TJm +(mainly) 27.6761 Tj +-452 TJm +(assists) 25.4644 Tj +-452 TJm +(with) 17.7135 Tj +-452 TJm +(portability) 41.5142 Tj +-452 TJm +(problems) 37.0808 Tj +-452 TJm +(between) 33.1954 Tj +-452 TJm +(Unix-lik) 33.7633 Tj +10 TJm +(e) 4.42339 Tj +72 505.92 Td +(platforms.) 40.6773 Tj +-1398 TJm +(But) 14.396 Tj +[1 0 0 1 144.784 505.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -144.784 -505.92] cm +[1 0 0 1 0 0] Tm +0 0 Td +144.784 505.92 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 174.672 505.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -174.672 -505.92] cm +[1 0 0 1 0 0] Tm +0 0 Td +178.455 505.92 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-380 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-379 TJm +(much) 22.1369 Tj +-380 TJm +(in) 7.7509 Tj +-380 TJm +(the) 12.1743 Tj +-379 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-380 TJm +(of) 8.29885 Tj +-380 TJm +(portability) 41.5142 Tj +-379 TJm +(problems) 37.0808 Tj +-380 TJm +(on) 9.9626 Tj +-380 TJm +(Unix;) 22.6948 Tj +-444 TJm +(most) 19.3773 Tj +-380 TJm +(of) 8.29885 Tj +-380 TJm +(the) 12.1743 Tj +-379 TJm +(dif) 11.0684 Tj +25 TJm +(\002culties) 31.5516 Tj +72 493.964 Td +(appear) 26.5503 Tj +-297 TJm +(when) 21.579 Tj +-296 TJm +(po) 9.9626 Tj +-1 TJm +(r) 3.31755 Tj +1 TJm +(ting) 15.5018 Tj +-297 TJm +(to) 7.7509 Tj +-297 TJm +(the) 12.1743 Tj +-297 TJm +(Mac,) 20.1942 Tj +-308 TJm +(or) 8.29885 Tj +-297 TJm +(to) 7.7509 Tj +-297 TJm +(Microsoft') 42.61 Tj +55 TJm +(s) 3.87545 Tj +-296 TJm +(operating) 37.6287 Tj +-297 TJm +(systems.) 34.0422 Tj +[1 0 0 1 361.339 493.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -361.339 -493.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +361.339 493.964 Td +/F134_0 9.9626 Tf +(autoconf) 47.8205 Tj +[1 0 0 1 409.16 493.964] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -409.16 -493.964] cm +[1 0 0 1 0 0] Tm +0 0 Td +412.116 493.964 Td +/F130_0 9.9626 Tf +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-297 TJm +(help) 17.1556 Tj +-296 TJm +(in) 7.7509 Tj +-297 TJm +(those) 21.031 Tj +-297 TJm +(cases,) 23.5117 Tj +-308 TJm +(and) 14.386 Tj +72 482.009 Td +(brings) 24.9065 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(whole) 24.3486 Tj +-250 TJm +(load) 17.1556 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-250 TJm +(comple) 29.3299 Tj +15 TJm +(xity) 15.5018 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 479.852] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -469.89] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 460.091 Td +/F130_0 9.9626 Tf +(Most) 20.4831 Tj +-392 TJm +(people) 26.5603 Tj +-392 TJm +(should) 26.5703 Tj +-393 TJm +(be) 9.40469 Tj +-392 TJm +(able) 16.5977 Tj +-392 TJm +(to) 7.7509 Tj +-392 TJm +(compile) 32.0995 Tj +-393 TJm +(the) 12.1743 Tj +-392 TJm +(library) 26.5603 Tj +-392 TJm +(and) 14.386 Tj +-392 TJm +(program) 33.7533 Tj +-393 TJm +(under) 22.6848 Tj +-392 TJm +(Unix) 19.9252 Tj +-392 TJm +(straight) 29.8878 Tj +-392 TJm +(out-of-the-box,) 60.5925 Tj +-428 TJm +(so) 8.85675 Tj +-392 TJm +(to) 7.7509 Tj +-393 TJm +(speak,) 25.1755 Tj +72 448.136 Td +(especially) 39.8404 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(v) 4.9813 Tj +15 TJm +(ersion) 24.3486 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(GNU) 21.579 Tj +-250 TJm +(C) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable.) 29.0509 Tj +[1 0 0 1 72 445.979] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -436.017] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 426.218 Td +/F130_0 9.9626 Tf +(There) 23.2328 Tj +-259 TJm +(are) 12.1643 Tj +-258 TJm +(a) 4.42339 Tj +-259 TJm +(couple) 26.5603 Tj +-258 TJm +(of) 8.29885 Tj +[1 0 0 1 159.561 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -159.561 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +159.561 426.218 Td +/F134_0 9.9626 Tf +(__inline__) 59.7756 Tj +[1 0 0 1 219.337 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -219.337 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +221.913 426.218 Td +/F130_0 9.9626 Tf +(directi) 25.4544 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-259 TJm +(in) 7.7509 Tj +-258 TJm +(the) 12.1743 Tj +-259 TJm +(code.) 21.3 Tj +-671 TJm +(GNU) 21.579 Tj +-259 TJm +(C) 6.64505 Tj +-258 TJm +(\() 3.31755 Tj +[1 0 0 1 352.587 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -352.587 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +352.587 426.218 Td +/F134_0 9.9626 Tf +(gcc) 17.9327 Tj +[1 0 0 1 370.52 426.218] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -370.52 -426.218] cm +[1 0 0 1 0 0] Tm +0 0 Td +370.52 426.218 Td +/F130_0 9.9626 Tf +(\)) 3.31755 Tj +-259 TJm +(should) 26.5703 Tj +-258 TJm +(be) 9.40469 Tj +-259 TJm +(able) 16.5977 Tj +-258 TJm +(to) 7.7509 Tj +-259 TJm +(handle) 26.5603 Tj +-259 TJm +(them.) 22.4159 Tj +-671 TJm +(If) 6.63509 Tj +-259 TJm +(you') 18.2614 Tj +50 TJm +(re) 7.74094 Tj +72 414.263 Td +(not) 12.7322 Tj +-279 TJm +(using) 21.589 Tj +-279 TJm +(GNU) 21.579 Tj +-279 TJm +(C,) 9.1357 Tj +-279 TJm +(your) 18.2614 Tj +-279 TJm +(C) 6.64505 Tj +-279 TJm +(compiler) 35.417 Tj +-279 TJm +(shouldn') 34.8691 Tj +18 TJm +(t) 2.7696 Tj +-279 TJm +(see) 12.7222 Tj +-279 TJm +(them) 19.9252 Tj +-279 TJm +(at) 7.193 Tj +-279 TJm +(all.) 12.4533 Tj +-794 TJm +(If) 6.63509 Tj +-279 TJm +(your) 18.2614 Tj +-279 TJm +(compiler) 35.417 Tj +-279 TJm +(does,) 20.7521 Tj +-286 TJm +(for) 11.6164 Tj +-279 TJm +(some) 21.031 Tj +-279 TJm +(reason,) 28.493 Tj +-287 TJm +(see) 12.7222 Tj +-279 TJm +(them) 19.9252 Tj +-279 TJm +(and) 14.386 Tj +72 402.308 Td +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-283 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-283 TJm +(them,) 22.4159 Tj +-291 TJm +(just) 14.396 Tj +[1 0 0 1 164.167 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -164.167 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +164.167 402.308 Td +/F134_0 9.9626 Tf +(#define) 41.8429 Tj +[1 0 0 1 206.01 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.8196 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -208.829 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +208.829 402.308 Td +/F134_0 9.9626 Tf +(__inline__) 59.7756 Tj +[1 0 0 1 268.605 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -268.605 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +271.425 402.308 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-283 TJm +(be) 9.40469 Tj +[1 0 0 1 294.22 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -294.22 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +294.22 402.308 Td +/F134_0 9.9626 Tf +(/) 5.97756 Tj +300.197 400.565 Td +(*) 5.97756 Tj +-600 TJm +(*) 5.97756 Tj +318.13 402.308 Td +(/) 5.97756 Tj +[1 0 0 1 324.108 402.308] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -324.108 -402.308] cm +[1 0 0 1 0 0] Tm +0 0 Td +324.108 402.308 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-818 TJm +(One) 16.5977 Tj +-283 TJm +(easy) 17.7035 Tj +-283 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-283 TJm +(to) 7.7509 Tj +-283 TJm +(do) 9.9626 Tj +-283 TJm +(this) 14.396 Tj +-283 TJm +(is) 6.64505 Tj +-283 TJm +(to) 7.7509 Tj +-283 TJm +(compile) 32.0995 Tj +-283 TJm +(with) 17.7135 Tj +-283 TJm +(the) 12.1743 Tj +-283 TJm +(\003ag) 14.9439 Tj +[1 0 0 1 72 390.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -390.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 390.353 Td +/F134_0 9.9626 Tf +(-D__inline__=) 77.7083 Tj +[1 0 0 1 149.709 390.353] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -149.709 -390.353] cm +[1 0 0 1 0 0] Tm +0 0 Td +149.709 390.353 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-250 TJm +(which) 24.3486 Tj +-250 TJm +(should) 26.5703 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(understood) 44.2738 Tj +-250 TJm +(by) 9.9626 Tj +-250 TJm +(most) 19.3773 Tj +-250 TJm +(Unix) 19.9252 Tj +-250 TJm +(compilers.) 41.7831 Tj +[1 0 0 1 72 388.196] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -378.233] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 368.435 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-321 TJm +(you) 14.9439 Tj +-321 TJm +(still) 14.9539 Tj +-322 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-321 TJm +(dif) 11.0684 Tj +25 TJm +(\002culties,) 34.0422 Tj +-339 TJm +(try) 11.0684 Tj +-321 TJm +(compiling) 40.4083 Tj +-321 TJm +(with) 17.7135 Tj +-322 TJm +(t) 2.7696 Tj +1 TJm +(he) 9.40469 Tj +-322 TJm +(macro) 24.8965 Tj +[1 0 0 1 310.295 368.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -310.295 -368.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +310.295 368.435 Td +/F134_0 9.9626 Tf +(BZ_STRICT_ANSI) 83.6858 Tj +[1 0 0 1 393.981 368.435] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -393.981 -368.435] cm +[1 0 0 1 0 0] Tm +0 0 Td +397.18 368.435 Td +/F130_0 9.9626 Tf +(de\002ned.) 31.8205 Tj +-524 TJm +(This) 17.7135 Tj +-321 TJm +(should) 26.5703 Tj +-321 TJm +(enable) 26.0024 Tj +-321 TJm +(you) 14.9439 Tj +-322 TJm +(to) 7.7509 Tj +72 356.48 Td +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +-321 TJm +(the) 12.1743 Tj +-321 TJm +(library) 26.5603 Tj +-322 TJm +(in) 7.7509 Tj +-321 TJm +(a) 4.42339 Tj +-321 TJm +(strictly) 27.6761 Tj +-321 TJm +(ANSI) 23.2427 Tj +-321 TJm +(compliant) 39.8504 Tj +-322 TJm +(en) 9.40469 Tj +40 TJm +(vironment.) 43.4469 Tj +-1047 TJm +(Building) 34.8791 Tj +-321 TJm +(the) 12.1743 Tj +-321 TJm +(program) 33.7533 Tj +-322 TJm +(itself) 19.9252 Tj +-321 TJm +(lik) 10.5205 Tj +10 TJm +(e) 4.42339 Tj +-321 TJm +(this) 14.396 Tj +-321 TJm +(is) 6.64505 Tj +-321 TJm +(dangerous) 40.9463 Tj +-322 TJm +(and) 14.386 Tj +72 344.525 Td +(not) 12.7322 Tj +-260 TJm +(supported,) 41.7831 Tj +-263 TJm +(since) 20.4731 Tj +-260 TJm +(you) 14.9439 Tj +-260 TJm +(remo) 20.4731 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +[1 0 0 1 204.498 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -204.498 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +204.498 344.525 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 234.386 344.525] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -234.386 -344.525] cm +[1 0 0 1 0 0] Tm +0 0 Td +234.386 344.525 Td +/F130_0 9.9626 Tf +(') 3.31755 Tj +55 TJm +(s) 3.87545 Tj +-260 TJm +(checks) 27.1082 Tj +-260 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-261 TJm +(compressi) 40.3983 Tj +1 TJm +(ng) 9.9626 Tj +-261 TJm +(directories,) 44.5428 Tj +-262 TJm +(symbolic) 36.5329 Tj +-261 TJm +(links,) 21.8679 Tj +-262 TJm +(de) 9.40469 Tj +25 TJm +(vices,) 22.9638 Tj +-263 TJm +(and) 14.386 Tj +-260 TJm +(other) 20.4731 Tj +72 332.57 Td +(not-really-a-\002le) 62.5253 Tj +-250 TJm +(entities.) 31.2726 Tj +-620 TJm +(This) 17.7135 Tj +-250 TJm +(could) 22.1369 Tj +-250 TJm +(cause) 22.1269 Tj +-250 TJm +(\002lesystem) 40.4083 Tj +-250 TJm +(corruption!) 44.8217 Tj +[1 0 0 1 72 330.413] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -320.45] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 310.652 Td +/F130_0 9.9626 Tf +(One) 16.5977 Tj +-392 TJm +(other) 20.4731 Tj +-391 TJm +(thing:) 23.2527 Tj +-594 TJm +(if) 6.08715 Tj +-391 TJm +(you) 14.9439 Tj +-392 TJm +(create) 23.7807 Tj +-391 TJm +(a) 4.42339 Tj +[1 0 0 1 210.879 310.652] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.879 -310.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +210.879 310.652 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 240.767 310.652] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.767 -310.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +244.669 310.652 Td +/F130_0 9.9626 Tf +(binary) 25.4544 Tj +-392 TJm +(for) 11.6164 Tj +-391 TJm +(public) 24.9065 Tj +-392 TJm +(distrib) 25.4644 Tj +20 TJm +(ution,) 22.9738 Tj +-427 TJm +(please) 24.8965 Tj +-392 TJm +(consider) 33.7533 Tj +-391 TJm +(linking) 28.234 Tj +-392 TJm +(it) 5.53921 Tj +-391 TJm +(statically) 35.9749 Tj +-392 TJm +(\() 3.31755 Tj +[1 0 0 1 522.067 310.652] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -522.067 -310.652] cm +[1 0 0 1 0 0] Tm +0 0 Td +522.067 310.652 Td +/F134_0 9.9626 Tf +(gcc) 17.9327 Tj +72 298.697 Td +(-static) 41.8429 Tj +[1 0 0 1 113.843 298.697] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -113.843 -298.697] cm +[1 0 0 1 0 0] Tm +0 0 Td +113.843 298.697 Td +/F130_0 9.9626 Tf +(\).) 5.8082 Tj +-620 TJm +(This) 17.7135 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(oids) 16.6077 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(sorts) 18.8194 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(library-v) 34.8591 Tj +15 TJm +(ersion) 24.3486 Tj +-250 TJm +(issues) 23.8007 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(others) 24.3486 Tj +-250 TJm +(may) 17.1556 Tj +-250 TJm +(encounter) 39.2825 Tj +-250 TJm +(later) 17.7035 Tj +-250 TJm +(on.) 12.4533 Tj +[1 0 0 1 72 296.54] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -286.577] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 276.779 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-296 TJm +(you) 14.9439 Tj +-296 TJm +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +[1 0 0 1 122.709 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -122.709 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +122.709 276.779 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 152.596 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -152.596 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +155.545 276.779 Td +/F130_0 9.9626 Tf +(on) 9.9626 Tj +-296 TJm +(W) 9.40469 Tj +40 TJm +(in32,) 20.2042 Tj +-307 TJm +(you) 14.9439 Tj +-296 TJm +(must) 19.3773 Tj +-296 TJm +(set) 11.0684 Tj +[1 0 0 1 254.965 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -254.965 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +254.965 276.779 Td +/F134_0 9.9626 Tf +(BZ_UNIX) 41.8429 Tj +[1 0 0 1 296.808 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -296.808 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +299.756 276.779 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-296 TJm +(0) 4.9813 Tj +-296 TJm +(and) 14.386 Tj +[1 0 0 1 335.72 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -335.72 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +335.72 276.779 Td +/F134_0 9.9626 Tf +(BZ_LCCWIN32) 65.7532 Tj +[1 0 0 1 401.473 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -401.473 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +404.422 276.779 Td +/F130_0 9.9626 Tf +(to) 7.7509 Tj +-296 TJm +(1,) 7.47195 Tj +-307 TJm +(in) 7.7509 Tj +-296 TJm +(the) 12.1743 Tj +-296 TJm +(\002le) 12.7322 Tj +[1 0 0 1 467.159 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -467.159 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +467.159 276.779 Td +/F134_0 9.9626 Tf +(bzip2.c) 41.8429 Tj +[1 0 0 1 509.002 276.779] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -509.002 -276.779] cm +[1 0 0 1 0 0] Tm +0 0 Td +509.002 276.779 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-307 TJm +(before) 25.4445 Tj +72 264.824 Td +(compiling.) 42.899 Tj +-310 TJm +(Otherwise) 40.9463 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(resulting) 34.8691 Tj +-250 TJm +(binary) 25.4544 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ork) 13.2801 Tj +-250 TJm +(correctly) 35.4071 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 262.667] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -252.704] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 230.071 Td +/F122_0 20.6585 Tf +(4.3.) 34.4584 Tj +-278 TJm +(Repor) 59.6824 Tj +-20 TJm +(ting) 37.867 Tj +-278 TJm +(b) 12.6223 Tj +20 TJm +(ugs) 36.7308 Tj +[1 0 0 1 72 225.474] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -215.512] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 208.153 Td +/F130_0 9.9626 Tf +(I) 3.31755 Tj +-228 TJm +(tried) 18.2614 Tj +-228 TJm +(pretty) 23.2427 Tj +-228 TJm +(hard) 17.7035 Tj +-228 TJm +(to) 7.7509 Tj +-228 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-228 TJm +(sure) 16.5977 Tj +[1 0 0 1 196.25 208.153] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -196.25 -208.153] cm +[1 0 0 1 0 0] Tm +0 0 Td +196.25 208.153 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 226.138 208.153] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -226.138 -208.153] cm +[1 0 0 1 0 0] Tm +0 0 Td +228.409 208.153 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-228 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-228 TJm +(free,) 17.9725 Tj +-232 TJm +(both) 17.7135 Tj +-228 TJm +(by) 9.9626 Tj +-228 TJm +(design) 26.0123 Tj +-228 TJm +(and) 14.386 Tj +-228 TJm +(by) 9.9626 Tj +-228 TJm +(testing.) 29.0609 Tj +-605 TJm +(Hopefully) 40.3983 Tj +-228 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-228 TJm +(ne) 9.40469 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +-228 TJm +(need) 18.8094 Tj +-228 TJm +(to) 7.7509 Tj +-228 TJm +(read) 17.1456 Tj +72 196.198 Td +(this) 14.396 Tj +-250 TJm +(section) 28.224 Tj +-250 TJm +(for) 11.6164 Tj +-250 TJm +(real.) 17.4246 Tj +[1 0 0 1 72 196.098] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -186.136] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 174.28 Td +/F130_0 9.9626 Tf +(Ne) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ertheless,) 37.3498 Tj +-313 TJm +(if) 6.08715 Tj +[1 0 0 1 137.751 174.28] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -137.751 -174.28] cm +[1 0 0 1 0 0] Tm +0 0 Td +137.751 174.28 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 167.639 174.28] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -167.639 -174.28] cm +[1 0 0 1 0 0] Tm +0 0 Td +170.634 174.28 Td +/F130_0 9.9626 Tf +(dies) 16.0497 Tj +-301 TJm +(with) 17.7135 Tj +-300 TJm +(a) 4.42339 Tj +-301 TJm +(se) 8.29885 Tj +15 TJm +(gmentation) 44.8317 Tj +-300 TJm +(f) 3.31755 Tj +10 TJm +(ault,) 17.4346 Tj +-314 TJm +(a) 4.42339 Tj +-300 TJm +(b) 4.9813 Tj +20 TJm +(us) 8.85675 Tj +-301 TJm +(error) 19.3573 Tj +-300 TJm +(or) 8.29885 Tj +-301 TJm +(an) 9.40469 Tj +-301 TJm +(internal) 30.4357 Tj +-300 TJm +(assertion) 35.417 Tj +-301 TJm +(f) 3.31755 Tj +10 TJm +(ailure,) 25.1755 Tj +-313 TJm +(it) 5.53921 Tj +-301 TJm +(wil) 12.7322 Tj +1 TJm +(l) 2.7696 Tj +-301 TJm +(ask) 13.2801 Tj +-301 TJm +(you) 14.9439 Tj +-300 TJm +(to) 7.7509 Tj +72 162.325 Td +(email) 22.1369 Tj +-242 TJm +(me) 12.1743 Tj +-243 TJm +(a) 4.42339 Tj +-242 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-243 TJm +(report.) 26.2813 Tj +-615 TJm +(Experience) 44.8118 Tj +-242 TJm +(from) 19.3673 Tj +-243 TJm +(years) 21.0211 Tj +-242 TJm +(of) 8.29885 Tj +-242 TJm +(feedback) 35.955 Tj +-243 TJm +(of) 8.29885 Tj +-242 TJm +(bzip2) 22.1369 Tj +-243 TJm +(users) 20.4731 Tj +-242 TJm +(indicates) 35.417 Tj +-243 TJm +(that) 14.9439 Tj +-242 TJm +(almost) 26.5703 Tj +-242 TJm +(all) 9.9626 Tj +-243 TJm +(these) 20.4731 Tj +-242 TJm +(problems) 37.0808 Tj +-243 TJm +(can) 13.8281 Tj +72 150.37 Td +(be) 9.40469 Tj +-250 TJm +(traced) 24.3386 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(either) 22.6848 Tj +-250 TJm +(compiler) 35.417 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ugs) 13.8381 Tj +-250 TJm +(or) 8.29885 Tj +-250 TJm +(hardw) 24.8965 Tj +10 TJm +(are) 12.1643 Tj +-250 TJm +(problems.) 39.5714 Tj +[1 0 0 1 72 148.213] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -97.3611] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(32) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 36 36 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -31.5168] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 710.037 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -710.037] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 710.037 Td +/F130_0 9.9626 Tf +(Recompile) 43.1679 Tj +-306 TJm +(the) 12.1743 Tj +-306 TJm +(program) 33.7533 Tj +-306 TJm +(with) 17.7135 Tj +-306 TJm +(no) 9.9626 Tj +-306 TJm +(optimisation,) 52.3136 Tj +-320 TJm +(and) 14.386 Tj +-306 TJm +(see) 12.7222 Tj +-306 TJm +(if) 6.08715 Tj +-306 TJm +(it) 5.53921 Tj +-306 TJm +(w) 7.193 Tj +10 TJm +(orks.) 19.6462 Tj +-956 TJm +(And/or) 28.224 Tj +-306 TJm +(try) 11.0684 Tj +-306 TJm +(a) 4.42339 Tj +-306 TJm +(dif) 11.0684 Tj +25 TJm +(ferent) 23.2328 Tj +-306 TJm +(compiler) 35.417 Tj +55 TJm +(.) 2.49065 Tj +-956 TJm +(I) 3.31755 Tj +-306 TJm +(heard) 22.1269 Tj +-306 TJm +(all) 9.9626 Tj +86.944 698.082 Td +(sorts) 18.8194 Tj +-282 TJm +(of) 8.29885 Tj +-282 TJm +(stories) 26.0123 Tj +-282 TJm +(about) 22.1369 Tj +-283 TJm +(v) 4.9813 Tj +25 TJm +(arious) 24.3486 Tj +-282 TJm +(\003a) 9.9626 Tj +20 TJm +(v) 4.9813 Tj +20 TJm +(ours) 17.1556 Tj +-282 TJm +(of) 8.29885 Tj +-282 TJm +(GNU) 21.579 Tj +-282 TJm +(C) 6.64505 Tj +-282 TJm +(\(and) 17.7035 Tj +-282 TJm +(other) 20.4731 Tj +-283 TJm +(compilers\)) 42.61 Tj +-282 TJm +(generating) 42.0521 Tj +-282 TJm +(bad) 14.386 Tj +-282 TJm +(code) 18.8094 Tj +-282 TJm +(for) 11.6164 Tj +[1 0 0 1 472.141 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.141 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +472.141 698.082 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 502.029 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -502.029 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +502.029 698.082 Td +/F130_0 9.9626 Tf +(,) 2.49065 Tj +-290 TJm +(and) 14.386 Tj +-282 TJm +(I') 6.63509 Tj +50 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +86.944 686.127 Td +(run) 13.2801 Tj +-250 TJm +(across) 24.8965 Tj +-250 TJm +(tw) 9.9626 Tj +10 TJm +(o) 4.9813 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xamples) 33.2053 Tj +-250 TJm +(myself.) 29.6088 Tj +[1 0 0 1 237.767 686.127] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.767 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.007] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 664.209 Td +/F130_0 9.9626 Tf +(2.7.X) 22.1369 Tj +-280 TJm +(v) 4.9813 Tj +15 TJm +(ersions) 28.224 Tj +-279 TJm +(of) 8.29885 Tj +-280 TJm +(GNU) 21.579 Tj +-279 TJm +(C) 6.64505 Tj +-280 TJm +(are) 12.1643 Tj +-279 TJm +(kno) 14.9439 Tj +25 TJm +(wn) 12.1743 Tj +-280 TJm +(to) 7.7509 Tj +-280 TJm +(generate) 33.7433 Tj +-279 TJm +(bad) 14.386 Tj +-280 TJm +(code) 18.8094 Tj +-279 TJm +(from) 19.3673 Tj +-280 TJm +(time) 17.7135 Tj +-279 TJm +(to) 7.7509 Tj +-280 TJm +(time,) 20.2042 Tj +-287 TJm +(at) 7.193 Tj +-280 TJm +(high) 17.7135 Tj +-279 TJm +(optimisation) 49.823 Tj +-280 TJm +(le) 7.193 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(els.) 13.5591 Tj +-797 TJm +(If) 6.63509 Tj +-280 TJm +(you) 14.9439 Tj +86.944 652.254 Td +(get) 12.1743 Tj +-295 TJm +(problems,) 39.5714 Tj +-307 TJm +(try) 11.0684 Tj +-296 TJm +(using) 21.589 Tj +-295 TJm +(the) 12.1743 Tj +-296 TJm +(\003ags) 18.8194 Tj +[1 0 0 1 220.116 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -220.116 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +220.116 652.254 Td +/F134_0 9.9626 Tf +(-O2) 17.9327 Tj +[1 0 0 1 238.049 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.9438 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -240.993 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +240.993 652.254 Td +/F134_0 9.9626 Tf +(-fomit-frame-pointer) 119.551 Tj +[1 0 0 1 360.544 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.9438 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -363.488 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +363.488 652.254 Td +/F134_0 9.9626 Tf +(-fno-strength-reduce) 119.551 Tj +[1 0 0 1 483.04 652.254] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -483.04 -652.254] cm +[1 0 0 1 0 0] Tm +0 0 Td +483.04 652.254 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-893 TJm +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-295 TJm +(should) 26.5703 Tj +86.944 640.299 Td +(speci\002cally) 45.3796 Tj +[1 0 0 1 134.814 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -134.814 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +134.814 640.299 Td +/F637_0 9.9626 Tf +(not) 12.7322 Tj +[1 0 0 1 147.546 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -147.546 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +150.036 640.299 Td +/F130_0 9.9626 Tf +(use) 13.2801 Tj +[1 0 0 1 165.807 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -165.807 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +165.807 640.299 Td +/F134_0 9.9626 Tf +(-funroll-loops) 83.6858 Tj +[1 0 0 1 249.493 640.299] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -249.493 -640.299] cm +[1 0 0 1 0 0] Tm +0 0 Td +249.493 640.299 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +[1 0 0 1 72 638.142] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -628.179] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 618.381 Td +/F130_0 9.9626 Tf +(Y) 7.193 Tj +110 TJm +(ou) 9.9626 Tj +-249 TJm +(may) 17.1556 Tj +-249 TJm +(notice) 24.3486 Tj +-248 TJm +(that) 14.9439 Tj +-249 TJm +(the) 12.1743 Tj +-249 TJm +(Mak) 18.2614 Tj +10 TJm +(e\002le) 17.1556 Tj +-249 TJm +(runs) 17.1556 Tj +-248 TJm +(six) 11.6264 Tj +-249 TJm +(tests) 17.7135 Tj +-249 TJm +(as) 8.29885 Tj +-249 TJm +(part) 15.4918 Tj +-249 TJm +(of) 8.29885 Tj +-248 TJm +(the) 12.1743 Tj +-249 TJm +(b) 4.9813 Tj +20 TJm +(uild) 15.5018 Tj +-249 TJm +(process.) 32.3685 Tj +-619 TJm +(If) 6.63509 Tj +-249 TJm +(the) 12.1743 Tj +-249 TJm +(program) 33.7533 Tj +-248 TJm +(passes) 25.4544 Tj +-249 TJm +(all) 9.9626 Tj +-249 TJm +(of) 8.29885 Tj +-249 TJm +(these,) 22.9638 Tj +-249 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +86.944 606.426 Td +(a) 4.42339 Tj +-250 TJm +(pretty) 23.2427 Tj +-250 TJm +(good) 19.9252 Tj +-250 TJm +(\(b) 8.29885 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(not) 12.7322 Tj +-250 TJm +(100%\)) 26.5603 Tj +-250 TJm +(indication) 39.8504 Tj +-250 TJm +(that) 14.9439 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(compiler) 35.417 Tj +-250 TJm +(has) 13.2801 Tj +-250 TJm +(done) 19.3673 Tj +-250 TJm +(its) 9.41466 Tj +-250 TJm +(job) 12.7322 Tj +-250 TJm +(correctly) 35.4071 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 604.269] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -19.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 584.508 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 584.508 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +[1 0 0 1 95.9558 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -95.9558 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +95.9558 584.508 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 125.844 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -125.844 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +128.22 584.508 Td +/F130_0 9.9626 Tf +(crashes) 29.3199 Tj +-239 TJm +(randomly) 38.1866 Tj +65 TJm +(,) 2.49065 Tj +-240 TJm +(and) 14.386 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(crashe) 25.4445 Tj +1 TJm +(s) 3.87545 Tj +-239 TJm +(are) 12.1643 Tj +-239 TJm +(not) 12.7322 Tj +-238 TJm +(repeatable,) 43.427 Tj +-241 TJm +(you) 14.9439 Tj +-239 TJm +(may) 17.1556 Tj +-238 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-239 TJm +(a) 4.42339 Tj +-238 TJm +(\003ak) 14.9439 Tj +15 TJm +(y) 4.9813 Tj +-239 TJm +(memory) 33.2053 Tj +-238 TJm +(subsystem.) 44.0048 Tj +[1 0 0 1 510.112 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -510.112 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +510.112 584.508 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 540 584.508] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -584.508] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 572.553 Td +/F130_0 9.9626 Tf +(really) 22.6848 Tj +-254 TJm +(hammers) 36.5229 Tj +-253 TJm +(your) 18.2614 Tj +-254 TJm +(memory) 33.2053 Tj +-253 TJm +(hierarch) 32.6375 Tj +5 TJm +(y) 4.9813 Tj +65 TJm +(,) 2.49065 Tj +-255 TJm +(and) 14.386 Tj +-253 TJm +(if) 6.08715 Tj +-254 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-254 TJm +(a) 4.42339 Tj +-253 TJm +(bit) 10.5205 Tj +-254 TJm +(mar) 15.4918 Tj +18 TJm +(ginal,) 22.4159 Tj +-254 TJm +(you) 14.9439 Tj +-254 TJm +(may) 17.1556 Tj +-253 TJm +(get) 12.1743 Tj +-254 TJm +(these) 20.4731 Tj +-253 TJm +(problems.) 39.5714 Tj +-642 TJm +(Ditto) 20.4831 Tj +-254 TJm +(if) 6.08715 Tj +-253 TJm +(your) 18.2614 Tj +-254 TJm +(disk) 16.6077 Tj +86.944 560.598 Td +(or) 8.29885 Tj +-250 TJm +(I/O) 13.2801 Tj +-250 TJm +(subsystem) 41.5142 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(slo) 11.6264 Tj +25 TJm +(wly) 14.9439 Tj +-250 TJm +(f) 3.31755 Tj +10 TJm +(ailing.) 25.1855 Tj +-620 TJm +(Y) 7.193 Tj +111 TJm +(up,) 12.4533 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(really) 22.6848 Tj +-250 TJm +(does) 18.2614 Tj +-250 TJm +(happen.) 31.2626 Tj +[1 0 0 1 345.143 560.598] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -273.143 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -548.478] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 538.68 Td +/F130_0 9.9626 Tf +(T) 6.08715 Tj +35 TJm +(ry) 8.29885 Tj +-250 TJm +(using) 21.589 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(dif) 11.0684 Tj +25 TJm +(ferent) 23.2328 Tj +-250 TJm +(machine) 33.7533 Tj +-250 TJm +(of) 8.29885 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(same) 20.4731 Tj +-250 TJm +(type,) 19.6462 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(see) 12.7222 Tj +-250 TJm +(if) 6.08715 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(can) 13.8281 Tj +-250 TJm +(repeat) 24.3386 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem.) 35.696 Tj +[1 0 0 1 72 536.523] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -19.761] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.9739 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -78.9739 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +78.9739 516.762 Td +/F130_0 9.9626 Tf +(\225) 3.48691 Tj +[1 0 0 1 82.4608 516.762] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -86.944 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +86.944 516.762 Td +/F130_0 9.9626 Tf +(This) 17.7135 Tj +-229 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-230 TJm +(really) 22.6848 Tj +-229 TJm +(a) 4.42339 Tj +-229 TJm +(b) 4.9813 Tj +20 TJm +(ug,) 12.4533 Tj +-234 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-229 TJm +(...) 7.47195 Tj +-303 TJm +(If) 6.63509 Tj +[1 0 0 1 212.232 516.762] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -212.232 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +212.232 516.762 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 242.12 516.762] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -242.12 -516.762] cm +[1 0 0 1 0 0] Tm +0 0 Td +244.405 516.762 Td +/F130_0 9.9626 Tf +(tells) 16.6077 Tj +-229 TJm +(you) 14.9439 Tj +-230 TJm +(your) 18.2614 Tj +-229 TJm +(\002le) 12.7322 Tj +-229 TJm +(is) 6.64505 Tj +-230 TJm +(corrupted) 38.1767 Tj +-229 TJm +(on) 9.9626 Tj +-230 TJm +(decompression,) 62.2563 Tj +-233 TJm +(and) 14.386 Tj +-229 TJm +(you) 14.9439 Tj +-230 TJm +(obtained) 34.3112 Tj +-229 TJm +(the) 12.1743 Tj +-229 TJm +(\002le) 12.7322 Tj +86.944 504.807 Td +(via) 12.1743 Tj +-262 TJm +(FTP) 17.1656 Tj +111 TJm +(,) 2.49065 Tj +-263 TJm +(there) 19.9152 Tj +-262 TJm +(is) 6.64505 Tj +-262 TJm +(a) 4.42339 Tj +-262 TJm +(possibility) 41.5241 Tj +-263 TJm +(that) 14.9439 Tj +-262 TJm +(you) 14.9439 Tj +-262 TJm +(for) 11.6164 Tj +18 TJm +(got) 12.7322 Tj +-263 TJm +(to) 7.7509 Tj +-262 TJm +(tell) 12.7322 Tj +-262 TJm +(FTP) 17.1656 Tj +-263 TJm +(to) 7.7509 Tj +-262 TJm +(do) 9.9626 Tj +-262 TJm +(a) 4.42339 Tj +-262 TJm +(binary) 25.4544 Tj +-263 TJm +(mode) 22.1369 Tj +-262 TJm +(transfer) 30.4258 Tj +55 TJm +(.) 2.49065 Tj +-694 TJm +(That) 18.2614 Tj +-262 TJm +(absolutely) 40.9562 Tj +-262 TJm +(will) 15.5018 Tj +-263 TJm +(cause) 22.1269 Tj +86.944 492.852 Td +(the) 12.1743 Tj +-250 TJm +(\002le) 12.7322 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(be) 9.40469 Tj +-250 TJm +(non-decompressible.) 82.7294 Tj +-620 TJm +(Y) 7.193 Tj +110 TJm +(ou') 13.2801 Tj +10 TJm +(ll) 5.53921 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(transfer) 30.4258 Tj +-250 TJm +(it) 5.53921 Tj +-250 TJm +(ag) 9.40469 Tj +5 TJm +(ain.) 14.6649 Tj +[1 0 0 1 351.34 492.852] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -279.34 -12.1195] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -480.732] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 470.934 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-235 TJm +(you') 18.2614 Tj +50 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-236 TJm +(incor) 20.4731 Tj +1 TJm +(p) 4.9813 Tj +-1 TJm +(or) 8.29885 Tj +1 TJm +(ated) 16.5977 Tj +[1 0 0 1 163.036 470.934] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -163.036 -470.934] cm +[1 0 0 1 0 0] Tm +0 0 Td +163.036 470.934 Td +/F134_0 9.9626 Tf +(libbzip2) 47.8205 Tj +[1 0 0 1 210.856 470.934] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -210.856 -470.934] cm +[1 0 0 1 0 0] Tm +0 0 Td +213.2 470.934 Td +/F130_0 9.9626 Tf +(into) 15.5018 Tj +-235 TJm +(your) 18.2614 Tj +-235 TJm +(o) 4.9813 Tj +25 TJm +(wn) 12.1743 Tj +-236 TJm +(program) 33.7533 Tj +-235 TJm +(and) 14.386 Tj +-235 TJm +(are) 12.1643 Tj +-236 TJm +(get) 12.1743 Tj +1 TJm +(ting) 15.5018 Tj +-236 TJm +(problems,) 39.5714 Tj +-238 TJm +(please,) 27.3872 Tj +-238 TJm +(please,) 27.3872 Tj +-238 TJm +(please,) 27.3872 Tj +-238 TJm +(check) 23.2328 Tj +-236 TJm +(that) 14.9439 Tj +72 458.979 Td +(the) 12.1743 Tj +-242 TJm +(parameters) 43.7059 Tj +-243 TJm +(you) 14.9439 Tj +-242 TJm +(are) 12.1643 Tj +-242 TJm +(passing) 29.8878 Tj +-243 TJm +(in) 7.7509 Tj +-242 TJm +(calls) 18.2614 Tj +-242 TJm +(to) 7.7509 Tj +-243 TJm +(the) 12.1743 Tj +-242 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-244 TJm +(are) 12.1643 Tj +-242 TJm +(correct,) 30.1468 Tj +-244 TJm +(and) 14.386 Tj +-243 TJm +(in) 7.7509 Tj +-242 TJm +(accordance) 44.8018 Tj +-242 TJm +(with) 17.7135 Tj +-243 TJm +(what) 19.3673 Tj +-242 TJm +(the) 12.1743 Tj +-242 TJm +(documentation) 59.2177 Tj +-243 TJm +(says) 17.1556 Tj +72 447.024 Td +(is) 6.64505 Tj +-250 TJm +(allo) 14.9439 Tj +25 TJm +(w) 7.193 Tj +10 TJm +(able.) 19.0883 Tj +-310 TJm +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(tried) 18.2614 Tj +-250 TJm +(to) 7.7509 Tj +-250 TJm +(mak) 17.1556 Tj +10 TJm +(e) 4.42339 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(library) 26.5603 Tj +-250 TJm +(rob) 13.2801 Tj +20 TJm +(ust) 11.6264 Tj +-250 TJm +(ag) 9.40469 Tj +5 TJm +(ainst) 18.8194 Tj +-250 TJm +(such) 18.2614 Tj +-250 TJm +(problems,) 39.5714 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-250 TJm +(I'm) 14.386 Tj +-250 TJm +(sure) 16.5977 Tj +-250 TJm +(I) 3.31755 Tj +-250 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(en') 12.7222 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(succeeded.) 43.427 Tj +[1 0 0 1 72 444.867] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -434.904] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 425.106 Td +/F130_0 9.9626 Tf +(Finally) 28.234 Tj +65 TJm +(,) 2.49065 Tj +-324 TJm +(if) 6.08715 Tj +-310 TJm +(the) 12.1743 Tj +-309 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-309 TJm +(comments) 40.9562 Tj +-310 TJm +(don') 18.2614 Tj +18 TJm +(t) 2.7696 Tj +-309 TJm +(help,) 19.6462 Tj +-324 TJm +(you') 18.2614 Tj +10 TJm +(ll) 5.53921 Tj +-310 TJm +(ha) 9.40469 Tj +20 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-309 TJm +(to) 7.7509 Tj +-309 TJm +(send) 18.2614 Tj +-310 TJm +(me) 12.1743 Tj +-309 TJm +(a) 4.42339 Tj +-309 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-310 TJm +(report.) 26.2813 Tj +-976 TJm +(No) 12.1743 Tj +25 TJm +(w) 7.193 Tj +65 TJm +(,) 2.49065 Tj +-324 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-310 TJm +(just) 14.396 Tj +-309 TJm +(amazing) 33.7533 Tj +-309 TJm +(ho) 9.9626 Tj +25 TJm +(w) 7.193 Tj +-310 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +72 413.151 Td +(people) 26.5603 Tj +-250 TJm +(will) 15.5018 Tj +-250 TJm +(send) 18.2614 Tj +-250 TJm +(me) 12.1743 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(b) 4.9813 Tj +20 TJm +(ug) 9.9626 Tj +-250 TJm +(report) 23.7907 Tj +-250 TJm +(saying) 26.0123 Tj +-250 TJm +(something) 41.5142 Tj +-250 TJm +(lik) 10.5205 Tj +10 TJm +(e:) 7.193 Tj +[1 0 0 1 72 410.994] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -24.9066] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 23.9103 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 20.3237] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -401.629] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 401.629 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +-426 TJm +(crashed) 41.8429 Tj +-426 TJm +(with) 23.9102 Tj +-426 TJm +(segmentation) 71.7307 Tj +-426 TJm +(fault) 29.8878 Tj +-426 TJm +(on) 11.9551 Tj +-426 TJm +(my) 11.9551 Tj +-426 TJm +(machine) 41.8429 Tj +[1 0 0 1 72 386.087] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -376.125] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 364.169 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +-241 TJm +(absolutely) 40.9562 Tj +-241 TJm +(nothing) 30.4457 Tj +-241 TJm +(el) 7.193 Tj +1 TJm +(se.) 10.7895 Tj +-614 TJm +(Needless) 35.965 Tj +-241 TJm +(to) 7.7509 Tj +-241 TJm +(say) 13.2801 Tj +65 TJm +(,) 2.49065 Tj +-243 TJm +(a) 4.42339 Tj +-241 TJm +(such) 18.2614 Tj +-240 TJm +(a) 4.42339 Tj +-241 TJm +(report) 23.7907 Tj +-241 TJm +(is) 6.64505 Tj +[1 0 0 1 324.681 364.169] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -324.681 -364.169] cm +[1 0 0 1 0 0] Tm +0 0 Td +324.681 364.169 Td +/F637_0 9.9626 Tf +(totally) 25.4644 Tj +55 TJm +(,) 2.49065 Tj +-243 TJm +(utterly) 26.0123 Tj +55 TJm +(,) 2.49065 Tj +-242 TJm +(completely) 43.158 Tj +-241 TJm +(and) 14.9439 Tj +-241 TJm +(compr) 25.4544 Tj +37 TJm +(ehensively) 41.4942 Tj +-241 TJm +(100%) 23.2427 Tj +72 352.214 Td +(useless;) 31.5416 Tj +-257 TJm +(a) 4.9813 Tj +-255 TJm +(waste) 22.6948 Tj +-255 TJm +(of) 7.7509 Tj +-255 TJm +(your) 18.2614 Tj +-255 TJm +(time) 17.1556 Tj +10 TJm +(,) 2.49065 Tj +-256 TJm +(my) 11.6164 Tj +-255 TJm +(time) 17.1556 Tj +10 TJm +(,) 2.49065 Tj +-256 TJm +(and) 14.9439 Tj +-255 TJm +(net) 12.1743 Tj +-255 TJm +(bandwidth) 42.0721 Tj +[1 0 0 1 302.574 352.214] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -302.574 -352.214] cm +[1 0 0 1 0 0] Tm +0 0 Td +302.574 352.214 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-650 TJm +(W) 9.40469 Tj +40 TJm +(ith) 10.5205 Tj +-254 TJm +(no) 9.9626 Tj +-255 TJm +(details) 26.0123 Tj +-255 TJm +(at) 7.193 Tj +-255 TJm +(all,) 12.4533 Tj +-256 TJm +(there') 23.2328 Tj +55 TJm +(s) 3.87545 Tj +-255 TJm +(no) 9.9626 Tj +-255 TJm +(w) 7.193 Tj +10 TJm +(ay) 9.40469 Tj +-255 TJm +(I) 3.31755 Tj +-255 TJm +(can) 13.8281 Tj +-255 TJm +(possibly) 33.2153 Tj +-255 TJm +(be) 9.40469 Tj +15 TJm +(gin) 12.7322 Tj +72 340.259 Td +(to) 7.7509 Tj +-250 TJm +(\002gure) 23.2427 Tj +-250 TJm +(out) 12.7322 Tj +-250 TJm +(what) 19.3673 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(problem) 33.2053 Tj +-250 TJm +(is.) 9.1357 Tj +[1 0 0 1 72 338.102] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -328.14] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 318.341 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-309 TJm +(rules) 19.3673 Tj +-309 TJm +(of) 8.29885 Tj +-309 TJm +(the) 12.1743 Tj +-310 TJm +(g) 4.9813 Tj +5 TJm +(ame) 16.5977 Tj +-309 TJm +(are:) 14.9339 Tj +-428 TJm +(f) 3.31755 Tj +10 TJm +(acts,) 17.9825 Tj +-324 TJm +(f) 3.31755 Tj +10 TJm +(acts,) 17.9825 Tj +-324 TJm +(f) 3.31755 Tj +10 TJm +(acts.) 17.9825 Tj +-975 TJm +(Don') 20.4731 Tj +18 TJm +(t) 2.7696 Tj +-309 TJm +(omit) 18.2714 Tj +-309 TJm +(them) 19.9252 Tj +-309 TJm +(because) 31.5316 Tj +-309 TJm +("oh,) 16.518 Tj +-324 TJm +(the) 12.1743 Tj +15 TJm +(y) 4.9813 Tj +-309 TJm +(w) 7.193 Tj +10 TJm +(on') 13.2801 Tj +18 TJm +(t) 2.7696 Tj +-309 TJm +(be) 9.40469 Tj +-310 TJm +(rele) 14.9339 Tj +25 TJm +(v) 4.9813 Tj +25 TJm +(ant".) 18.7297 Tj +-974 TJm +(At) 9.9626 Tj +-310 TJm +(the) 12.1743 Tj +-309 TJm +(bare) 17.1456 Tj +72 306.386 Td +(minimum:) 41.5241 Tj +[1 0 0 1 72 306.287] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -60.7721] cm +/DeviceRGB {} cs +[0.94899 0.94899 0.976456] sc +/DeviceRGB {} CS +[0.94899 0.94899 0.976456] SC +0 0 468 59.7758 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 56.1892] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -296.922] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 296.922 Td +/F134_0 9.9626 Tf +(Machine) 41.8429 Tj +-426 TJm +(type.) 29.8878 Tj +-852 TJm +(Operating) 53.798 Tj +-426 TJm +(system) 35.8654 Tj +-426 TJm +(version.) 47.8205 Tj +90 284.967 Td +(Exact) 29.8878 Tj +-426 TJm +(version) 41.8429 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(bzip2) 29.8878 Tj +-426 TJm +(\(do) 17.9327 Tj +-426 TJm +(bzip2) 29.8878 Tj +-426 TJm +(-V\).) 23.9102 Tj +90 273.011 Td +(Exact) 29.8878 Tj +-426 TJm +(version) 41.8429 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compiler) 47.8205 Tj +-426 TJm +(used.) 29.8878 Tj +90 261.056 Td +(Flags) 29.8878 Tj +-426 TJm +(passed) 35.8654 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(compiler.) 53.798 Tj +[1 0 0 1 72 245.514] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -235.552] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 223.597 Td +/F130_0 9.9626 Tf +(Ho) 12.1743 Tj +25 TJm +(we) 11.6164 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(er) 7.74094 Tj +40 TJm +(,) 2.49065 Tj +-254 TJm +(the) 12.1743 Tj +-252 TJm +(most) 19.3773 Tj +-253 TJm +(important) 38.7446 Tj +-253 TJm +(single) 23.8007 Tj +-253 TJm +(thing) 20.4831 Tj +-253 TJm +(t) 2.7696 Tj +1 TJm +(hat) 12.1743 Tj +-253 TJm +(will) 15.5018 Tj +-253 TJm +(help) 17.1556 Tj +-253 TJm +(me) 12.1743 Tj +-253 TJm +(is) 6.64505 Tj +-252 TJm +(the) 12.1743 Tj +-253 TJm +(\002le) 12.7322 Tj +-253 TJm +(that) 14.9439 Tj +-253 TJm +(you) 14.9439 Tj +-253 TJm +(were) 19.3573 Tj +-253 TJm +(trying) 23.8007 Tj +-252 TJm +(to) 7.7509 Tj +-253 TJm +(compress) 37.6287 Tj +-253 TJm +(or) 8.29885 Tj +-253 TJm +(decompress) 47.0334 Tj +72 211.641 Td +(at) 7.193 Tj +-304 TJm +(the) 12.1743 Tj +-305 TJm +(time) 17.7135 Tj +-304 TJm +(the) 12.1743 Tj +-304 TJm +(problem) 33.2053 Tj +-305 TJm +(happened.) 40.6673 Tj +-946 TJm +(W) 9.40469 Tj +40 TJm +(ithout) 23.2527 Tj +-304 TJm +(that,) 17.4346 Tj +-318 TJm +(my) 12.7322 Tj +-305 TJm +(ability) 25.4644 Tj +-304 TJm +(to) 7.7509 Tj +-304 TJm +(do) 9.9626 Tj +-305 TJm +(an) 9.40469 Tj +15 TJm +(ything) 25.4644 Tj +-304 TJm +(more) 20.4731 Tj +-304 TJm +(than) 17.1556 Tj +-305 TJm +(speculate) 37.0708 Tj +-304 TJm +(about) 22.1369 Tj +-304 TJm +(the) 12.1743 Tj +-305 TJm +(cause,) 24.6176 Tj +-318 TJm +(is) 6.64505 Tj +72 199.686 Td +(limited.) 30.7247 Tj +[1 0 0 1 72 199.587] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -189.624] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 164.933 Td +/F122_0 20.6585 Tf +(4.4.) 34.4584 Tj +-278 TJm +(Did) 33.2808 Tj +-278 TJm +(y) 11.4861 Tj +25 TJm +(ou) 25.2447 Tj +-278 TJm +(g) 12.6223 Tj +-10 TJm +(et) 18.3654 Tj +-278 TJm +(the) 30.9877 Tj +-278 TJm +(right) 45.9032 Tj +-278 TJm +(pac) 35.5946 Tj +20 TJm +(ka) 22.9723 Tj +10 TJm +(g) 12.6223 Tj +-10 TJm +(e?) 24.1085 Tj +[1 0 0 1 72 160.337] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -150.374] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 143.016 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 143.016] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -143.016] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.603 143.016 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-272 TJm +(a) 4.42339 Tj +-273 TJm +(resource) 33.7433 Tj +-272 TJm +(hog.) 17.4346 Tj +-378 TJm +(It) 6.08715 Tj +-272 TJm +(soaks) 22.1369 Tj +-273 TJm +(up) 9.9626 Tj +-272 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-273 TJm +(amounts) 33.7633 Tj +-272 TJm +(of) 8.29885 Tj +-273 TJm +(CPU) 19.3773 Tj +-272 TJm +(c) 4.42339 Tj +15 TJm +(ycles) 20.4731 Tj +-273 TJm +(and) 14.386 Tj +-272 TJm +(memory) 33.2053 Tj +65 TJm +(.) 2.49065 Tj +-755 TJm +(Also,) 21.31 Tj +-278 TJm +(it) 5.53921 Tj +-273 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-272 TJm +(v) 4.9813 Tj +15 TJm +(ery) 12.7222 Tj +-273 TJm +(lar) 10.5105 Tj +18 TJm +(ge) 9.40469 Tj +-272 TJm +(latencies.) 37.3498 Tj +72 131.06 Td +(In) 8.29885 Tj +-251 TJm +(the) 12.1743 Tj +-251 TJm +(w) 7.193 Tj +10 TJm +(orst) 14.9439 Tj +-251 TJm +(case,) 19.6363 Tj +-251 TJm +(you) 14.9439 Tj +-251 TJm +(can) 13.8281 Tj +-251 TJm +(feed) 17.1456 Tj +-251 TJm +(man) 17.1556 Tj +15 TJm +(y) 4.9813 Tj +-251 TJm +(me) 12.1743 Tj +15 TJm +(g) 4.9813 Tj +4 TJm +(abyt) 17.1556 Tj +1 TJm +(es) 8.29885 Tj +-252 TJm +(of) 8.29885 Tj +-251 TJm +(uncompressed) 56.996 Tj +-251 TJm +(data) 16.5977 Tj +-251 TJm +(into) 15.5018 Tj +-251 TJm +(the) 12.1743 Tj +-251 TJm +(library) 26.5603 Tj +-251 TJm +(before) 25.4445 Tj +-251 TJm +(getting) 27.6761 Tj +-251 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-251 TJm +(compressed) 47.0334 Tj +72 119.105 Td +(output,) 27.9551 Tj +-250 TJm +(so) 8.85675 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(probably) 35.417 Tj +-250 TJm +(rules) 19.3673 Tj +-250 TJm +(out) 12.7322 Tj +-250 TJm +(applications) 48.1492 Tj +-250 TJm +(requiring) 36.5229 Tj +-250 TJm +(interacti) 32.6474 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(e) 4.42339 Tj +-250 TJm +(beha) 18.8094 Tj +20 TJm +(viour) 21.031 Tj +55 TJm +(.) 2.49065 Tj +[1 0 0 1 72 116.949] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -106.986] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 97.1875 Td +/F130_0 9.9626 Tf +(These) 23.7907 Tj +-304 TJm +(aren') 20.4632 Tj +18 TJm +(t) 2.7696 Tj +-304 TJm +(f) 3.31755 Tj +10 TJm +(aults) 18.8194 Tj +-304 TJm +(of) 8.29885 Tj +-304 TJm +(my) 12.7322 Tj +-304 TJm +(implementation,) 65.0359 Tj +-317 TJm +(I) 3.31755 Tj +-304 TJm +(hope,) 21.8579 Tj +-318 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-304 TJm +(more) 20.4731 Tj +-304 TJm +(an) 9.40469 Tj +-304 TJm +(intrinsic) 32.6574 Tj +-304 TJm +(property) 33.7533 Tj +-304 TJm +(of) 8.29885 Tj +-304 TJm +(the) 12.1743 Tj +-304 TJm +(Burro) 23.2427 Tj +25 TJm +(ws-Wheeler) 48.1293 Tj +-304 TJm +(transform) 38.7346 Tj +72 85.2323 Td +(\(unfortunately\).) 62.8042 Tj +-620 TJm +(Maybe) 27.6661 Tj +-250 TJm +(this) 14.396 Tj +-250 TJm +(isn') 14.9439 Tj +18 TJm +(t) 2.7696 Tj +-250 TJm +(what) 19.3673 Tj +-250 TJm +(you) 14.9439 Tj +-250 TJm +(w) 7.193 Tj +10 TJm +(ant.) 14.6649 Tj +[1 0 0 1 72 83.0755] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -22.2611] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7545] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(33) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 37 37 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(If) 6.63509 Tj +-275 TJm +(you) 14.9439 Tj +-274 TJm +(w) 7.193 Tj +10 TJm +(ant) 12.1743 Tj +-275 TJm +(a) 4.42339 Tj +-274 TJm +(compressor) 45.9276 Tj +-275 TJm +(and/or) 25.4544 Tj +-275 TJm +(library) 26.5603 Tj +-274 TJm +(which) 24.3486 Tj +-275 TJm +(is) 6.64505 Tj +-274 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +40 TJm +(,) 2.49065 Tj +-281 TJm +(uses) 17.1556 Tj +-275 TJm +(less) 14.9439 Tj +-274 TJm +(memory) 33.2053 Tj +-275 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-275 TJm +(gets) 16.0497 Tj +-274 TJm +(pretty) 23.2427 Tj +-275 TJm +(good) 19.9252 Tj +-274 TJm +(compression,) 52.8516 Tj +-281 TJm +(and) 14.386 Tj +-275 TJm +(has) 13.2801 Tj +72 698.082 Td +(minimal) 33.2153 Tj +-288 TJm +(latenc) 23.7907 Tj +15 TJm +(y) 4.9813 Tj +65 TJm +(,) 2.49065 Tj +-297 TJm +(consider) 33.7533 Tj +-288 TJm +(Jean-loup) 38.7346 Tj +-288 TJm +(Gailly') 28.224 Tj +55 TJm +(s) 3.87545 Tj +-288 TJm +(and) 14.386 Tj +-288 TJm +(Mark) 21.579 Tj +-288 TJm +(Adl) 14.9439 Tj +1 TJm +(er') 11.0585 Tj +55 TJm +(s) 3.87545 Tj +-288 TJm +(w) 7.193 Tj +10 TJm +(ork,) 15.7708 Tj +[1 0 0 1 353.879 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -353.879 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +353.879 698.082 Td +/F134_0 9.9626 Tf +(zlib-1.2.1) 59.7756 Tj +[1 0 0 1 413.655 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -413.655 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +416.523 698.082 Td +/F130_0 9.9626 Tf +(and) 14.386 Tj +[1 0 0 1 433.777 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -433.777 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +433.777 698.082 Td +/F134_0 9.9626 Tf +(gzip-1.2.4) 59.7756 Tj +[1 0 0 1 493.553 698.082] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.553 -698.082] cm +[1 0 0 1 0 0] Tm +0 0 Td +493.553 698.082 Td +/F130_0 9.9626 Tf +(.) 2.49065 Tj +-847 TJm +(Look) 21.031 Tj +-288 TJm +(for) 11.6164 Tj +72 686.127 Td +(them) 19.9252 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(http://www) 45.3896 Tj +65 TJm +(.zlib) 17.4346 Tj +40 TJm +(.or) 10.7895 Tj +18 TJm +(g) 4.9813 Tj +-250 TJm +(and) 14.386 Tj +-250 TJm +(http://www) 45.3896 Tj +65 TJm +(.gzip.or) 30.4357 Tj +18 TJm +(g) 4.9813 Tj +-250 TJm +(respecti) 30.9837 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(ely) 12.1743 Tj +65 TJm +(.) 2.49065 Tj +[1 0 0 1 72 683.97] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -674.008] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 664.209 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(or) 8.29885 Tj +-582 TJm +(something) 41.5142 Tj +-583 TJm +(f) 3.31755 Tj +10 TJm +(aster) 18.8094 Tj +-582 TJm +(and) 14.386 Tj +-582 TJm +(lighter) 26.0123 Tj +-583 TJm +(still,) 17.4445 Tj +-665 TJm +(you) 14.9439 Tj +-582 TJm +(might) 23.2527 Tj +-583 TJm +(try) 11.0684 Tj +-582 TJm +(Markus) 30.4357 Tj +-582 TJm +(F) 5.53921 Tj +-582 TJm +(X) 7.193 Tj +-582 TJm +(J) 3.87545 Tj +-582 TJm +(Oberhumer') 48.6872 Tj +55 TJm +(s) 3.87545 Tj +[1 0 0 1 437.433 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -437.433 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +437.433 664.209 Td +/F134_0 9.9626 Tf +(LZO) 17.9327 Tj +[1 0 0 1 455.365 664.209] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -455.365 -664.209] cm +[1 0 0 1 0 0] Tm +0 0 Td +461.163 664.209 Td +/F130_0 9.9626 Tf +(real-time) 35.965 Tj +-582 TJm +(compres-) 37.0708 Tj +72 652.254 Td +(sion/decompression) 79.1429 Tj +-250 TJm +(library) 26.5603 Tj +65 TJm +(,) 2.49065 Tj +-250 TJm +(at) 7.193 Tj +-250 TJm +(http://www) 45.3896 Tj +65 TJm +(.oberhumer) 45.6486 Tj +55 TJm +(.com/opensource.) 70.2762 Tj +[1 0 0 1 72 650.097] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -640.135] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 617.501 Td +/F122_0 20.6585 Tf +(4.5.) 34.4584 Tj +-278 TJm +(Fur) 33.2808 Tj +-20 TJm +(ther) 39.0239 Tj +-278 TJm +(Reading) 81.4978 Tj +[1 0 0 1 72 612.905] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9626] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -602.942] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 595.583 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 101.888 595.583] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -101.888 -595.583] cm +[1 0 0 1 0 0] Tm +0 0 Td +104.923 595.583 Td +/F130_0 9.9626 Tf +(is) 6.64505 Tj +-305 TJm +(not) 12.7322 Tj +-304 TJm +(research) 33.1854 Tj +-305 TJm +(w) 7.193 Tj +10 TJm +(ork,) 15.7708 Tj +-318 TJm +(in) 7.7509 Tj +-305 TJm +(the) 12.1743 Tj +-304 TJm +(sense) 21.579 Tj +-305 TJm +(that) 14.9439 Tj +-304 TJm +(it) 5.53921 Tj +-305 TJm +(doesn') 26.5603 Tj +18 TJm +(t) 2.7696 Tj +-305 TJm +(present) 28.772 Tj +-304 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-305 TJm +(ne) 9.40469 Tj +25 TJm +(w) 7.193 Tj +-304 TJm +(ideas.) 22.9638 Tj +-474 TJm +(Rather) 26.5603 Tj +40 TJm +(,) 2.49065 Tj +-318 TJm +(it') 8.85675 Tj +55 TJm +(s) 3.87545 Tj +-305 TJm +(an) 9.40469 Tj +-305 TJm +(engineeri) 37.0708 Tj +1 TJm +(ng) 9.9626 Tj +-305 TJm +(e) 4.42339 Tj +15 TJm +(x) 4.9813 Tj +15 TJm +(ercise) 23.2328 Tj +72 583.628 Td +(based) 22.6848 Tj +-250 TJm +(on) 9.9626 Tj +-250 TJm +(e) 4.42339 Tj +15 TJm +(xisting) 27.1282 Tj +-250 TJm +(ideas.) 22.9638 Tj +[1 0 0 1 72 581.471] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -9.9627] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -571.509] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 561.71 Td +/F130_0 9.9626 Tf +(F) 5.53921 Tj +15 TJm +(our) 13.2801 Tj +-250 TJm +(documents) 43.1679 Tj +-250 TJm +(describe) 33.1954 Tj +-250 TJm +(essentially) 42.0621 Tj +-250 TJm +(all) 9.9626 Tj +-250 TJm +(the) 12.1743 Tj +-250 TJm +(ideas) 20.4731 Tj +-250 TJm +(behind) 27.1182 Tj +[1 0 0 1 298.747 561.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -298.747 -561.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +298.747 561.71 Td +/F134_0 9.9626 Tf +(bzip2) 29.8878 Tj +[1 0 0 1 328.635 561.71] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -328.635 -561.71] cm +[1 0 0 1 0 0] Tm +0 0 Td +328.635 561.71 Td +/F130_0 9.9626 Tf +(:) 2.7696 Tj +[1 0 0 1 72 559.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -299.875] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 298.879 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 295.293] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -550.189] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 550.189 Td +/F134_0 9.9626 Tf +(Michael) 41.8429 Tj +-426 TJm +(Burrows) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(D.) 11.9551 Tj +-426 TJm +(J.) 11.9551 Tj +-426 TJm +(Wheeler:) 47.8205 Tj +98.4879 538.234 Td +("A) 11.9551 Tj +-426 TJm +(block-sorting) 77.7083 Tj +-426 TJm +(lossless) 47.8205 Tj +-426 TJm +(data) 23.9102 Tj +-426 TJm +(compression) 65.7532 Tj +-426 TJm +(algorithm") 59.7756 Tj +102.732 526.278 Td +(10th) 23.9102 Tj +-426 TJm +(May) 17.9327 Tj +-426 TJm +(1994.) 29.8878 Tj +102.732 514.323 Td +(Digital) 41.8429 Tj +-426 TJm +(SRC) 17.9327 Tj +-426 TJm +(Research) 47.8205 Tj +-426 TJm +(Report) 35.8654 Tj +-426 TJm +(124.) 23.9102 Tj +102.732 502.368 Td +(ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.g\ +z) 382.564 Tj +102.732 490.413 Td +(If) 11.9551 Tj +-426 TJm +(you) 17.9327 Tj +-426 TJm +(have) 23.9102 Tj +-426 TJm +(trouble) 41.8429 Tj +-426 TJm +(finding) 41.8429 Tj +-426 TJm +(it,) 17.9327 Tj +-426 TJm +(try) 17.9327 Tj +-426 TJm +(searching) 53.798 Tj +-426 TJm +(at) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +102.732 478.458 Td +(New) 17.9327 Tj +-426 TJm +(Zealand) 41.8429 Tj +-426 TJm +(Digital) 41.8429 Tj +-426 TJm +(Library,) 47.8205 Tj +-426 TJm +(http://www.nzdl.org.) 119.551 Tj +90 454.547 Td +(Daniel) 35.8654 Tj +-426 TJm +(S.) 11.9551 Tj +-426 TJm +(Hirschberg) 59.7756 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(Debra) 29.8878 Tj +-426 TJm +(A.) 11.9551 Tj +-426 TJm +(LeLewer) 41.8429 Tj +98.4879 442.592 Td +("Efficient) 59.7756 Tj +-426 TJm +(Decoding) 47.8205 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(Prefix) 35.8654 Tj +-426 TJm +(Codes") 35.8654 Tj +102.732 430.637 Td +(Communications) 83.6858 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(ACM,) 23.9102 Tj +-426 TJm +(April) 29.8878 Tj +-426 TJm +(1990,) 29.8878 Tj +-426 TJm +(Vol) 17.9327 Tj +-426 TJm +(33,) 17.9327 Tj +-426 TJm +(Number) 35.8654 Tj +-426 TJm +(4.) 11.9551 Tj +102.732 418.682 Td +(You) 17.9327 Tj +-426 TJm +(might) 29.8878 Tj +-426 TJm +(be) 11.9551 Tj +-426 TJm +(able) 23.9102 Tj +-426 TJm +(to) 11.9551 Tj +-426 TJm +(get) 17.9327 Tj +-426 TJm +(an) 11.9551 Tj +-426 TJm +(electronic) 59.7756 Tj +-426 TJm +(copy) 23.9102 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(this) 23.9102 Tj +102.732 406.727 Td +(from) 23.9102 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(ACM) 17.9327 Tj +-426 TJm +(Digital) 41.8429 Tj +-426 TJm +(Library.) 47.8205 Tj +90 382.816 Td +(David) 29.8878 Tj +-426 TJm +(J.) 11.9551 Tj +-426 TJm +(Wheeler) 41.8429 Tj +102.732 370.861 Td +(Program) 41.8429 Tj +-426 TJm +(bred3.c) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(accompanying) 71.7307 Tj +-426 TJm +(document) 47.8205 Tj +-426 TJm +(bred3.ps.) 53.798 Tj +102.732 358.906 Td +(This) 23.9102 Tj +-426 TJm +(contains) 47.8205 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(idea) 23.9102 Tj +-426 TJm +(behind) 35.8654 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(multi-table) 65.7532 Tj +-426 TJm +(Huffman) 41.8429 Tj +-426 TJm +(coding) 35.8654 Tj +-426 TJm +(scheme.) 41.8429 Tj +102.732 346.951 Td +(ftp://ftp.cl.cam.ac.uk/users/djw3/) 203.237 Tj +90 323.041 Td +(Jon) 17.9327 Tj +-426 TJm +(L.) 11.9551 Tj +-426 TJm +(Bentley) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(Robert) 35.8654 Tj +-426 TJm +(Sedgewick) 53.798 Tj +98.4879 311.085 Td +("Fast) 29.8878 Tj +-426 TJm +(Algorithms) 59.7756 Tj +-426 TJm +(for) 17.9327 Tj +-426 TJm +(Sorting) 41.8429 Tj +-426 TJm +(and) 17.9327 Tj +-426 TJm +(Searching) 53.798 Tj +-426 TJm +(Strings") 47.8205 Tj +102.732 299.13 Td +(Available) 53.798 Tj +-426 TJm +(from) 23.9102 Tj +-426 TJm +(Sedgewick's) 65.7532 Tj +-426 TJm +(web) 17.9327 Tj +-426 TJm +(page,) 29.8878 Tj +102.732 287.175 Td +(www.cs.princeton.edu/~rs) 143.461 Tj +[1 0 0 1 72 259.678] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -249.715] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 237.76 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-239 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-238 TJm +(paper) 22.1269 Tj +-239 TJm +(gi) 7.7509 Tj +25 TJm +(v) 4.9813 Tj +15 TJm +(es) 8.29885 Tj +-239 TJm +(v) 4.9813 Tj +25 TJm +(aluable) 28.772 Tj +-238 TJm +(additional) 39.8504 Tj +-239 TJm +(insights) 31.0036 Tj +-238 TJm +(into) 15.5018 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(algorithm,) 41.2352 Tj +-241 TJm +(b) 4.9813 Tj +20 TJm +(ut) 7.7509 Tj +-238 TJm +(is) 6.64505 Tj +-239 TJm +(not) 12.7322 Tj +-239 TJm +(immedi) 30.4457 Tj +1 TJm +(ately) 19.3673 Tj +-239 TJm +(the) 12.1743 Tj +-239 TJm +(basis) 19.9252 Tj +-238 TJm +(of) 8.29885 Tj +-239 TJm +(an) 9.40469 Tj +15 TJm +(y) 4.9813 Tj +-239 TJm +(code) 18.8094 Tj +72 225.805 Td +(used) 18.2614 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(bzip2.) 24.6275 Tj +[1 0 0 1 72 223.648] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -72.7273] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 71.731 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 68.1444] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -214.283] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 214.283 Td +/F134_0 9.9626 Tf +(Peter) 29.8878 Tj +-426 TJm +(Fenwick:) 47.8205 Tj +102.732 202.328 Td +(Block) 29.8878 Tj +-426 TJm +(Sorting) 41.8429 Tj +-426 TJm +(Text) 23.9102 Tj +-426 TJm +(Compression) 65.7532 Tj +102.732 190.373 Td +(Proceedings) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(19th) 23.9102 Tj +-426 TJm +(Australasian) 71.7307 Tj +-426 TJm +(Computer) 47.8205 Tj +-426 TJm +(Science) 41.8429 Tj +-426 TJm +(Conference,) 65.7532 Tj +111.22 178.418 Td +(Melbourne,) 59.7756 Tj +-426 TJm +(Australia.) 59.7756 Tj +-852 TJm +(Jan) 17.9327 Tj +-426 TJm +(31) 11.9551 Tj +-426 TJm +(-) 5.97756 Tj +-426 TJm +(Feb) 17.9327 Tj +-426 TJm +(2,) 11.9551 Tj +-426 TJm +(1996.) 29.8878 Tj +102.732 166.463 Td +(ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps) 322.788 Tj +[1 0 0 1 72 150.921] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -140.958] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 129.003 Td +/F130_0 9.9626 Tf +(K) 7.193 Tj +15 TJm +(unihik) 25.4644 Tj +10 TJm +(o) 4.9813 Tj +-250 TJm +(Sadakane') 41.4942 Tj +55 TJm +(s) 3.87545 Tj +-250 TJm +(sorting) 27.6761 Tj +-250 TJm +(algorithm,) 41.2352 Tj +-250 TJm +(mentioned) 42.0621 Tj +-250 TJm +(abo) 14.386 Tj +15 TJm +(v) 4.9813 Tj +15 TJm +(e,) 6.91404 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(from:) 22.1369 Tj +[1 0 0 1 72 126.846] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -117.482] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 117.482 Td +/F134_0 9.9626 Tf +(http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz) 346.698 Tj +[1 0 0 1 72 89.9846] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -29.1702] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9514] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9514 Td +/F130_0 9.9626 Tf +(34) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 38 38 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0 612 792 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +0 0 612 792 re +W +q +[1 0 0 1 72 741.554] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 14.4459] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 187.197 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 -6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 116.328 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -382.4 -749.245] cm +[1 0 0 1 0 0] Tm +0 0 Td +498.728 749.245 Td +/F130_0 9.9626 Tf +(Miscellanea) 48.1393 Tj +[1 0 0 1 266.071 749.146] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 280.796 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -472.974 -7.0936] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -0.4981] cm +q +[] 0 d +0 J +0.4981 w +0 0.2491 m +475.465 0.2491 l +S +Q +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 479.251 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -540 -741.554] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 710.037 Td +/F130_0 9.9626 Tf +(The) 15.4918 Tj +-250 TJm +(Manber) 30.9837 Tj +20 TJm +(-Myers) 28.772 Tj +-250 TJm +(suf) 12.1743 Tj +25 TJm +(\002x) 10.5205 Tj +-250 TJm +(array) 20.4632 Tj +-250 TJm +(construction) 49.2551 Tj +-250 TJm +(algorithm) 38.7446 Tj +-250 TJm +(is) 6.64505 Tj +-250 TJm +(described) 38.1767 Tj +-250 TJm +(in) 7.7509 Tj +-250 TJm +(a) 4.42339 Tj +-250 TJm +(paper) 22.1269 Tj +-250 TJm +(a) 4.42339 Tj +20 TJm +(v) 4.9813 Tj +25 TJm +(ailable) 26.5603 Tj +-250 TJm +(from:) 22.1369 Tj +[1 0 0 1 72 707.88] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -36.8618] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 35.8655 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 32.2789] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3685] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -698.516] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 698.516 Td +/F134_0 9.9626 Tf +(http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps) 322.788 Tj +[1 0 0 1 72 671.019] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -13.5492] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -72 -661.056] cm +[1 0 0 1 0 0] Tm +0 0 Td +72 649.101 Td +/F130_0 9.9626 Tf +(Finally) 28.234 Tj +65 TJm +(,) 2.49065 Tj +-227 TJm +(the) 12.1743 Tj +-221 TJm +(follo) 18.8194 Tj +25 TJm +(wing) 19.9252 Tj +-222 TJm +(papers) 26.0024 Tj +-221 TJm +(document) 39.2925 Tj +-221 TJm +(some) 21.031 Tj +-222 TJm +(in) 7.7509 Tj +40 TJm +(v) 4.9813 Tj +15 TJm +(estig) 18.8194 Tj +5 TJm +(ations) 23.8007 Tj +-221 TJm +(I) 3.31755 Tj +-221 TJm +(made) 21.579 Tj +-222 TJm +(into) 15.5018 Tj +-221 TJm +(the) 12.1743 Tj +-221 TJm +(performance) 50.341 Tj +-222 TJm +(of) 8.29885 Tj +-221 TJm +(sorting) 27.6761 Tj +-221 TJm +(and) 14.386 Tj +-222 TJm +(decompression) 59.7656 Tj +72 637.146 Td +(algorithms:) 45.3896 Tj +[1 0 0 1 72 634.989] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 -132.503] cm +/DeviceRGB {} cs +[0.929398 0.968597 0.956848] sc +/DeviceRGB {} CS +[0.929398 0.968597 0.956848] SC +0 0 468 131.507 re +f +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 127.92] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 18 -8.3686] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -90 -625.624] cm +[1 0 0 1 0 0] Tm +0 0 Td +90 625.624 Td +/F134_0 9.9626 Tf +(Julian) 35.8654 Tj +-426 TJm +(Seward) 35.8654 Tj +102.732 613.669 Td +(On) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(Performance) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(BWT) 17.9327 Tj +-426 TJm +(Sorting) 41.8429 Tj +-426 TJm +(Algorithms) 59.7756 Tj +102.732 601.714 Td +(Proceedings) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(IEEE) 23.9102 Tj +-426 TJm +(Data) 23.9102 Tj +-426 TJm +(Compression) 65.7532 Tj +-426 TJm +(Conference) 59.7756 Tj +-426 TJm +(2000) 23.9102 Tj +111.22 589.759 Td +(Snowbird,) 53.798 Tj +-426 TJm +(Utah.) 29.8878 Tj +-852 TJm +(28-30) 29.8878 Tj +-426 TJm +(March) 29.8878 Tj +-426 TJm +(2000.) 29.8878 Tj +90 565.848 Td +(Julian) 35.8654 Tj +-426 TJm +(Seward) 35.8654 Tj +102.732 553.893 Td +(Space-time) 59.7756 Tj +-426 TJm +(Tradeoffs) 53.798 Tj +-426 TJm +(in) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(Inverse) 41.8429 Tj +-426 TJm +(B-W) 17.9327 Tj +-426 TJm +(Transform) 53.798 Tj +102.732 541.938 Td +(Proceedings) 65.7532 Tj +-426 TJm +(of) 11.9551 Tj +-426 TJm +(the) 17.9327 Tj +-426 TJm +(IEEE) 23.9102 Tj +-426 TJm +(Data) 23.9102 Tj +-426 TJm +(Compression) 65.7532 Tj +-426 TJm +(Conference) 59.7756 Tj +-426 TJm +(2001) 23.9102 Tj +111.22 529.983 Td +(Snowbird,) 53.798 Tj +-426 TJm +(Utah.) 29.8878 Tj +-852 TJm +(27-29) 29.8878 Tj +-426 TJm +(March) 29.8878 Tj +-426 TJm +(2001.) 29.8878 Tj +[1 0 0 1 72 502.486] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 468 3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -468 -3.5866] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 0 -451.634] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 1.8929 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 374.394 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 0 6.8541] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 40.5726 -6.7546] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 -493.841 -50.9513] cm +[1 0 0 1 0 0] Tm +0 0 Td +534.414 50.9513 Td +/F130_0 9.9626 Tf +(35) 9.9626 Tj +[1 0 0 1 453.269 50.8518] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +[1 0 0 1 6.2765 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +[1 0 0 1 -13.1436 0] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%+ font DTUUHP+NimbusSanL-Bold +%%+ font VXAMRV+NimbusRomNo9L-Regu +%%+ font MFECUR+NimbusMonL-Regu +%%+ font ZOVMRD+CMMI10 +%%+ font ERVBFT+NimbusMonL-Bold +%%+ font BZXIEB+CMSY10 +%%+ font WWWUTU+NimbusRomNo9L-ReguItal +%%EOF diff --git a/win32/3rdparty/bzip2/manual.xml b/win32/3rdparty/bzip2/manual.xml new file mode 100644 index 000000000..f22413602 --- /dev/null +++ b/win32/3rdparty/bzip2/manual.xml @@ -0,0 +1,2964 @@ + + + %common-ents; +]> + + + + + bzip2 and libbzip2, version 1.0.5 + A program and library for data compression + + &bz-lifespan; + Julian Seward + + Version &bz-version; of &bz-date; + + + + Julian + Seward + + &bz-url; + + + + + + + This program, bzip2, the + associated library libbzip2, and + all documentation, are copyright © &bz-lifespan; Julian Seward. + All rights reserved. + + Redistribution and use in source and binary forms, with + or without modification, are permitted provided that the + following conditions are met: + + + + Redistributions of source code must retain the + above copyright notice, this list of conditions and the + following disclaimer. + + The origin of this software must not be + misrepresented; you must not claim that you wrote the original + software. If you use this software in a product, an + acknowledgment in the product documentation would be + appreciated but is not required. + + Altered source versions must be plainly marked + as such, and must not be misrepresented as being the original + software. + + The name of the author may not be used to + endorse or promote products derived from this software without + specific prior written permission. + + + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. + + PATENTS: To the best of my knowledge, + bzip2 and + libbzip2 do not use any patented + algorithms. However, I do not have the resources to carry + out a patent search. Therefore I cannot give any guarantee of + the above statement. + + + + + + + + + +Introduction + +bzip2 compresses files +using the Burrows-Wheeler block-sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors. + +bzip2 is built on top of +libbzip2, a flexible library for +handling compressed data in the +bzip2 format. This manual +describes both how to use the program and how to work with the +library interface. Most of the manual is devoted to this +library, not the program, which is good news if your interest is +only in the program. + + + + describes how to use + bzip2; this is the only part + you need to read if you just want to know how to operate the + program. + + describes the + programming interfaces in detail, and + + records some + miscellaneous notes which I thought ought to be recorded + somewhere. + + + + + + + +How to use bzip2 + +This chapter contains a copy of the +bzip2 man page, and nothing +else. + + +NAME + + + + bzip2, + bunzip2 - a block-sorting file + compressor, v1.0.4 + + bzcat - + decompresses files to stdout + + bzip2recover - + recovers data from damaged bzip2 files + + + + + + + +SYNOPSIS + + + + bzip2 [ + -cdfkqstvzVL123456789 ] [ filenames ... ] + + bunzip2 [ + -fkvsVL ] [ filenames ... ] + + bzcat [ -s ] [ + filenames ... ] + + bzip2recover + filename + + + + + + + +DESCRIPTION + +bzip2 compresses files +using the Burrows-Wheeler block sorting text compression +algorithm, and Huffman coding. Compression is generally +considerably better than that achieved by more conventional +LZ77/LZ78-based compressors, and approaches the performance of +the PPM family of statistical compressors. + +The command-line options are deliberately very similar to +those of GNU gzip, but they are +not identical. + +bzip2 expects a list of +file names to accompany the command-line flags. Each file is +replaced by a compressed version of itself, with the name +original_name.bz2. Each +compressed file has the same modification date, permissions, and, +when possible, ownership as the corresponding original, so that +these properties can be correctly restored at decompression time. +File name handling is naive in the sense that there is no +mechanism for preserving original file names, permissions, +ownerships or dates in filesystems which lack these concepts, or +have serious file name length restrictions, such as +MS-DOS. + +bzip2 and +bunzip2 will by default not +overwrite existing files. If you want this to happen, specify +the -f flag. + +If no file names are specified, +bzip2 compresses from standard +input to standard output. In this case, +bzip2 will decline to write +compressed output to a terminal, as this would be entirely +incomprehensible and therefore pointless. + +bunzip2 (or +bzip2 -d) decompresses all +specified files. Files which were not created by +bzip2 will be detected and +ignored, and a warning issued. +bzip2 attempts to guess the +filename for the decompressed file from that of the compressed +file as follows: + + + + filename.bz2 + becomes + filename + + filename.bz + becomes + filename + + filename.tbz2 + becomes + filename.tar + + filename.tbz + becomes + filename.tar + + anyothername + becomes + anyothername.out + + + +If the file does not end in one of the recognised endings, +.bz2, +.bz, +.tbz2 or +.tbz, +bzip2 complains that it cannot +guess the name of the original file, and uses the original name +with .out appended. + +As with compression, supplying no filenames causes +decompression from standard input to standard output. + +bunzip2 will correctly +decompress a file which is the concatenation of two or more +compressed files. The result is the concatenation of the +corresponding uncompressed files. Integrity testing +(-t) of concatenated compressed +files is also supported. + +You can also compress or decompress files to the standard +output by giving the -c flag. +Multiple files may be compressed and decompressed like this. The +resulting outputs are fed sequentially to stdout. Compression of +multiple files in this manner generates a stream containing +multiple compressed file representations. Such a stream can be +decompressed correctly only by +bzip2 version 0.9.0 or later. +Earlier versions of bzip2 will +stop after decompressing the first file in the stream. + +bzcat (or +bzip2 -dc) decompresses all +specified files to the standard output. + +bzip2 will read arguments +from the environment variables +BZIP2 and +BZIP, in that order, and will +process them before any arguments read from the command line. +This gives a convenient way to supply default arguments. + +Compression is always performed, even if the compressed +file is slightly larger than the original. Files of less than +about one hundred bytes tend to get larger, since the compression +mechanism has a constant overhead in the region of 50 bytes. +Random data (including the output of most file compressors) is +coded at about 8.05 bits per byte, giving an expansion of around +0.5%. + +As a self-check for your protection, +bzip2 uses 32-bit CRCs to make +sure that the decompressed version of a file is identical to the +original. This guards against corruption of the compressed data, +and against undetected bugs in +bzip2 (hopefully very unlikely). +The chances of data corruption going undetected is microscopic, +about one chance in four billion for each file processed. Be +aware, though, that the check occurs upon decompression, so it +can only tell you that something is wrong. It can't help you +recover the original uncompressed data. You can use +bzip2recover to try to recover +data from damaged files. + +Return values: 0 for a normal exit, 1 for environmental +problems (file not found, invalid flags, I/O errors, etc.), 2 +to indicate a corrupt compressed file, 3 for an internal +consistency error (eg, bug) which caused +bzip2 to panic. + + + + + +OPTIONS + + + + + -c --stdout + Compress or decompress to standard + output. + + + + -d --decompress + Force decompression. + bzip2, + bunzip2 and + bzcat are really the same + program, and the decision about what actions to take is done on + the basis of which name is used. This flag overrides that + mechanism, and forces bzip2 to decompress. + + + + -z --compress + The complement to + -d: forces compression, + regardless of the invokation name. + + + + -t --test + Check integrity of the specified file(s), but + don't decompress them. This really performs a trial + decompression and throws away the result. + + + + -f --force + Force overwrite of output files. Normally, + bzip2 will not overwrite + existing output files. Also forces + bzip2 to break hard links to + files, which it otherwise wouldn't do. + bzip2 normally declines + to decompress files which don't have the correct magic header + bytes. If forced (-f), + however, it will pass such files through unmodified. This is + how GNU gzip behaves. + + + + + -k --keep + Keep (don't delete) input files during + compression or decompression. + + + + -s --small + Reduce memory usage, for compression, + decompression and testing. Files are decompressed and tested + using a modified algorithm which only requires 2.5 bytes per + block byte. This means any file can be decompressed in 2300k + of memory, albeit at about half the normal speed. + During compression, -s + selects a block size of 200k, which limits memory use to around + the same figure, at the expense of your compression ratio. In + short, if your machine is low on memory (8 megabytes or less), + use -s for everything. See + below. + + + + -q --quiet + Suppress non-essential warning messages. + Messages pertaining to I/O errors and other critical events + will not be suppressed. + + + + -v --verbose + Verbose mode -- show the compression ratio for + each file processed. Further + -v's increase the verbosity + level, spewing out lots of information which is primarily of + interest for diagnostic purposes. + + + + -L --license -V --version + Display the software version, license terms and + conditions. + + + + -1 (or + --fast) to + -9 (or + -best) + Set the block size to 100 k, 200 k ... 900 k + when compressing. Has no effect when decompressing. See below. The + --fast and + --best aliases are primarily + for GNU gzip compatibility. + In particular, --fast doesn't + make things significantly faster. And + --best merely selects the + default behaviour. + + + + -- + Treats all subsequent arguments as file names, + even if they start with a dash. This is so you can handle + files with names beginning with a dash, for example: + bzip2 -- + -myfilename. + + + + --repetitive-fast + --repetitive-best + These flags are redundant in versions 0.9.5 and + above. They provided some coarse control over the behaviour of + the sorting algorithm in earlier versions, which was sometimes + useful. 0.9.5 and above have an improved algorithm which + renders these flags irrelevant. + + + + + + + + +MEMORY MANAGEMENT + +bzip2 compresses large +files in blocks. The block size affects both the compression +ratio achieved, and the amount of memory needed for compression +and decompression. The flags -1 +through -9 specify the block +size to be 100,000 bytes through 900,000 bytes (the default) +respectively. At decompression time, the block size used for +compression is read from the header of the compressed file, and +bunzip2 then allocates itself +just enough memory to decompress the file. Since block sizes are +stored in compressed files, it follows that the flags +-1 to +-9 are irrelevant to and so +ignored during decompression. + +Compression and decompression requirements, in bytes, can be +estimated as: + +Compression: 400k + ( 8 x block size ) + +Decompression: 100k + ( 4 x block size ), or + 100k + ( 2.5 x block size ) + + +Larger block sizes give rapidly diminishing marginal +returns. Most of the compression comes from the first two or +three hundred k of block size, a fact worth bearing in mind when +using bzip2 on small machines. +It is also important to appreciate that the decompression memory +requirement is set at compression time by the choice of block +size. + +For files compressed with the default 900k block size, +bunzip2 will require about 3700 +kbytes to decompress. To support decompression of any file on a +4 megabyte machine, bunzip2 has +an option to decompress using approximately half this amount of +memory, about 2300 kbytes. Decompression speed is also halved, +so you should use this option only where necessary. The relevant +flag is -s. + +In general, try and use the largest block size memory +constraints allow, since that maximises the compression achieved. +Compression and decompression speed are virtually unaffected by +block size. + +Another significant point applies to files which fit in a +single block -- that means most files you'd encounter using a +large block size. The amount of real memory touched is +proportional to the size of the file, since the file is smaller +than a block. For example, compressing a file 20,000 bytes long +with the flag -9 will cause the +compressor to allocate around 7600k of memory, but only touch +400k + 20000 * 8 = 560 kbytes of it. Similarly, the decompressor +will allocate 3700k but only touch 100k + 20000 * 4 = 180 +kbytes. + +Here is a table which summarises the maximum memory usage +for different block sizes. Also recorded is the total compressed +size for 14 files of the Calgary Text Compression Corpus +totalling 3,141,622 bytes. This column gives some feel for how +compression varies with block size. These figures tend to +understate the advantage of larger block sizes for larger files, +since the Corpus is dominated by smaller files. + + + Compress Decompress Decompress Corpus +Flag usage usage -s usage Size + + -1 1200k 500k 350k 914704 + -2 2000k 900k 600k 877703 + -3 2800k 1300k 850k 860338 + -4 3600k 1700k 1100k 846899 + -5 4400k 2100k 1350k 845160 + -6 5200k 2500k 1600k 838626 + -7 6100k 2900k 1850k 834096 + -8 6800k 3300k 2100k 828642 + -9 7600k 3700k 2350k 828642 + + + + + + +RECOVERING DATA FROM DAMAGED FILES + +bzip2 compresses files in +blocks, usually 900kbytes long. Each block is handled +independently. If a media or transmission error causes a +multi-block .bz2 file to become +damaged, it may be possible to recover data from the undamaged +blocks in the file. + +The compressed representation of each block is delimited by +a 48-bit pattern, which makes it possible to find the block +boundaries with reasonable certainty. Each block also carries +its own 32-bit CRC, so damaged blocks can be distinguished from +undamaged ones. + +bzip2recover is a simple +program whose purpose is to search for blocks in +.bz2 files, and write each block +out into its own .bz2 file. You +can then use bzip2 -t to test +the integrity of the resulting files, and decompress those which +are undamaged. + +bzip2recover takes a +single argument, the name of the damaged file, and writes a +number of files rec0001file.bz2, +rec0002file.bz2, etc, containing +the extracted blocks. The output filenames are designed so that +the use of wildcards in subsequent processing -- for example, +bzip2 -dc rec*file.bz2 > +recovered_data -- lists the files in the correct +order. + +bzip2recover should be of +most use dealing with large .bz2 +files, as these will contain many blocks. It is clearly futile +to use it on damaged single-block files, since a damaged block +cannot be recovered. If you wish to minimise any potential data +loss through media or transmission errors, you might consider +compressing with a smaller block size. + + + + + +PERFORMANCE NOTES + +The sorting phase of compression gathers together similar +strings in the file. Because of this, files containing very long +runs of repeated symbols, like "aabaabaabaab ..." (repeated +several hundred times) may compress more slowly than normal. +Versions 0.9.5 and above fare much better than previous versions +in this respect. The ratio between worst-case and average-case +compression time is in the region of 10:1. For previous +versions, this figure was more like 100:1. You can use the +-vvvv option to monitor progress +in great detail, if you want. + +Decompression speed is unaffected by these +phenomena. + +bzip2 usually allocates +several megabytes of memory to operate in, and then charges all +over it in a fairly random fashion. This means that performance, +both for compressing and decompressing, is largely determined by +the speed at which your machine can service cache misses. +Because of this, small changes to the code to reduce the miss +rate have been observed to give disproportionately large +performance improvements. I imagine +bzip2 will perform best on +machines with very large caches. + + + + + + +CAVEATS + +I/O error messages are not as helpful as they could be. +bzip2 tries hard to detect I/O +errors and exit cleanly, but the details of what the problem is +sometimes seem rather misleading. + +This manual page pertains to version &bz-version; of +bzip2. Compressed data created by +this version is entirely forwards and backwards compatible with the +previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0, +1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and +above can correctly decompress multiple concatenated compressed files. +0.1pl2 cannot do this; it will stop after decompressing just the first +file in the stream. + +bzip2recover versions +prior to 1.0.2 used 32-bit integers to represent bit positions in +compressed files, so it could not handle compressed files more +than 512 megabytes long. Versions 1.0.2 and above use 64-bit ints +on some platforms which support them (GNU supported targets, and +Windows). To establish whether or not +bzip2recover was built with such +a limitation, run it without arguments. In any event you can +build yourself an unlimited version if you can recompile it with +MaybeUInt64 set to be an +unsigned 64-bit integer. + + + + + + +AUTHOR + +Julian Seward, +&bz-email; + +The ideas embodied in +bzip2 are due to (at least) the +following people: Michael Burrows and David Wheeler (for the +block sorting transformation), David Wheeler (again, for the +Huffman coder), Peter Fenwick (for the structured coding model in +the original bzip, and many +refinements), and Alistair Moffat, Radford Neal and Ian Witten +(for the arithmetic coder in the original +bzip). I am much indebted for +their help, support and advice. See the manual in the source +distribution for pointers to sources of documentation. Christian +von Roques encouraged me to look for faster sorting algorithms, +so as to speed up compression. Bela Lubkin encouraged me to +improve the worst-case compression performance. +Donna Robinson XMLised the documentation. +Many people sent +patches, helped with portability problems, lent machines, gave +advice and were generally helpful. + + + + + + + + + +Programming with <computeroutput>libbzip2</computeroutput> + + +This chapter describes the programming interface to +libbzip2. + +For general background information, particularly about +memory use and performance aspects, you'd be well advised to read + as well. + + + +Top-level structure + +libbzip2 is a flexible +library for compressing and decompressing data in the +bzip2 data format. Although +packaged as a single entity, it helps to regard the library as +three separate parts: the low level interface, and the high level +interface, and some utility functions. + +The structure of +libbzip2's interfaces is similar +to that of Jean-loup Gailly's and Mark Adler's excellent +zlib library. + +All externally visible symbols have names beginning +BZ2_. This is new in version +1.0. The intention is to minimise pollution of the namespaces of +library clients. + +To use any part of the library, you need to +#include <bzlib.h> +into your sources. + + + + +Low-level summary + +This interface provides services for compressing and +decompressing data in memory. There's no provision for dealing +with files, streams or any other I/O mechanisms, just straight +memory-to-memory work. In fact, this part of the library can be +compiled without inclusion of +stdio.h, which may be helpful +for embedded applications. + +The low-level part of the library has no global variables +and is therefore thread-safe. + +Six routines make up the low level interface: +BZ2_bzCompressInit, +BZ2_bzCompress, and +BZ2_bzCompressEnd for +compression, and a corresponding trio +BZ2_bzDecompressInit, +BZ2_bzDecompress and +BZ2_bzDecompressEnd for +decompression. The *Init +functions allocate memory for compression/decompression and do +other initialisations, whilst the +*End functions close down +operations and release memory. + +The real work is done by +BZ2_bzCompress and +BZ2_bzDecompress. These +compress and decompress data from a user-supplied input buffer to +a user-supplied output buffer. These buffers can be any size; +arbitrary quantities of data are handled by making repeated calls +to these functions. This is a flexible mechanism allowing a +consumer-pull style of activity, or producer-push, or a mixture +of both. + + + + + +High-level summary + +This interface provides some handy wrappers around the +low-level interface to facilitate reading and writing +bzip2 format files +(.bz2 files). The routines +provide hooks to facilitate reading files in which the +bzip2 data stream is embedded +within some larger-scale file structure, or where there are +multiple bzip2 data streams +concatenated end-to-end. + +For reading files, +BZ2_bzReadOpen, +BZ2_bzRead, +BZ2_bzReadClose and +BZ2_bzReadGetUnused are +supplied. For writing files, +BZ2_bzWriteOpen, +BZ2_bzWrite and +BZ2_bzWriteFinish are +available. + +As with the low-level library, no global variables are used +so the library is per se thread-safe. However, if I/O errors +occur whilst reading or writing the underlying compressed files, +you may have to consult errno to +determine the cause of the error. In that case, you'd need a C +library which correctly supports +errno in a multithreaded +environment. + +To make the library a little simpler and more portable, +BZ2_bzReadOpen and +BZ2_bzWriteOpen require you to +pass them file handles (FILE*s) +which have previously been opened for reading or writing +respectively. That avoids portability problems associated with +file operations and file attributes, whilst not being much of an +imposition on the programmer. + + + + + +Utility functions summary + +For very simple needs, +BZ2_bzBuffToBuffCompress and +BZ2_bzBuffToBuffDecompress are +provided. These compress data in memory from one buffer to +another buffer in a single function call. You should assess +whether these functions fulfill your memory-to-memory +compression/decompression requirements before investing effort in +understanding the more general but more complex low-level +interface. + +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp) has +contributed some functions to give better +zlib compatibility. These +functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. You may find +these functions more convenient for simple file reading and +writing, than those in the high-level interface. These functions +are not (yet) officially part of the library, and are minimally +documented here. If they break, you get to keep all the pieces. +I hope to document them properly when time permits. + +Yoshioka also contributed modifications to allow the +library to be built as a Windows DLL. + + + + + + + +Error handling + +The library is designed to recover cleanly in all +situations, including the worst-case situation of decompressing +random data. I'm not 100% sure that it can always do this, so +you might want to add a signal handler to catch segmentation +violations during decompression if you are feeling especially +paranoid. I would be interested in hearing more about the +robustness of the library to corrupted compressed data. + +Version 1.0.3 more robust in this respect than any +previous version. Investigations with Valgrind (a tool for detecting +problems with memory management) indicate +that, at least for the few files I tested, all single-bit errors +in the decompressed data are caught properly, with no +segmentation faults, no uses of uninitialised data, no out of +range reads or writes, and no infinite looping in the decompressor. +So it's certainly pretty robust, although +I wouldn't claim it to be totally bombproof. + +The file bzlib.h contains +all definitions needed to use the library. In particular, you +should definitely not include +bzlib_private.h. + +In bzlib.h, the various +return values are defined. The following list is not intended as +an exhaustive description of the circumstances in which a given +value may be returned -- those descriptions are given later. +Rather, it is intended to convey the rough meaning of each return +value. The first five actions are normal and not intended to +denote an error situation. + + + + + BZ_OK + The requested action was completed + successfully. + + + + BZ_RUN_OK, BZ_FLUSH_OK, + BZ_FINISH_OK + In + BZ2_bzCompress, the requested + flush/finish/nothing-special action was completed + successfully. + + + + BZ_STREAM_END + Compression of data was completed, or the + logical stream end was detected during + decompression. + + + + +The following return values indicate an error of some +kind. + + + + + BZ_CONFIG_ERROR + Indicates that the library has been improperly + compiled on your platform -- a major configuration error. + Specifically, it means that + sizeof(char), + sizeof(short) and + sizeof(int) are not 1, 2 and + 4 respectively, as they should be. Note that the library + should still work properly on 64-bit platforms which follow + the LP64 programming model -- that is, where + sizeof(long) and + sizeof(void*) are 8. Under + LP64, sizeof(int) is still 4, + so libbzip2, which doesn't + use the long type, is + OK. + + + + BZ_SEQUENCE_ERROR + When using the library, it is important to call + the functions in the correct sequence and with data structures + (buffers etc) in the correct states. + libbzip2 checks as much as it + can to ensure this is happening, and returns + BZ_SEQUENCE_ERROR if not. + Code which complies precisely with the function semantics, as + detailed below, should never receive this value; such an event + denotes buggy code which you should + investigate. + + + + BZ_PARAM_ERROR + Returned when a parameter to a function call is + out of range or otherwise manifestly incorrect. As with + BZ_SEQUENCE_ERROR, this + denotes a bug in the client code. The distinction between + BZ_PARAM_ERROR and + BZ_SEQUENCE_ERROR is a bit + hazy, but still worth making. + + + + BZ_MEM_ERROR + Returned when a request to allocate memory + failed. Note that the quantity of memory needed to decompress + a stream cannot be determined until the stream's header has + been read. So + BZ2_bzDecompress and + BZ2_bzRead may return + BZ_MEM_ERROR even though some + of the compressed data has been read. The same is not true + for compression; once + BZ2_bzCompressInit or + BZ2_bzWriteOpen have + successfully completed, + BZ_MEM_ERROR cannot + occur. + + + + BZ_DATA_ERROR + Returned when a data integrity error is + detected during decompression. Most importantly, this means + when stored and computed CRCs for the data do not match. This + value is also returned upon detection of any other anomaly in + the compressed data. + + + + BZ_DATA_ERROR_MAGIC + As a special case of + BZ_DATA_ERROR, it is + sometimes useful to know when the compressed stream does not + start with the correct magic bytes ('B' 'Z' + 'h'). + + + + BZ_IO_ERROR + Returned by + BZ2_bzRead and + BZ2_bzWrite when there is an + error reading or writing in the compressed file, and by + BZ2_bzReadOpen and + BZ2_bzWriteOpen for attempts + to use a file for which the error indicator (viz, + ferror(f)) is set. On + receipt of BZ_IO_ERROR, the + caller should consult errno + and/or perror to acquire + operating-system specific information about the + problem. + + + + BZ_UNEXPECTED_EOF + Returned by + BZ2_bzRead when the + compressed file finishes before the logical end of stream is + detected. + + + + BZ_OUTBUFF_FULL + Returned by + BZ2_bzBuffToBuffCompress and + BZ2_bzBuffToBuffDecompress to + indicate that the output data will not fit into the output + buffer provided. + + + + + + + + + +Low-level interface + + + +<computeroutput>BZ2_bzCompressInit</computeroutput> + + +typedef struct { + char *next_in; + unsigned int avail_in; + unsigned int total_in_lo32; + unsigned int total_in_hi32; + + char *next_out; + unsigned int avail_out; + unsigned int total_out_lo32; + unsigned int total_out_hi32; + + void *state; + + void *(*bzalloc)(void *,int,int); + void (*bzfree)(void *,void *); + void *opaque; +} bz_stream; + +int BZ2_bzCompressInit ( bz_stream *strm, + int blockSize100k, + int verbosity, + int workFactor ); + + +Prepares for compression. The +bz_stream structure holds all +data pertaining to the compression activity. A +bz_stream structure should be +allocated and initialised prior to the call. The fields of +bz_stream comprise the entirety +of the user-visible data. state +is a pointer to the private data structures required for +compression. + +Custom memory allocators are supported, via fields +bzalloc, +bzfree, and +opaque. The value +opaque is passed to as the first +argument to all calls to bzalloc +and bzfree, but is otherwise +ignored by the library. The call bzalloc ( +opaque, n, m ) is expected to return a pointer +p to n * +m bytes of memory, and bzfree ( +opaque, p ) should free that memory. + +If you don't want to use a custom memory allocator, set +bzalloc, +bzfree and +opaque to +NULL, and the library will then +use the standard malloc / +free routines. + +Before calling +BZ2_bzCompressInit, fields +bzalloc, +bzfree and +opaque should be filled +appropriately, as just described. Upon return, the internal +state will have been allocated and initialised, and +total_in_lo32, +total_in_hi32, +total_out_lo32 and +total_out_hi32 will have been +set to zero. These four fields are used by the library to inform +the caller of the total amount of data passed into and out of the +library, respectively. You should not try to change them. As of +version 1.0, 64-bit counts are maintained, even on 32-bit +platforms, using the _hi32 +fields to store the upper 32 bits of the count. So, for example, +the total amount of data in is (total_in_hi32 +<< 32) + total_in_lo32. + +Parameter blockSize100k +specifies the block size to be used for compression. It should +be a value between 1 and 9 inclusive, and the actual block size +used is 100000 x this figure. 9 gives the best compression but +takes most memory. + +Parameter verbosity should +be set to a number between 0 and 4 inclusive. 0 is silent, and +greater numbers give increasingly verbose monitoring/debugging +output. If the library has been compiled with +-DBZ_NO_STDIO, no such output +will appear for any verbosity setting. + +Parameter workFactor +controls how the compression phase behaves when presented with +worst case, highly repetitive, input data. If compression runs +into difficulties caused by repetitive data, the library switches +from the standard sorting algorithm to a fallback algorithm. The +fallback is slower than the standard algorithm by perhaps a +factor of three, but always behaves reasonably, no matter how bad +the input. + +Lower values of workFactor +reduce the amount of effort the standard algorithm will expend +before resorting to the fallback. You should set this parameter +carefully; too low, and many inputs will be handled by the +fallback algorithm and so compress rather slowly, too high, and +your average-to-worst case compression times can become very +large. The default value of 30 gives reasonable behaviour over a +wide range of circumstances. + +Allowable values range from 0 to 250 inclusive. 0 is a +special case, equivalent to using the default value of 30. + +Note that the compressed output generated is the same +regardless of whether or not the fallback algorithm is +used. + +Be aware also that this parameter may disappear entirely in +future versions of the library. In principle it should be +possible to devise a good way to automatically choose which +algorithm to use. Such a mechanism would render the parameter +obsolete. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if strm is NULL + or blockSize < 1 or blockSize > 9 + or verbosity < 0 or verbosity > 4 + or workFactor < 0 or workFactor > 250 +BZ_MEM_ERROR + if not enough memory is available +BZ_OK + otherwise + + +Allowable next actions: + + +BZ2_bzCompress + if BZ_OK is returned + no specific action needed in case of error + + + + + + +<computeroutput>BZ2_bzCompress</computeroutput> + + +int BZ2_bzCompress ( bz_stream *strm, int action ); + + +Provides more input and/or output buffer space for the +library. The caller maintains input and output buffers, and +calls BZ2_bzCompress to transfer +data between them. + +Before each call to +BZ2_bzCompress, +next_in should point at the data +to be compressed, and avail_in +should indicate how many bytes the library may read. +BZ2_bzCompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read. + +Similarly, next_out should +point to a buffer in which the compressed data is to be placed, +with avail_out indicating how +much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output. + +You may provide and remove as little or as much data as you +like on each call of +BZ2_bzCompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call. + +A second purpose of +BZ2_bzCompress is to request a +change of mode of the compressed stream. + +Conceptually, a compressed stream can be in one of four +states: IDLE, RUNNING, FLUSHING and FINISHING. Before +initialisation +(BZ2_bzCompressInit) and after +termination (BZ2_bzCompressEnd), +a stream is regarded as IDLE. + +Upon initialisation +(BZ2_bzCompressInit), the stream +is placed in the RUNNING state. Subsequent calls to +BZ2_bzCompress should pass +BZ_RUN as the requested action; +other actions are illegal and will result in +BZ_SEQUENCE_ERROR. + +At some point, the calling program will have provided all +the input data it wants to. It will then want to finish up -- in +effect, asking the library to process any data it might have +buffered internally. In this state, +BZ2_bzCompress will no longer +attempt to read data from +next_in, but it will want to +write data to next_out. Because +the output buffer supplied by the user can be arbitrarily small, +the finishing-up operation cannot necessarily be done with a +single call of +BZ2_bzCompress. + +Instead, the calling program passes +BZ_FINISH as an action to +BZ2_bzCompress. This changes +the stream's state to FINISHING. Any remaining input (ie, +next_in[0 .. avail_in-1]) is +compressed and transferred to the output buffer. To do this, +BZ2_bzCompress must be called +repeatedly until all the output has been consumed. At that +point, BZ2_bzCompress returns +BZ_STREAM_END, and the stream's +state is set back to IDLE. +BZ2_bzCompressEnd should then be +called. + +Just to make sure the calling program does not cheat, the +library makes a note of avail_in +at the time of the first call to +BZ2_bzCompress which has +BZ_FINISH as an action (ie, at +the time the program has announced its intention to not supply +any more input). By comparing this value with that of +avail_in over subsequent calls +to BZ2_bzCompress, the library +can detect any attempts to slip in more data to compress. Any +calls for which this is detected will return +BZ_SEQUENCE_ERROR. This +indicates a programming mistake which should be corrected. + +Instead of asking to finish, the calling program may ask +BZ2_bzCompress to take all the +remaining input, compress it and terminate the current +(Burrows-Wheeler) compression block. This could be useful for +error control purposes. The mechanism is analogous to that for +finishing: call BZ2_bzCompress +with an action of BZ_FLUSH, +remove output data, and persist with the +BZ_FLUSH action until the value +BZ_RUN is returned. As with +finishing, BZ2_bzCompress +detects any attempt to provide more input data once the flush has +begun. + +Once the flush is complete, the stream returns to the +normal RUNNING state. + +This all sounds pretty complex, but isn't really. Here's a +table which shows which actions are allowable in each state, what +action will be taken, what the next state is, and what the +non-error return values are. Note that you can't explicitly ask +what state the stream is in, but nor do you need to -- it can be +inferred from the values returned by +BZ2_bzCompress. + + +IDLE/any + Illegal. IDLE state only exists after BZ2_bzCompressEnd or + before BZ2_bzCompressInit. + Return value = BZ_SEQUENCE_ERROR + +RUNNING/BZ_RUN + Compress from next_in to next_out as much as possible. + Next state = RUNNING + Return value = BZ_RUN_OK + +RUNNING/BZ_FLUSH + Remember current value of next_in. Compress from next_in + to next_out as much as possible, but do not accept any more input. + Next state = FLUSHING + Return value = BZ_FLUSH_OK + +RUNNING/BZ_FINISH + Remember current value of next_in. Compress from next_in + to next_out as much as possible, but do not accept any more input. + Next state = FINISHING + Return value = BZ_FINISH_OK + +FLUSHING/BZ_FLUSH + Compress from next_in to next_out as much as possible, + but do not accept any more input. + If all the existing input has been used up and all compressed + output has been removed + Next state = RUNNING; Return value = BZ_RUN_OK + else + Next state = FLUSHING; Return value = BZ_FLUSH_OK + +FLUSHING/other + Illegal. + Return value = BZ_SEQUENCE_ERROR + +FINISHING/BZ_FINISH + Compress from next_in to next_out as much as possible, + but to not accept any more input. + If all the existing input has been used up and all compressed + output has been removed + Next state = IDLE; Return value = BZ_STREAM_END + else + Next state = FINISHING; Return value = BZ_FINISH_OK + +FINISHING/other + Illegal. + Return value = BZ_SEQUENCE_ERROR + + + +That still looks complicated? Well, fair enough. The +usual sequence of calls for compressing a load of data is: + + + + Get started with + BZ2_bzCompressInit. + + Shovel data in and shlurp out its compressed form + using zero or more calls of + BZ2_bzCompress with action = + BZ_RUN. + + Finish up. Repeatedly call + BZ2_bzCompress with action = + BZ_FINISH, copying out the + compressed output, until + BZ_STREAM_END is + returned. Close up and go home. Call + BZ2_bzCompressEnd. + + + +If the data you want to compress fits into your input +buffer all at once, you can skip the calls of +BZ2_bzCompress ( ..., BZ_RUN ) +and just do the BZ2_bzCompress ( ..., BZ_FINISH +) calls. + +All required memory is allocated by +BZ2_bzCompressInit. The +compression library can accept any data at all (obviously). So +you shouldn't get any error return values from the +BZ2_bzCompress calls. If you +do, they will be +BZ_SEQUENCE_ERROR, and indicate +a bug in your programming. + +Trivial other possible return values: + + +BZ_PARAM_ERROR + if strm is NULL, or strm->s is NULL + + + + + + +<computeroutput>BZ2_bzCompressEnd</computeroutput> + + +int BZ2_bzCompressEnd ( bz_stream *strm ); + + +Releases all memory associated with a compression +stream. + +Possible return values: + + +BZ_PARAM_ERROR if strm is NULL or strm->s is NULL +BZ_OK otherwise + + + + + + +<computeroutput>BZ2_bzDecompressInit</computeroutput> + + +int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small ); + + +Prepares for decompression. As with +BZ2_bzCompressInit, a +bz_stream record should be +allocated and initialised before the call. Fields +bzalloc, +bzfree and +opaque should be set if a custom +memory allocator is required, or made +NULL for the normal +malloc / +free routines. Upon return, the +internal state will have been initialised, and +total_in and +total_out will be zero. + +For the meaning of parameter +verbosity, see +BZ2_bzCompressInit. + +If small is nonzero, the +library will use an alternative decompression algorithm which +uses less memory but at the cost of decompressing more slowly +(roughly speaking, half the speed, but the maximum memory +requirement drops to around 2300k). See +for more information on memory management. + +Note that the amount of memory needed to decompress a +stream cannot be determined until the stream's header has been +read, so even if +BZ2_bzDecompressInit succeeds, a +subsequent BZ2_bzDecompress +could fail with +BZ_MEM_ERROR. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if ( small != 0 && small != 1 ) + or (verbosity <; 0 || verbosity > 4) +BZ_MEM_ERROR + if insufficient memory is available + + +Allowable next actions: + + +BZ2_bzDecompress + if BZ_OK was returned + no specific action required in case of error + + + + + + +<computeroutput>BZ2_bzDecompress</computeroutput> + + +int BZ2_bzDecompress ( bz_stream *strm ); + + +Provides more input and/out output buffer space for the +library. The caller maintains input and output buffers, and uses +BZ2_bzDecompress to transfer +data between them. + +Before each call to +BZ2_bzDecompress, +next_in should point at the +compressed data, and avail_in +should indicate how many bytes the library may read. +BZ2_bzDecompress updates +next_in, +avail_in and +total_in to reflect the number +of bytes it has read. + +Similarly, next_out should +point to a buffer in which the uncompressed output is to be +placed, with avail_out +indicating how much output space is available. +BZ2_bzCompress updates +next_out, +avail_out and +total_out to reflect the number +of bytes output. + +You may provide and remove as little or as much data as you +like on each call of +BZ2_bzDecompress. In the limit, +it is acceptable to supply and remove data one byte at a time, +although this would be terribly inefficient. You should always +ensure that at least one byte of output space is available at +each call. + +Use of BZ2_bzDecompress is +simpler than +BZ2_bzCompress. + +You should provide input and remove output as described +above, and repeatedly call +BZ2_bzDecompress until +BZ_STREAM_END is returned. +Appearance of BZ_STREAM_END +denotes that BZ2_bzDecompress +has detected the logical end of the compressed stream. +BZ2_bzDecompress will not +produce BZ_STREAM_END until all +output data has been placed into the output buffer, so once +BZ_STREAM_END appears, you are +guaranteed to have available all the decompressed output, and +BZ2_bzDecompressEnd can safely +be called. + +If case of an error return value, you should call +BZ2_bzDecompressEnd to clean up +and release memory. + +Possible return values: + + +BZ_PARAM_ERROR + if strm is NULL or strm->s is NULL + or strm->avail_out < 1 +BZ_DATA_ERROR + if a data integrity error is detected in the compressed stream +BZ_DATA_ERROR_MAGIC + if the compressed stream doesn't begin with the right magic bytes +BZ_MEM_ERROR + if there wasn't enough memory available +BZ_STREAM_END + if the logical end of the data stream was detected and all + output in has been consumed, eg s-->avail_out > 0 +BZ_OK + otherwise + + +Allowable next actions: + + +BZ2_bzDecompress + if BZ_OK was returned +BZ2_bzDecompressEnd + otherwise + + + + + + +<computeroutput>BZ2_bzDecompressEnd</computeroutput> + + +int BZ2_bzDecompressEnd ( bz_stream *strm ); + + +Releases all memory associated with a decompression +stream. + +Possible return values: + + +BZ_PARAM_ERROR + if strm is NULL or strm->s is NULL +BZ_OK + otherwise + + +Allowable next actions: + + + None. + + + + + + + + +High-level interface + +This interface provides functions for reading and writing +bzip2 format files. First, some +general points. + + + + All of the functions take an + int* first argument, + bzerror. After each call, + bzerror should be consulted + first to determine the outcome of the call. If + bzerror is + BZ_OK, the call completed + successfully, and only then should the return value of the + function (if any) be consulted. If + bzerror is + BZ_IO_ERROR, there was an + error reading/writing the underlying compressed file, and you + should then consult errno / + perror to determine the cause + of the difficulty. bzerror + may also be set to various other values; precise details are + given on a per-function basis below. + + If bzerror indicates + an error (ie, anything except + BZ_OK and + BZ_STREAM_END), you should + immediately call + BZ2_bzReadClose (or + BZ2_bzWriteClose, depending on + whether you are attempting to read or to write) to free up all + resources associated with the stream. Once an error has been + indicated, behaviour of all calls except + BZ2_bzReadClose + (BZ2_bzWriteClose) is + undefined. The implication is that (1) + bzerror should be checked + after each call, and (2) if + bzerror indicates an error, + BZ2_bzReadClose + (BZ2_bzWriteClose) should then + be called to clean up. + + The FILE* arguments + passed to BZ2_bzReadOpen / + BZ2_bzWriteOpen should be set + to binary mode. Most Unix systems will do this by default, but + other platforms, including Windows and Mac, will not. If you + omit this, you may encounter problems when moving code to new + platforms. + + Memory allocation requests are handled by + malloc / + free. At present there is no + facility for user-defined memory allocators in the file I/O + functions (could easily be added, though). + + + + + + +<computeroutput>BZ2_bzReadOpen</computeroutput> + + +typedef void BZFILE; + +BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, + int verbosity, int small, + void *unused, int nUnused ); + + +Prepare to read compressed data from file handle +f. +f should refer to a file which +has been opened for reading, and for which the error indicator +(ferror(f))is not set. If +small is 1, the library will try +to decompress using less memory, at the expense of speed. + +For reasons explained below, +BZ2_bzRead will decompress the +nUnused bytes starting at +unused, before starting to read +from the file f. At most +BZ_MAX_UNUSED bytes may be +supplied like this. If this facility is not required, you should +pass NULL and +0 for +unused and +nUnused respectively. + +For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit. + +The amount of memory needed to decompress a file cannot be +determined until the file's header has been read. So it is +possible that BZ2_bzReadOpen +returns BZ_OK but a subsequent +call of BZ2_bzRead will return +BZ_MEM_ERROR. + +Possible assignments to +bzerror: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if f is NULL + or small is neither 0 nor 1 + or ( unused == NULL && nUnused != 0 ) + or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) ) +BZ_IO_ERROR + if ferror(f) is nonzero +BZ_MEM_ERROR + if insufficient memory is available +BZ_OK + otherwise. + + +Possible return values: + + +Pointer to an abstract BZFILE + if bzerror is BZ_OK +NULL + otherwise + + +Allowable next actions: + + +BZ2_bzRead + if bzerror is BZ_OK +BZ2_bzClose + otherwise + + + + + + +<computeroutput>BZ2_bzRead</computeroutput> + + +int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len ); + + +Reads up to len +(uncompressed) bytes from the compressed file +b into the buffer +buf. If the read was +successful, bzerror is set to +BZ_OK and the number of bytes +read is returned. If the logical end-of-stream was detected, +bzerror will be set to +BZ_STREAM_END, and the number of +bytes read is returned. All other +bzerror values denote an +error. + +BZ2_bzRead will supply +len bytes, unless the logical +stream end is detected or an error occurs. Because of this, it +is possible to detect the stream end by observing when the number +of bytes returned is less than the number requested. +Nevertheless, this is regarded as inadvisable; you should instead +check bzerror after every call +and watch out for +BZ_STREAM_END. + +Internally, BZ2_bzRead +copies data from the compressed file in chunks of size +BZ_MAX_UNUSED bytes before +decompressing it. If the file contains more bytes than strictly +needed to reach the logical end-of-stream, +BZ2_bzRead will almost certainly +read some of the trailing data before signalling +BZ_SEQUENCE_END. To collect the +read but unused data once +BZ_SEQUENCE_END has appeared, +call BZ2_bzReadGetUnused +immediately before +BZ2_bzReadClose. + +Possible assignments to +bzerror: + + +BZ_PARAM_ERROR + if b is NULL or buf is NULL or len < 0 +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzWriteOpen +BZ_IO_ERROR + if there is an error reading from the compressed file +BZ_UNEXPECTED_EOF + if the compressed file ended before + the logical end-of-stream was detected +BZ_DATA_ERROR + if a data integrity error was detected in the compressed stream +BZ_DATA_ERROR_MAGIC + if the stream does not begin with the requisite header bytes + (ie, is not a bzip2 data file). This is really + a special case of BZ_DATA_ERROR. +BZ_MEM_ERROR + if insufficient memory was available +BZ_STREAM_END + if the logical end of stream was detected. +BZ_OK + otherwise. + + +Possible return values: + + +number of bytes read + if bzerror is BZ_OK or BZ_STREAM_END +undefined + otherwise + + +Allowable next actions: + + +collect data from buf, then BZ2_bzRead or BZ2_bzReadClose + if bzerror is BZ_OK +collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused + if bzerror is BZ_SEQUENCE_END +BZ2_bzReadClose + otherwise + + + + + + +<computeroutput>BZ2_bzReadGetUnused</computeroutput> + + +void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, + void** unused, int* nUnused ); + + +Returns data which was read from the compressed file but +was not needed to get to the logical end-of-stream. +*unused is set to the address of +the data, and *nUnused to the +number of bytes. *nUnused will +be set to a value between 0 and +BZ_MAX_UNUSED inclusive. + +This function may only be called once +BZ2_bzRead has signalled +BZ_STREAM_END but before +BZ2_bzReadClose. + +Possible assignments to +bzerror: + + +BZ_PARAM_ERROR + if b is NULL + or unused is NULL or nUnused is NULL +BZ_SEQUENCE_ERROR + if BZ_STREAM_END has not been signalled + or if b was opened with BZ2_bzWriteOpen +BZ_OK + otherwise + + +Allowable next actions: + + +BZ2_bzReadClose + + + + + + +<computeroutput>BZ2_bzReadClose</computeroutput> + + +void BZ2_bzReadClose ( int *bzerror, BZFILE *b ); + + +Releases all memory pertaining to the compressed file +b. +BZ2_bzReadClose does not call +fclose on the underlying file +handle, so you should do that yourself if appropriate. +BZ2_bzReadClose should be called +to clean up after all error situations. + +Possible assignments to +bzerror: + + +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzOpenWrite +BZ_OK + otherwise + + +Allowable next actions: + + +none + + + + + + +<computeroutput>BZ2_bzWriteOpen</computeroutput> + + +BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, + int blockSize100k, int verbosity, + int workFactor ); + + +Prepare to write compressed data to file handle +f. +f should refer to a file which +has been opened for writing, and for which the error indicator +(ferror(f))is not set. + +For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit. + +All required memory is allocated at this stage, so if the +call completes successfully, +BZ_MEM_ERROR cannot be signalled +by a subsequent call to +BZ2_bzWrite. + +Possible assignments to +bzerror: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if f is NULL + or blockSize100k < 1 or blockSize100k > 9 +BZ_IO_ERROR + if ferror(f) is nonzero +BZ_MEM_ERROR + if insufficient memory is available +BZ_OK + otherwise + + +Possible return values: + + +Pointer to an abstract BZFILE + if bzerror is BZ_OK +NULL + otherwise + + +Allowable next actions: + + +BZ2_bzWrite + if bzerror is BZ_OK + (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless) +BZ2_bzWriteClose + otherwise + + + + + + +<computeroutput>BZ2_bzWrite</computeroutput> + + +void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len ); + + +Absorbs len bytes from the +buffer buf, eventually to be +compressed and written to the file. + +Possible assignments to +bzerror: + + +BZ_PARAM_ERROR + if b is NULL or buf is NULL or len < 0 +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzReadOpen +BZ_IO_ERROR + if there is an error writing the compressed file. +BZ_OK + otherwise + + + + + + +<computeroutput>BZ2_bzWriteClose</computeroutput> + + +void BZ2_bzWriteClose( int *bzerror, BZFILE* f, + int abandon, + unsigned int* nbytes_in, + unsigned int* nbytes_out ); + +void BZ2_bzWriteClose64( int *bzerror, BZFILE* f, + int abandon, + unsigned int* nbytes_in_lo32, + unsigned int* nbytes_in_hi32, + unsigned int* nbytes_out_lo32, + unsigned int* nbytes_out_hi32 ); + + +Compresses and flushes to the compressed file all data so +far supplied by BZ2_bzWrite. +The logical end-of-stream markers are also written, so subsequent +calls to BZ2_bzWrite are +illegal. All memory associated with the compressed file +b is released. +fflush is called on the +compressed file, but it is not +fclose'd. + +If BZ2_bzWriteClose is +called to clean up after an error, the only action is to release +the memory. The library records the error codes issued by +previous calls, so this situation will be detected automatically. +There is no attempt to complete the compression operation, nor to +fflush the compressed file. You +can force this behaviour to happen even in the case of no error, +by passing a nonzero value to +abandon. + +If nbytes_in is non-null, +*nbytes_in will be set to be the +total volume of uncompressed data handled. Similarly, +nbytes_out will be set to the +total volume of compressed data written. For compatibility with +older versions of the library, +BZ2_bzWriteClose only yields the +lower 32 bits of these counts. Use +BZ2_bzWriteClose64 if you want +the full 64 bit counts. These two functions are otherwise +absolutely identical. + +Possible assignments to +bzerror: + + +BZ_SEQUENCE_ERROR + if b was opened with BZ2_bzReadOpen +BZ_IO_ERROR + if there is an error writing the compressed file +BZ_OK + otherwise + + + + + + +Handling embedded compressed data streams + +The high-level library facilitates use of +bzip2 data streams which form +some part of a surrounding, larger data stream. + + + + For writing, the library takes an open file handle, + writes compressed data to it, + fflushes it but does not + fclose it. The calling + application can write its own data before and after the + compressed data stream, using that same file handle. + + Reading is more complex, and the facilities are not as + general as they could be since generality is hard to reconcile + with efficiency. BZ2_bzRead + reads from the compressed file in blocks of size + BZ_MAX_UNUSED bytes, and in + doing so probably will overshoot the logical end of compressed + stream. To recover this data once decompression has ended, + call BZ2_bzReadGetUnused after + the last call of BZ2_bzRead + (the one returning + BZ_STREAM_END) but before + calling + BZ2_bzReadClose. + + + +This mechanism makes it easy to decompress multiple +bzip2 streams placed end-to-end. +As the end of one stream, when +BZ2_bzRead returns +BZ_STREAM_END, call +BZ2_bzReadGetUnused to collect +the unused data (copy it into your own buffer somewhere). That +data forms the start of the next compressed stream. To start +uncompressing that next stream, call +BZ2_bzReadOpen again, feeding in +the unused data via the unused / +nUnused parameters. Keep doing +this until BZ_STREAM_END return +coincides with the physical end of file +(feof(f)). In this situation +BZ2_bzReadGetUnused will of +course return no data. + +This should give some feel for how the high-level interface +can be used. If you require extra flexibility, you'll have to +bite the bullet and get to grips with the low-level +interface. + + + + + +Standard file-reading/writing code + +Here's how you'd write data to a compressed file: + + +FILE* f; +BZFILE* b; +int nBuf; +char buf[ /* whatever size you like */ ]; +int bzerror; +int nWritten; + +f = fopen ( "myfile.bz2", "w" ); +if ( !f ) { + /* handle error */ +} +b = BZ2_bzWriteOpen( &bzerror, f, 9 ); +if (bzerror != BZ_OK) { + BZ2_bzWriteClose ( b ); + /* handle error */ +} + +while ( /* condition */ ) { + /* get data to write into buf, and set nBuf appropriately */ + nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf ); + if (bzerror == BZ_IO_ERROR) { + BZ2_bzWriteClose ( &bzerror, b ); + /* handle error */ + } +} + +BZ2_bzWriteClose( &bzerror, b ); +if (bzerror == BZ_IO_ERROR) { + /* handle error */ +} + + +And to read from a compressed file: + + +FILE* f; +BZFILE* b; +int nBuf; +char buf[ /* whatever size you like */ ]; +int bzerror; +int nWritten; + +f = fopen ( "myfile.bz2", "r" ); +if ( !f ) { + /* handle error */ +} +b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 ); +if ( bzerror != BZ_OK ) { + BZ2_bzReadClose ( &bzerror, b ); + /* handle error */ +} + +bzerror = BZ_OK; +while ( bzerror == BZ_OK && /* arbitrary other conditions */) { + nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ ); + if ( bzerror == BZ_OK ) { + /* do something with buf[0 .. nBuf-1] */ + } +} +if ( bzerror != BZ_STREAM_END ) { + BZ2_bzReadClose ( &bzerror, b ); + /* handle error */ +} else { + BZ2_bzReadClose ( &bzerror, b ); +} + + + + + + + + +Utility functions + + + +<computeroutput>BZ2_bzBuffToBuffCompress</computeroutput> + + +int BZ2_bzBuffToBuffCompress( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int blockSize100k, + int verbosity, + int workFactor ); + + +Attempts to compress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the compressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned. + +Compression in this manner is a one-shot event, done with a +single call to this function. The resulting compressed data is a +complete bzip2 format data +stream. There is no mechanism for making additional calls to +provide extra input data. If you want that kind of mechanism, +use the low-level interface. + +For the meaning of parameters +blockSize100k, +verbosity and +workFactor, see +BZ2_bzCompressInit. + +To guarantee that the compressed data will fit in its +buffer, allocate an output buffer of size 1% larger than the +uncompressed data, plus six hundred extra bytes. + +BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if dest is NULL or destLen is NULL + or blockSize100k < 1 or blockSize100k > 9 + or verbosity < 0 or verbosity > 4 + or workFactor < 0 or workFactor > 250 +BZ_MEM_ERROR + if insufficient memory is available +BZ_OUTBUFF_FULL + if the size of the compressed data exceeds *destLen +BZ_OK + otherwise + + + + + + +<computeroutput>BZ2_bzBuffToBuffDecompress</computeroutput> + + +int BZ2_bzBuffToBuffDecompress( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int small, + int verbosity ); + + +Attempts to decompress the data in source[0 +.. sourceLen-1] into the destination buffer, +dest[0 .. *destLen-1]. If the +destination buffer is big enough, +*destLen is set to the size of +the uncompressed data, and BZ_OK +is returned. If the compressed data won't fit, +*destLen is unchanged, and +BZ_OUTBUFF_FULL is +returned. + +source is assumed to hold +a complete bzip2 format data +stream. +BZ2_bzBuffToBuffDecompress tries +to decompress the entirety of the stream into the output +buffer. + +For the meaning of parameters +small and +verbosity, see +BZ2_bzDecompressInit. + +Because the compression ratio of the compressed data cannot +be known in advance, there is no easy way to guarantee that the +output buffer will be big enough. You may of course make +arrangements in your code to record the size of the uncompressed +data, but such a mechanism is beyond the scope of this +library. + +BZ2_bzBuffToBuffDecompress +will not write data at or beyond +dest[*destLen], even in case of +buffer overflow. + +Possible return values: + + +BZ_CONFIG_ERROR + if the library has been mis-compiled +BZ_PARAM_ERROR + if dest is NULL or destLen is NULL + or small != 0 && small != 1 + or verbosity < 0 or verbosity > 4 +BZ_MEM_ERROR + if insufficient memory is available +BZ_OUTBUFF_FULL + if the size of the compressed data exceeds *destLen +BZ_DATA_ERROR + if a data integrity error was detected in the compressed data +BZ_DATA_ERROR_MAGIC + if the compressed data doesn't begin with the right magic bytes +BZ_UNEXPECTED_EOF + if the compressed data ends unexpectedly +BZ_OK + otherwise + + + + + + + + +<computeroutput>zlib</computeroutput> compatibility functions + +Yoshioka Tsuneo has contributed some functions to give +better zlib compatibility. +These functions are BZ2_bzopen, +BZ2_bzread, +BZ2_bzwrite, +BZ2_bzflush, +BZ2_bzclose, +BZ2_bzerror and +BZ2_bzlibVersion. These +functions are not (yet) officially part of the library. If they +break, you get to keep all the pieces. Nevertheless, I think +they work ok. + + +typedef void BZFILE; + +const char * BZ2_bzlibVersion ( void ); + + +Returns a string indicating the library version. + + +BZFILE * BZ2_bzopen ( const char *path, const char *mode ); +BZFILE * BZ2_bzdopen ( int fd, const char *mode ); + + +Opens a .bz2 file for +reading or writing, using either its name or a pre-existing file +descriptor. Analogous to fopen +and fdopen. + + +int BZ2_bzread ( BZFILE* b, void* buf, int len ); +int BZ2_bzwrite ( BZFILE* b, void* buf, int len ); + + +Reads/writes data from/to a previously opened +BZFILE. Analogous to +fread and +fwrite. + + +int BZ2_bzflush ( BZFILE* b ); +void BZ2_bzclose ( BZFILE* b ); + + +Flushes/closes a BZFILE. +BZ2_bzflush doesn't actually do +anything. Analogous to fflush +and fclose. + + +const char * BZ2_bzerror ( BZFILE *b, int *errnum ) + + +Returns a string describing the more recent error status of +b, and also sets +*errnum to its numerical +value. + + + + + +Using the library in a <computeroutput>stdio</computeroutput>-free environment + + + +Getting rid of <computeroutput>stdio</computeroutput> + +In a deeply embedded application, you might want to use +just the memory-to-memory functions. You can do this +conveniently by compiling the library with preprocessor symbol +BZ_NO_STDIO defined. Doing this +gives you a library containing only the following eight +functions: + +BZ2_bzCompressInit, +BZ2_bzCompress, +BZ2_bzCompressEnd +BZ2_bzDecompressInit, +BZ2_bzDecompress, +BZ2_bzDecompressEnd +BZ2_bzBuffToBuffCompress, +BZ2_bzBuffToBuffDecompress + +When compiled like this, all functions will ignore +verbosity settings. + + + + + +Critical error handling + +libbzip2 contains a number +of internal assertion checks which should, needless to say, never +be activated. Nevertheless, if an assertion should fail, +behaviour depends on whether or not the library was compiled with +BZ_NO_STDIO set. + +For a normal compile, an assertion failure yields the +message: + +
+bzip2/libbzip2: internal error number N. +This is a bug in bzip2/libbzip2, &bz-version; of &bz-date;. +Please report it to me at: &bz-email;. If this happened +when you were using some program which uses libbzip2 as a +component, you should also report this bug to the author(s) +of that program. Please make an effort to report this bug; +timely and accurate bug reports eventually lead to higher +quality software. Thanks. Julian Seward, &bz-date;. +
+ +where N is some error code +number. If N == 1007, it also +prints some extra text advising the reader that unreliable memory +is often associated with internal error 1007. (This is a +frequently-observed-phenomenon with versions 1.0.0/1.0.1). + +exit(3) is then +called. + +For a stdio-free library, +assertion failures result in a call to a function declared +as: + + +extern void bz_internal_error ( int errcode ); + + +The relevant code is passed as a parameter. You should +supply such a function. + +In either case, once an assertion failure has occurred, any +bz_stream records involved can +be regarded as invalid. You should not attempt to resume normal +operation with them. + +You may, of course, change critical error handling to suit +your needs. As I said above, critical errors indicate bugs in +the library and should not occur. All "normal" error situations +are indicated via error return codes from functions, and can be +recovered from. + +
+ +
+ + + +Making a Windows DLL + +Everything related to Windows has been contributed by +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp), so +you should send your queries to him (but perhaps Cc: me, +&bz-email;). + +My vague understanding of what to do is: using Visual C++ +5.0, open the project file +libbz2.dsp, and build. That's +all. + +If you can't open the project file for some reason, make a +new one, naming these files: +blocksort.c, +bzlib.c, +compress.c, +crctable.c, +decompress.c, +huffman.c, +randtable.c and +libbz2.def. You will also need +to name the header files bzlib.h +and bzlib_private.h. + +If you don't use VC++, you may need to define the +proprocessor symbol +_WIN32. + +Finally, dlltest.c is a +sample program using the DLL. It has a project file, +dlltest.dsp. + +If you just want a makefile for Visual C, have a look at +makefile.msc. + +Be aware that if you compile +bzip2 itself on Win32, you must +set BZ_UNIX to 0 and +BZ_LCCWIN32 to 1, in the file +bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly. + +I haven't tried any of this stuff myself, but it all looks +plausible. + + + +
+ + + + +Miscellanea + +These are just some random thoughts of mine. Your mileage +may vary. + + + +Limitations of the compressed file format + +bzip2-1.0.X, +0.9.5 and +0.9.0 use exactly the same file +format as the original version, +bzip2-0.1. This decision was +made in the interests of stability. Creating yet another +incompatible compressed file format would create further +confusion and disruption for users. + +Nevertheless, this is not a painless decision. Development +work since the release of +bzip2-0.1 in August 1997 has +shown complexities in the file format which slow down +decompression and, in retrospect, are unnecessary. These +are: + + + + The run-length encoder, which is the first of the + compression transformations, is entirely irrelevant. The + original purpose was to protect the sorting algorithm from the + very worst case input: a string of repeated symbols. But + algorithm steps Q6a and Q6b in the original Burrows-Wheeler + technical report (SRC-124) show how repeats can be handled + without difficulty in block sorting. + + The randomisation mechanism doesn't really need to be + there. Udi Manber and Gene Myers published a suffix array + construction algorithm a few years back, which can be employed + to sort any block, no matter how repetitive, in O(N log N) + time. Subsequent work by Kunihiko Sadakane has produced a + derivative O(N (log N)^2) algorithm which usually outperforms + the Manber-Myers algorithm. + + I could have changed to Sadakane's algorithm, but I find + it to be slower than bzip2's + existing algorithm for most inputs, and the randomisation + mechanism protects adequately against bad cases. I didn't + think it was a good tradeoff to make. Partly this is due to + the fact that I was not flooded with email complaints about + bzip2-0.1's performance on + repetitive data, so perhaps it isn't a problem for real + inputs. + + Probably the best long-term solution, and the one I have + incorporated into 0.9.5 and above, is to use the existing + sorting algorithm initially, and fall back to a O(N (log N)^2) + algorithm if the standard algorithm gets into + difficulties. + + The compressed file format was never designed to be + handled by a library, and I have had to jump though some hoops + to produce an efficient implementation of decompression. It's + a bit hairy. Try passing + decompress.c through the C + preprocessor and you'll see what I mean. Much of this + complexity could have been avoided if the compressed size of + each block of data was recorded in the data stream. + + An Adler-32 checksum, rather than a CRC32 checksum, + would be faster to compute. + + + +It would be fair to say that the +bzip2 format was frozen before I +properly and fully understood the performance consequences of +doing so. + +Improvements which I was able to incorporate into 0.9.0, +despite using the same file format, are: + + + + Single array implementation of the inverse BWT. This + significantly speeds up decompression, presumably because it + reduces the number of cache misses. + + Faster inverse MTF transform for large MTF values. + The new implementation is based on the notion of sliding blocks + of values. + + bzip2-0.9.0 now reads + and writes files with fread + and fwrite; version 0.1 used + putc and + getc. Duh! Well, you live + and learn. + + + +Further ahead, it would be nice to be able to do random +access into files. This will require some careful design of +compressed file formats. + + + + + +Portability issues + +After some consideration, I have decided not to use GNU +autoconf to configure 0.9.5 or +1.0. + +autoconf, admirable and +wonderful though it is, mainly assists with portability problems +between Unix-like platforms. But +bzip2 doesn't have much in the +way of portability problems on Unix; most of the difficulties +appear when porting to the Mac, or to Microsoft's operating +systems. autoconf doesn't help +in those cases, and brings in a whole load of new +complexity. + +Most people should be able to compile the library and +program under Unix straight out-of-the-box, so to speak, +especially if you have a version of GNU C available. + +There are a couple of +__inline__ directives in the +code. GNU C (gcc) should be +able to handle them. If you're not using GNU C, your C compiler +shouldn't see them at all. If your compiler does, for some +reason, see them and doesn't like them, just +#define +__inline__ to be +/* */. One easy way to do this +is to compile with the flag +-D__inline__=, which should be +understood by most Unix compilers. + +If you still have difficulties, try compiling with the +macro BZ_STRICT_ANSI defined. +This should enable you to build the library in a strictly ANSI +compliant environment. Building the program itself like this is +dangerous and not supported, since you remove +bzip2's checks against +compressing directories, symbolic links, devices, and other +not-really-a-file entities. This could cause filesystem +corruption! + +One other thing: if you create a +bzip2 binary for public distribution, +please consider linking it statically (gcc +-static). This avoids all sorts of library-version +issues that others may encounter later on. + +If you build bzip2 on +Win32, you must set BZ_UNIX to 0 +and BZ_LCCWIN32 to 1, in the +file bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly. + + + + + +Reporting bugs + +I tried pretty hard to make sure +bzip2 is bug free, both by +design and by testing. Hopefully you'll never need to read this +section for real. + +Nevertheless, if bzip2 dies +with a segmentation fault, a bus error or an internal assertion +failure, it will ask you to email me a bug report. Experience from +years of feedback of bzip2 users indicates that almost all these +problems can be traced to either compiler bugs or hardware +problems. + + + + Recompile the program with no optimisation, and + see if it works. And/or try a different compiler. I heard all + sorts of stories about various flavours of GNU C (and other + compilers) generating bad code for + bzip2, and I've run across two + such examples myself. + + 2.7.X versions of GNU C are known to generate bad code + from time to time, at high optimisation levels. If you get + problems, try using the flags + -O2 + -fomit-frame-pointer + -fno-strength-reduce. You + should specifically not use + -funroll-loops. + + You may notice that the Makefile runs six tests as part + of the build process. If the program passes all of these, it's + a pretty good (but not 100%) indication that the compiler has + done its job correctly. + + If bzip2 + crashes randomly, and the crashes are not repeatable, you may + have a flaky memory subsystem. + bzip2 really hammers your + memory hierarchy, and if it's a bit marginal, you may get these + problems. Ditto if your disk or I/O subsystem is slowly + failing. Yup, this really does happen. + + Try using a different machine of the same type, and see + if you can repeat the problem. + + This isn't really a bug, but ... If + bzip2 tells you your file is + corrupted on decompression, and you obtained the file via FTP, + there is a possibility that you forgot to tell FTP to do a + binary mode transfer. That absolutely will cause the file to + be non-decompressible. You'll have to transfer it + again. + + + +If you've incorporated +libbzip2 into your own program +and are getting problems, please, please, please, check that the +parameters you are passing in calls to the library, are correct, +and in accordance with what the documentation says is allowable. +I have tried to make the library robust against such problems, +but I'm sure I haven't succeeded. + +Finally, if the above comments don't help, you'll have to +send me a bug report. Now, it's just amazing how many people +will send me a bug report saying something like: + + +bzip2 crashed with segmentation fault on my machine + + +and absolutely nothing else. Needless to say, a such a +report is totally, utterly, completely and +comprehensively 100% useless; a waste of your time, my time, and +net bandwidth. With no details at all, there's no way +I can possibly begin to figure out what the problem is. + +The rules of the game are: facts, facts, facts. Don't omit +them because "oh, they won't be relevant". At the bare +minimum: + + +Machine type. Operating system version. +Exact version of bzip2 (do bzip2 -V). +Exact version of the compiler used. +Flags passed to the compiler. + + +However, the most important single thing that will help me +is the file that you were trying to compress or decompress at the +time the problem happened. Without that, my ability to do +anything more than speculate about the cause, is limited. + + + + + +Did you get the right package? + +bzip2 is a resource hog. +It soaks up large amounts of CPU cycles and memory. Also, it +gives very large latencies. In the worst case, you can feed many +megabytes of uncompressed data into the library before getting +any compressed output, so this probably rules out applications +requiring interactive behaviour. + +These aren't faults of my implementation, I hope, but more +an intrinsic property of the Burrows-Wheeler transform +(unfortunately). Maybe this isn't what you want. + +If you want a compressor and/or library which is faster, +uses less memory but gets pretty good compression, and has +minimal latency, consider Jean-loup Gailly's and Mark Adler's +work, zlib-1.2.1 and +gzip-1.2.4. Look for them at +http://www.zlib.org and +http://www.gzip.org +respectively. + +For something faster and lighter still, you might try Markus F +X J Oberhumer's LZO real-time +compression/decompression library, at +http://www.oberhumer.com/opensource. + + + + + + +Further Reading + +bzip2 is not research +work, in the sense that it doesn't present any new ideas. +Rather, it's an engineering exercise based on existing +ideas. + +Four documents describe essentially all the ideas behind +bzip2: + +Michael Burrows and D. J. Wheeler: + "A block-sorting lossless data compression algorithm" + 10th May 1994. + Digital SRC Research Report 124. + ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz + If you have trouble finding it, try searching at the + New Zealand Digital Library, http://www.nzdl.org. + +Daniel S. Hirschberg and Debra A. LeLewer + "Efficient Decoding of Prefix Codes" + Communications of the ACM, April 1990, Vol 33, Number 4. + You might be able to get an electronic copy of this + from the ACM Digital Library. + +David J. Wheeler + Program bred3.c and accompanying document bred3.ps. + This contains the idea behind the multi-table Huffman coding scheme. + ftp://ftp.cl.cam.ac.uk/users/djw3/ + +Jon L. Bentley and Robert Sedgewick + "Fast Algorithms for Sorting and Searching Strings" + Available from Sedgewick's web page, + www.cs.princeton.edu/~rs + + +The following paper gives valuable additional insights into +the algorithm, but is not immediately the basis of any code used +in bzip2. + +Peter Fenwick: + Block Sorting Text Compression + Proceedings of the 19th Australasian Computer Science Conference, + Melbourne, Australia. Jan 31 - Feb 2, 1996. + ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps + +Kunihiko Sadakane's sorting algorithm, mentioned above, is +available from: + +http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz + + +The Manber-Myers suffix array construction algorithm is +described in a paper available from: + +http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps + + +Finally, the following papers document some +investigations I made into the performance of sorting +and decompression algorithms: + +Julian Seward + On the Performance of BWT Sorting Algorithms + Proceedings of the IEEE Data Compression Conference 2000 + Snowbird, Utah. 28-30 March 2000. + +Julian Seward + Space-time Tradeoffs in the Inverse B-W Transform + Proceedings of the IEEE Data Compression Conference 2001 + Snowbird, Utah. 27-29 March 2001. + + + + + + +
diff --git a/win32/3rdparty/bzip2/mk251.c b/win32/3rdparty/bzip2/mk251.c new file mode 100644 index 000000000..39e94c057 --- /dev/null +++ b/win32/3rdparty/bzip2/mk251.c @@ -0,0 +1,31 @@ + +/* Spew out a long sequence of the byte 251. When fed to bzip2 + versions 1.0.0 or 1.0.1, causes it to die with internal error + 1007 in blocksort.c. This assertion misses an extremely rare + case, which is fixed in this version (1.0.2) and above. +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include + +int main () +{ + int i; + for (i = 0; i < 48500000 ; i++) + putchar(251); + return 0; +} diff --git a/win32/3rdparty/bzip2/randtable.c b/win32/3rdparty/bzip2/randtable.c new file mode 100644 index 000000000..068b76367 --- /dev/null +++ b/win32/3rdparty/bzip2/randtable.c @@ -0,0 +1,84 @@ + +/*-------------------------------------------------------------*/ +/*--- Table for randomising repetitive blocks ---*/ +/*--- randtable.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------*/ +Int32 BZ2_rNums[512] = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 +}; + + +/*-------------------------------------------------------------*/ +/*--- end randtable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/win32/3rdparty/bzip2/sample3.ref b/win32/3rdparty/bzip2/sample3.ref new file mode 100644 index 0000000000000000000000000000000000000000..775a2f68e21f08bd79afc65217d7e380ecd360ba GIT binary patch literal 120244 zcmeIwOOD$x3;@u*Pr>B`2m*9&(S0wVX6V?6V+WFhHn$%o=(;C(3qce_QXjlu)7)a5 zmyAB=-*e{Iyk3@P{N8F0P7y!Hcy5oLvwppT+Hx6(n&p)j^L~u`lBH#Q{5Zs3uD#J7 zW8H3X%h;!~zpKw>jaJ57p2Ovlt;L_$&OT+-Y8E{s9-?Jl<6gJ1 z7tPyRmSM`}ej0{*>v!u7YDVc}-C}&y*Seom&!z42x%a-6dTlYUJ@el?d+Fmc8UBC) z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= MV1NMz82FEYZ{Yw!HUIzs literal 0 HcmV?d00001 diff --git a/win32/3rdparty/bzip2/spewG.c b/win32/3rdparty/bzip2/spewG.c new file mode 100644 index 000000000..5892b92c3 --- /dev/null +++ b/win32/3rdparty/bzip2/spewG.c @@ -0,0 +1,54 @@ + +/* spew out a thoroughly gigantic file designed so that bzip2 + can compress it reasonably rapidly. This is to help test + support for large files (> 2GB) in a reasonable amount of time. + I suggest you use the undocumented --exponential option to + bzip2 when compressing the resulting file; this saves a bit of + time. Note: *don't* bother with --exponential when compressing + Real Files; it'll just waste a lot of CPU time :-) + (but is otherwise harmless). +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#define _FILE_OFFSET_BITS 64 + +#include +#include + +/* The number of megabytes of junk to spew out (roughly) */ +#define MEGABYTES 5000 + +#define N_BUF 1000000 +char buf[N_BUF]; + +int main ( int argc, char** argv ) +{ + int ii, kk, p; + srandom(1); + setbuffer ( stdout, buf, N_BUF ); + for (kk = 0; kk < MEGABYTES * 515; kk+=3) { + p = 25+random()%50; + for (ii = 0; ii < p; ii++) + printf ( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); + for (ii = 0; ii < p-1; ii++) + printf ( "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ); + for (ii = 0; ii < p+1; ii++) + printf ( "ccccccccccccccccccccccccccccccccccccc" ); + } + fflush(stdout); + return 0; +} diff --git a/win32/3rdparty/bzip2/unzcrash.c b/win32/3rdparty/bzip2/unzcrash.c new file mode 100644 index 000000000..a1b75463a --- /dev/null +++ b/win32/3rdparty/bzip2/unzcrash.c @@ -0,0 +1,141 @@ + +/* A test program written to test robustness to decompression of + corrupted data. Usage is + unzcrash filename + and the program will read the specified file, compress it (in memory), + and then repeatedly decompress it, each time with a different bit of + the compressed data inverted, so as to test all possible one-bit errors. + This should not cause any invalid memory accesses. If it does, + I want to know about it! + + PS. As you can see from the above description, the process is + incredibly slow. A file of size eg 5KB will cause it to run for + many hours. +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.5 of 10 December 2007 + Copyright (C) 1996-2007 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include +#include +#include "bzlib.h" + +#define M_BLOCK 1000000 + +typedef unsigned char uchar; + +#define M_BLOCK_OUT (M_BLOCK + 1000000) +uchar inbuf[M_BLOCK]; +uchar outbuf[M_BLOCK_OUT]; +uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)]; + +int nIn, nOut, nZ; + +static char *bzerrorstrings[] = { + "OK" + ,"SEQUENCE_ERROR" + ,"PARAM_ERROR" + ,"MEM_ERROR" + ,"DATA_ERROR" + ,"DATA_ERROR_MAGIC" + ,"IO_ERROR" + ,"UNEXPECTED_EOF" + ,"OUTBUFF_FULL" + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ +}; + +void flip_bit ( int bit ) +{ + int byteno = bit / 8; + int bitno = bit % 8; + uchar mask = 1 << bitno; + //fprintf ( stderr, "(byte %d bit %d mask %d)", + // byteno, bitno, (int)mask ); + zbuf[byteno] ^= mask; +} + +int main ( int argc, char** argv ) +{ + FILE* f; + int r; + int bit; + int i; + + if (argc != 2) { + fprintf ( stderr, "usage: unzcrash filename\n" ); + return 1; + } + + f = fopen ( argv[1], "r" ); + if (!f) { + fprintf ( stderr, "unzcrash: can't open %s\n", argv[1] ); + return 1; + } + + nIn = fread ( inbuf, 1, M_BLOCK, f ); + fprintf ( stderr, "%d bytes read\n", nIn ); + + nZ = M_BLOCK; + r = BZ2_bzBuffToBuffCompress ( + zbuf, &nZ, inbuf, nIn, 9, 0, 30 ); + + assert (r == BZ_OK); + fprintf ( stderr, "%d after compression\n", nZ ); + + for (bit = 0; bit < nZ*8; bit++) { + fprintf ( stderr, "bit %d ", bit ); + flip_bit ( bit ); + nOut = M_BLOCK_OUT; + r = BZ2_bzBuffToBuffDecompress ( + outbuf, &nOut, zbuf, nZ, 0, 0 ); + fprintf ( stderr, " %d %s ", r, bzerrorstrings[-r] ); + + if (r != BZ_OK) { + fprintf ( stderr, "\n" ); + } else { + if (nOut != nIn) { + fprintf(stderr, "nIn/nOut mismatch %d %d\n", nIn, nOut ); + return 1; + } else { + for (i = 0; i < nOut; i++) + if (inbuf[i] != outbuf[i]) { + fprintf(stderr, "mismatch at %d\n", i ); + return 1; + } + if (i == nOut) fprintf(stderr, "really ok!\n" ); + } + } + + flip_bit ( bit ); + } + +#if 0 + assert (nOut == nIn); + for (i = 0; i < nOut; i++) { + if (inbuf[i] != outbuf[i]) { + fprintf ( stderr, "difference at %d !\n", i ); + return 1; + } + } +#endif + + fprintf ( stderr, "all ok\n" ); + return 0; +} diff --git a/win32/3rdparty/bzip2/words0 b/win32/3rdparty/bzip2/words0 new file mode 100644 index 000000000..fbf442ad6 --- /dev/null +++ b/win32/3rdparty/bzip2/words0 @@ -0,0 +1,9 @@ + +If compilation produces errors, or a large number of warnings, +please read README.COMPILATION.PROBLEMS -- you might be able to +adjust the flags in this Makefile to improve matters. + +Also in README.COMPILATION.PROBLEMS are some hints that may help +if your build produces an executable which is unable to correctly +handle so-called 'large files' -- files of size 2GB or more. + diff --git a/win32/3rdparty/bzip2/words1 b/win32/3rdparty/bzip2/words1 new file mode 100644 index 000000000..2e83de9f0 --- /dev/null +++ b/win32/3rdparty/bzip2/words1 @@ -0,0 +1,4 @@ + +Doing 6 tests (3 compress, 3 uncompress) ... +If there's a problem, things might stop at this point. + diff --git a/win32/3rdparty/bzip2/words2 b/win32/3rdparty/bzip2/words2 new file mode 100644 index 000000000..caddcf422 --- /dev/null +++ b/win32/3rdparty/bzip2/words2 @@ -0,0 +1,5 @@ + +Checking test results. If any of the four "cmp"s which follow +report any differences, something is wrong. If you can't easily +figure out what, please let me know (jseward@bzip.org). + diff --git a/win32/3rdparty/bzip2/words3 b/win32/3rdparty/bzip2/words3 new file mode 100644 index 000000000..697266990 --- /dev/null +++ b/win32/3rdparty/bzip2/words3 @@ -0,0 +1,30 @@ + +If you got this far and the 'cmp's didn't complain, it looks +like you're in business. + +To install in /usr/local/bin, /usr/local/lib, /usr/local/man and +/usr/local/include, type + + make install + +To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type + + make install PREFIX=/xxx/yyy + +If you are (justifiably) paranoid and want to see what 'make install' +is going to do, you can first do + + make -n install or + make -n install PREFIX=/xxx/yyy respectively. + +The -n instructs make to show the commands it would execute, but +not actually execute them. + +Instructions for use are in the preformatted manual page, in the file +bzip2.txt. For more detailed documentation, read the full manual. +It is available in Postscript form (manual.ps), PDF form (manual.pdf), +and HTML form (manual.html). + +You can also do "bzip2 --help" to see some helpful information. +"bzip2 -L" displays the software license. + diff --git a/win32/3rdparty/bzip2/xmlproc.sh b/win32/3rdparty/bzip2/xmlproc.sh new file mode 100644 index 000000000..53841773d --- /dev/null +++ b/win32/3rdparty/bzip2/xmlproc.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# see the README file for usage etc. +# +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.5 of 10 December 2007 +# Copyright (C) 1996-2007 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ---------------------------------------------------------------- + + +usage() { + echo ''; + echo 'Usage: xmlproc.sh -[option] '; + echo 'Specify a target from:'; + echo '-v verify xml file conforms to dtd'; + echo '-html output in html format (single file)'; + echo '-ps output in postscript format'; + echo '-pdf output in pdf format'; + exit; +} + +if test $# -ne 2; then + usage +fi +# assign the variable for the output type +action=$1; shift +# assign the output filename +xmlfile=$1; shift +# and check user input it correct +if !(test -f $xmlfile); then + echo "No such file: $xmlfile"; + exit; +fi +# some other stuff we will use +OUT=output +xsl_fo=bz-fo.xsl +xsl_html=bz-html.xsl + +basename=$xmlfile +basename=${basename//'.xml'/''} + +fofile="${basename}.fo" +htmlfile="${basename}.html" +pdffile="${basename}.pdf" +psfile="${basename}.ps" +xmlfmtfile="${basename}.fmt" + +# first process the xmlfile with CDATA tags +./format.pl $xmlfile $xmlfmtfile +# so the shell knows where the catalogs live +export XML_CATALOG_FILES=/etc/xml/catalog + +# post-processing tidy up +cleanup() { + echo "Cleaning up: $@" + while [ $# != 0 ] + do + arg=$1; shift; + echo " deleting $arg"; + rm $arg + done +} + +case $action in + -v) + flags='--noout --xinclude --noblanks --postvalid' + dtd='--dtdvalid http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd' + xmllint $flags $dtd $xmlfmtfile 2> $OUT + egrep 'error' $OUT + rm $OUT + ;; + + -html) + echo "Creating $htmlfile ..." + xsltproc --nonet --xinclude -o $htmlfile $xsl_html $xmlfmtfile + cleanup $xmlfmtfile + ;; + + -pdf) + echo "Creating $pdffile ..." + xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile + pdfxmltex $fofile >$OUT $OUT $OUT $OUT $OUT $OUT $OUT $OUT $OUT + + +We are pleased to announce the availability of a new release of +Pthreads-win32, an Open Source Software implementation of the +Threads component of the POSIX 1003.1 2001 Standard for Microsoft's +Win32 environment. Some functions from other sections of POSIX +1003.1 2001 are also supported including semaphores and scheduling +functions. + +Some common non-portable functions are also implemented for +additional compatibility, as are a few functions specific +to pthreads-win32 for easier integration with Win32 applications. + +Pthreads-win32 is free software, distributed under the GNU Lesser +General Public License (LGPL). + + +Acknowledgements +---------------- +This library is based originally on a Win32 pthreads +implementation contributed by John Bossom . + +The implementation of Condition Variables uses algorithms developed +by Alexander Terekhov and Louis Thomas. + +The implementation of POSIX mutexes has been improved by Thomas Pfaff +and later by Alexander Terekhov. + +The implementation of Spinlocks and Barriers was contributed +by Ross Johnson. + +The implementation of read/write locks was contributed by +Aurelio Medina and improved by Alexander Terekhov. + +Many others have contributed significant time and effort to solve crutial +problems in order to make the library workable, robust and reliable. + +Thanks to Xavier Leroy for granting permission to use and modify his +LinuxThreads manual pages. + +Thanks to The Open Group for making the Single Unix Specification +publicly available - many of the manual pages included in the package +were extracted from it. + +There is also a separate CONTRIBUTORS file. This file and others are +on the web site: + + http://sources.redhat.com/pthreads-win32 + +As much as possible, the ChangeLog file acknowledges contributions to the +code base in more detail. + + +Changes since the last release +------------------------------ +These are now documented in the NEWS file. +See the ChangeLog file also. + + +Known Bugs +---------- +These are now documented in the BUGS file. + + +Level of standards conformance +------------------------------ + +The following POSIX 1003.1 2001 options are defined and set to 200112L: + + _POSIX_THREADS + _POSIX_THREAD_SAFE_FUNCTIONS + _POSIX_THREAD_ATTR_STACKSIZE + _POSIX_THREAD_PRIORITY_SCHEDULING + _POSIX_SEMAPHORES + _POSIX_READER_WRITER_LOCKS + _POSIX_SPIN_LOCKS + _POSIX_BARRIERS + + +The following POSIX 1003.1 2001 options are defined and set to -1: + + _POSIX_THREAD_ATTR_STACKADDR + _POSIX_THREAD_PRIO_INHERIT + _POSIX_THREAD_PRIO_PROTECT + _POSIX_THREAD_PROCESS_SHARED + + +The following POSIX 1003.1 2001 limits are defined and set: + + _POSIX_THREAD_THREADS_MAX + _POSIX_SEM_VALUE_MAX + _POSIX_SEM_NSEMS_MAX + _POSIX_THREAD_KEYS_MAX + _POSIX_THREAD_DESTRUCTOR_ITERATIONS + PTHREAD_STACK_MIN + PTHREAD_THREADS_MAX + SEM_VALUE_MAX + SEM_NSEMS_MAX + PTHREAD_KEYS_MAX + PTHREAD_DESTRUCTOR_ITERATIONS + + +The following functions are implemented: + + --------------------------- + PThreads + --------------------------- + pthread_attr_init + pthread_attr_destroy + pthread_attr_getdetachstate + pthread_attr_getstackaddr + pthread_attr_getstacksize + pthread_attr_setdetachstate + pthread_attr_setstackaddr + pthread_attr_setstacksize + + pthread_create + pthread_detach + pthread_equal + pthread_exit + pthread_join + pthread_once + pthread_self + + pthread_cancel + pthread_cleanup_pop + pthread_cleanup_push + pthread_setcancelstate + pthread_setcanceltype + pthread_testcancel + + --------------------------- + Thread Specific Data + --------------------------- + pthread_key_create + pthread_key_delete + pthread_setspecific + pthread_getspecific + + --------------------------- + Mutexes + --------------------------- + pthread_mutexattr_init + pthread_mutexattr_destroy + pthread_mutexattr_getpshared + pthread_mutexattr_setpshared + pthread_mutexattr_gettype + pthread_mutexattr_settype (types: PTHREAD_MUTEX_DEFAULT + PTHREAD_MUTEX_NORMAL + PTHREAD_MUTEX_ERRORCHECK + PTHREAD_MUTEX_RECURSIVE ) + pthread_mutex_init + pthread_mutex_destroy + pthread_mutex_lock + pthread_mutex_trylock + pthread_mutex_timedlock + pthread_mutex_unlock + + --------------------------- + Condition Variables + --------------------------- + pthread_condattr_init + pthread_condattr_destroy + pthread_condattr_getpshared + pthread_condattr_setpshared + + pthread_cond_init + pthread_cond_destroy + pthread_cond_wait + pthread_cond_timedwait + pthread_cond_signal + pthread_cond_broadcast + + --------------------------- + Read/Write Locks + --------------------------- + pthread_rwlock_init + pthread_rwlock_destroy + pthread_rwlock_tryrdlock + pthread_rwlock_trywrlock + pthread_rwlock_rdlock + pthread_rwlock_timedrdlock + pthread_rwlock_rwlock + pthread_rwlock_timedwrlock + pthread_rwlock_unlock + pthread_rwlockattr_init + pthread_rwlockattr_destroy + pthread_rwlockattr_getpshared + pthread_rwlockattr_setpshared + + --------------------------- + Spin Locks + --------------------------- + pthread_spin_init + pthread_spin_destroy + pthread_spin_lock + pthread_spin_unlock + pthread_spin_trylock + + --------------------------- + Barriers + --------------------------- + pthread_barrier_init + pthread_barrier_destroy + pthread_barrier_wait + pthread_barrierattr_init + pthread_barrierattr_destroy + pthread_barrierattr_getpshared + pthread_barrierattr_setpshared + + --------------------------- + Semaphores + --------------------------- + sem_init + sem_destroy + sem_post + sem_wait + sem_trywait + sem_timedwait + sem_getvalue (# free if +ve, # of waiters if -ve) + sem_open (returns an error ENOSYS) + sem_close (returns an error ENOSYS) + sem_unlink (returns an error ENOSYS) + + --------------------------- + RealTime Scheduling + --------------------------- + pthread_attr_getschedparam + pthread_attr_setschedparam + pthread_attr_getinheritsched + pthread_attr_setinheritsched + pthread_attr_getschedpolicy (only supports SCHED_OTHER) + pthread_attr_setschedpolicy (only supports SCHED_OTHER) + pthread_getschedparam + pthread_setschedparam + pthread_getconcurrency + pthread_setconcurrency + pthread_attr_getscope + pthread_attr_setscope (only supports PTHREAD_SCOPE_SYSTEM) + sched_get_priority_max + sched_get_priority_min + sched_rr_get_interval (returns an error ENOTSUP) + sched_setscheduler (only supports SCHED_OTHER) + sched_getscheduler (only supports SCHED_OTHER) + sched_yield + + --------------------------- + Signals + --------------------------- + pthread_sigmask + pthread_kill (only supports zero sig value, + for thread validity checking) + + --------------------------- + Non-portable routines (see the README.NONPORTABLE file for usage) + --------------------------- + pthread_getw32threadhandle_np + pthread_timechange_handler_np + pthread_delay_np + pthread_mutexattr_getkind_np + pthread_mutexattr_setkind_np (types: PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ADAPTIVE_NP, + PTHREAD_MUTEX_TIMED_NP) + pthread_num_processors_np + pthread_win32_process_attach_np (Required when statically linking + the library) + pthread_win32_process_detach_np (Required when statically linking + the library) + pthread_win32_thread_attach_np (Required when statically linking + the library) + pthread_win32_thread_detach_np (Required when statically linking + the library) + + --------------------------- + Static Initializers + --------------------------- + PTHREAD_ONCE_INIT + PTHREAD_MUTEX_INITIALIZER + PTHREAD_RECURSIVE_MUTEX_INITIALIZER + PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP + PTHREAD_ERRORCHECK_MUTEX_INITIALIZER + PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP + PTHREAD_COND_INITIALIZER + PTHREAD_RWLOCK_INITIALIZER + PTHREAD_SPINLOCK_INITIALIZER + + --------------------------- + Thread-Safe C Runtime Library (macros) + --------------------------- + strtok_r + asctime_r + ctime_r + gmtime_r + localtime_r + rand_r + + +The following functions are not implemented: + + --------------------------- + RealTime Scheduling + --------------------------- + pthread_mutex_getprioceiling + pthread_mutex_setprioceiling + pthread_mutex_attr_getprioceiling + pthread_mutex_attr_getprotocol + pthread_mutex_attr_setprioceiling + pthread_mutex_attr_setprotocol + + --------------------------- + Fork Handlers + --------------------------- + pthread_atfork + + --------------------------- + Stdio + --------------------------- + flockfile + ftrylockfile + funlockfile + getc_unlocked + getchar_unlocked + putc_unlocked + putchar_unlocked + + --------------------------- + Thread-Safe C Runtime Library + --------------------------- + readdir_r + getgrgid_r + getgrnam_r + getpwuid_r + getpwnam_r + + --------------------------- + Signals + --------------------------- + sigtimedwait + sigwait + sigwaitinfo + + --------------------------- + General + --------------------------- + sysconf + +The library includes two non-API functions for creating cancellation +points in applications and libraries: + + pthreadCancelableWait + pthreadCancelableTimedWait + + +Availability +------------ + +The prebuilt DLL, export libs (for both MSVC and Mingw32), and the header +files (pthread.h, semaphore.h, sched.h) are available along with the +complete source code. + +The source code can be found at: + + ftp://sources.redhat.com/pub/pthreads-win32 + +and as individual source code files at + + ftp://sources.redhat.com/pub/pthreads-win32/source + +The pre-built DLL, export libraries and include files can be found at: + + ftp://sources.redhat.com/pub/pthreads-win32/dll-latest + + + +Mailing List +------------ + +There is a mailing list for discussing pthreads on Win32. To join, +send email to: + + pthreads-win32-subscribe@sourceware.cygnus.com + + +Application Development Environments +------------------------------------ + +See the README file for more information. + +MSVC: +MSVC using SEH works. Distribute pthreadVSE.dll with your application. +MSVC using C++ EH works. Distribute pthreadVCE.dll with your application. +MSVC using C setjmp/longjmp works. Distribute pthreadVC.dll with your application. + + +Mingw32: +See the FAQ, Questions 6 and 10. + +Mingw using C++ EH works. Distribute pthreadGCE.dll with your application. +Mingw using C setjmp/longjmp works. Distribute pthreadGC.dll with your application. + + +Cygwin: (http://sourceware.cygnus.com/cygwin/) +Developers using Cygwin will not need pthreads-win32 since it has POSIX threads +support. Refer to its documentation for details and extent. + + +UWIN: +UWIN is a complete Unix-like environment for Windows from AT&T. Pthreads-win32 +doesn't currently support UWIN (and vice versa), but that may change in the +future. + +Generally: +For convenience, the following pre-built files are available on the FTP site +(see Availability above): + + pthread.h - for POSIX 1c threads + semaphore.h - for POSIX 1b semaphores + sched.h - for POSIX 1b scheduling + pthreadVCE.dll - built with MSVC++ compiler using C++ EH + pthreadVCE.lib + pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp + pthreadVC.lib + pthreadVSE.dll - built with MSVC compiler using SEH + pthreadVSE.lib + pthreadGCE.dll - built with Mingw32 G++ 2.95.2-1 + pthreadGC.dll - built with Mingw32 GCC 2.95.2-1 using setjmp/longjmp + libpthreadGCE.a - derived from pthreadGCE.dll + libpthreadGC.a - derived from pthreadGC.dll + gcc.dll - needed if distributing applications that use + pthreadGCE.dll (but see the FAQ Q 10 for the latest + related information) + +These are the only files you need in order to build POSIX threads +applications for Win32 using either MSVC or Mingw32. + +See the FAQ file in the source tree for additional information. + + +Documentation +------------- + +For the authoritative reference, see the online POSIX +standard reference at: + + http://www.OpenGroup.org + +For POSIX Thread API programming, several reference books are +available: + + Programming with POSIX Threads + David R. Butenhof + Addison-Wesley (pub) + + Pthreads Programming + By Bradford Nichols, Dick Buttlar & Jacqueline Proulx Farrell + O'Reilly (pub) + +On the web: see the links at the bottom of the pthreads-win32 site: + + http://sources.redhat.com/pthreads-win32/ + + Currently, there is no documentation included in the package apart + from the copious comments in the source code. + + + +Enjoy! + +Ross Johnson diff --git a/win32/3rdparty/pthreads/BUGS b/win32/3rdparty/pthreads/BUGS new file mode 100644 index 000000000..29cee0033 --- /dev/null +++ b/win32/3rdparty/pthreads/BUGS @@ -0,0 +1,133 @@ +---------- +Known bugs +---------- + +1. Not strictly a bug, more of a gotcha. + + Under MS VC++ (only tested with version 6.0), a term_func + set via the standard C++ set_terminate() function causes the + application to abort. + + Notes from the MSVC++ manual: + 1) A term_func() should call exit(), otherwise + abort() will be called on return to the caller. + A call to abort() raises SIGABRT and the default signal handler + for all signals terminates the calling program with + exit code 3. + 2) A term_func() must not throw an exception. Therefore + term_func() should not call pthread_exit(), which + works by throwing an exception (pthreadVCE or pthreadVSE) + or by calling longjmp (pthreadVC). + + Workaround: avoid using pthread_exit() in C++ applications. Exit + threads by dropping through the end of the thread routine. + +2. Cancellation problems in optimised code + - Milan Gardian + + This is suspected to be a compiler bug in VC6.0, and also seen in + VC7.0 and VS .NET 2003. The GNU C++ compiler does not have a problem + with this, and it has been reported that the Intel C++ 8.1 compiler + and Visual C++ 2005 Express Edition Beta2 pass tests\semaphore4.c + (which exposes the bug). + + Workaround [rpj - 2 Feb 2002] + ----------------------------- + [Please note: this workaround did not solve a similar problem in + snapshot-2004-11-03 or later, even though similar symptoms were seen. + tests\semaphore4.c fails in that snapshot for the VCE version of the + DLL.] + + The problem disappears when /Ob0 is used, i.e. /O2 /Ob0 works OK, + but if you want to use inlining optimisation you can be much more + specific about where it's switched off and on by using a pragma. + + So the inlining optimisation is interfering with the way that cleanup + handlers are run. It appears to relate to auto-inlining of class methods + since this is the only auto inlining that is performed at /O1 optimisation + (functions with the "inline" qualifier are also inlined, but the problem + doesn't appear to involve any such functions in the library or testsuite). + + In order to confirm the inlining culprit, the following use of pragmas + eliminate the problem but I don't know how to make it transparent, putting + it in, say, pthread.h where pthread_cleanup_push defined as a macro. + + #pragma inline_depth(0) + pthread_cleanup_push(handlerFunc, (void *) &arg); + + /* ... */ + + pthread_cleanup_pop(0); + #pragma inline_depth() + + Note the empty () pragma value after the pop macro. This resets depth to the + default. Or you can specify a non-zero depth here. + + The pragma is also needed (and now used) within the library itself wherever + cleanup handlers are used (condvar.c and rwlock.c). + + Use of these pragmas allows compiler optimisations /O1 and /O2 to be + used for either or both the library and applications. + + Experimenting further, I found that wrapping the actual cleanup handler + function with #pragma auto_inline(off|on) does NOT work. + + MSVC6.0 doesn't appear to support the C99 standard's _Pragma directive, + however, later versions may. This form is embeddable inside #define + macros, which would be ideal because it would mean that it could be added + to the push/pop macro definitions in pthread.h and hidden from the + application programmer. + + [/rpj] + + Original problem description + ---------------------------- + + The cancellation (actually, cleanup-after-cancel) tests fail when using VC + (professional) optimisation switches (/O1 or /O2) in pthreads library. I + have not investigated which concrete optimisation technique causes this + problem (/Og, /Oi, /Ot, /Oy, /Ob1, /Gs, /Gf, /Gy, etc.), but here is a + summary of builds and corresponding failures: + + * pthreads VSE (optimised tests): OK + * pthreads VCE (optimised tests): Failed "cleanup1" test (runtime) + + * pthreads VSE (DLL in CRT, optimised tests): OK + * pthreads VCE (DLL in CRT, optimised tests): Failed "cleanup1" test + (runtime) + + Please note that while in VSE version of the pthreads library the + optimisation does not really have any impact on the tests (they pass OK), in + VCE version addition of optimisation (/O2 in this case) causes the tests to + fail uniformly - either in "cleanup0" or "cleanup1" test cases. + + Please note that all the tests above use default pthreads DLL (no + optimisations, linked with either static or DLL CRT, based on test type). + Therefore the problem lies not within the pthreads DLL but within the + compiled client code (the application using pthreads -> involvement of + "pthread.h"). + + I think the message of this section is that usage of VCE version of pthreads + in applications relying on cancellation/cleanup AND using optimisations for + creation of production code is highly unreliable for the current version of + the pthreads library. + +3. The Borland Builder 5.5 version of the library produces memory read exceptions +in some tests. + +4. pthread_barrier_wait() can deadlock if the number of potential calling +threads for a particular barrier is greater than the barrier count parameter +given to pthread_barrier_init() for that barrier. + +This is due to the very lightweight implementation of pthread-win32 barriers. +To cope with more than "count" possible waiters, barriers must effectively +implement all the same safeguards as condition variables, making them much +"heavier" than at present. + +The workaround is to ensure that no more than "count" threads attempt to wait +at the barrier. + +5. Canceling a thread blocked on pthread_once appears not to work in the MSVC++ +version of the library "pthreadVCE.dll". The test case "once3.c" hangs. I have no +clues on this at present. All other versions pass this test ok - pthreadsVC.dll, +pthreadsVSE.dll, pthreadsGC.dll and pthreadsGCE.dll. diff --git a/win32/3rdparty/pthreads/Bmakefile b/win32/3rdparty/pthreads/Bmakefile new file mode 100644 index 000000000..66707bf4c --- /dev/null +++ b/win32/3rdparty/pthreads/Bmakefile @@ -0,0 +1,266 @@ +# This makefile is compatible with BCB make. Use "make -fBMakefile" to compile. +# +# The variables $DLLDEST and $LIBDEST hold the destination directories for the +# dll and the lib, respectively. Probably all that needs to change is $DEVROOT. +# +# Currently only the recommended pthreadBC.dll is built by this makefile. +# + + +DLL_VER = 2 + +DEVROOT = . + +DLLDEST = $(DEVROOT)\DLL +LIBDEST = $(DEVROOT)\DLL + +DLLS = pthreadBC$(DLL_VER).dll + +OPTIM = /O2 + +RC = brcc32 +RCFLAGS = -i. + +CFLAGS = /q /I. /D_WIN32_WINNT=0x400 /DHAVE_CONFIG_H=1 /4 /tWD /tWM \ + /w-aus /w-asc /w-par + +#C cleanup code +BCFLAGS = $(PTW32_FLAGS) $(CFLAGS) + +# Agregate modules for inlinability +DLL_OBJS = \ + attr.obj \ + barrier.obj \ + cancel.obj \ + cleanup.obj \ + condvar.obj \ + create.obj \ + dll.obj \ + errno.obj \ + exit.obj \ + fork.obj \ + global.obj \ + misc.obj \ + mutex.obj \ + nonportable.obj \ + private.obj \ + rwlock.obj \ + sched.obj \ + semaphore.obj \ + signal.obj \ + spin.obj \ + sync.obj \ + tsd.obj + +INCL = config.h implement.h semaphore.h pthread.h need_errno.h + +ATTR_SRCS = \ + pthread_attr_init.c \ + pthread_attr_destroy.c \ + pthread_attr_getdetachstate.c \ + pthread_attr_setdetachstate.c \ + pthread_attr_getstackaddr.c \ + pthread_attr_setstackaddr.c \ + pthread_attr_getstacksize.c \ + pthread_attr_setstacksize.c \ + pthread_attr_getscope.c \ + pthread_attr_setscope.c + +BARRIER_SRCS = \ + pthread_barrier_init.c \ + pthread_barrier_destroy.c \ + pthread_barrier_wait.c \ + pthread_barrierattr_init.c \ + pthread_barrierattr_destroy.c \ + pthread_barrierattr_setpshared.c \ + pthread_barrierattr_getpshared.c + +CANCEL_SRCS = \ + pthread_setcancelstate.c \ + pthread_setcanceltype.c \ + pthread_testcancel.c \ + pthread_cancel.c + +CONDVAR_SRCS = \ + ptw32_cond_check_need_init.c \ + pthread_condattr_destroy.c \ + pthread_condattr_getpshared.c \ + pthread_condattr_init.c \ + pthread_condattr_setpshared.c \ + pthread_cond_destroy.c \ + pthread_cond_init.c \ + pthread_cond_signal.c \ + pthread_cond_wait.c + +EXIT_SRCS = \ + pthread_exit.c + +MISC_SRCS = \ + pthread_equal.c \ + pthread_getconcurrency.c \ + pthread_once.c \ + pthread_self.c \ + pthread_setconcurrency.c \ + ptw32_calloc.c \ + ptw32_MCS_lock.c \ + ptw32_new.c \ + w32_CancelableWait.c + +MUTEX_SRCS = \ + ptw32_mutex_check_need_init.c \ + pthread_mutex_init.c \ + pthread_mutex_destroy.c \ + pthread_mutexattr_init.c \ + pthread_mutexattr_destroy.c \ + pthread_mutexattr_getpshared.c \ + pthread_mutexattr_setpshared.c \ + pthread_mutexattr_settype.c \ + pthread_mutexattr_gettype.c \ + pthread_mutex_lock.c \ + pthread_mutex_timedlock.c \ + pthread_mutex_unlock.c \ + pthread_mutex_trylock.c + +NONPORTABLE_SRCS = \ + pthread_mutexattr_setkind_np.c \ + pthread_mutexattr_getkind_np.c \ + pthread_getw32threadhandle_np.c \ + pthread_delay_np.c \ + pthread_num_processors_np.c \ + pthread_win32_attach_detach_np.c \ + pthread_timechange_handler_np.c + +PRIVATE_SRCS = \ + ptw32_is_attr.c \ + ptw32_processInitialize.c \ + ptw32_processTerminate.c \ + ptw32_threadStart.c \ + ptw32_threadDestroy.c \ + ptw32_tkAssocCreate.c \ + ptw32_tkAssocDestroy.c \ + ptw32_callUserDestroyRoutines.c \ + ptw32_timespec.c \ + ptw32_relmillisecs.c \ + ptw32_throw.c \ + ptw32_InterlockedCompareExchange.c \ + ptw32_getprocessors.c + +RWLOCK_SRCS = \ + ptw32_rwlock_check_need_init.c \ + ptw32_rwlock_cancelwrwait.c \ + pthread_rwlock_init.c \ + pthread_rwlock_destroy.c \ + pthread_rwlockattr_init.c \ + pthread_rwlockattr_destroy.c \ + pthread_rwlockattr_getpshared.c \ + pthread_rwlockattr_setpshared.c \ + pthread_rwlock_rdlock.c \ + pthread_rwlock_timedrdlock.c \ + pthread_rwlock_wrlock.c \ + pthread_rwlock_timedwrlock.c \ + pthread_rwlock_unlock.c \ + pthread_rwlock_tryrdlock.c \ + pthread_rwlock_trywrlock.c + +SCHED_SRCS = \ + pthread_attr_setschedpolicy.c \ + pthread_attr_getschedpolicy.c \ + pthread_attr_setschedparam.c \ + pthread_attr_getschedparam.c \ + pthread_attr_setinheritsched.c \ + pthread_attr_getinheritsched.c \ + pthread_setschedparam.c \ + pthread_getschedparam.c \ + sched_get_priority_max.c \ + sched_get_priority_min.c \ + sched_setscheduler.c \ + sched_getscheduler.c \ + sched_yield.c + +SEMAPHORE_SRCS = \ + sem_init.c \ + sem_destroy.c \ + sem_trywait.c \ + sem_timedwait.c \ + sem_wait.c \ + sem_post.c \ + sem_post_multiple.c \ + sem_getvalue.c \ + sem_open.c \ + sem_close.c \ + sem_unlink.c + +SPIN_SRCS = \ + ptw32_spinlock_check_need_init.c \ + pthread_spin_init.c \ + pthread_spin_destroy.c \ + pthread_spin_lock.c \ + pthread_spin_unlock.c \ + pthread_spin_trylock.c + +SYNC_SRCS = \ + pthread_detach.c \ + pthread_join.c + +TSD_SRCS = \ + pthread_key_create.c \ + pthread_key_delete.c \ + pthread_setspecific.c \ + pthread_getspecific.c + + +all: clean $(DLLS) + +realclean: clean + if exist pthread*.dll del pthread*.dll + if exist pthread*.lib del pthread*.lib + if exist *.stamp del *.stamp + +clean: + if exist *.obj del *.obj + if exist *.ilk del *.ilk + if exist *.ilc del *.ilc + if exist *.ild del *.ild + if exist *.ilf del *.ilf + if exist *.ils del *.ils + if exist *.tds del *.tds + if exist *.pdb del *.pdb + if exist *.exp del *.exp + if exist *.map del *.map + if exist *.o del *.o + if exist *.i del *.i + if exist *.res del *.res + + +install: $(DLLS) + copy pthread*.dll $(DLLDEST) + copy pthread*.lib $(LIBDEST) + +$(DLLS): $(DLL_OBJS) version.res + ilink32 /Tpd /Gi c0d32x.obj $(DLL_OBJS), \ + $@, ,\ + cw32mti.lib import32.lib, ,\ + version.res + +.c.obj: + $(CC) $(OPTIM) $(BCFLAGS) -c $< + +.rc.res: + $(RC) $(RCFLAGS) $< + +attr.obj: attr.c $(ATTR_SRCS) $(INCL) +barrier.obj: barrier.c $(BARRIER_SRCS) $(INCL) +cancel.obj: cancel.c $(CANCEL_SRCS) $(INCL) +condvar.obj: condvar.c $(CONDVAR_SRCS) $(INCL) +exit.obj: exit.c $(EXIT_SRCS) $(INCL) +misc.obj: misc.c $(MISC_SRCS) $(INCL) +mutex.obj: mutex.c $(MUTEX_SRCS) $(INCL) +nonportable.obj: nonportable.c $(NONPORTABLE_SRCS) $(INCL) +private.obj: private.c $(PRIVATE_SRCS) $(INCL) +rwlock.obj: rwlock.c $(RWLOCK_SRCS) $(INCL) +sched.obj: sched.c $(SCHED_SRCS) $(INCL) +semaphore.obj: semaphore.c $(SEMAPHORE_SRCS) $(INCL) +spin.obj: spin.c $(SPIN_SRCS) $(INCL) +sync.obj: sync.c $(SYNC_SRCS) $(INCL) +tsd.obj: tsd.c $(TSD_SRCS) $(INCL) +version.res: version.rc $(INCL) diff --git a/win32/3rdparty/pthreads/CONTRIBUTORS b/win32/3rdparty/pthreads/CONTRIBUTORS new file mode 100644 index 000000000..e5b7325d1 --- /dev/null +++ b/win32/3rdparty/pthreads/CONTRIBUTORS @@ -0,0 +1,129 @@ +Contributors (in approximate order of appearance) + +[See also the ChangeLog file where individuals are +attributed in log entries. Likewise in the FAQ file.] + +Ben Elliston bje at cygnus dot com + Initiated the project; + setup the project infrastructure (CVS, web page, etc.); + early prototype routines. +Ross Johnson rpj at callisto dot canberra dot edu dot au + early prototype routines; + ongoing project coordination/maintenance; + implementation of spin locks and barriers; + various enhancements; + bug fixes; + documentation; + testsuite. +Robert Colquhoun rjc at trump dot net dot au + Early bug fixes. +John E. Bossom John dot Bossom at cognos dot com + Contributed substantial original working implementation; + bug fixes; + ongoing guidance and standards interpretation. +Anders Norlander anorland at hem2 dot passagen dot se + Early enhancements and runtime checking for supported + Win32 routines. +Tor Lillqvist tml at iki dot fi + General enhancements; + early bug fixes to condition variables. +Scott Lightner scott at curriculum dot com + Bug fix. +Kevin Ruland Kevin dot Ruland at anheuser-busch dot com + Various bug fixes. +Mike Russo miker at eai dot com + Bug fix. +Mark E. Armstrong avail at pacbell dot net + Bug fixes. +Lorin Hochstein lmh at xiphos dot ca + general bug fixes; bug fixes to condition variables. +Peter Slacik Peter dot Slacik at tatramed dot sk + Bug fixes. +Mumit Khan khan at xraylith dot wisc dot edu + Fixes to work with Mingw32. +Milan Gardian mg at tatramed dot sk + Bug fixes and reports/analyses of obscure problems. +Aurelio Medina aureliom at crt dot com + First implementation of read-write locks. +Graham Dumpleton Graham dot Dumpleton at ra dot pad dot otc dot telstra dot com dot au + Bug fix in condition variables. +Tristan Savatier tristan at mpegtv dot com + WinCE port. +Erik Hensema erik at hensema dot xs4all dot nl + Bug fixes. +Rich Peters rpeters at micro-magic dot com +Todd Owen towen at lucidcalm dot dropbear dot id dot au + Bug fixes to dll loading. +Jason Nye jnye at nbnet dot nb dot ca + Implementation of async cancelation. +Fred Forester fforest at eticomm dot net +Kevin D. Clark kclark at cabletron dot com +David Baggett dmb at itasoftware dot com + Bug fixes. +Paul Redondo paul at matchvision dot com +Scott McCaskill scott at 3dfx dot com + Bug fixes. +Jef Gearhart jgearhart at tpssys dot com + Bug fix. +Arthur Kantor akantor at bexusa dot com + Mutex enhancements. +Steven Reddie smr at essemer dot com dot au + Bug fix. +Alexander Terekhov TEREKHOV at de dot ibm dot com + Re-implemented and improved read-write locks; + (with Louis Thomas) re-implemented and improved + condition variables; + enhancements to semaphores; + enhancements to mutexes; + new mutex implementation in 'futex' style; + suggested a robust implementation of pthread_once + similar to that implemented by V.Kliathcko; + system clock change handling re CV timeouts; + bug fixes. +Thomas Pfaff tpfaff at gmx dot net + Changes to make C version usable with C++ applications; + re-implemented mutex routines to avoid Win32 mutexes + and TryEnterCriticalSection; + procedure to fix Mingw32 thread-safety issues. +Franco Bez franco dot bez at gmx dot de + procedure to fix Mingw32 thread-safety issues. +Louis Thomas lthomas at arbitrade dot com + (with Alexander Terekhov) re-implemented and improved + condition variables. +David Korn dgk at research dot att dot com + Ported to UWIN. +Phil Frisbie, Jr. phil at hawksoft dot com + Bug fix. +Ralf Brese Ralf dot Brese at pdb4 dot siemens dot de + Bug fix. +prionx at juno dot com prionx at juno dot com + Bug fixes. +Max Woodbury mtew at cds dot duke dot edu + POSIX versioning conditionals; + reduced namespace pollution; + idea to separate routines to reduce statically + linked image sizes. +Rob Fanner rfanner at stonethree dot com + Bug fix. +Michael Johnson michaelj at maine dot rr dot com + Bug fix. +Nicolas Barry boozai at yahoo dot com + Bug fixes. +Piet van Bruggen pietvb at newbridges dot nl + Bug fix. +Makoto Kato raven at oldskool dot jp + AMD64 port. +Panagiotis E. Hadjidoukas peh at hpclab dot ceid dot upatras dot gr + Contributed the QueueUserAPCEx package which + makes preemptive async cancelation possible. +Will Bryant will dot bryant at ecosm dot com + Borland compiler patch and makefile. +Anuj Goyal anuj dot goyal at gmail dot com + Port to Digital Mars compiler. +Gottlob Frege gottlobfrege at gmail dot com + re-implemented pthread_once (version 2) + (pthread_once cancellation added by rpj). +Vladimir Kliatchko vladimir at kliatchko dot com + reimplemented pthread_once with the same form + as described by A.Terekhov (later version 2); + implementation of MCS (Mellor-Crummey/Scott) locks. diff --git a/win32/3rdparty/pthreads/COPYING b/win32/3rdparty/pthreads/COPYING new file mode 100644 index 000000000..5cfea0d0e --- /dev/null +++ b/win32/3rdparty/pthreads/COPYING @@ -0,0 +1,150 @@ + pthreads-win32 - a POSIX threads library for Microsoft Windows + + +This file is Copyrighted +------------------------ + + This file is covered under the following Copyright: + + Copyright (C) 2001,2006 Ross P. Johnson + All rights reserved. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Pthreads-win32 is covered by the GNU Lesser General Public License +------------------------------------------------------------------ + + Pthreads-win32 is open software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation version 2.1 of the + License. + + Pthreads-win32 is several binary link libraries, several modules, + associated interface definition files and scripts used to control + its compilation and installation. + + Pthreads-win32 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + A copy of the GNU Lesser General Public License is distributed with + pthreads-win32 under the filename: + + COPYING.LIB + + You should have received a copy of the version 2.1 GNU Lesser General + Public License with pthreads-win32; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place + Suite 330 + Boston, MA 02111-1307 + USA + + The contact addresses for pthreads-win32 is as follows: + + Web: http://sources.redhat.com/pthreads-win32 + Email: Ross Johnson + Please use: Firstname.Lastname@homemail.com.au + + + +Pthreads-win32 copyrights and exception files +--------------------------------------------- + + With the exception of the files listed below, Pthreads-win32 + is covered under the following GNU Lesser General Public License + Copyrights: + + Pthreads-win32 - POSIX Threads Library for Win32 + Copyright(C) 1998 John E. Bossom + Copyright(C) 1999,2006 Pthreads-win32 contributors + + The current list of contributors is contained + in the file CONTRIBUTORS included with the source + code distribution. The current list of CONTRIBUTORS + can also be seen at the following WWW location: + http://sources.redhat.com/pthreads-win32/contributors.html + + Contact Email: Ross Johnson + Please use: Firstname.Lastname@homemail.com.au + + These files are not covered under one of the Copyrights listed above: + + COPYING + COPYING.LIB + tests/rwlock7.c + + This file, COPYING, is distributed under the Copyright found at the + top of this file. It is important to note that you may distribute + verbatim copies of this file but you may not modify this file. + + The file COPYING.LIB, which contains a copy of the version 2.1 + GNU Lesser General Public License, is itself copyrighted by the + Free Software Foundation, Inc. Please note that the Free Software + Foundation, Inc. does NOT have a copyright over Pthreads-win32, + only the COPYING.LIB that is supplied with pthreads-win32. + + The file tests/rwlock7.c is derived from code written by + Dave Butenhof for his book 'Programming With POSIX(R) Threads'. + The original code was obtained by free download from his website + http://home.earthlink.net/~anneart/family/Threads/source.html + and did not contain a copyright or author notice. It is assumed to + be freely distributable. + + In all cases one may use and distribute these exception files freely. + And because one may freely distribute the LGPL covered files, the + entire pthreads-win32 source may be freely used and distributed. + + + +General Copyleft and License info +--------------------------------- + + For general information on Copylefts, see: + + http://www.gnu.org/copyleft/ + + For information on GNU Lesser General Public Licenses, see: + + http://www.gnu.org/copyleft/lesser.html + http://www.gnu.org/copyleft/lesser.txt + + +Why pthreads-win32 did not use the GNU General Public License +------------------------------------------------------------- + + The goal of the pthreads-win32 project has been to + provide a quality and complete implementation of the POSIX + threads API for Microsoft Windows within the limits imposed + by virtue of it being a stand-alone library and not + linked directly to other POSIX compliant libraries. For + example, some functions and features, such as those based + on POSIX signals, are missing. + + Pthreads-win32 is a library, available in several different + versions depending on supported compilers, and may be used + as a dynamically linked module or a statically linked set of + binary modules. It is not an application on it's own. + + It was fully intended that pthreads-win32 be usable with + commercial software not covered by either the GPL or the LGPL + licenses. Pthreads-win32 has many contributors to it's + code base, many of whom have done so because they have + used the library in commercial or proprietry software + projects. + + Releasing pthreads-win32 under the LGPL ensures that the + library can be used widely, while at the same time ensures + that bug fixes and improvements to the pthreads-win32 code + itself is returned to benefit all current and future users + of the library. + + Although pthreads-win32 makes it possible for applications + that use POSIX threads to be ported to Win32 platforms, the + broader goal of the project is to encourage the use of open + standards, and in particular, to make it just a little easier + for developers writing Win32 applications to consider + widening the potential market for their products. diff --git a/win32/3rdparty/pthreads/COPYING.LIB b/win32/3rdparty/pthreads/COPYING.LIB new file mode 100644 index 000000000..b1e3f5a26 --- /dev/null +++ b/win32/3rdparty/pthreads/COPYING.LIB @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/win32/3rdparty/pthreads/ChangeLog b/win32/3rdparty/pthreads/ChangeLog new file mode 100644 index 000000000..b85d9f9b8 --- /dev/null +++ b/win32/3rdparty/pthreads/ChangeLog @@ -0,0 +1,4821 @@ +2006-12-20 Ross Johnson + + * sem_destroy.c: Fix the race involving invalidation of the sema; + fix incorrect return of EBUSY resulting from the mutex trylock + on the private mutex guard. + * sem_wait.c: Add check for invalid sem_t after acquiring the + sem_t state guard mutex and before affecting changes to sema state. + * sem_trywait.c: Likewise. + * sem_timedwait.c: Likewise. + * sem_getvalue.c: Likewise. + * sem_post.c: Similar. + * sem_post_multiple.c: Likewise. + * sem_init.c: Set max Win32 semaphore count to SEM_VALUE_MAX (was + _POSIX_SEM_VALUE_MAX, which is a lower value - the minimum). + + * pthread_win32_attach_detach_np.c (pthread_win32_process_attach_np): + Load COREDLL.DLL under WINCE to check existence of + InterlockedCompareExchange() routine. This used to be done to test + for TryEnterCriticalSection() but was removed when this was no + longer needed. + +2006-01-25 Prashant Thakre + + * pthread_cancel.c: Added _M_IA64 register context support. + +2005-05-13 Ross Johnson + + * pthread_kill.c (pthread_kill): Remove check for Win32 thread + priority (to confirm HANDLE validity). Useless since thread HANDLEs + a not recycle-unique. + +2005-05-30 Vladimir Kliatchko + + * pthread_once.c: Re-implement using an MCS queue-based lock. The form + of pthread_once is as proposed by Alexander Terekhov (see entry of + 2005-03-13). The MCS lock implementation does not require a unique + 'name' to identify the lock between threads. Attempts to get the Event + or Semaphore based versions of pthread_once to a satisfactory level + of robustness have thus far failed. The last problem (avoiding races + involving non recycle-unique Win32 HANDLEs) was giving everyone + grey hair trying to solve it. + + * ptw32_MCS_lock.c: New MCS queue-based lock implementation. These + locks are efficient: they have very low overhead in the uncontended case; + are efficient in contention and minimise cache-coherence updates in + managing the user level FIFO queue; do not require an ABI change in the + library. + +2005-05-27 Alexander Gottwald + + * pthread.h: Some things, like HANDLE, were only defined if + PTW32_LEVEL was >= 3. They should always be defined. + +2005-05-25 Vladimir Kliatchko + + * pthread_once.c: Eliminate all priority operations and other + complexity by replacing the event with a semaphore. The advantage + of the change is the ability to release just one waiter if the + init_routine thread is cancelled yet still release all waiters when + done. Simplify once_control state checks to improve efficiency + further. + +2005-05-24 Mikael Magnusson + + * GNUmakefile: Patched to allow cross-compile with mingw32 on Linux. + It uses macros instead of referencing dlltool, gcc and g++ directly; + added a call to ranlib. For example the GC static library can be + built with: + make CC=i586-mingw32msvc-gcc RC=i586-mingw32msvc-windres \ + RANLIB=i586-mingw32msvc-ranlib clean GC-static + +2005-05-13 Ross Johnson + + * pthread_win32_attach_detach_np.c (pthread_win32_thread_detach_np): + Move on-exit-only stuff from ptw32_threadDestroy() to here. + * ptw32_threadDestroy.c: It's purpose is now only to reclaim thread + resources for detached threads, or via pthread_join() or + pthread_detach() on joinable threads. + * ptw32_threadStart.c: Calling user destruct routines has moved to + pthread_win32_thread_detach_np(); call pthread_win32_thread_detach_np() + directly if statically linking, otherwise do so via dllMain; store + thread return value in thread struct for all cases, including + cancellation and exception exits; thread abnormal exits go via + pthread_win32_thread_detach_np. + * pthread_join.c (pthread_join): Don't try to get return code from + Win32 thread - always get it from he thread struct. + * pthread_detach.c (pthread_detach): reduce extent of the thread + existence check since we now don't care if the Win32 thread HANDLE has + been closed; reclaim thread resources if the thread has exited already. + * ptw32_throw.c (ptw32_throw): For Win32 threads that are not implicit, + only Call thread cleanup if statically linking, otherwise leave it to + dllMain. + * sem_post.c (_POSIX_SEM_VALUE_MAX): Change to SEM_VALUE_MAX. + * sem_post_multiple.c: Likewise. + * sem_init.c: Likewise. + +2005-05-10 Ross Johnson + + * pthread_join.c (pthread_join): Add missing check for thread ID + reference count in thread existence test; reduce extent of the + existence test since we don't care if the Win32 thread HANDLE has + been closed. + +2005-05-09 Ross Johnson + + * ptw32_callUserDestroyRoutines.c: Run destructor process (i.e. + loop over all keys calling destructors) up to + PTHREAD_DESTRUCTOR_ITERATIONS times if TSD value isn't NULL yet; + modify assoc management. + * pthread_key_delete.c: Modify assoc management. + * ptw32_tkAssocDestroy.c: Fix error in assoc removal from chains. + * pthread.h + (_POSIX_THREAD_DESTRUCTOR_ITERATIONS): Define to value specified by + POSIX. + (_POSIX_THREAD_KEYS_MAX): Define to value specified by POSIX. + (PTHREAD_KEYS_MAX): Redefine [upward] to minimum required by POSIX. + (SEM_NSEMS_MAX): Define to implementation value. + (SEM_VALUE_MAX): Define to implementation value. + (_POSIX_SEM_NSEMS_MAX): Redefine to value specified by POSIX. + (_POSIX_SEM_VALUE_MAX): Redefine to value specified by POSIX. + +2005-05-06 Ross Johnson + + * signal.c (sigwait): Add a cancellation point to this otherwise + no-op. + * sem_init.c (sem_init): Check for and return ERANGE error. + * sem_post.c (sem_post): Likewise. + * sem_post_multiple.c (sem_post_multiple): Likewise. + * manual (directory): Added; see ChangeLog inside. + +2005-05-02 Ross Johnson + + * implement.h (struct pthread_key_t_): Change threadsLock to keyLock + so as not to be confused with the per thread lock 'threadlock'; + change all references to it. + * implement.h (struct ThreadKeyAssoc): Remove lock; add prevKey + and prevThread pointers; re-implemented all routines that use this + struct. The effect of this is to save one handle per association, + which could potentially equal the number of keys multiplied by the + number of threads, accumulating over time - and to free the + association memory as soon as it is no longer referenced by either + the key or the thread. Previously, the handle and memory were + released only after BOTH key and thread no longer referenced the + association. That is, often no association resources were released + until the process itself exited. In addition, at least one race + condition has been removed - where two threads could attempt to + release the association resources simultaneously - one via + ptw32_callUserDestroyRoutines and the other via + pthread_key_delete. + - thanks to Richard Hughes at Aculab for discovering the problem. + * pthread_key_create.c: See above. + * pthread_key_delete.c: See above. + * pthread_setspecific.c: See above. + * ptw32_callUserDestroyRoutines.c: See above. + * ptw32_tkAssocCreate.c: See above. + * ptw32_tkAssocDestroy.c: See above. + +2005-04-27 Ross Johnson + + * sem_wait.c (ptw32_sem_wait_cleanup): after cancellation re-attempt + to acquire the semaphore to avoid a race with a late sem_post. + * sem_timedwait.c: Modify comments. + +2005-04-25 Ross Johnson + + * ptw32_relmillisecs.c: New module; converts future abstime to + milliseconds relative to 'now'. + * pthread_mutex_timedlock.c: Use new ptw32_relmillisecs routine in + place of internal code; remove the NEED_SEM code - this routine is now + implemented for builds that define NEED_SEM (WinCE etc) + * sem_timedwait.c: Likewise; after timeout or cancellation, + re-attempt to acquire the semaphore in case one has been posted since + the timeout/cancel occurred. Thanks to Stefan Mueller. + * Makefile: Add ptw32_relmillisecs.c module; remove + ptw32_{in,de}crease_semaphore.c modules. + * GNUmakefile: Likewise. + * Bmakefile: Likewise. + + * sem_init.c: Re-write the NEED_SEM code to be consistent with the + non-NEED_SEM code, but retaining use of an event in place of the w32 sema + for w32 systems that don't include semaphores (WinCE); + the NEED_SEM versions of semaphores has been broken for a long time but is + now fixed and supports all of the same routines as the non-NEED_SEM case. + * sem_destroy.c: Likewise. + * sem_wait.c: Likewise. + * sem_post.c: Likewise. + * sem_post_multple.c: Likewise. + * implement.h: Likewise. + * sem_timedwait.c: Likewise; this routine is now + implemented for builds that define NEED_SEM (WinCE etc). + * sem_trywait.c: Likewise. + * sem_getvalue.c: Likewise. + + * pthread_once.c: Yet more changes, reverting closer to Gottlob Frege's + first design, but retaining cancellation, priority boosting, and adding + preservation of W32 error codes to make pthread_once transparent to + GetLastError. + +2005-04-11 Ross Johnson + + * pthread_once.c (pthread_once): Added priority boosting to + solve starvation problem after once_routine cancellation. + See notes in file. + +2005-04-06 Kevin Lussier + + * Makefile: Added debug targets for all versions of the library. + +2005-04-01 Ross Johnson + + * GNUmakefile: Add target to build libpthreadGC1.a as a static link + library. + * Makefile: Likewise for pthreadGC1.lib. + +2005-04-01 Kevin Lussier + + * sem_timedwait.c (sem_timedwait): Increase size of temp variables to + avoid int overflows for large timeout values. + * implement.h (int64_t): Include or define. + +2005-03-31 Dimitar Panayotov ^M + + * pthread.h: Fix conditional defines for static linking. + * sched.h: Liekwise. + * semaphore.h: Likewise. + * dll.c (PTW32_STATIC_LIB): Module is conditionally included + in the build. + +2005-03-16 Ross Johnson ^M + + * pthread_setcancelstate.c: Undo the last change. + +2005-03-16 Ross Johnson ^M + + * pthread_setcancelstate.c: Don't check for an async cancel event + if the library is using alertable async cancel.. + +2005-03-14 Ross Johnson + + * pthread_once.c (pthread_once): Downgrade interlocked operations to simple + memory operations where these are protected by the critical section; edit + comments. + +2005-03-13 Ross Johnson + + * pthread_once.c (pthread_once): Completely redesigned; a change was + required to the ABI (pthread_once_t_), and resulting in a version + compatibility index increment. + + NOTES: + The design (based on pseudo code contributed by Gottlob Frege) avoids + creating a kernel object if there is no contention. See URL for details:- + http://sources.redhat.com/ml/pthreads-win32/2005/msg00029.html + This uses late initialisation similar to the technique already used for + pthreads-win32 mutexes and semaphores (from Alexander Terekhov). + + The subsequent cancelation cleanup additions (by rpj) could not be implemented + without sacrificing some of the efficiency in Gottlob's design. In particular, + although each once_control uses it's own event to block on, a global CS is + required to manage it - since the event must be either re-usable or + re-creatable under cancelation. This is not needed in the non-cancelable + design because it is able to mark the event as closed (forever). + + When uncontested, a CS operation is equivalent to an Interlocked operation + in speed. So, in the final design with cancelability, an uncontested + once_control operation involves a minimum of five interlocked operations + (including the LeaveCS operation). + + ALTERNATIVES: + An alternative design from Alexander Terekhov proposed using a named mutex, + as sketched below:- + + if (!once_control) { // May be in TLS + named_mutex::guard guard(&once_control2); + if (!once_control2) { + + once_control2 = true; + } + once_control = true; + } + + A more detailed description of this can be found here:- + http://groups.yahoo.com/group/boost/message/15442 + + [Although the definition of a suitable PTHREAD_ONCE_INIT precludes use of the + TLS located flag, this is not critical.] + + There are three primary concerns though:- + 1) The [named] mutex is 'created' even in the uncontended case. + 2) A system wide unique name must be generated. + 3) Win32 mutexes are VERY slow even in the uncontended case. An uncontested + Win32 mutex lock operation can be 50 (or more) times slower than an + uncontested EnterCS operation. + + Ultimately, the named mutex trick is making use of the global locks maintained + by the kernel. + + * pthread.h (pthread_once_t_): One flag and an event HANDLE added. + (PTHREAD_ONCE_INIT): Additional values included. + +2005-03-08 Ross Johnson + + * pthread_once.c (pthread_once): Redesigned to elliminate potential + starvation problem. + - reported by Gottlob Frege + + * ptw32_threadDestroy.c (ptw32_threadDestroy): Implicit threads were + not closing their Win32 thread duplicate handle. + - reported by Dmitrii Semii + +2005-01-25 Ralf Kubis + + * Attempted acquisition of recursive mutex was causing waiting + threads to not be woken when the mutex is released. + + * GNUmakefile (GCE): Generate correct version resource comments. + +2005-01-01 Konstantin Voronkov + + * pthread_mutex_lock.c (pthread_mutex_lock): The new atomic exchange + mutex algorithm is known to allow a thread to steal the lock off + FIFO waiting threads. The next waiting FIFO thread gets a spurious + wake-up and must attempt to re-acquire the lock. The woken thread + was setting itself as the mutex's owner before the re-acquisition. + +2004-11-22 Ross Johnson + + * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Undo change + from 2004-11-02. + * Makefile (DLL_VER): Added for DLL naming suffix - see README. + * GNUmakefile (DLL_VER): Likewise. + * Wmakefile (DLL_VER): Likewise. + * Bmakefile (DLL_VER): Likewise. + * pthread.dsw (version.rc): Added to MSVS workspace. + +2004-11-20 Boudewijn Dekker + + * pthread_getspecific.c (pthread_getspecific): Check for + invalid (NULL) key argument. + +2004-11-19 Ross Johnson + + * config.h (PTW32_THREAD_ID_REUSE_INCREMENT): Added to allow + building the library for either unique thread IDs like Solaris + or non-unique thread IDs like Linux; allows application developers + to override the library's default insensitivity to some apps + that may not be strictly POSIX compliant. + * version.rc: New resource module to encode version information + within the DLL. + * pthread.h: Added PTW32_VERSION* defines and grouped sections + required by resource compiler together; bulk of file is skipped + if RC_INVOKED. Defined some error numbers and other names for + Borland compiler. + +2004-11-02 Ross Johnson + + * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Lock CV mutex at + start of cleanup handler rather than at the end. + * implement.h (PTW32_THREAD_REUSE_EMPTY): Renamed from *_BOTTOM. + (ptw32_threadReuseBottom): New global variable. + * global.c (ptw32_threadReuseBottom): Declare new variable. + * ptw32_reuse.c (ptw32_reuse): Change reuse LIFO stack to LILO queue + to more evenly distribute use of reusable thread IDs; use renamed + PTW32_THREAD_REUSE_EMPTY. + * ptw32_processTerminate.c (ptw2_processTerminate): Use renamed + PTW32_THREAD_REUSE_EMPTY. + +2004-10-31 Ross Johnson + + * implement.h (PThreadState): Add new state value + 'PThreadStateCancelPending'. + * pthread_testcancel.c (pthread_testcancel): Use new thread + 'PThreadStateCancelPending' state as short cut to avoid entering + kernel space via WaitForSingleObject() call. This was obviated + by user space sema acquisition in sem_wait() and sem_timedwait(), + which are also cancelation points. A call to pthread_testcancel() + was required, which introduced a kernel call, effectively nullifying + any gains made by the user space sem acquisition checks. + * pthread_cancel.c (pthread_cancel): Set new thread + 'PThreadStateCancelPending' state. + +2004-10-29 Ross Johnson + + * implement.h (pthread_t): Renamed to ptw32_thread_t; struct contains + all thread state. + * pthread.h (ptw32_handle_t): New general purpose struct to serve + as a handle for various reusable object IDs - currently only used + by pthread_t; contains a pointer to ptw32_thread_t (thread state) + and a general purpose uint for use as a reuse counter or flags etc. + (pthread_t): typedef'ed to ptw32_handle_t; the uint is the reuse + counter that allows the library to maintain unique POSIX thread IDs. + When the pthread struct reuse stack was introduced, threads would + often acquire an identical ID to a previously destroyed thread. The + same was true for the pre-reuse stack library, by virtue of pthread_t + being the address of the thread struct. The new pthread_t retains + the reuse stack but provides virtually unique thread IDs. + * sem_wait.c (ptw32_sem_wait_cleanup): New routine used for + cancelation cleanup. + * sem_timedwait.c (ptw32_sem_timedwait_cleanup): Likewise. + +2004-10-22 Ross Johnson + + * sem_init.c (sem_init): Introduce a 'lock' element in order to + replace the interlocked operations with conventional serialisation. + This is needed in order to be able to atomically modify the sema + value and perform Win32 sema release operations. Win32 semaphores are + used instead of events in order to support efficient multiple posting. + If the whole modify/release isn't atomic, a race between + sem_timedwait() and sem_post() could result in a release when there is + no waiting semaphore, which would cause too many threads to proceed. + * sem_wait.c (sem_wait): Use new 'lock'element. + * sem_timedwait.c (sem_timedwait): Likewise. + * sem_trywait.c (sem_trywait): Likewise. + * sem_post.c (sem_post): Likewise. + * sem_post_multiple.c (sem_post_multiple): Likewise. + * sem_getvalue.c (sem_getvalue): Likewise. + * ptw32_semwait.c (ptw32_semwait): Likewise. + * sem_destroy.c (sem_destroy): Likewise; also tightened the conditions + for semaphore destruction; in particular, a semaphore will not be + destroyed if it has waiters. + * sem_timedwait.c (sem_timedwait): Added cancel cleanup handler to + restore sema value when cancelled. + * sem_wait.c (sem_wait): Likewise. + +2004-10-21 Ross Johnson + + * pthread_mutex_unlock.c (pthread_mutex_unlock): Must use PulseEvent() + rather than SetEvent() to reset the event if there are no waiters. + +2004-10-19 Ross Johnson + + * sem_init.c (sem_init): New semaphore model based on the same idea + as mutexes, i.e. user space interlocked check to avoid + unnecessarily entering kernel space. Wraps the Win32 semaphore and + keeps it's own counter. Although the motivation to do this has existed + for a long time, credit goes to Alexander Terekhov for providing + the logic. I have deviated slightly from AT's logic to add the waiters + count, which has made the code more complicated by adding cancelation + cleanup. This also appears to have broken the VCE (C++ EH) version of + the library (the same problem as previously reported - see BUGS #2), + only apparently not fixable using the usual workaround, nor by turning + all optimisation off. The GCE version works fine, so it is presumed to + be a bug in MSVC++ 6.0. The cancelation exception is thrown and caught + correctly, but the cleanup class destructor is never called. The failing + test is tests\semaphore4.c. + * sem_wait.c (sem_wait): Implemented user space check model. + * sem_post.c (sem_post): Likewise. + * sem_trywait.c (sem_trywait): Likewise. + * sem_timedwait.c (sem_timedwait): Likewise. + * sem_post_multiple.c (sem_post_multiple): Likewise. + * sem_getvalue.c (sem_getvalue): Likewise. + * ptw32_semwait.c (ptw32_semwait): Likewise. + * implement.h (sem_t_): Add counter element. + +2004-10-15 Ross Johnson + + * implement.h (pthread_mutex_t_): Use an event in place of + the POSIX semaphore. + * pthread_mutex_init.c: Create the event; remove semaphore init. + * pthread_mutex_destroy.c: Delete the event. + * pthread_mutex_lock.c: Replace the semaphore wait with the event wait. + * pthread_mutex_trylock.c: Likewise. + * pthread_mutex_timedlock.c: Likewise. + * pthread_mutex_unlock.c: Set the event. + +2004-10-14 Ross Johnson + + * pthread_mutex_lock.c (pthread_mutex_lock): New algorithm using + Terekhov's xchg based variation of Drepper's cmpxchg model. + Theoretically, xchg uses fewer clock cycles than cmpxchg (using IA-32 + as a reference), however, in my opinion bus locking dominates the + equation on smp systems, so the model with the least number of bus + lock operations in the execution path should win, which is Terekhov's + variant. On IA-32 uni-processor systems, it's faster to use the + CMPXCHG instruction without locking the bus than to use the XCHG + instruction, which always locks the bus. This makes the two variants + equal for the non-contended lock (fast lane) execution path on up + IA-32. Testing shows that the xchg variant is faster on up IA-32 as + well if the test forces higher lock contention frequency, even though + kernel calls should be dominating the times (on up IA-32, both + variants used CMPXCHG instructions and neither locked the bus). + * pthread_mutex_timedlock.c pthread_mutex_timedlock(): Similarly. + * pthread_mutex_trylock.c (pthread_mutex_trylock): Similarly. + * pthread_mutex_unlock.c (pthread_mutex_unlock): Similarly. + * ptw32_InterlockedCompareExchange.c (ptw32_InterlockExchange): New + function. + (PTW32_INTERLOCKED_EXCHANGE): Sets up macro to use inlined + ptw32_InterlockedExchange. + * implement.h (PTW32_INTERLOCKED_EXCHANGE): Set default to + InterlockedExchange(). + * Makefile: Building using /Ob2 so that asm sections within inline + functions are inlined. + +2004-10-08 Ross Johnson + + * pthread_mutex_destroy.c (pthread_mutex_destroy): Critical Section + element is no longer required. + * pthread_mutex_init.c (pthread_mutex_init): Likewise. + * pthread_mutex_lock.c (pthread_mutex_lock): New algorithm following + Drepper's paper at http://people.redhat.com/drepper/futex.pdf, but + using the existing semaphore in place of the futex described in the + paper. Idea suggested by Alexander Terekhov - see: + http://sources.redhat.com/ml/pthreads-win32/2003/msg00108.html + * pthread_mutex_timedlock.c pthread_mutex_timedlock(): Similarly. + * pthread_mutex_trylock.c (pthread_mutex_trylock): Similarly. + * pthread_mutex_unlock.c (pthread_mutex_unlock): Similarly. + * pthread_barrier_wait.c (pthread_barrier_wait): Use inlined version + of InterlockedCompareExchange() if possible - determined at + build-time. + * pthread_spin_destroy.c pthread_spin_destroy(): Likewise. + * pthread_spin_lock.c pthread_spin_lock():Likewise. + * pthread_spin_trylock.c (pthread_spin_trylock):Likewise. + * pthread_spin_unlock.c (pthread_spin_unlock):Likewise. + * ptw32_InterlockedCompareExchange.c: Sets up macro for inlined use. + * implement.h (pthread_mutex_t_): Remove Critical Section element. + (PTW32_INTERLOCKED_COMPARE_EXCHANGE): Set to default non-inlined + version of InterlockedCompareExchange(). + * private.c: Include ptw32_InterlockedCompareExchange.c first for + inlining. + * GNUmakefile: Add commandline option to use inlined + InterlockedCompareExchange(). + * Makefile: Likewise. + +2004-09-27 Ross Johnson + + * pthread_mutex_lock.c (pthread_mutex_lock): Separate + PTHREAD_MUTEX_NORMAL logic since we do not need to keep or check some + state required by other mutex types; do not check mutex pointer arg + for validity - leave this to the system since we are only checking + for NULL pointers. This should improve speed of NORMAL mutexes and + marginally improve speed of other type. + * pthread_mutex_trylock.c (pthread_mutex_trylock): Likewise. + * pthread_mutex_unlock.c (pthread_mutex_unlock): Likewise; also avoid + entering the critical section for the no-waiters case, with approx. + 30% reduction in lock/unlock overhead for this case. + * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise; also + no longer keeps mutex if post-timeout second attempt succeeds - this + will assist applications that wish to impose strict lock deadlines, + rather than simply to escape from frozen locks. + +2004-09-09 Tristan Savatier + * pthread.h (struct pthread_once_t_): Qualify the 'done' element + as 'volatile'. + * pthread_once.c: Concerned about possible race condition, + specifically on MPU systems re concurrent access to multibyte types. + [Maintainer's note: the race condition is harmless on SPU systems + and only a problem on MPU systems if concurrent access results in an + exception (presumably generated by a hardware interrupt). There are + other instances of similar harmless race conditions that have not + been identified as issues.] + +2004-09-09 Ross Johnson + + * pthread.h: Declare additional types as volatile. + +2004-08-27 Ross Johnson + + * pthread_barrier_wait.c (pthread_barrier_wait): Remove excessive code + by substituting the internal non-cancelable version of sem_wait + (ptw32_semwait). + +2004-08-25 Ross Johnson + + * pthread_join.c (pthread_join): Rewrite and re-order the conditional + tests in an attempt to improve efficiency and remove a race + condition. + +2004-08-23 Ross Johnson + + * create.c (pthread_create): Don't create a thread if the thread + id pointer location (first arg) is inaccessible. A memory + protection fault will result if the thread id arg isn't an accessible + location. This is consistent with GNU/Linux but different to + Solaris or MKS (and possibly others), which accept NULL as meaning + 'don't return the created thread's ID'. Applications that run + using pthreads-win32 will run on all other POSIX threads + implementations, at least w.r.t. this feature. + + It was decided not to copy the Solaris et al behaviour because, + although it would have simplified some application porting (but only + from Solaris to Windows), the feature is not technically necessary, + and the alternative segfault behaviour helps avoid buggy application + code. + +2004-07-01 Anuj Goyal + + * builddmc.bat: New; Windows bat file to build the library. + * config.h (__DMC__): Support for Digital Mars compiler. + * create.c (__DMC__): Likewise. + * pthread_exit.c (__DMC__): Likewise. + * pthread_join.c (__DMC__): Likewise. + * ptw32_threadDestroy.c (__DMC__): Likewise. + * ptw32_threadStart.c (__DMC__): Likewise. + * ptw32_throw.c (__DMC__): Likewise. + +2004-06-29 Anuj Goyal + + * pthread.h (__DMC__): Initial support for Digital Mars compiler. + +2004-06-29 Will Bryant + + * README.Borland: New; description of Borland changes. + * Bmakefile: New makefile for the Borland make utility. + * ptw32_InterlockedCompareExchange.c: + Add Borland compatible asm code. + +2004-06-26 Jason Bard + + * pthread.h (HAVE_STRUCT_TIMESPEC): If undefined, define it + to avoid timespec struct redefined errors elsewhere in an + application. + +2004-06-21 Ross Johnson + + * pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER): Mutex + initialiser added for compatibility with Linux threads and + others; currently not included in SUSV3. + * pthread.h (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER): Likewise. + * pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP): Likewise. + * pthread.h (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP): Likewise. + + * ptw32_mutex_check_need_init.c (ptw32_mutex_check_need_init): + Add new initialisers. + + * pthread_mutex_lock.c (pthread_mutex_lock): Check for new + initialisers. + * pthread_mutex_trylock.c (pthread_mutex_trylock): Likewise. + * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise. + * pthread_mutex_unlock.c (pthread_mutex_unlock): Likewise. + * pthread_mutex_destroy.c (pthread_mutex_destroy): Likewise. + +2004-05-20 Ross Johnson + + * README.NONPORTABLE: Document pthread_win32_test_features_np(). + * FAQ: Update various answers. + +2004-05-19 Ross Johnson + + * Makefile: Don't define _WIN32_WINNT on compiler command line. + * GNUmakefile: Likewise. + +2004-05-16 Ross Johnson + + * pthread_cancel.c (pthread_cancel): Adapted to use auto-detected + QueueUserAPCEx features at run-time. + (ptw32_RegisterCancelation): Drop in replacement for QueueUserAPCEx() + if it can't be used. Provides older style non-preemptive async + cancelation. + * pthread_win32_attach_detach_np.c (pthread_win32_attach_np): + Auto-detect quserex.dll and the availability of alertdrv.sys; + initialise and close on process attach/detach. + * global.c (ptw32_register_cancelation): Pointer to either + QueueUserAPCEx() or ptw32_RegisterCancelation() depending on + availability. QueueUserAPCEx makes pre-emptive async cancelation + possible. + * implement.h: Add definitions and prototypes related to QueueUserAPC. + +2004-05-16 Panagiotis E. Hadjidoukas + + * QueueUserAPCEx (separate contributed package): Provides preemptive + APC feature. + * pthread_cancel.c (pthread_cancel): Initial integration of + QueueUserAPCEx into pthreads-win32 to provide true pre-emptive + async cancelation of threads, including blocked threads. + +2004-05-06 Makoto Kato + + * pthread.h (DWORD_PTR): Define typedef for older MSVC. + * pthread_cancel.c (AMD64): Add architecture specific Context register. + * ptw32_getprocessors.c: Use correct types (DWORD_PTR) for mask + variables. + +2004-04-06 P. van Bruggen + + * ptw32_threadDestroy.c: Destroy threadLock mutex to + close a memory leak. + +2004-02-13 Gustav Hallberg + + * pthread_equal.c: Remove redundant equality logic. + +2003-12-10 Philippe Di Cristo + + * sem_timedwait.c (sem_timedwait): Fix timeout calculations. + +2003-10-20 Alexander Terekhov + + * pthread_mutex_timedlock.c (ptw32_semwait): Move to individual module. + * ptw32_semwait.c: New module. + * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Replace cancelable + sem_wait() call with non-cancelable ptw32_semwait() call. + * pthread.c (private.c): Re-order for inlining. GNU C warned that + function ptw32_semwait() was defined 'inline' after it was called. + * pthread_cond_signal.c (ptw32_cond_unblock): Likewise. + * pthread_delay_np.c: Disable Watcom warning with comment. + * *.c (process.h): Remove include from .c files. This is conditionally + included by the common project include files. + +2003-10-20 James Ewing + + * ptw32_getprocessors.c: Some Win32 environments don't have + GetProcessAffinityMask(), so always return CPU count = 1 for them. + * config.h (NEED_PROCESSOR_AFFINITY_MASK): Define for WinCE. + +2003-10-15 Ross Johnson + + * Re-indented all .c files using default GNU style to remove assorted + editor ugliness (used GNU indent utility in default style). + +2003-10-15 Alex Blanco + + * sem_init.c (sem_init): Would call CreateSemaphore even if the sema + struct calloc failed; was not freeing calloced memory if either + CreateSemaphore or CreateEvent failed. + +2003-10-14 Ross Johnson + + * pthread.h: Add Watcom compiler compatibility. Esssentially just add + the cdecl attribute to all exposed function prototypes so that Watcom + generates function call code compatible with non-Watcom built libraries. + By default, Watcom uses registers to pass function args if possible rather + than pushing to stack. + * semaphore.h: Likewise. + * sched.h: Likewise. + * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Define with cdecl attribute + for Watcom compatibility. This routine is called via pthread_cleanup_push so + it had to match function arg definition. + * Wmakefile: New makefile for Watcom builds. + +2003-09-14 Ross Johnson + + * pthread_setschedparam.c (pthread_setschedparam): Attempt to map + all priority levels between max and min (as returned by + sched_get_priority_min/max) to reasonable Win32 priority levels - i.e. + levels between THREAD_PRIORITY_LOWEST/IDLE to THREAD_PRIORITY_LOWEST and + between THREAD_PRIORITY_HIGHEST/TIME_CRITICAL to THREAD_PRIORITY_HIGHEST + while others remain unchanged; record specified thread priority level + for return by pthread_getschedparam. + + Note that, previously, specified levels not matching Win32 priority levels + would silently leave the current thread priority unaltered. + + * pthread_getschedparam.c (pthread_getschedparam): Return the priority + level specified by the latest pthread_setschedparam or pthread_create rather + than the actual running thread priority as returned by GetThreadPriority - as + required by POSIX. I.e. temporary or adjusted actual priority levels are not + returned by this routine. + + * pthread_create.c (pthread_create): For priority levels specified via + pthread attributes, attempt to map all priority levels between max and + min (as returned by sched_get_priority_min/max) to reasonable Win32 + priority levels; record priority level given via attributes, or + inherited from parent thread, for later return by pthread_getschedparam. + + * ptw32_new.c (ptw32_new): Initialise pthread_t_ sched_priority element. + + * pthread_self.c (pthread_self): Set newly created implicit POSIX thread + sched_priority to Win32 thread's current actual priority. Temporarily + altered priorities can't be avoided in this case. + + * implement.h (struct pthread_t_): Add new sched_priority element. + +2003-09-12 Ross Johnson + + * sched_get_priority_min.c (sched_get_priority_min): On error should return -1 + with errno set. + * sched_get_priority_max.c (sched_get_priority_max): Likewise. + +2003-09-03 Ross Johnson + + * w32_cancelableWait.c (ptw32_cancelable_wait): Allow cancelation + of implicit POSIX threads as well. + +2003-09-02 Ross Johnson + + * pthread_win32_attach_detach_np.c (pthread_win32_thread_detach_np): + Add comment. + + * pthread_exit.c (pthread_exit): Fix to recycle the POSIX thread handle in + addition to calling user TSD destructors. Move the implicit POSIX thread exit + handling to ptw32_throw to centralise the logic. + + * ptw32_throw.c (ptw32_throw): Implicit POSIX threads have no point + to jump or throw to, so cleanup and exit the thread here in this case. For + processes using the C runtime, the exit code will be set to the POSIX + reason for the throw (i.e. PTHREAD_CANCEL or the value given to pthread_exit). + Note that pthread_exit() already had similar logic, which has been moved to + here. + + * ptw32_threadDestroy.c (ptw32_threadDestroy): Don't close the Win32 handle + of implicit POSIX threads - expect this to be done by Win32? + +2003-09-01 Ross Johnson + + * pthread_self.c (pthread_self): The newly aquired pthread_t must be + assigned to the reuse stack, not freed, if the routine fails somehow. + +2003-08-13 Ross Johnson + + * pthread_getschedparam.c (pthread_getschedparam): An invalid thread ID + parameter was returning an incorrect error value; now uses a more exhaustive + check for validity. + + * pthread_setschedparam.c (pthread_setschedparam): Likewise. + + * pthread_join.c (pthread_join): Now uses a more exhaustive + check for validity. + + * pthread_detach.c (pthread_detach): Likewise. + + * pthread_cancel.c (pthread_cancel): Likewise. + + * ptw32_threadDestroy.c (ptw32_threadDestroy): pthread_t structs are + never freed - push them onto a stack for reuse. + + * ptw32_new.c (ptw32_new): Check for reusable pthread_t before dynamically + allocating new memory for the struct. + + * pthread_kill.c (pthread_kill): New file; new routine; takes only a zero + signal arg so that applications can check the thread arg for validity; checks + that the underlying Win32 thread HANDLE is valid. + + * pthread.h (pthread_kill): Add prototype. + + * ptw32_reuse.c (ptw32_threadReusePop): New file; new routine; pop a + pthread_t off the reuse stack. pthread_t_ structs that have been destroyed, i.e. + have exited detached or have been joined, are cleaned up and put onto a reuse + stack. Consequently, thread IDs are no longer freed once calloced. The library + will attempt to get a struct off this stack before asking the system to alloc + new memory when creating threads. The stack is guarded by a global mutex. + (ptw32_threadReusePush): New routine; push a pthread_t onto the reuse stack. + + * implement.h (ptw32_threadReusePush): Add new prototype. + (ptw32_threadReusePop): Likewise. + (pthread_t): Add new element. + + * ptw32_processTerminate.c (ptw32_processTerminate): Delete the thread + reuse lock; free all thread ID structs on the thread reuse stack. + + * ptw32_processInitialize.c (ptw32_processInitialize): Initialise the + thread reuse lock. + +2003-07-19 Ross Johnson + + * GNUmakefile: modified to work under MsysDTK environment. + * pthread_spin_lock.c (pthread_spin_lock): Check for NULL arg. + * pthread_spin_unlock.c (pthread_spin_unlock): Likewise. + * pthread_spin_trylock.c (pthread_spin_trylock): Likewise; + fix incorrect pointer value if lock is dynamically initialised by + this function. + * sem_init.c (sem_init): Initialise sem_t value to quell compiler warning. + * sem_destroy.c (sem_destroy): Likewise. + * ptw32_threadStart.c (non-MSVC code sections): Include rather + than old-style ; fix all std:: namespace entities such as + std::terminate_handler instances and associated methods. + * ptw32_callUserDestroyRoutines.c (non-MSVC code sections): Likewise. + +2003-06-24 Piet van Bruggen + + * pthread_spin_destroy.c (pthread_spin_destroy): Was not freeing the + spinlock struct. + +2003-06-22 Nicolas Barry + + * pthread_mutex_destroy.c (pthread_mutex_destroy): When called + with a recursive mutex that was locked by the current thread, the + function was failing with a success return code. + +2003-05-15 Steven Reddie + + * pthread_win32_attach_detach_np.c (pthread_win32_process_detach_np): + NULLify ptw32_selfThreadKey after the thread is destroyed, otherwise + destructors calling pthreads routines might resurrect it again, creating + memory leaks. Call the underlying Win32 Tls routine directly rather than + pthread_setspecific(). + (pthread_win32_thread_detach_np): Likewise. + +2003-05-14 Viv + + * pthread.dsp: Change /MT compile flag to /MD. + +2003-03-04 Alexander Terekhov + + * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Fix failure to + set ownership of mutex on second grab after abstime timeout. + - bug reported by Robert Strycek + +2002-12-17 Thomas Pfaff + + * pthread_mutex_lock.c (ptw32_semwait): New static routine to provide + a non-cancelable sem_wait() function. This is consistent with the + way that pthread_mutex_timedlock.c does it. + (pthread_mutex_lock): Use ptw32_semwait() instead of sem_wait(). + +2002-12-11 Thomas Pfaff + + * pthread_mutex_trylock.c: Should return EBUSY rather than EDEADLK. + * pthread_mutex_destroy.c: Remove redundant ownership test (the + trylock call does this for us); do not destroy a recursively locked + mutex. + +2002-09-20 Michael Johnson + + * pthread_cond_destroy.c (pthread_cond_destroy): + When two different threads exist, and one is attempting to + destroy a condition variable while the other is attempting to + initialize a condition variable that was created with + PTHREAD_COND_INITIALIZER, a deadlock can occur. Shrink + the ptw32_cond_list_lock critical section to fix it. + +2002-07-31 Ross Johnson + + * ptw32_threadStart.c (ptw32_threadStart): Thread cancelLock + destruction moved to ptw32_threadDestroy(). + + * ptw32_threadDestroy.c (ptw32_threadDestroy): Destroy + the thread's cancelLock. Moved here from ptw32_threadStart.c + to cleanup implicit threads as well. + +2002-07-30 Alexander Terekhov + + * pthread_cond_wait.c (ptw32_cond_wait_cleanup): + Remove code designed to avoid/prevent spurious wakeup + problems. It is believed that the sem_timedwait() call + is consuming a CV signal that it shouldn't and this is + breaking the avoidance logic. + +2002-07-30 Ross Johnson + + * sem_timedwait.c (sem_timedwait): Tighten checks for + unreasonable abstime values - that would result in + unexpected timeout values. + + * w32_CancelableWait.c (ptw32_cancelable_wait): + Tighten up return value checking and add comments. + + +2002-06-08 Ross Johnson + + * sem_getvalue.c (sem_getvalue): Now returns a value for the + NEED_SEM version (i.e. earlier versions of WinCE). + + +2002-06-04 Rob Fanner + + * sem_getvalue.c (sem_getvalue): The Johnson M. Hart + approach didn't work - we are forced to take an + intrusive approach. We try to decrement the sema + and then immediately release it again to get the + value. There is a small probability that this may + block other threads, but only momentarily. + +2002-06-03 Ross Johnson + + * sem_init.c (sem_init): Initialise Win32 semaphores + to _POSIX_SEM_VALUE_MAX (which this implementation + defines in pthread.h) so that sem_getvalue() can use + the trick described in the comments in sem_getvalue(). + * pthread.h (_POSIX_SEM_VALUE_MAX): Defined. + (_POSIX_SEM_NSEMS_MAX): Defined - not used but may be + useful for source code portability. + +2002-06-03 Rob Fanner + + * sem_getvalue.c (sem_getvalue): Did not work on NT. + Use approach suggested by Johnson M. Hart in his book + "Win32 System Programming". + +2002-02-28 Ross Johnson + + * errno.c: Compiler directive was incorrectly including code. + * pthread.h: Conditionally added some #defines from config.h + needed when not building the library. e.g. NEED_ERRNO, NEED_SEM. + (PTW32_DLLPORT): Now only defined if _DLL defined. + (_errno): Compiler directive was incorrectly including prototype. + * sched.h: Conditionally added some #defines from config.h + needed when not building the library. + * semaphore.h: Replace an instance of NEED_SEM that should + have been NEED_ERRNO. This change currently has nil effect. + + * GNUmakefile: Correct some recent changes. + + * Makefile: Add rule to generate pre-processor output. + +2002-02-23 Ross Johnson + + * pthread_rwlock_timedrdlock.c: New - untested. + * pthread_rwlock_timedwrlock.c: New - untested. + + * Testsuite passed (except known MSVC++ problems) + + * pthread_cond_destroy.c: Expand the time change + critical section to solve deadlock problem. + + * pthread.c: Add all remaining C modules. + * pthread.h: Use dllexport/dllimport attributes on functions + to avoid using pthread.def. + * sched.h: Likewise. + * semaphore.h: Likewise. + * GNUmakefile: Add new targets for single translation + unit build to maximise inlining potential; generate + pthread.def automatically. + * Makefile: Likewise, but no longer uses pthread.def. + +2002-02-20 Ross Johnson + + * pthread_cond_destroy.c (pthread_cond_destroy): + Enter the time change critical section earlier. + +2002-02-17 Ross Johnson + + * nonportable.c (pthread_delay_np): Make a true + cancelation point. Deferred cancels will interrupt the + wait. + +2002-02-07 Ross Johnson + + Reduced name space pollution. + ----------------------------- + When the appropriate symbols are defined, the headers + will restrict the definitions of new names. In particular, + it must be possible to NOT include the + header and related definitions with some combination + of symbol definitions. Secondly, it should be possible + that additional definitions should be limited to POSIX + compliant symbols by the definition of appropriate symbols. + + * pthread.h: POSIX conditionals. + * sched.h: POSIX conditionals. + * semaphore.h: POSIX conditionals. + + * semaphore.c: Included . + (sem_init): Changed magic 0x7FFFFFFFL to INT_MAX. + (sem_getvalue): Trial version. + + Reduce executable size. + ----------------------- + When linking with the static library, only those + routines actually called, either directly or indirectly + should be included. + + [Gcc has the -ffunction-segments option to do this but MSVC + doesn't have this feature as far as I can determine. Other + compilers are undetermined as well. - rpj] + + * semaphore.c: All routines are now in separate compilation units; + This file is used to congregate the separate modules for + potential inline optimisation and backward build compatibility. + * sem_close.c: Separated routine from semaphore.c. + * ptw32_decrease_semaphore.c: Likewise. + * sem_destroy.c: Likewise. + * sem_getvalue.c: Likewise. + * ptw32_increase_semaphore.c: Likewise. + * sem_init.c: Likewise. + * sem_open.c: Likewise. + * sem_post.c: Likewise. + * sem_post_multiple.c: Likewise. + * sem_timedwait.c: Likewise. + * sem_trywait.c: Likewise. + * sem_unlink.c: Likewise. + * sem_wait.c: Likewise. + +2002-02-04 Ross Johnson + + The following extends the idea above to the rest of pthreads-win32 - rpj + + * attr.c: All routines are now in separate compilation units; + This file is used to congregate the separate modules for + potential inline optimisation and backward build compatibility. + * pthread_attr_destroy.c: Separated routine from attr.c. + * pthread_attr_getdetachstate.c: Likewise. + * pthread_attr_getscope.c: Likewise. + * pthread_attr_getstackaddr.c: Likewise. + * pthread_attr_getstacksize.c: Likewise. + * pthread_attr_init.c: Likewise. + * pthread_attr_is_attr.c: Likewise. + * pthread_attr_setdetachstate.c: Likewise. + * pthread_attr_setscope.c: Likewise. + * pthread_attr_setstackaddr.c: Likewise. + * pthread_attr_setstacksize.c: Likewise. + + * pthread.c: Agregation of agregate modules for super-inlineability. + +2002-02-02 Ross Johnson + + * cancel.c: Rearranged some code and introduced checks + to disable cancelation at the start of a thread's cancelation + run to prevent double cancelation. The main problem + arises if a thread is canceling and then receives a subsequent + async cancel request. + * private.c: Likewise. + * condvar.c: Place pragmas around cleanup_push/pop to turn + off inline optimisation (/Obn where n>0 - MSVC only). Various + optimisation switches in MSVC turn this on, which interferes with + the way that cleanup handlers are run in C++ EH and SEH + code. Application code compiled with inline optimisation must + also wrap cleanup_push/pop blocks with the pragmas, e.g. + #pragma inline_depth(0) + pthread_cleanup_push(...) + ... + pthread_cleanup_pop(...) + #pragma inline_depth(8) + * rwlock.c: Likewise. + * mutex.c: Remove attempts to inline some functions. + * signal.c: Modify misleading comment. + +2002-02-01 Ross Johnson + + * semaphore.c (sem_trywait): Fix missing errno return + for systems that define NEED_SEM (e.g. early WinCE). + * mutex.c (pthread_mutex_timedlock): Return ENOTSUP + for systems that define NEED_SEM since they don't + have sem_trywait(). + +2002-01-27 Ross Johnson + + * mutex.c (pthread_mutex_timedlock): New function suggested by + Alexander Terekhov. The logic required to implement this + properly came from Alexander, with some collaboration + with Thomas Pfaff. + (pthread_mutex_unlock): Wrap the waiters check and sema + post in a critical section to prevent a race with + pthread_mutex_timedlock. + (ptw32_timed_semwait): New function; + returns a special result if the absolute timeout parameter + represents a time already passed when called; used by + pthread_mutex_timedwait(). Have deliberately not reused + the name "ptw32_sem_timedwait" because they are not the same + routine. + * condvar.c (ptw32_cond_timedwait): Use the new sem_timedwait() + instead of ptw32_sem_timedwait(), which now has a different + function. See previous. + * implement.h: Remove prototype for ptw32_sem_timedwait. + See next. + (pthread_mutex_t_): Add critical section element for access + to lock_idx during mutex post-timeout processing. + * semaphore.h (sem_timedwait): See next. + * semaphore.c (sem_timedwait): See next. + * private.c (ptw32_sem_timedwait): Move to semaphore.c + and rename as sem_timedwait(). + +2002-01-18 Ross Johnson + + * sync.c (pthread_join): Was getting the exit code from the + calling thread rather than the joined thread if + defined(__MINGW32__) && !defined(__MSVCRT__). + +2002-01-15 Ross Johnson + + * pthread.h: Unless the build explicitly defines __CLEANUP_SEH, + __CLEANUP_CXX, or __CLEANUP_C, then the build defaults to + __CLEANUP_C style cleanup. This style uses setjmp/longjmp + in the cancelation and thread exit implementations and therefore + won't do stack unwinding if linked to applications that have it + (e.g. C++ apps). This is currently consistent with most/all + commercial Unix POSIX threads implementations. + + * spin.c (pthread_spin_init): Edit renamed function call. + * nonportable.c (pthread_num_processors_np): New. + (pthread_getprocessors_np): Renamed to ptw32_getprocessors + and moved to private.c. + * private.c (pthread_getprocessors): Moved here from + nonportable.c. + * pthread.def (pthread_getprocessors_np): Removed + from export list. + + * rwlock.c (pthread_rwlockattr_init): New. + (pthread_rwlockattr_destroy): New. + (pthread_rwlockattr_getpshared): New. + (pthread_rwlockattr_setpshared): New. + +2002-01-14 Ross Johnson + + * attr.c (pthread_attr_setscope): Fix struct pointer + indirection error introduced 2002-01-04. + (pthread_attr_getscope): Likewise. + +2002-01-12 Ross Johnson + + * pthread.dsp (SOURCE): Add missing source files. + +2002-01-08 Ross Johnson + + * mutex.c (pthread_mutex_trylock): use + ptw32_interlocked_compare_exchange function pointer + rather than ptw32_InterlockedCompareExchange() directly + to retain portability to non-iX86 processors, + e.g. WinCE etc. The pointer will point to the native + OS version of InterlockedCompareExchange() if the + OS supports it (see ChangeLog entry of 2001-10-17). + +2002-01-07 Thomas Pfaff , Alexander Terekhov + + * mutex.c (pthread_mutex_init): Remove critical + section calls. + (pthread_mutex_destroy): Likewise. + (pthread_mutex_unlock): Likewise. + (pthread_mutex_trylock): Likewise; uses + ptw32_InterlockedCompareExchange() to avoid need for + critical section; library is no longer i386 compatible; + recursive mutexes now increment the lock count rather + than return EBUSY; errorcheck mutexes return EDEADLCK + rather than EBUSY. This behaviour is consistent with the + Solaris pthreads implementation. + * implement.h (pthread_mutex_t_): Remove critical + section element - no longer needed. + + +2002-01-04 Ross Johnson + + * attr.c (pthread_attr_setscope): Add more error + checking and actually store the scope value even + though it's not really necessary. + (pthread_attr_getscope): Return stored value. + * implement.h (pthread_attr_t_): Add new scope element. + * ANNOUNCE: Fix out of date comment next to + pthread_attr_setscope in conformance section. + +2001-12-21 Alexander Terekhov + + * mutex.c (pthread_mutex_lock): Decrementing lock_idx was + not thread-safe. + (pthread_mutex_trylock): Likewise. + +2001-10-26 prionx@juno.com + + * semaphore.c (sem_init): Fix typo and missing bracket + in conditionally compiled code. Only older versions of + WinCE require this code, hence it doesn't normally get + tested; somehow when sem_t reverted to an opaque struct + the calloc NULL check was left in the conditionally included + section. + (sem_destroy): Likewise, the calloced sem_t wasn't being freed. + +2001-10-25 Ross Johnson + + * GNUmakefile (libwsock32): Add to linker flags for + WSAGetLastError() and WSASetLastError(). + * Makefile (wsock32.lib): Likewise. + * create.c: Minor mostly inert changes. + * implement.h (PTW32_MAX): Move into here and renamed + from sched.h. + (PTW32_MIN): Likewise. + * GNUmakefile (TEST_ICE): Define if testing internal + implementation of InterlockedCompareExchange. + * Makefile (TEST_ICE): Likewise. + * private.c (TEST_ICE): Likewise. + +2001-10-24 Ross Johnson + + * attr.c (pthread_attr_setstacksize): Quell warning + from LCC by conditionally compiling the stacksize + validity check. LCC correctly warns that the condition + (stacksize < PTHREAD_STACK_MIN) is suspicious + because STACK_MIN is 0 and stacksize is of type + size_t (or unsigned int). + +2001-10-17 Ross Johnson + + * barrier.c: Move _LONG and _LPLONG defines into + implement.h; rename to PTW32_INTERLOCKED_LONG and + PTW32_INTERLOCKED_LPLONG respectively. + * spin.c: Likewise; ptw32_interlocked_compare_exchange used + in place of InterlockedCompareExchange directly. + * global.c (ptw32_interlocked_compare_exchange): Add + prototype for this new routine pointer to be used when + InterlockedCompareExchange isn't supported by Windows. + * nonportable.c (pthread_win32_process_attach_np): Check for + support of InterlockedCompareExchange in kernel32 and assign its + address to ptw32_interlocked_compare_exchange if it exists, or + our own ix86 specific implementation ptw32_InterlockedCompareExchange. + *private.c (ptw32_InterlockedCompareExchange): An + implementation of InterlockedCompareExchange() which is + specific to ix86; written directly in assembler for either + MSVC or GNU C; needed because Windows 95 doesn't support + InterlockedCompareExchange(). + + * sched.c (sched_get_priority_min): Extend to return + THREAD_PRIORITY_IDLE. + (sched_get_priority_max): Extend to return + THREAD_PRIORITY_CRITICAL. + +2001-10-15 Ross Johnson + + * spin.c (pthread_spin_lock): PTHREAD_SPINLOCK_INITIALIZER + was causing a program fault. + (pthread_spin_init): Could have alloced memory + without freeing under some error conditions. + + * mutex.c (pthread_mutex_init): Move memory + allocation of mutex struct after checking for + PROCESS_SHARED. + +2001-10-12 Ross Johnson + + * spin.c (pthread_spin_unlock): Was not returning + EPERM if the spinlock was not locked, for multi CPU + machines. + +2001-10-08 Ross Johnson + + * spin.c (pthread_spin_trylock): Was not returning + EBUSY for multi CPU machines. + +2001-08-24 Ross Johnson + + * condvar.c (pthread_cond_destroy): Remove cv element + that is no longer used. + * implement.h: Likewise. + +2001-08-23 Alexander Terekhov + + * condvar.c (pthread_cond_destroy): fix bug with + respect to deadlock in the case of concurrent + _destroy/_unblock; a condition variable can be destroyed + immediately after all the threads that are blocked on + it are awakened. + +2001-08-23 Phil Frisbie, Jr. + + * tsd.c (pthread_getspecific): Preserve the last + winsock error [from WSAGetLastError()]. + +2001-07-18 Scott McCaskill + + * mutex.c (pthread_mutexattr_init): Return ENOMEM + immediately and don't dereference the NULL pointer + if calloc fails. + (pthread_mutexattr_getpshared): Don't dereference + a pointer that is possibly NULL. + * barrier.c (pthread_barrierattr_init): Likewise + (pthread_barrierattr_getpshared): Don't dereference + a pointer that is possibly NULL. + * condvar.c (pthread_condattr_getpshared): Don't dereference + a pointer that is possibly NULL. + +2001-07-15 Ross Johnson + + * rwlock.c (pthread_rwlock_wrlock): Is allowed to be + a cancelation point; re-enable deferred cancelability + around the CV call. + +2001-07-10 Ross Johnson + + * barrier.c: Still more revamping. The exclusive access + mutex isn't really needed so it has been removed and replaced + by an InterlockedDecrement(). nSerial has been removed. + iStep is now dual-purpose. The process shared attribute + is now stored in the barrier struct. + * implement.h (pthread_barrier_t_): Lost some/gained one + elements. + * private.c (ptw32_threadStart): Removed some comments. + +2001-07-10 Ross Johnson + + * barrier.c: Revamped to fix the race condition. Two alternating + semaphores are used instead of the PulseEvent. Also improved + overall throughput by returning PTHREAD_BARRIER_SERIAL_THREAD + to the first waking thread. + * implement.h (pthread_barrier_t_): Revamped. + +2001-07-09 Ross Johnson + + * barrier.c: Fix several bugs in all routines. Now passes + tests/barrier5.c which is fairly rigorous. There is still + a non-optimal work-around for a race condition between + the barrier breeched event signal and event wait. Basically + the last (signalling) thread to hit the barrier yields + to allow any other threads, which may have lost the race, + to complete. + +2001-07-07 Ross Johnson + + * barrier.c: Changed synchronisation mechanism to a + Win32 manual reset Event and use PulseEvent to signal + waiting threads. If the implementation continued to use + a semaphore it would require a second semaphore and + some management to use them alternately as barriers. A + single semaphore allows threads to cascade from one barrier + through the next, leaving some threads blocked at the first. + * implement.h (pthread_barrier_t_): As per above. + * general: Made a number of other routines inlinable. + +2001-07-07 Ross Johnson + + * spin.c: Revamped and working; included static initialiser. + Now beta level. + * barrier.c: Likewise. + * condvar.c: Macro constant change; inline auto init routine. + * mutex.c: Likewise. + * rwlock.c: Likewise. + * private.c: Add support for spinlock initialiser. + * global.c: Likewise. + * implement.h: Likewise. + * pthread.h (PTHREAD_SPINLOCK_INITIALIZER): Fix typo. + +2001-07-05 Ross Johnson + + * barrier.c: Remove static initialisation - irrelevent + for this object. + * pthread.h (PTHREAD_BARRIER_INITIALIZER): Removed. + * rwlock.c (pthread_rwlock_wrlock): This routine is + not a cancelation point - disable deferred + cancelation around call to pthread_cond_wait(). + +2001-07-05 Ross Johnson + + * spin.c: New module implementing spin locks. + * barrier.c: New module implementing barriers. + * pthread.h (_POSIX_SPIN_LOCKS): defined. + (_POSIX_BARRIERS): Defined. + (pthread_spin_*): Defined. + (pthread_barrier*): Defined. + (PTHREAD_BARRIER_SERIAL_THREAD): Defined. + * implement.h (pthread_spinlock_t_): Defined. + (pthread_barrier_t_): Defined. + (pthread_barrierattr_t_): Defined. + + * mutex.c (pthread_mutex_lock): Return with the error + if an auto-initialiser initialisation fails. + + * nonportable.c (pthread_getprocessors_np): New; gets the + number of available processors for the current process. + +2001-07-03 Ross Johnson + + * pthread.h (_POSIX_READER_WRITER_LOCKS): Define it + if not already defined. + +2001-07-01 Alexander Terekhov + + * condvar.c: Fixed lost signal bug reported by Timur Aydin + (taydin@snet.net). + [RPJ (me) didn't translate the original algorithm + correctly.] + * semaphore.c: Added sem_post_multiple; this is a useful + routine, but it doesn't appear to be standard. For now it's + not an exported function. + +2001-06-25 Ross Johnson + + * create.c (pthread_create): Add priority inheritance + attributes. + * mutex.c (pthread_mutex_lock): Remove some overhead for + PTHREAD_MUTEX_NORMAL mutex types. Specifically, avoid + calling pthread_self() and pthread_equal() to check/set + the mutex owner. Introduce a new pseudo owner for this + type. Test results suggest increases in speed of up to + 90% for non-blocking locks. + This is the default type of mutex used internally by other + synchronising objects, ie. condition variables and + read-write locks. The test rwlock7.c shows about a + 30-35% speed increase over snapshot 2001-06-06. The + price of this is that the application developer + must ensure correct behaviour, or explicitly set the + mutex to a safer type such as PTHREAD_MUTEX_ERRORCHECK. + For example, PTHREAD_MUTEX_NORMAL (or PTHREAD_MUTEX_DEFAULT) + type mutexes will not return an error if a thread which is not + the owner calls pthread_mutex_unlock. The call will succeed + in unlocking the mutex if it is currently locked, but a + subsequent unlock by the true owner will then fail with EPERM. + This is however consistent with some other implementations. + (pthread_mutex_unlock): Likewise. + (pthread_mutex_trylock): Likewise. + (pthread_mutex_destroy): Likewise. + * attr.c (pthread_attr_init): PTHREAD_EXPLICIT_SCHED is the + default inheritance attribute; THREAD_PRIORITY_NORMAL is + the default priority for new threads. + * sched.c (pthread_attr_setschedpolicy): Added routine. + (pthread_attr_getschedpolicy): Added routine. + (pthread_attr_setinheritsched): Added routine. + (pthread_attr_getinheritsched): Added routine. + * pthread.h (sched_rr_set_interval): Added as a macro; + returns -1 with errno set to ENOSYS. + +2001-06-23 Ross Johnson + + *sched.c (pthread_attr_setschedparam): Add priority range + check. + (sched_setscheduler): New function; checks for a valid + pid and policy; checks for permission to set information + in the target process; expects pid to be a Win32 process ID, + not a process handle; the only scheduler policy allowed is + SCHED_OTHER. + (sched_getscheduler): Likewise, but checks for permission + to query. + * pthread.h (SCHED_*): Moved to sched.h as defined in the + POSIX standard. + * sched.h (SCHED_*): Moved from pthread.h. + (pid_t): Defined if necessary. + (sched_setscheduler): Defined. + (sched_getscheduler): Defined. + * pthread.def (sched_setscheduler): Exported. + (sched_getscheduler): Likewise. + +2001-06-23 Ralf Brese + + * create.c (pthread_create): Set thread priority from + thread attributes. + +2001-06-18 Ross Johnson + + * Made organisational-only changes to UWIN additions. + * dll.c (dllMain): Moved UWIN process attach code + to pthread_win32_process_attach_np(); moved + instance of pthread_count to global.c. + * global.c (pthread_count): Moved from dll.c. + * nonportable.c (pthread_win32_process_attach_np): + Moved _UWIN code to here from dll.c. + * implement.h (pthread_count): Define extern int. + * create.c (pthread_count): Remove extern int. + * private.c (pthread_count): Likewise. + * exit.c (pthread_count): Likewise. + +2001-06-18 David Korn + + * dll.c: Added changes necessary to work with UWIN. + * create.c: Likewise. + * pthread.h: Likewise. + * misc.c: Likewise. + * exit.c: Likewise. + * private.c: Likewise. + * implement.h: Likewise. + There is some room at the start of struct pthread_t_ + to implement the signal semantics in UWIN's posix.dll + although this is not yet complete. + * Nmakefile: Compatible with UWIN's Nmake utility. + * Nmakefile.tests: Likewise - for running the tests. + +2001-06-08 Ross Johnson + + * semaphore.h (sem_t): Fixed for compile and test. + * implement.h (sem_t_): Likewise. + * semaphore.c: Likewise. + * private.c (ptw32_sem_timedwait): Updated to use new + opaque sem_t. + +2001-06-06 Ross Johnson + + * semaphore.h (sem_t): Is now an opaque pointer; + moved actual definition to implement.h. + * implement.h (sem_t_): Move here from semaphore.h; + was the definition of sem_t. + * semaphore.c: Wherever necessary, changed use of sem + from that of a pointer to a pointer-pointer; added + extra checks for a valid sem_t; NULL sem_t when + it is destroyed; added extra checks when creating + and destroying sem_t elements in the NEED_SEM + code branches; changed from using a pthread_mutex_t + ((*sem)->mutex) to CRITICAL_SECTION ((*sem)->sem_lock_cs) + in NEED_SEM branches for access serialisation. + +2001-06-06 Ross Johnson + + * mutex.c (pthread_mutexattr_init): Remove + ptw32_mutex_default_kind. + +2001-06-05 Ross Johnson + + * nonportable.c (pthread_mutex_setdefaultkind_np): + Remove - should not have been included in the first place. + (pthread_mutex_getdefaultkind_np): Likewise. + * global.c (ptw32_mutex_default_kind): Likewise. + * mutex.c (pthread_mutex_init): Remove use of + ptw32_mutex_default_kind. + * pthread.h (pthread_mutex_setdefaultkind_np): Likewise. + (pthread_mutex_getdefaultkind_np): Likewise. + * pthread.def (pthread_mutexattr_setkind_np): Added. + (pthread_mutexattr_getkind_np): Likewise. + + * README: Many changes that should have gone in before + the last snapshot. + * README.NONPORTABLE: New - referred to by ANNOUNCE + but never created; documents the non-portable routines + included in the library - moved from README with new + routines added. + * ANNOUNCE (pthread_mutexattr_setkind_np): Added to + compliance list. + (pthread_mutexattr_getkind_np): Likewise. + +2001-06-04 Ross Johnson + + * condvar.c: Add original description of the algorithm as + developed by Terekhov and Thomas, plus reference to + README.CV. + +2001-06-03 Alexander Terekhov , Louis Thomas + + * condvar.c (pthread_cond_init): Completely revamped. + (pthread_cond_destroy): Likewise. + (ptw32_cond_wait_cleanup): Likewise. + (ptw32_cond_timedwait): Likewise. + (ptw32_cond_unblock): New general signaling routine. + (pthread_cond_signal): Now calls ptw32_cond_unblock. + (pthread_cond_broadcast): Likewise. + * implement.h (pthread_cond_t_): Revamped. + * README.CV: New; explanation of the above changes. + +2001-05-30 Ross Johnson + + * pthread.h (rand_r): Fake using _seed argument to quell + compiler warning (compiler should optimise this away later). + + * GNUmakefile (OPT): Leave symbolic information out of the library + and increase optimisation level - for smaller faster prebuilt + dlls. + +2001-05-29 Milan Gardian + + * Makefile: fix typo. + * pthreads.h: Fix problems with stdcall/cdecl conventions, in particular + remove the need for PT_STDCALL everywhere; remove warning supression. + * (errno): Fix the longstanding "inconsistent dll linkage" problem + with errno; now also works with /MD debugging libs - + warnings emerged when compiling pthreads library with /MD (or /MDd) + compiler switch, instead of /MT (or /MTd) (i.e. when compiling pthreads + using Multithreaded DLL CRT instead of Multithreaded statically linked + CRT). + * create.c (pthread_create): Likewise; fix typo. + * private.c (ptw32_threadStart): Eliminate use of terminate() which doesn't + throw exceptions. + * Remove unnecessary #includes from a number of modules - + [I had to #include malloc.h in implement.h for gcc - rpj]. + +2001-05-29 Thomas Pfaff + + * pthread.h (PTHREAD_MUTEX_DEFAULT): New; equivalent to + PTHREAD_MUTEX_DEFAULT_NP. + * (PTHREAD_MUTEX_NORMAL): Similarly. + * (PTHREAD_MUTEX_ERRORCHECK): Similarly. + * (PTHREAD_MUTEX_RECURSIVE): Similarly. + * (pthread_mutex_setdefaultkind_np): New; Linux compatibility stub + for pthread_mutexattr_settype. + * (pthread_mutexattr_getkind_np): New; Linux compatibility stub + for pthread_mutexattr_gettype. + * mutex.c (pthread_mutexattr_settype): New; allow + the following types of mutex: + PTHREAD_MUTEX_DEFAULT_NP + PTHREAD_MUTEX_NORMAL_NP + PTHREAD_MUTEX_ERRORCHECK_NP + PTHREAD_MUTEX_RECURSIVE_NP + * Note that PTHREAD_MUTEX_DEFAULT is equivalent to + PTHREAD_MUTEX_NORMAL - ie. mutexes should no longer + be recursive by default, and a thread will deadlock if it + tries to relock a mutex it already owns. This is inline with + other pthreads implementations. + * (pthread_mutex_lock): Process the lock request + according to the mutex type. + * (pthread_mutex_init): Eliminate use of Win32 mutexes as the + basis of POSIX mutexes - instead, a combination of one critical section + and one semaphore are used in conjunction with Win32 Interlocked* routines. + * (pthread_mutex_destroy): Likewise. + * (pthread_mutex_lock): Likewise. + * (pthread_mutex_trylock): Likewise. + * (pthread_mutex_unlock): Likewise. + * Use longjmp/setjmp to implement cancelation when building the library + using a C compiler which doesn't support exceptions, e.g. gcc -x c (note + that gcc -x c++ uses exceptions). + * Also fixed some of the same typos and eliminated PT_STDCALL as + Milan Gardian's patches above. + +2001-02-07 Alexander Terekhov + + * rwlock.c: Revamped. + * implement.h (pthread_rwlock_t_): Redefined. + This implementation does not have reader/writer starvation problem. + Rwlock attempts to behave more like a normal mutex with + races and scheduling policy determining who is more important; + It also supports recursive locking, + has less synchronization overhead (no broadcasts at all, + readers are not blocked on any condition variable) and seem to + be faster than the current implementation [W98 appears to be + approximately 15 percent faster at least - on top of speed increase + from Thomas Pfaff's changes to mutex.c - rpj]. + +2000-12-29 Ross Johnson + + * Makefile: Back-out "for" loops which don't work. + + * GNUmakefile: Remove the fake.a target; add the "realclean" + target; don't remove built libs under the "clean" target. + + * config.h: Add a guard against multiple inclusion. + + * semaphore.h: Add some defines from config.h to make + semaphore.h independent of config.h when building apps. + + * pthread.h (_errno): Back-out previous fix until we know how to + fix it properly. + + * implement.h (lockCount): Add missing element to pthread_mutex_t_. + + * sync.c (pthread_join): Spelling fix in comment. + + * private.c (ptw32_threadStart): Reset original termination + function (C++). + (ptw32_threadStart): Cleanup detached threads early in case + the library is statically linked. + (ptw32_callUserDestroyRoutines): Remove [SEH] __try block from + destructor call so that unhandled exceptions will be passed through + to the system; call terminate() from [C++] try block for the same + reason. + + * tsd.c (pthread_getspecific): Add comment. + + * mutex.c (pthread_mutex_init): Initialise new elements in + pthread_mutex_t. + (pthread_mutex_unlock): Invert "pthread_equal()" test. + +2000-12-28 Ross Johnson + + * semaphore.c (mode_t): Use ifndef HAVE_MODE_T to include definition. + + * config.h.in (HAVE_MODE_T): Added. + (_UWIN): Start adding defines for the UWIN package. + + * private.c (ptw32_threadStart): Unhandled exceptions are + now passed through to the system to deal with. This is consistent + with normal Windows behaviour. C++ applications may use + set_terminate() to override the default behaviour which is + to call ptw32_terminate(). Ptw32_terminate() cleans up some + POSIX thread stuff before calling the system default function + which calls abort(). The users termination function should conform + to standard C++ semantics which is to not return. It should + exit the thread (call pthread_exit()) or exit the application. + * private.c (ptw32_terminate): Added as the default set_terminate() + function. It calls the system default function after cleaning up + some POSIX thread stuff. + + * implement.h (ptw32_try_enter_critical_section): Move + declaration. + * global.c (ptw32_try_enter_critical_section): Moved + from dll.c. + * dll.c: Move process and thread attach/detach code into + functions in nonportable.c. + * nonportable.c (pthread_win32_process_attach_np): Process + attach code from dll.c is now available to static linked + applications. + * nonportable.c (pthread_win32_process_detach_np): Likewise. + * nonportable.c (pthread_win32_thread_attach_np): Likewise. + * nonportable.c (pthread_win32_thread_detach_np): Likewise. + + * pthread.h: Add new non-portable prototypes for static + linked applications. + + * GNUmakefile (OPT): Increase optimisation flag and remove + debug info flag. + + * pthread.def: Add new non-portable exports for static + linked applications. + +2000-12-11 Ross Johnson + + * FAQ: Update Answer 6 re getting a fully working + Mingw32 built library. + +2000-10-10 Steven Reddie + + * misc.c (pthread_self): Restore Win32 "last error" + cleared by TlsGetValue() call in + pthread_getspecific() + +2000-09-20 Arthur Kantor + + * mutex.c (pthread_mutex_lock): Record the owner + of the mutex. This requires also keeping count of + recursive locks ourselves rather than leaving it + to Win32 since we need to know when to NULL the + thread owner when the mutex is unlocked. + (pthread_mutex_trylock): Likewise. + (pthread_mutex_unlock): Check that the calling + thread owns the mutex, decrement the recursive + lock count, and NULL the owner if zero. Return + EPERM if the mutex is owned by another thread. + * implement.h (pthread_mutex_t_): Add ownerThread + and lockCount members. + +2000-09-13 Jef Gearhart + + * mutex.c (pthread_mutex_init): Call + TryEnterCriticalSection through the pointer + rather than directly so that the dll can load + on Windows versions that can't resolve the + function, eg. Windows 95 + +2000-09-09 Ross Johnson + + * pthread.h (ctime_r): Fix arg. + +2000-09-08 Ross Johnson + + * GNUmakefile(_WIN32_WINNT=0x400): Define in CFLAGS; + doesn't seem to be needed though. + + * cancel.c (pthread_cancel): Must get "self" through + calling pthread_self() which will ensure a POSIX thread + struct is built for non-POSIX threads; return an error + if this fails + - Ollie Leahy + (pthread_setcancelstate): Likewise. + (pthread_setcanceltype): Likewise. + * misc.c (ptw32_cancelable_wait): Likewise. + + * private.c (ptw32_tkAssocCreate): Remove unused #if 0 + wrapped code. + + * pthread.h (ptw32_get_exception_services_code): + Needed to be forward declared unconditionally. + +2000-09-06 Ross Johnson + + * cancel.c (pthread_cancel): If called from the main + thread "self" would be NULL; get "self" via pthread_self() + instead of directly from TLS so that an implicit + pthread object is created. + + * misc.c (pthread_equal): Strengthen test for NULLs. + +2000-09-02 Ross Johnson + + * condvar.c (ptw32_cond_wait_cleanup): Ensure that all + waking threads check if they are the last, and notify + the broadcaster if so - even if an error occurs in the + waiter. + + * semaphore.c (_decrease_semaphore): Should be + a call to ptw32_decrease_semaphore. + (_increase_semaphore): Should be a call to + ptw32_increase_semaphore. + + * misc.c (ptw32_cancelable_wait): Renamed from + CancelableWait. + * rwlock.c (_rwlock_check*): Renamed to + ptw32_rwlock_check*. + * mutex.c (_mutex_check*): Renamed to ptw32_mutex_check*. + * condvar.c (cond_timed*): Renamed to ptw32_cond_timed*. + (_cond_check*): Renamed to ptw32_cond_check*. + (cond_wait_cleanup*): Rename to ptw32_cond_wait_cleanup*. + (ptw32_cond_timedwait): Add comments. + +2000-08-22 Ross Johnson + + * private.c (ptw32_throw): Fix exception test; + move exceptionInformation declaration. + + * tsd.c (pthread_key_create): newkey wrongly declared. + + * pthread.h: Fix comment block. + +2000-08-18 Ross Johnson + + * mutex.c (pthread_mutex_destroy): Check that the mutex isn't + held; invalidate the mutex as early as possible to avoid + contention; not perfect - FIXME! + + * rwlock.c (pthread_rwlock_init): Remove redundant assignment + to "rw". + (pthread_rwlock_destroy): Invalidate the rwlock before + freeing up any of it's resources - to avoid contention. + + * private.c (ptw32_tkAssocCreate): Change assoc->lock + to use a dynamically initialised mutex - only consumes + a W32 mutex or critical section when first used, + not before. + + * mutex.c (pthread_mutex_init): Remove redundant assignment + to "mx". + (pthread_mutexattr_destroy): Set attribute to NULL + before freeing it's memory - to avoid contention. + + * implement.h (PTW32_EPS_CANCEL/PTW32_EPS_EXIT): + Must be defined for all compilers - used as generic + exception selectors by ptw32_throw(). + + * Several: Fix typos from scripted edit session + yesterday. + + * nonportable.c (pthread_mutexattr_setforcecs_np): + Moved this function from mutex.c. + (pthread_getw32threadhandle_np): New function to + return the win32 thread handle that the POSIX + thread is using. + * mutex.c (pthread_mutexattr_setforcecs_np): + Moved to new file "nonportable.c". + + * pthread.h (PTW32_BUILD): Only redefine __except + and catch compiler keywords if we aren't building + the library (ie. PTW32_BUILD is not defined) - + this is safer than defining and then undefining + if not building the library. + * implement.h: Remove __except and catch undefines. + * Makefile (CFLAGS): Define PTW32_BUILD. + * GNUmakefile (CFLAGS): Define PTW32_BUILD. + + * All appropriate: Change Pthread_exception* to + ptw32_exception* to be consistent with internal + identifier naming. + + * private.c (ptw32_throw): New function to provide + a generic exception throw for all internal + exceptions and EH schemes. + (ptw32_threadStart): pthread_exit() value is now + returned via the thread structure exitStatus + element. + * exit.c (pthread_exit): pthread_exit() value is now + returned via the thread structure exitStatus + element. + * cancel.c (ptw32_cancel_self): Now uses ptw32_throw. + (pthread_setcancelstate): Ditto. + (pthread_setcanceltype): Ditto. + (pthread_testcancel): Ditto. + (pthread_cancel): Ditto. + * misc.c (CancelableWait): Ditto. + * exit.c (pthread_exit): Ditto. + * All applicable: Change PTW32_ prefix to + PTW32_ prefix to remove leading underscores + from private library identifiers. + +2000-08-17 Ross Johnson + + * All applicable: Change _pthread_ prefix to + ptw32_ prefix to remove leading underscores + from private library identifiers (single + and double leading underscores are reserved in the + ANSI C standard for compiler implementations). + + * tsd.c (pthread_create_key): Initialise temporary + key before returning it's address to avoid race + conditions. + +2000-08-13 Ross Johnson + + * errno.c: Add _MD precompile condition; thus far + had no effect when using /MD compile option but I + thnk it should be there. + + * exit.c: Add __cplusplus to various #if lines; + was compiling SEH code even when VC++ had + C++ compile options. + + * private.c: ditto. + + * create.c (pthread_create): Add PT_STDCALL macro to + function pointer arg in _beginthread(). + + * pthread.h: PT_STDCALL really does need to be defined + in both this and impliment.h; don't set it to __cdecl + - this macro is only used to extend function pointer + casting for functions that will be passed as parameters. + (~PThreadCleanup): add cast and group expression. + (_errno): Add _MD compile conditional. + (PtW32NoCatchWarn): Change pragma message. + + * implement.h: Move and change PT_STDCALL define. + + * need_errno.h: Add _MD to compilation conditional. + + * GNUmakefile: Substantial rewrite for new naming + convention; set for nil optimisation (turn it up + when we have a working library build; add target + "fake.a" to build a libpthreadw32.a from the VC++ + built DLL pthreadVCE.dll. + + * pthread.def (LIBRARY): Don't specify in the .def + file - it is specified on the linker command line + since we now use the same .def file for variously + named .dlls. + + * Makefile: Substantial rewrite for new naming + convention; default nmake target only issues a + help message; run nmake with specific target + corresponding to the EH scheme being used. + + * README: Update information; add naming convention + explanation. + + * ANNOUNCE: Update information. + +2000-08-12 Ross Johnson + + * pthread.h: Add compile-time message when using + MSC_VER compiler and C++ EH to warn application + programmers to use PtW32Catch instead of catch(...) + if they want cancelation and pthread_exit to work. + + * implement.h: Remove #include ; we + use our own local semaphore.h. + +2000-08-10 Ross Johnson + + * cleanup.c (pthread_pop_cleanup): Remove _pthread + prefix from __except and catch keywords; implement.h + now simply undefines ptw32__except and + ptw32_catch if defined; VC++ was not textually + substituting ptw32_catch etc back to catch as + it was redefined; the reason for using the prefixed + version was to make it clear that it was not using + the pthread.h redefined catch keyword. + + * private.c (ptw32_threadStart): Ditto. + (ptw32_callUserDestroyRoutines): Ditto. + + * implement.h (ptw32__except): Remove #define. + (ptw32_catch): Remove #define. + + * GNUmakefile (pthread.a): New target to build + libpthread32.a from pthread.dll using dlltool. + + * buildlib.bat: Duplicate cl commands with args to + build C++ EH version of pthread.dll; use of .bat + files is redundant now that nmake compatible + Makefile is included; used as a kludge only now. + + * Makefile: Localise some macros and fix up the clean: + target to extend it and work properly. + + * CONTRIBUTORS: Add contributors. + + * ANNOUNCE: Updated. + + * README: Updated. + +2000-08-06 Ross Johnson + + * pthread.h: Remove #warning - VC++ doesn't accept it. + +2000-08-05 Ross Johnson + + * pthread.h (PtW32CatchAll): Add macro. When compiling + applications using VC++ with C++ EH rather than SEH + 'PtW32CatchAll' must be used in place of any 'catch( ... )' + if the application wants pthread cancelation or + pthread_exit() to work. + +2000-08-03 Ross Johnson + + * pthread.h: Add a base class ptw32_exception for + library internal exceptions and change the "catch" + re-define macro to use it. + +2000-08-02 Ross Johnson + + * GNUmakefile (CFLAGS): Add -mthreads. + Add new targets to generate cpp and asm output. + + * sync.c (pthread_join): Remove dead code. + +2000-07-25 Tristan Savatier + + * sched.c (sched_get_priority_max): Handle different WinCE and + Win32 priority values together. + (sched_get_priority_min): Ditto. + +2000-07-25 Ross Johnson + + * create.c (pthread_create): Force new threads to wait until + pthread_create has the new thread's handle; we also retain + a local copy of the handle for internal use until + pthread_create returns. + + * private.c (ptw32_threadStart): Initialise ei[]. + (ptw32_threadStart): When beginthread is used to start the + thread, force waiting until the creator thread had the + thread handle. + + * cancel.c (ptw32_cancel_thread): Include context switch + code for defined(_X86_) environments in addition to _M_IX86. + + * rwlock.c (pthread_rwlock_destroy): Assignment changed + to avoid compiler warning. + + * private.c (ptw32_get_exception_services_code): Cast + NULL return value to avoid compiler warning. + + * cleanup.c (pthread_pop_cleanup): Initialise "cleanup" variable + to avoid compiler warnings. + + * misc.c (ptw32_new): Change "new" variable to "t" to avoid + confusion with the C++ keyword of the same name. + + * condvar.c (cond_wait_cleanup): Initialise lastWaiter variable. + (cond_timedwait): Remove unused local variables. to avoid + compiler warnings. + + * dll.c (dllMain): Remove 2000-07-21 change - problem + appears to be in pthread_create(). + +2000-07-22 Ross Johnson + + * tsd.c (pthread_key_create): If a destructor was given + and the pthread_mutex_init failed, then would try to + reference a NULL pointer (*key); eliminate this section of + code by using a dynamically initialised mutex + (PTHREAD_MUTEX_INITIALIZER). + + * tsd.c (pthread_setspecific): Return an error if + unable to set the value; simplify cryptic conditional. + + * tsd.c (pthread_key_delete): Locking threadsLock relied + on mutex_lock returning an error if the key has no destructor. + ThreadsLock is only initialised if the key has a destructor. + Making this mutex a static could reduce the number of mutexes + used by an application since it is actually created only at + first use and it's often destroyed soon after. + +2000-07-22 Ross Johnson + + * FAQ: Added Q5 and Q6. + +2000-07-21 David Baggett + + * dll.c: Include resource leakage work-around. This is a + partial FIXME which doesn't stop all leakage. The real + problem needs to be found and fixed. + +2000-07-21 Ross Johnson + + * create.c (pthread_create): Set threadH to 0 (zero) + everywhere. Some assignments were using NULL. Maybe + it should be NULL everywhere - need to check. (I know + they are nearly always the same thing - but not by + definition.) + + * misc.c (pthread_self): Try to catch NULL thread handles + at the point where they might be generated, even though + they should always be valid at this point. + + * tsd.c (pthread_setspecific): return an error value if + pthread_self() returns NULL. + + * sync.c (pthread_join): return an error value if + pthread_self() returns NULL. + + * signal.c (pthread_sigmask): return an error value if + pthread_self() returns NULL. + +2000-03-02 Ross Johnson + + * attr.c (pthread_attr_init): Set default stacksize to zero (0) + rather than PTHREAD_STACK_MIN even though these are now the same. + + * pthread.h (PTHREAD_STACK_MIN): Lowered to 0. + +2000-01-28 Ross Johnson + + * mutex.c (pthread_mutex_init): Free mutex if it has been alloced; + if critical sections can be used instead of Win32 mutexes, test + that the critical section works and return an error if not. + +2000-01-07 Ross Johnson + + * cleanup.c (pthread_pop_cleanup): Include SEH code only if MSC is not + compiling as C++. + (pthread_push_cleanup): Include SEH code only if MSC is not + compiling as C++. + + * pthread.h: Include SEH code only if MSC is not + compiling as C++. + + * implement.h: Include SEH code only if MSC is not + compiling as C++. + + * cancel.c (ptw32_cancel_thread): Add _M_IX86 check. + (pthread_testcancel): Include SEH code only if MSC is not + compiling as C++. + (ptw32_cancel_self): Include SEH code only if MSC is not + compiling as C++. + +2000-01-06 Erik Hensema + + * Makefile: Remove inconsistencies in 'cl' args + +2000-01-04 Ross Johnson + + * private.c (ptw32_get_exception_services_code): New; returns + value of EXCEPTION_PTW32_SERVICES. + (ptw32_processInitialize): Remove initialisation of + ptw32_exception_services which is no longer needed. + + * pthread.h (ptw32_exception_services): Remove extern. + (ptw32_get_exception_services_code): Add function prototype; + use this to return EXCEPTION_PTW32_SERVICES value instead of + using the ptw32_exception_services variable which I had + trouble exporting through pthread.def. + + * global.c (ptw32_exception_services): Remove declaration. + +1999-11-22 Ross Johnson + + * implement.h: Forward declare ptw32_new(); + + * misc.c (ptw32_new): New; alloc and initialise a new pthread_t. + (pthread_self): New thread struct is generated by new routine + ptw32_new(). + + * create.c (pthread_create): New thread struct is generated + by new routine ptw32_new(). + +1999-11-21 Ross Johnson + + * global.c (ptw32_exception_services): Declare new variable. + + * private.c (ptw32_threadStart): Destroy thread's + cancelLock mutex; make 'catch' and '__except' usageimmune to + redfinitions in pthread.h. + (ptw32_processInitialize): Init new constant ptw32_exception_services. + + * create.c (pthread_create): Initialise thread's cancelLock + mutex. + + * cleanup.c (pthread_pop_cleanup): Make 'catch' and '__except' + usage immune to redfinition s in pthread.h. + + * private.c: Ditto. + + * pthread.h (catch): Redefine 'catch' so that C++ applications + won't catch our internal exceptions. + (__except): ditto for __except. + + * implement.h (ptw32_catch): Define internal version + of 'catch' because 'catch' is redefined by pthread.h. + (__except): ditto for __except. + (struct pthread_t_): Add cancelLock mutex for async cancel + safety. + +1999-11-21 Jason Nye , Erik Hensema + + * cancel.c (ptw32_cancel_self): New; part of the async + cancellation implementation. + (ptw32_cancel_thread): Ditto; this function is X86 + processor specific. + (pthread_setcancelstate): Add check for pending async + cancel request and cancel the calling thread if + required; add async-cancel safety lock. + (pthread_setcanceltype): Ditto. + +1999-11-13 Erik Hensema + + * configure.in (AC_OUTPUT): Put generated output into GNUmakefile + rather than Makefile. Makefile will become the MSC nmake compatible + version + +1999-11-13 John Bossom (John.Bossom@cognos.com> + + * misc.c (pthread_self): Add a note about GetCurrentThread + returning a pseudo-handle + +1999-11-10 Todd Owen + + * dll.c (dllMain): Free kernel32 ASAP. + If TryEnterCriticalSection is not being used, then free + the kernel32.dll handle now, rather than leaving it until + DLL_PROCESS_DETACH. + + Note: this is not a pedantic exercise in freeing unused + resources! It is a work-around for a bug in Windows 95 + (see microsoft knowledge base article, Q187684) which + does Bad Things when FreeLibrary is called within + the DLL_PROCESS_DETACH code, in certain situations. + Since w95 just happens to be a platform which does not + provide TryEnterCriticalSection, the bug will be + effortlessly avoided. + +1999-11-10 Ross Johnson + + * sync.c (pthread_join): Make it a deferred cancelation point. + + * misc.c (pthread_self): Explicitly initialise implicitly + created thread state to default values. + +1999-11-05 Tristan Savatier + + * pthread.h (winsock.h): Include unconditionally. + (ETIMEDOUT): Change fallback value to that defined by winsock.h. + + * general: Patched for portability to WinCE. The details are + described in the file WinCE-PORT. Follow the instructions + in README.WinCE to make the appropriate changes in config.h. + +1999-10-30 Erik Hensema + + * create.c (pthread_create): Explicitly initialise thread state to + default values. + + * cancel.c (pthread_setcancelstate): Check for NULL 'oldstate' + for compatibility with Solaris pthreads; + (pthread_setcanceltype): ditto: + +1999-10-23 Erik Hensema + + * pthread.h (ctime_r): Fix incorrect argument "_tm" + +1999-10-21 Aurelio Medina + + * pthread.h (_POSIX_THREADS): Only define it if it isn't + already defined. Projects may need to define this on + the CC command line under Win32 as it doesn't have unistd.h + +1999-10-17 Ross Johnson + + * rwlock.c (pthread_rwlock_destroy): Add cast to remove compile + warning. + + * condvar.c (pthread_cond_broadcast): Only release semaphores + if there are waiting threads. + +1999-10-15 Lorin Hochstein , Peter Slacik + + * condvar.c (cond_wait_cleanup): New static cleanup handler for + cond_timedwait; + (cond_timedwait): pthread_cleanup_push args changed; + canceling a thread while it's in pthread_cond_wait + will now decrement the waiters count and cleanup if it's the + last waiter. + +1999-10-15 Graham Dumpleton + + * condvar.c (cond_wait_cleanup): the last waiter will now reset the CV's + wasBroadcast flag + +Thu Sep 16 1999 Ross Johnson + + * rwlock.c (pthread_rwlock_destroy): Add serialisation. + (_rwlock_check_need_init): Check for detroyed rwlock. + * rwlock.c: Check return codes from _rwlock_check_need_init(); + modify comments; serialise access to rwlock objects during + operations; rename rw_mutex to rw_lock. + * implement.h: Rename rw_mutex to rw_lock. + * mutex.c (pthread_mutex_destroy): Add serialisation. + (_mutex_check_need_init): Check for detroyed mutex. + * condvar.c (pthread_cond_destroy): Add serialisation. + (_cond_check_need_init): Check for detroyed condvar. + * mutex.c: Modify comments. + * condvar.c: Modify comments. + +1999-08-10 Aurelio Medina + + * implement.h (pthread_rwlock_t_): Add. + * pthread.h (pthread_rwlock_t): Add. + (PTHREAD_RWLOCK_INITIALIZER): Add. + Add rwlock function prototypes. + * rwlock.c: New module. + * pthread.def: Add new rwlock functions. + * private.c (ptw32_processInitialize): initialise + ptw32_rwlock_test_init_lock critical section. + * global.c (ptw32_rwlock_test_init_lock): Add. + + * mutex.c (pthread_mutex_destroy): Don't free mutex memory + if mutex is PTHREAD_MUTEX_INITIALIZER and has not been + initialised yet. + +1999-08-08 Milan Gardian + + * mutex.c (pthread_mutex_destroy): Free mutex memory. + +1999-08-22 Ross Johnson + + * exit.c (pthread_exit): Fix reference to potentially + uninitialised pointer. + +1999-08-21 Ross Johnson + + * private.c (ptw32_threadStart): Apply fix of 1999-08-19 + this time to C++ and non-trapped C versions. Ommitted to + do this the first time through. + +1999-08-19 Ross Johnson + + * private.c (ptw32_threadStart): Return exit status from + the application thread startup routine. + - Milan Gardian + +1999-08-18 John Bossom + + * exit.c (pthread_exit): Put status into pthread_t->exitStatus + * private.c (ptw32_threadStart): Set pthread->exitStatus + on exit of try{} block. + * sync.c (pthread_join): use pthread_exitStatus value if the + thread exit doesn't return a value (for Mingw32 CRTDLL + which uses endthread instead of _endthreadex). + +Tue Aug 17 20:17:58 CDT 1999 Mumit Khan + + * create.c (pthread_create): Add CRTDLL suppport. + * exit.c (pthread_exit): Likewise. + * private.c (ptw32_threadStart): Likewise. + (ptw32_threadDestroy): Likewise. + * sync.c (pthread_join): Likewise. + * tests/join1.c (main): Warn about partial support for CRTDLL. + +Tue Aug 17 20:00:08 1999 Mumit Khan + + * Makefile.in (LD): Delete entry point. + * acconfig.h (STDCALL): Delete unused macro. + * configure.in: Remove test for STDCALL. + * config.h.in: Regenerate. + * errno.c (_errno): Fix self type. + * pthread.h (PT_STDCALL): Move from here to + * implement.h (PT_STDCALL): here. + (ptw32_threadStart): Fix prototype. + * private.c (ptw32_threadStart): Likewise. + +1999-08-14 Ross Johnson + + * exit.c (pthread_exit): Don't call pthread_self() but + get thread handle directly from TSD for efficiency. + +1999-08-12 Ross Johnson + + * private.c (ptw32_threadStart): ei[] only declared if _MSC_VER. + + * exit.c (pthread_exit): Check for implicitly created threads + to avoid raising an unhandled exception. + +1999-07-12 Peter Slacik + + * condvar.c (pthread_cond_destroy): Add critical section. + (cond_timedwait): Add critical section; check for timeout + waiting on semaphore. + (pthread_cond_broadcast): Add critical section. + +1999-07-09 Lorin Hochstein , John Bossom + + The problem was that cleanup handlers were not executed when + pthread_exit() was called. + + * implement.h (pthread_t_): Add exceptionInformation element for + C++ per-thread exception information. + (general): Define and rename exceptions. + +1999-07-09 Ross Johnson + + * misc.c (CancelableWait): PTW32_EPS_CANCEL (SEH) and + ptw32_exception_cancel (C++) used to identify the exception. + + * cancel.c (pthread_testcancel): PTW32_EPS_CANCEL (SEH) and + ptw32_exception_cancel (C++) used to identify the exception. + + * exit.c (pthread_exit): throw/raise an exception to return to + ptw32_threadStart() to exit the thread. PTW32_EPS_EXIT (SEH) + and ptw32_exception_exit (C++) used to identify the exception. + + * private.c (ptw32_threadStart): Add pthread_exit exception trap; + clean up and exit the thread directly rather than via pthread_exit(). + +Sun May 30 00:25:02 1999 Ross Johnson + + * semaphore.h (mode_t): Conditionally typedef it. + +Fri May 28 13:33:05 1999 Mark E. Armstrong + + * condvar.c (pthread_cond_broadcast): Fix possible memory fault + +Thu May 27 13:08:46 1999 Peter Slacik + + * condvar.c (pthread_cond_broadcast): Fix logic bug + +Thu May 27 13:08:46 1999 Bossom, John + + * condvar.c (pthread_cond_broadcast): optimise sem_post loop + +Fri May 14 12:13:18 1999 Mike Russo + + * attr.c (pthread_attr_setdetachstate): Fix logic bug + +Sat May 8 09:42:30 1999 Ross Johnson + + * pthread.def (sem_open): Add. + (sem_close): Add. + (sem_unlink): Add. + (sem_getvalue): Add. + + * FAQ (Question 3): Add. + +Thu Apr 8 01:16:23 1999 Ross Johnson + + * semaphore.c (sem_open): New function; returns an error (ENOSYS). + (sem_close): ditto. + (sem_unlink): ditto. + (sem_getvalue): ditto. + + * semaphore.h (_POSIX_SEMAPHORES): define. + +Wed Apr 7 14:09:52 1999 Ross Johnson + + * errno.c (_REENTRANT || _MT): Invert condition. + + * pthread.h (_errno): Conditionally include prototype. + +Wed Apr 7 09:37:00 1999 Ross Johnson + + * *.c (comments): Remove individual attributions - these are + documented sufficiently elsewhere. + + * implement.h (pthread.h): Remove extraneous include. + +Sun Apr 4 11:05:57 1999 Ross Johnson + + * sched.c (sched.h): Include. + + * sched.h: New file for POSIX 1b scheduling. + + * pthread.h: Move opaque structures to implement.h; move sched_* + prototypes out and into sched.h. + + * implement.h: Add opaque structures from pthread.h. + + * sched.c (sched_yield): New function. + + * condvar.c (ptw32_sem_*): Rename to sem_*; except for + ptw32_sem_timedwait which is an private function. + +Sat Apr 3 23:28:00 1999 Ross Johnson + + * Makefile.in (OBJS): Add errno.o. + +Fri Apr 2 11:08:50 1999 Ross Johnson + + * implement.h (ptw32_sem_*): Remove prototypes now defined in + semaphore.h. + + * pthread.h (sempahore.h): Include. + + * semaphore.h: New file for POSIX 1b semaphores. + + * semaphore.c (ptw32_sem_timedwait): Moved to private.c. + + * pthread.h (ptw32_sem_t): Change to sem_t. + + * private.c (ptw32_sem_timedwait): Moved from semaphore.c; + set errno on error. + + * pthread.h (pthread_t_): Add per-thread errno element. + +Fri Apr 2 11:08:50 1999 John Bossom + + * semaphore.c (ptw32_sem_*): Change to sem_*; these functions + will be exported from the library; set errno on error. + + * errno.c (_errno): New file. New function. + +Fri Mar 26 14:11:45 1999 Tor Lillqvist + + * semaphore.c (ptw32_sem_timedwait): Check for negative + milliseconds. + +Wed Mar 24 11:32:07 1999 John Bossom + + * misc.c (CancelableWait): Initialise exceptionInformation[2]. + (pthread_self): Get a real Win32 thread handle for implicit threads. + + * cancel.c (pthread_testcancel): Initialise exceptionInformation[2]. + + * implement.h (SE_INFORMATION): Fix values. + + * private.c (ptw32_threadDestroy): Close the thread handle. + +Fri Mar 19 12:57:27 1999 Ross Johnson + + * cancel.c (comments): Update and cleanup. + +Fri Mar 19 09:12:59 1999 Ross Johnson + + * private.c (ptw32_threadStart): status returns PTHREAD_CANCELED. + + * pthread.h (PTHREAD_CANCELED): defined. + +Tue Mar 16 1999 Ross Johnson + + * all: Add GNU LGPL and Copyright and Warranty. + +Mon Mar 15 00:20:13 1999 Ross Johnson + + * condvar.c (pthread_cond_init): fix possible uninitialised use + of cv. + +Sun Mar 14 21:01:59 1999 Ross Johnson + + * condvar.c (pthread_cond_destroy): don't do full cleanup if + static initialised cv has never been used. + (cond_timedwait): check result of auto-initialisation. + +Thu Mar 11 09:01:48 1999 Ross Johnson + + * pthread.h (pthread_mutex_t): revert to (pthread_mutex_t *); + define a value to serve as PTHREAD_MUTEX_INITIALIZER. + (pthread_mutex_t_): remove staticinit and valid elements. + (pthread_cond_t): revert to (pthread_cond_t_ *); + define a value to serve as PTHREAD_COND_INITIALIZER. + (pthread_cond_t_): remove staticinit and valid elements. + + * mutex.c (pthread_mutex_t args): adjust indirection of references. + (all functions): check for PTHREAD_MUTEX_INITIALIZER value; + check for NULL (invalid). + + * condvar.c (pthread_cond_t args): adjust indirection of references. + (all functions): check for PTHREAD_COND_INITIALIZER value; + check for NULL (invalid). + +Wed Mar 10 17:18:12 1999 Ross Johnson + + * misc.c (CancelableWait): Undo changes from Mar 8 and 7. + +Mon Mar 8 11:18:59 1999 Ross Johnson + + * misc.c (CancelableWait): Ensure cancelEvent handle is the lowest + indexed element in the handles array. Enhance test for abandoned + objects. + + * pthread.h (PTHREAD_MUTEX_INITIALIZER): Trailing elements not + initialised are set to zero by the compiler. This avoids the + problem of initialising the opaque critical section element in it. + (PTHREAD_COND_INITIALIZER): Ditto. + + * semaphore.c (ptw32_sem_timedwait): Check sem == NULL earlier. + +Sun Mar 7 12:31:14 1999 Ross Johnson + + * condvar.c (pthread_cond_init): set semaphore initial value + to 0, not 1. cond_timedwait was returning signaled immediately. + + * misc.c (CancelableWait): Place the cancel event handle first + in the handle table for WaitForMultipleObjects. This ensures that + the cancel event is recognised and acted apon if both objects + happen to be signaled together. + + * private.c (ptw32_cond_test_init_lock): Initialise and destroy. + + * implement.h (ptw32_cond_test_init_lock): Add extern. + + * global.c (ptw32_cond_test_init_lock): Add declaration. + + * condvar.c (pthread_cond_destroy): check for valid initialised CV; + flag destroyed CVs as invalid. + (pthread_cond_init): pthread_cond_t is no longer just a pointer. + This is because PTHREAD_COND_INITIALIZER needs state info to reside + in pthread_cond_t so that it can initialise on first use. Will work on + making pthread_cond_t (and other objects like it) opaque again, if + possible, later. + (cond_timedwait): add check for statically initialisation of + CV; initialise on first use. + (pthread_cond_signal): check for valid CV. + (pthread_cond_broadcast): check for valid CV. + (_cond_check_need_init): Add. + + * pthread.h (PTHREAD_COND_INITIALIZER): Fix. + (pthread_cond_t): no longer a pointer to pthread_cond_t_. + (pthread_cond_t_): add 'staticinit' and 'valid' elements. + +Sat Mar 6 1999 Ross Johnson + + * implement.h: Undate comments. + +Sun Feb 21 1999 Ross Johnson + + * pthread.h (PTHREAD_MUTEX_INITIALIZER): missing braces around + cs element initialiser. + +1999-02-21 Ben Elliston + + * pthread.h (pthread_exit): The return type of this function is + void, not int. + + * exit.c (pthread_exit): Do not return 0. + +Sat Feb 20 16:03:30 1999 Ross Johnson + + * dll.c (DLLMain): Expand TryEnterCriticalSection support test. + + * mutex.c (pthread_mutex_trylock): The check for + ptw32_try_enter_critical_section == NULL should have been + removed long ago. + +Fri Feb 19 16:03:30 1999 Ross Johnson + + * sync.c (pthread_join): Fix pthread_equal() test. + + * mutex.c (pthread_mutex_trylock): Check mutex != NULL before + using it. + +Thu Feb 18 16:17:30 1999 Ross Johnson + + * misc.c (pthread_equal): Fix inverted result. + + * Makefile.in: Use libpthread32.a as the name of the DLL export + library instead of pthread.lib. + + * condvar.c (pthread_cond_init): cv could have been used unitialised; + initialise. + + * create.c (pthread_create): parms could have been used unitialised; + initialise. + + * pthread.h (struct pthread_once_t_): Remove redefinition. + +Sat Feb 13 03:03:30 1999 Ross Johnson + + * pthread.h (struct pthread_once_t_): Replaced. + + * misc.c (pthread_once): Replace with John Bossom's version; + has lighter weight serialisation; fixes problem of not holding + competing threads until after the init_routine completes. + +Thu Feb 11 13:34:14 1999 Ross Johnson + + * misc.c (CancelableWait): Change C++ exception throw. + + * sync.c (pthread_join): Change FIXME comment - issue resolved. + +Wed Feb 10 12:49:11 1999 Ross Johnson + + * configure: Various temporary changes. + - Kevin Ruland + + * README: Update. + + * pthread.def (pthread_attr_getstackaddr): uncomment + (pthread_attr_setstackaddr): uncomment + +Fri Feb 5 13:42:30 1999 Ross Johnson + + * semaphore.c: Comment format changes. + +Thu Feb 4 10:07:28 1999 Ross Johnson + + * global.c: Remove ptw32_exception instantiation. + + * cancel.c (pthread_testcancel): Change C++ exception throw. + + * implement.h: Remove extern declaration. + +Wed Feb 3 13:04:44 1999 Ross Johnson + + * cleanup.c: Rename ptw32_*_cleanup() to pthread_*_cleanup(). + + * pthread.def: Ditto. + + * pthread.h: Ditto. + + * pthread.def (pthread_cleanup_push): Remove from export list; + the function is defined as a macro under all compilers. + (pthread_cleanup_pop): Ditto. + + * pthread.h: Remove #if defined(). + +Wed Feb 3 10:13:48 1999 Ross Johnson + + * sync.c (pthread_join): Check for NULL value_ptr arg; + check for detached threads. + +Tue Feb 2 18:07:43 1999 Ross Johnson + + * implement.h: Add #include . + Change sem_t to ptw32_sem_t. + +Tue Feb 2 18:07:43 1999 Kevin Ruland + + * signal.c (pthread_sigmask): Add and modify casts. + Reverse LHS/RHS bitwise assignments. + + * pthread.h: Remove #include . + (PTW32_ATTR_VALID): Add cast. + (struct pthread_t_): Add sigmask element. + + * dll.c: Add "extern C" for DLLMain. + (DllMain): Add cast. + + * create.c (pthread_create): Set sigmask in thread. + + * condvar.c: Remove #include. Change sem_* to ptw32_sem_*. + + * attr.c: Changed #include. + + * Makefile.in: Additional targets and changes to build the library + as a DLL. + +Fri Jan 29 11:56:28 1999 Ross Johnson + + * Makefile.in (OBJS): Add semaphore.o to list. + + * semaphore.c (ptw32_sem_timedwait): Move from private.c. + Rename sem_* to ptw32_sem_*. + + * pthread.h (pthread_cond_t): Change type of sem_t. + _POSIX_SEMAPHORES no longer defined. + + * semaphore.h: Contents moved to implement.h. + Removed from source tree. + + * implement.h: Add semaphore function prototypes and rename all + functions to prepend 'ptw32_'. They are + now private to the pthreads-win32 implementation. + + * private.c: Change #warning. + Move ptw32_sem_timedwait() to semaphore.c. + + * cleanup.c: Change #warning. + + * misc.c: Remove #include + + * pthread.def: Cleanup CVS merge conflicts. + + * global.c: Ditto. + + * ChangeLog: Ditto. + + * cleanup.c: Ditto. + +Sun Jan 24 01:34:52 1999 Ross Johnson + + * semaphore.c (sem_wait): Remove second arg to + pthreadCancelableWait() call. + +Sat Jan 23 17:36:40 1999 Ross Johnson + + * pthread.def: Add new functions to export list. + + * pthread.h (PTHREAD_MUTEX_AUTO_CS_NP): New. + (PTHREAD_MUTEX_FORCE_CS_NP): New. + + * README: Updated. + +Fri Jan 22 14:31:59 1999 Ross Johnson + + * Makefile.in (CFLAGS): Remove -fhandle-exceptions. Not needed + with egcs. Add -g for debugging. + + * create.c (pthread_create): Replace __stdcall with PT_STDCALL + macro. This is a hack and must be fixed. + + * misc.c (CancelableWait): Remove redundant statement. + + * mutex.c (pthread_mutexattr_init): Cast calloc return value. + + * misc.c (CancelableWait): Add cast. + (pthread_self): Add cast. + + * exit.c (pthread_exit): Add cast. + + * condvar.c (pthread_condattr_init): Cast calloc return value. + + * cleanup.c: Reorganise conditional compilation. + + * attr.c (pthread_attr_init): Remove unused 'result'. + Cast malloc return value. + + * private.c (ptw32_callUserDestroyRoutines): Redo conditional + compilation. + + * misc.c (CancelableWait): C++ version uses 'throw'. + + * cancel.c (pthread_testcancel): Ditto. + + * implement.h (class ptw32_exception): Define for C++. + + * pthread.h: Fix C, C++, and Win32 SEH condition compilation + mayhem around pthread_cleanup_* defines. C++ version now uses John + Bossom's cleanup handlers. + (pthread_attr_t): Make 'valid' unsigned. + Define '_timeb' as 'timeb' for Ming32. + Define PT_STDCALL as nothing for Mingw32. May be temporary. + + * cancel.c (pthread_testcancel): Cast return value. + +Wed Jan 20 09:31:28 1999 Ross Johnson + + * pthread.h (pthread_mutexattr_t): Changed to a pointer. + + * mutex.c (pthread_mutex_init): Conditionally create Win32 mutex + - from John Bossom's implementation. + (pthread_mutex_destroy): Conditionally close Win32 mutex + - from John Bossom's implementation. + (pthread_mutexattr_init): Replaced by John Bossom's version. + (pthread_mutexattr_destroy): Ditto. + (pthread_mutexattr_getpshared): New function from John Bossom's + implementation. + (pthread_mutexattr_setpshared): New function from John Bossom's + implementation. + +Tue Jan 19 18:27:42 1999 Ross Johnson + + * pthread.h (pthreadCancelableTimedWait): New prototype. + (pthreadCancelableWait): Remove second argument. + + * misc.c (CancelableWait): New static function is + pthreadCancelableWait() renamed. + (pthreadCancelableWait): Now just calls CancelableWait() with + INFINITE timeout. + (pthreadCancelableTimedWait): Just calls CancelableWait() + with passed in timeout. + +Tue Jan 19 18:27:42 1999 Scott Lightner + + * private.c (ptw32_sem_timedwait): 'abstime' arg really is + absolute time. Calculate relative time to wait from current + time before passing timeout to new routine + pthreadCancelableTimedWait(). + +Tue Jan 19 10:27:39 1999 Ross Johnson + + * pthread.h (pthread_mutexattr_setforcecs_np): New prototype. + + * mutex.c (pthread_mutexattr_init): Init 'pshared' and 'forcecs' + attributes to 0. + (pthread_mutexattr_setforcecs_np): New function (not portable). + + * pthread.h (pthread_mutex_t): + Add 'mutex' element. Set to NULL in PTHREAD_MUTEX_INITIALIZER. + The pthread_mutex_*() routines will try to optimise performance + by choosing either mutexes or critical sections as the basis + for pthread mutexes for each indevidual mutex. + (pthread_mutexattr_t_): Add 'forcecs' element. + Some applications may choose to force use of critical sections + if they know that:- + the mutex is PROCESS_PRIVATE and, + either the OS supports TryEnterCriticalSection() or + pthread_mutex_trylock() will never be called on the mutex. + This attribute will be setable via a non-portable routine. + + Note: We don't yet support PROCESS_SHARED mutexes, so the + implementation as it stands will default to Win32 mutexes only if + the OS doesn't support TryEnterCriticalSection. On Win9x, and early + versions of NT 'forcecs' will need to be set in order to get + critical section based mutexes. + +Sun Jan 17 12:01:26 1999 Ross Johnson + + * pthread.h (PTHREAD_MUTEX_INITIALIZER): Init new 'staticinit' + value to '1' and existing 'valid' value to '1'. + + * global.c (ptw32_mutex_test_init_lock): Add. + + * implement.h (ptw32_mutex_test_init_lock.): Add extern. + + * private.c (ptw32_processInitialize): Init critical section for + global lock used by _mutex_check_need_init(). + (ptw32_processTerminate): Ditto (:s/Init/Destroy/). + + * dll.c (dllMain): Move call to FreeLibrary() so that it is only + called once when the process detaches. + + * mutex.c (_mutex_check_need_init): New static function to test + and init PTHREAD_MUTEX_INITIALIZER mutexes. Provides serialised + access to the internal state of the uninitialised static mutex. + Called from pthread_mutex_trylock() and pthread_mutex_lock() which + do a quick unguarded test to check if _mutex_check_need_init() + needs to be called. This is safe as the test is conservative + and is repeated inside the guarded section of + _mutex_check_need_init(). Thus in all calls except the first + calls to lock static mutexes, the additional overhead to lock any + mutex is a single memory fetch and test for zero. + + * pthread.h (pthread_mutex_t_): Add 'staticinit' member. Mutexes + initialised by PTHREAD_MUTEX_INITIALIZER aren't really initialised + until the first attempt to lock it. Using the 'valid' + flag (which flags the mutex as destroyed or not) to record this + information would be messy. It is possible for a statically + initialised mutex such as this to be destroyed before ever being + used. + + * mutex.c (pthread_mutex_trylock): Call _mutex_check_need_init() + to test/init PTHREAD_MUTEX_INITIALIZER mutexes. + (pthread_mutex_lock): Ditto. + (pthread_mutex_unlock): Add check to ensure we don't try to unlock + an unitialised static mutex. + (pthread_mutex_destroy): Add check to ensure we don't try to delete + a critical section that we never created. Allows us to destroy + a static mutex that has never been locked (and hence initialised). + (pthread_mutex_init): Set 'staticinit' flag to 0 for the new mutex. + +Sun Jan 17 12:01:26 1999 Ross Johnson + + * private.c (ptw32_sem_timedwait): Move from semaphore.c. + + * semaphore.c : Remove redundant #includes. + (ptw32_sem_timedwait): Move to private.c. + (sem_wait): Add missing abstime arg to pthreadCancelableWait() call. + +Fri Jan 15 23:38:05 1999 Ross Johnson + + * condvar.c (cond_timedwait): Remove comment. + +Fri Jan 15 15:41:28 1999 Ross Johnson + + * pthread.h: Add new 'abstime' arg to pthreadCancelableWait() + prototype. + + * condvar.c (cond_timedwait): New generalised function called by + both pthread_cond_wait() and pthread_cond_timedwait(). This is + essentially pthread_cond_wait() renamed and modified to add the + 'abstime' arg and call the new ptw32_sem_timedwait() instead of + sem_wait(). + (pthread_cond_wait): Now just calls the internal static + function cond_timedwait() with an INFINITE wait. + (pthread_cond_timedwait): Now implemented. Calls the internal + static function cond_timedwait(). + + * implement.h (ptw32_sem_timedwait): New internal function + prototype. + + * misc.c (pthreadCancelableWait): Added new 'abstime' argument + to allow shorter than INFINITE wait. + + * semaphore.c (ptw32_sem_timedwait): New function for internal + use. This is essentially sem_wait() modified to add the + 'abstime' arg and call the modified (see above) + pthreadCancelableWait(). + +Thu Jan 14 14:27:13 1999 Ross Johnson + + * cleanup.c: Correct _cplusplus to __cplusplus wherever used. + + * Makefile.in: Add CC=g++ and add -fhandle-exceptions to CFLAGS. + The derived Makefile will compile all units of the package as C++ + so that those which include try/catch exception handling should work + properly. The package should compile ok if CC=gcc, however, exception + handling will not be included and thus thread cancellation, for + example, will not work. + + * cleanup.c (ptw32_pop_cleanup): Add #warning to compile this + file as C++ if using a cygwin32 environment. Perhaps the whole package + should be compiled using g++ under cygwin. + + * private.c (ptw32_threadStart): Change #error directive + into #warning and bracket for __CYGWIN__ and derivative compilers. + +Wed Jan 13 09:34:52 1999 Ross Johnson + + * build.bat: Delete old binaries before compiling/linking. + +Tue Jan 12 09:58:38 1999 Tor Lillqvist + + * dll.c: The Microsoft compiler pragmas probably are more + appropriately protected by _MSC_VER than by _WIN32. + + * pthread.h: Define ETIMEDOUT. This should be returned by + pthread_cond_timedwait which is not implemented yet as of + snapshot-1999-01-04-1305. It was implemented in the older version. + The Microsoft compiler pragmas probably are more appropriately + protected by _MSC_VER than by _WIN32. + + * pthread.def: pthread_mutex_destroy was missing from the def file + + * condvar.c (pthread_cond_broadcast): Ensure we only wait on threads + if there were any waiting on the condition. + I think pthread_cond_broadcast should do the WaitForSingleObject + only if cv->waiters > 0? Otherwise it seems to hang, at least in the + testg thread program from glib. + +Tue Jan 12 09:58:38 1999 Ross Johnson + + * condvar.c (pthread_cond_timedwait): Fix function description + comments. + + * semaphore.c (sem_post): Correct typo in comment. + +Mon Jan 11 20:33:19 1999 Ross Johnson + + * pthread.h: Re-arrange conditional compile of pthread_cleanup-* + macros. + + * cleanup.c (ptw32_push_cleanup): Provide conditional + compile of cleanup->prev. + +1999-01-11 Tor Lillqvist + + * condvar.c (pthread_cond_init): Invert logic when testing the + return value from calloc(). + +Sat Jan 9 14:32:08 1999 Ross Johnson + + * implement.h: Compile-time switch for CYGWIN derived environments + to use CreateThread instead of _beginthreadex. Ditto for ExitThread. + Patch provided by Anders Norlander . + +Tue Jan 5 16:33:04 1999 Ross Johnson + + * cleanup.c (ptw32_pop_cleanup): Add C++ version of __try/__except + block. Move trailing "}" out of #ifdef _WIN32 block left there by + (rpj's) mistake. + + * private.c: Remove #include which is included by pthread.h. + +1998-12-11 Ben Elliston + + * README: Update info about subscribing to the mailing list. + +Mon Jan 4 11:23:40 1999 Ross Johnson + + * all: No code changes, just cleanup. + - remove #if 0 /* Pre Bossom */ enclosed code. + - Remove some redundant #includes. + * pthread.h: Update implemented/unimplemented routines list. + * Tag the bossom merge branch getting ready to merge back to main + trunk. + +Tue Dec 29 13:11:16 1998 Ross Johnson + + * implement.h: Move the following struct definitions to pthread.h: + pthread_t_, pthread_attr_t_, pthread_mutex_t_, pthread_mutex_t_, + pthread_mutexattr_t_, pthread_key_t_, pthread_cond_t_, + pthread_condattr_t_, pthread_once_t_. + + * pthread.h: Add "_" prefix to pthread_push_cleanup and + pthread_pop_cleanup internal routines, and associated struct and + typedefs. + + * buildlib.bat: Add compile command for semaphore.c + + * pthread.def: Comment out pthread_atfork routine name. + Now unimplemented. + + * tsd.c (pthread_setspecific): Rename tkAssocCreate to + ptw32_tkAssocCreate. + (pthread_key_delete): Rename tkAssocDestroy to + ptw32_tkAssocDestroy. + + * sync.c (pthread_join): Rename threadDestroy to ptw32_threadDestroy + + * sched.c (is_attr): attr is now **attr (was *attr), so add extra + NULL pointer test. + (pthread_attr_setschedparam): Increase redirection for attr which is + now a **. + (pthread_attr_getschedparam): Ditto. + (pthread_setschedparam): Change thread validation and rename "thread" + Win32 thread Handle element name to match John Bossom's version. + (pthread_getschedparam): Ditto. + + * private.c (ptw32_threadDestroy): Rename call to + callUserDestroyRoutines() as ptw32_callUserDestroyRoutines() + + * misc.c: Add #include "implement.h". + + * dll.c: Remove defined(KLUDGE) wrapped code. + + * fork.c: Remove redefinition of ENOMEM. + Remove pthread_atfork() and fork() with #if 0/#endif. + + * create.c (pthread_create): Rename threadStart and threadDestroy calls + to ptw32_threadStart and ptw32_threadDestroy. + + * implement.h: Rename "detachedstate" to "detachstate". + + * attr.c: Rename "detachedstate" to "detachstate". + +Mon Dec 28 09:54:39 1998 John Bossom + + * semaphore.c: Initial version. + * semaphore.h: Initial version. + +Mon Dec 28 09:54:39 1998 Ross Johnson + + * pthread.h (pthread_attr_t_): Change to *pthread_attr_t. + +Mon Dec 28 09:54:39 1998 John Bossom, Ben Elliston + + * attr.c (pthread_attr_setstacksize): Merge with John's version. + (pthread_attr_getstacksize): Merge with John's version. + (pthread_attr_setstackaddr): Merge with John's version. + (pthread_attr_getstackaddr): Merge with John's version. + (pthread_attr_init): Merge with John's version. + (pthread_attr_destroy): Merge with John's version. + (pthread_attr_getdetachstate): Merge with John's version. + (pthread_attr_setdetachstate): Merge with John's version. + (is_attr): attr is now **attr (was *attr), so add extra NULL pointer + test. + +Mon Dec 28 09:54:39 1998 Ross Johnson + + * implement.h (pthread_attr_t_): Add and rename elements in JEB's + version to correspond to original, so that it can be used with + original attr routines. + + * pthread.h: Add #endif at end which was truncated in merging. + +Sun Dec 20 14:51:58 1998 Ross Johnson + + * misc.c (pthreadCancelableWait): New function by John Bossom. Non-standard + but provides a hook that can be used to implement cancellation points in + applications that use this library. + + * pthread.h (pthread_cleanup_pop): C++ (non-WIN32) version uses + try/catch to emulate John Bossom's WIN32 __try/__finally behaviour. + In the WIN32 version __finally block, add a test for AbnormalTermination otherwise + cleanup is only run if the cleanup_pop execute arg is non-zero. Cancellation + should cause the cleanup to run irrespective of the execute arg. + + * condvar.c (pthread_condattr_init): Replaced by John Bossom's version. + (pthread_condattr_destroy): Replaced by John Bossom's version. + (pthread_condattr_getpshared): Replaced by John Bossom's version. + (pthread_condattr_setpshared): Replaced by John Bossom's version. + (pthread_cond_init): Replaced by John Bossom's version. + Fix comment (refered to mutex rather than condition variable). + (pthread_cond_destroy): Replaced by John Bossom's version. + (pthread_cond_wait): Replaced by John Bossom's version. + (pthread_cond_timedwait): Replaced by John Bossom's version. + (pthread_cond_signal): Replaced by John Bossom's version. + (pthread_cond_broadcast): Replaced by John Bossom's version. + +Thu Dec 17 19:10:46 1998 Ross Johnson + + * tsd.c (pthread_key_create): Replaced by John Bossom's version. + (pthread_key_delete): Replaced by John Bossom's version. + (pthread_setspecific): Replaced by John Bossom's version. + (pthread_getspecific): Replaced by John Bossom's version. + +Mon Dec 7 09:44:40 1998 John Bossom + + * cancel.c (pthread_setcancelstate): Replaced. + (pthread_setcanceltype): Replaced. + (pthread_testcancel): Replaced. + (pthread_cancel): Replaced. + + * exit.c (pthread_exit): Replaced. + + * misc.c (pthread_self): Replaced. + (pthread_equal): Replaced. + + * sync.c (pthread_detach): Replaced. + (pthread_join): Replaced. + + * create.c (pthread_create): Replaced. + + * private.c (ptw32_processInitialize): New. + (ptw32_processTerminate): New. + (ptw32_threadStart): New. + (ptw32_threadDestroy): New. + (ptw32_cleanupStack): New. + (ptw32_tkAssocCreate): New. + (ptw32_tkAssocDestroy): New. + (ptw32_callUserDestroyRoutines): New. + + * implement.h: Added non-API structures and declarations. + + * dll.c (PthreadsEntryPoint): Cast return value of GetProcAddress + to resolve compile warning from MSVC. + + * dll.c (DLLmain): Replaced. + * dll.c (PthreadsEntryPoint): + Re-applied Anders Norlander's patch:- + Initialize ptw32_try_enter_critical_section at startup + and release kernel32 handle when DLL is being unloaded. + +Sun Dec 6 21:54:35 1998 Ross Johnson + + * buildlib.bat: Fix args to CL when building the .DLL + + * cleanup.c (ptw32_destructor_run_all): Fix TSD key management. + This is a tidy-up before TSD and Thread management is completely + replaced by John Bossom's code. + + * tsd.c (pthread_key_create): Fix TSD key management. + + * global.c (ptw32_key_virgin_next): Initialise. + + * build.bat: New DOS script to compile and link a pthreads app + using Microsoft's CL compiler linker. + * buildlib.bat: New DOS script to compile all the object files + and create pthread.lib and pthread.dll using Microsoft's CL + compiler linker. + +1998-12-05 Anders Norlander + + * implement.h (ptw32_try_enter_critical_section): New extern + * dll.c (ptw32_try_enter_critical_section): New pointer to + TryEnterCriticalSection if it exists; otherwise NULL. + * dll.c (PthreadsEntryPoint): + Initialize ptw32_try_enter_critical_section at startup + and release kernel32 handle when DLL is being unloaded. + * mutex.c (pthread_mutex_trylock): Replaced check for NT with + a check if ptw32_try_enter_critical_section is valid + pointer to a function. Call ptw32_try_enter_critical_section + instead of TryEnterCriticalSection to avoid errors on Win95. + +Thu Dec 3 13:32:00 1998 Ross Johnson + + * README: Correct cygwin32 compatibility statement. + +Sun Nov 15 21:24:06 1998 Ross Johnson + + * cleanup.c (ptw32_destructor_run_all): Declare missing void * arg. + Fixup CVS merge conflicts. + +1998-10-30 Ben Elliston + + * condvar.c (cond_wait): Fix semantic error. Test for equality + instead of making an assignment. + +Fri Oct 30 15:15:50 1998 Ross Johnson + + * cleanup.c (ptw32_handler_push): Fixed bug appending new + handler to list reported by Peter Slacik + . + (new_thread): Rename poorly named local variable to + "new_handler". + +Sat Oct 24 18:34:59 1998 Ross Johnson + + * global.c: Add TSD key management array and index declarations. + + * implement.h: Ditto for externs. + +Fri Oct 23 00:08:09 1998 Ross Johnson + + * implement.h (PTW32_TSD_KEY_REUSE): Add enum. + + * private.c (ptw32_delete_thread): Add call to + ptw32_destructor_run_all() to clean up the threads keys. + + * cleanup.c (ptw32_destructor_run_all): Check for no more dirty + keys to run destructors on. Assume that the destructor call always + succeeds and set the key value to NULL. + +Thu Oct 22 21:44:44 1998 Ross Johnson + + * tsd.c (pthread_setspecific): Add key management code. + (pthread_key_create): Ditto. + (pthread_key_delete): Ditto. + + * implement.h (struct ptw32_tsd_key): Add status member. + + * tsd.c: Add description of pthread_key_delete() from the + standard as a comment. + +Fri Oct 16 17:38:47 1998 Ross Johnson + + * cleanup.c (ptw32_destructor_run_all): Fix and improve + stepping through the key table. + +Thu Oct 15 14:05:01 1998 Ross Johnson + + * private.c (ptw32_new_thread): Remove init of destructorstack. + No longer an element of pthread_t. + + * tsd.c (pthread_setspecific): Fix type declaration and cast. + (pthread_getspecific): Ditto. + (pthread_getspecific): Change error return value to NULL if key + is not in use. + +Thu Oct 15 11:53:21 1998 Ross Johnson + + * global.c (ptw32_tsd_key_table): Fix declaration. + + * implement.h(ptw32_TSD_keys_TlsIndex): Add missing extern. + (ptw32_tsd_mutex): Ditto. + + * create.c (ptw32_start_call): Fix "keys" array declaration. + Add comment. + + * tsd.c (pthread_setspecific): Fix type declaration and cast. + (pthread_getspecific): Ditto. + + * cleanup.c (ptw32_destructor_run_all): Declare missing loop + counter. + +Wed Oct 14 21:09:24 1998 Ross Johnson + + * private.c (ptw32_new_thread): Increment ptw32_threads_count. + (ptw32_delete_thread): Decrement ptw32_threads_count. + Remove some comments. + + * exit.c (ptw32_exit): : Fix two pthread_mutex_lock() calls that + should have been pthread_mutex_unlock() calls. + (ptw32_vacuum): Remove call to ptw32_destructor_pop_all(). + + * create.c (pthread_create): Fix two pthread_mutex_lock() calls that + should have been pthread_mutex_unlock() calls. + + * global.c (ptw32_tsd_mutex): Add mutex for TSD operations. + + * tsd.c (pthread_key_create): Add critical section. + (pthread_setspecific): Ditto. + (pthread_getspecific): Ditto. + (pthread_key_delete): Ditto. + + * sync.c (pthread_join): Fix two pthread_mutex_lock() calls that + should have been pthread_mutex_unlock() calls. + +Mon Oct 12 00:00:44 1998 Ross Johnson + + * implement.h (ptw32_tsd_key_table): New. + + * create.c (ptw32_start_call): Initialise per-thread TSD keys + to NULL. + + * misc.c (pthread_once): Correct typo in comment. + + * implement.h (ptw32_destructor_push): Remove. + (ptw32_destructor_pop): Remove. + (ptw32_destructor_run_all): Rename from ptw32_destructor_pop_all. + (PTW32_TSD_KEY_DELETED): Add enum. + (PTW32_TSD_KEY_INUSE): Add enum. + + * cleanup.c (ptw32_destructor_push): Remove. + (ptw32_destructor_pop): Remove. + (ptw32_destructor_run_all): Totally revamped TSD. + + * dll.c (ptw32_TSD_keys_TlsIndex): Initialise. + + * tsd.c (pthread_setspecific): Totally revamped TSD. + (pthread_getspecific): Ditto. + (pthread_create): Ditto. + (pthread_delete): Ditto. + +Sun Oct 11 22:44:55 1998 Ross Johnson + + * global.c (ptw32_tsd_key_table): Add new global. + + * implement.h (ptw32_tsd_key_t and struct ptw32_tsd_key): + Add. + (struct _pthread): Remove destructorstack. + + * cleanup.c (ptw32_destructor_run_all): Rename from + ptw32_destructor_pop_all. The key destructor stack was made + global rather than per-thread. No longer removes destructor nodes + from the stack. Comments updated. + +1998-10-06 Ben Elliston + + * condvar.c (cond_wait): Use POSIX, not Win32 mutex calls. + (pthread_cond_broadcast): Likewise. + (pthread_cond_signal): Likewise. + +1998-10-05 Ben Elliston + + * pthread.def: Update. Some functions aren't available yet, others + are macros in . + + * tests/join.c: Remove; useless. + +Mon Oct 5 14:25:08 1998 Ross Johnson + + * pthread.def: New file for building the DLL. + +1998-10-05 Ben Elliston + + * misc.c (pthread_equal): Correct inverted logic bug. + (pthread_once): Use the POSIX mutex primitives, not Win32. Remove + irrelevant FIXME comment. + + * global.c (PTHREAD_MUTEX_INITIALIZER): Move to pthread.h. + + * pthread.h (PTHREAD_MUTEX_INITIALIZER): Define. + (pthread_mutex_t): Reimplement as a struct containing a valid + flag. If the flag is ever down upon entry to a mutex operation, + we call pthread_mutex_create() to initialise the object. This + fixes the problem of how to handle statically initialised objects + that can't call InitializeCriticalSection() due to their context. + (PTHREAD_ONCE_INIT): Define. + + * mutex.c (pthread_mutex_init): Set valid flag. + (pthread_mutex_destroy): Clear valid flag. + (pthread_mutex_lock): Check and handle the valid flag. + (pthread_mutex_unlock): Likewise. + (pthread_mutex_trylock): Likewise. + + * tests/mutex3.c: New file; test for the static initialisation + macro. Passes. + + * tests/create1.c: New file; test pthread_create(). Passes. + + * tests/equal.c: Poor test; remove. + + * tests/equal1.c New file; test pthread_equal(). Passes. + + * tests/once1.c: New file; test for pthread_once(). Passes. + + * tests/self.c: Remove; rename to self1.c. + + * tests/self1.c: This is the old self.c. + + * tests/self2.c: New file. Test pthread_self() with a single + thread. Passes. + + * tests/self3.c: New file. Test pthread_self() with a couple of + threads to ensure their thread IDs differ. Passes. + +1998-10-04 Ben Elliston + + * tests/mutex2.c: Test pthread_mutex_trylock(). Passes. + + * tests/mutex1.c: New basic test for mutex functions (it passes). + (main): Eliminate warning. + + * configure.in: Test for __stdcall, not _stdcall. Typo. + + * configure: Regenerate. + + * attr.c (pthread_attr_setstackaddr): Remove FIXME comment. Win32 + does know about ENOSYS after all. + (pthread_attr_setstackaddr): Likewise. + +1998-10-03 Ben Elliston + + * configure.in: Test for the `_stdcall' keyword. Define `STDCALL' + to `_stdcall' if we have it, null otherwise. + + * configure: Regenerate. + + * acconfig.h (STDCALL): New define. + + * config.h.in: Regenerate. + + * create.c (ptw32_start_call): Add STDCALL prefix. + + * mutex.c (pthread_mutex_init): Correct function signature. + + * attr.c (pthread_attr_init): Only zero out the `sigmask' member + if we have the sigset_t type. + + * pthread.h: No need to include . It doesn't even exist + on Win32! Again, an artifact of cross-compilation. + (pthread_sigmask): Only provide if we have the sigset_t type. + + * process.h: Remove. This was a stand-in before we started doing + native compilation under Win32. + + * pthread.h (pthread_mutex_init): Make `attr' argument const. + +1998-10-02 Ben Elliston + + * COPYING: Remove. + + * COPYING.LIB: Add. This library is under the LGPL. + +1998-09-13 Ben Elliston + + * configure.in: Test for required system features. + + * configure: Generate. + + * acconfig.h: New file. + + * config.h.in: Generate. + + * Makefile.in: Renamed from Makefile. + + * COPYING: Import from a recent GNU package. + + * config.guess: Likewise. + + * config.sub: Likewise. + + * install-sh: Likewise. + + * config.h: Remove. + + * Makefile: Likewise. + +1998-09-12 Ben Elliston + + * windows.h: No longer needed; remove. + + * windows.c: Likewise. + +Sat Sep 12 20:09:24 1998 Ross Johnson + + * windows.h: Remove error number definitions. These are in + + * tsd.c: Add comment explaining rationale for not building + POSIX TSD on top of Win32 TLS. + +1998-09-12 Ben Elliston + + * {most}.c: Include to get POSIX error values. + + * signal.c (pthread_sigmask): Only provide if HAVE_SIGSET_T is + defined. + + * config.h: #undef features, don't #define them. This will be + generated by autoconf very soon. + +1998-08-11 Ben Elliston + + * Makefile (LIB): Define. + (clean): Define target. + (all): Build a library not just the object files. + + * pthread.h: Provide a definition for struct timespec if we don't + already have one. + + * windows.c (TlsGetValue): Bug fix. + +Thu Aug 6 15:19:22 1998 Ross Johnson + + * misc.c (pthread_once): Fix arg 1 of EnterCriticalSection() + and LeaveCriticalSection() calls to pass address-of lock. + + * fork.c (pthread_atfork): Typecast (void (*)(void *)) funcptr + in each ptw32_handler_push() call. + + * exit.c (ptw32_exit): Fix attr arg in + pthread_attr_getdetachstate() call. + + * private.c (ptw32_new_thread): Typecast (HANDLE) NULL. + (ptw32_delete_thread): Ditto. + + * implement.h: (PTW32_MAX_THREADS): Add define. This keeps + changing in an attempt to make thread administration data types + opaque and cleanup DLL startup. + + * dll.c (PthreadsEntryPoint): + (ptw32_virgins): Remove malloc() and free() calls. + (ptw32_reuse): Ditto. + (ptw32_win32handle_map): Ditto. + (ptw32_threads_mutex_table): Ditto. + + * global.c (_POSIX_THREAD_THREADS_MAX): Initialise with + PTW32_MAX_THREADS. + (ptw32_virgins): Ditto. + (ptw32_reuse): Ditto. + (ptw32_win32handle_map): Ditto. + (ptw32_threads_mutex_table): Ditto. + + * create.c (pthread_create): Typecast (HANDLE) NULL. + Typecast (unsigned (*)(void *)) start_routine. + + * condvar.c (pthread_cond_init): Add address-of operator & to + arg 1 of pthread_mutex_init() call. + (pthread_cond_destroy): Add address-of operator & to + arg 1 of pthread_mutex_destroy() call. + + * cleanup.c (ptw32_destructor_pop_all): Add (int) cast to + pthread_getspecific() arg. + (ptw32_destructor_pop): Add (void *) cast to "if" conditional. + (ptw32_destructor_push): Add (void *) cast to + ptw32_handler_push() "key" arg. + (malloc.h): Add include. + + * implement.h (ptw32_destructor_pop): Add prototype. + + * tsd.c (implement.h): Add include. + + * sync.c (pthread_join): Remove target_thread_mutex and it's + initialisation. Rename getdetachedstate to getdetachstate. + Remove unused variable "exitcode". + (pthread_detach): Remove target_thread_mutex and it's + initialisation. Rename getdetachedstate to getdetachstate. + Rename setdetachedstate to setdetachstate. + + * signal.c (pthread_sigmask): Rename SIG_SET to SIG_SETMASK. + Cast "set" to (long *) in assignment to passify compiler warning. + Add address-of operator & to thread->attr.sigmask in memcpy() call + and assignment. + (pthread_sigmask): Add address-of operator & to thread->attr.sigmask + in memcpy() call and assignment. + + * windows.h (THREAD_PRIORITY_ERROR_RETURN): Add. + (THREAD_PRIORITY_LOWEST): Add. + (THREAD_PRIORITY_HIGHEST): Add. + + * sched.c (is_attr): Add function. + (implement.h): Add include. + (pthread_setschedparam): Rename all instances of "sched_policy" + to "sched_priority". + (pthread_getschedparam): Ditto. + +Tue Aug 4 16:57:58 1998 Ross Johnson + + * private.c (ptw32_delete_thread): Fix typo. Add missing ';'. + + * global.c (ptw32_virgins): Change types from pointer to + array pointer. + (ptw32_reuse): Ditto. + (ptw32_win32handle_map): Ditto. + (ptw32_threads_mutex_table): Ditto. + + * implement.h(ptw32_virgins): Change types from pointer to + array pointer. + (ptw32_reuse): Ditto. + (ptw32_win32handle_map): Ditto. + (ptw32_threads_mutex_table): Ditto. + + * private.c (ptw32_delete_thread): Fix "entry" should be "thread". + + * misc.c (pthread_self): Add extern for ptw32_threadID_TlsIndex. + + * global.c: Add comment. + + * misc.c (pthread_once): Fix member -> dereferences. + Change ptw32_once_flag to once_control->flag in "if" test. + +Tue Aug 4 00:09:30 1998 Ross Johnson + + * implement.h(ptw32_virgins): Add extern. + (ptw32_virgin_next): Ditto. + (ptw32_reuse): Ditto. + (ptw32_reuse_top): Ditto. + (ptw32_win32handle_map): Ditto. + (ptw32_threads_mutex_table): Ditto. + + * global.c (ptw32_virgins): Changed from array to pointer. + Storage allocation for the array moved into dll.c. + (ptw32_reuse): Ditto. + (ptw32_win32handle_map): Ditto. + (ptw32_threads_mutex_table): Ditto. + + * dll.c (PthreadsEntryPoint): Set up thread admin storage when + DLL is loaded. + + * fork.c (pthread_atfork): Fix function pointer arg to all + ptw32_handler_push() calls. Change "arg" arg to NULL in child push. + + * exit.c: Add windows.h and process.h includes. + (ptw32_exit): Add local detachstate declaration. + (ptw32_exit): Fix incorrect name for pthread_attr_getdetachstate(). + + * pthread.h (_POSIX_THREAD_ATTR_STACKSIZE): Move from global.c + (_POSIX_THREAD_ATTR_STACKADDR): Ditto. + + * create.c (pthread_create): Fix #if should be #ifdef. + (ptw32_start_call): Remove usused variables. + + * process.h: Create. + + * windows.h: Move _beginthreadex and _endthreadex into + process.h + +Mon Aug 3 21:19:57 1998 Ross Johnson + + * condvar.c (pthread_cond_init): Add NULL attr to + pthread_mutex_init() call - default attributes will be used. + (cond_wait): Fix typo. + (cond_wait): Fix typo - cv was ev. + (pthread_cond_broadcast): Fix two identical typos. + + * cleanup.c (ptw32_destructor_pop_all): Remove _ prefix from + PTHREAD_DESTRUCTOR_ITERATIONS. + + * pthread.h: Move _POSIX_* values into posix.h + + * pthread.h: Fix typo in pthread_mutex_init() prototype. + + * attr.c (pthread_attr_init): Fix error in priority member init. + + * windows.h (THREAD_PRIORITY_NORMAL): Add. + + * pthread.h (sched_param): Add missing ';' to struct definition. + + * attr.c (pthread_attr_init): Remove obsolete pthread_attr_t + member initialisation - cancelstate, canceltype, cancel_pending. + (is_attr): Make arg "attr" a const. + + * implement.h (PTW32_HANDLER_POP_LIFO): Remove definition. + (PTW32_HANDLER_POP_FIFO): Ditto. + (PTW32_VALID): Add missing newline escape (\). + (ptw32_handler_node): Make element "next" a pointer. + +1998-08-02 Ben Elliston + + * windows.h: Remove duplicate TlsSetValue() prototype. Add + TlsGetValue() prototype. + (FALSE): Define. + (TRUE): Likewise. + Add forgotten errno values. Guard against multiple #includes. + + * windows.c: New file. Implement stubs for Win32 functions. + + * Makefile (SRCS): Remove. Not explicitly needed. + (CFLAGS): Add -Wall for all warnings with GCC. + +Sun Aug 2 19:03:42 1998 Ross Johnson + + * config.h: Create. This is a temporary stand-in for autoconf yet + to be done. + (HAVE_SIGNAL_H): Add. + + * pthread.h: Minor rearrangement for temporary config.h. + +Fri Jul 31 14:00:29 1998 Ross Johnson + + * cleanup.c (ptw32_destructor_pop): Implement. Removes + destructors associated with a key without executing them. + (ptw32_destructor_pop_all): Add FIXME comment. + + * tsd.c (pthread_key_delete): Add call to ptw32_destructor_pop(). + +Fri Jul 31 00:05:45 1998 Ross Johnson + + * tsd.c (pthread_key_create): Update to properly associate + the destructor routine with the key. + (pthread_key_delete): Add FIXME comment. + + * exit.c (ptw32_vacuum): Add call to + ptw32_destructor_pop_all(). + + * implement.h (ptw32_handler_pop_all): Add prototype. + (ptw32_destructor_pop_all): Ditto. + + * cleanup.c (ptw32_destructor_push): Implement. This is just a + call to ptw32_handler_push(). + (ptw32_destructor_pop_all): Implement. This is significantly + different to ptw32_handler_pop_all(). + + * Makefile (SRCS): Create. Preliminary. + + * windows.h: Create. Contains Win32 definitions for compile + testing. This is just a standin for the real one. + + * pthread.h (SIG_UNBLOCK): Fix typo. Was SIG_BLOCK. + (windows.h): Add include. Required for CRITICAL_SECTION. + (pthread_cond_t): Move enum declaration outside of struct + definition. + (unistd.h): Add include - may be temporary. + + * condvar.c (windows.h): Add include. + + * implement.h (PTW32_THIS): Remove - no longer required. + (PTW32_STACK): Use pthread_self() instead of PTW32_THIS. + +Thu Jul 30 23:12:45 1998 Ross Johnson + + * implement.h: Remove ptw32_find_entry() prototype. + + * private.c: Extend comments. + Remove ptw32_find_entry() - no longer needed. + + * create.c (ptw32_start_call): Add call to TlsSetValue() to + store the thread ID. + + * dll.c (PthreadsEntryPoint): Implement. This is called + whenever a process loads the DLL. Used to initialise thread + local storage. + + * implement.h: Add ptw32_threadID_TlsIndex. + Add ()s around PTW32_VALID expression. + + * misc.c (pthread_self): Re-implement using Win32 TLS to store + the threads own ID. + +Wed Jul 29 11:39:03 1998 Ross Johnson + + * private.c: Corrections in comments. + (ptw32_new_thread): Alter "if" flow to be more natural. + + * cleanup.c (ptw32_handler_push): Same as below. + + * create.c (pthread_create): Same as below. + + * private.c (ptw32_new_thread): Rename "new" to "new_thread". + Since when has a C programmer been required to know C++? + +Tue Jul 28 14:04:29 1998 Ross Johnson + + * implement.h: Add PTW32_VALID macro. + + * sync.c (pthread_join): Modify to use the new thread + type and ptw32_delete_thread(). Rename "target" to "thread". + Remove extra local variable "target". + (pthread_detach): Ditto. + + * signal.c (pthread_sigmask): Move init of "us" out of inner block. + Fix instance of "this" should have been "us". Rename "us" to "thread". + + * sched.c (pthread_setschedparam): Modify to use the new thread + type. + (pthread_getschedparam): Ditto. + + * private.c (ptw32_find_thread): Fix return type and arg. + + * implement.h: Remove PTW32_YES and PTW32_NO. + (ptw32_new_thread): Add prototype. + (ptw32_find_thread): Ditto. + (ptw32_delete_thread): Ditto. + (ptw32_new_thread_entry): Remove prototype. + (ptw32_find_thread_entry): Ditto. + (ptw32_delete_thread_entry): Ditto. + ( PTW32_NEW, PTW32_INUSE, PTW32_EXITED, PTW32_REUSE): + Add. + + + * create.c (pthread_create): Minor rename "us" to "new" (I need + these cues but it doesn't stop me coming out with some major bugs + at times). + Load start_routine and arg into the thread so the wrapper can + call it. + + * exit.c (pthread_exit): Fix pthread_this should be pthread_self. + + * cancel.c (pthread_setcancelstate): Change + ptw32_threads_thread_t * to pthread_t and init with + pthread_this(). + (pthread_setcanceltype): Ditto. + + * exit.c (ptw32_exit): Add new pthread_t arg. + Rename ptw32_delete_thread_entry to ptw32_delete_thread. + Rename "us" to "thread". + (pthread_exit): Call ptw32_exit with added thread arg. + + * create.c (ptw32_start_call): Insert missing ")". + Add "us" arg to ptw32_exit() call. + (pthread_create): Modify to use new thread allocation scheme. + + * private.c: Added detailed explanation of the new thread + allocation scheme. + (ptw32_new_thread): Totally rewritten to use + new thread allocation scheme. + (ptw32_delete_thread): Ditto. + (ptw32_find_thread): Obsolete. + +Mon Jul 27 17:46:37 1998 Ross Johnson + + * create.c (pthread_create): Start of rewrite. Not completed yet. + + * private.c (ptw32_new_thread_entry): Start of rewrite. Not + complete. + + * implement.h (ptw32_threads_thread): Rename, remove thread + member, add win32handle and ptstatus members. + (ptw32_t): Add. + + * pthread.h: pthread_t is no longer mapped directly to a Win32 + HANDLE type. This is so we can let the Win32 thread terminate and + reuse the HANDLE while pthreads holds it's own thread ID until + the last waiting join exits. + +Mon Jul 27 00:20:37 1998 Ross Johnson + + * private.c (ptw32_delete_thread_entry): Destroy the thread + entry attribute object before deleting the thread entry itself. + + * attr.c (pthread_attr_init): Initialise cancel_pending = FALSE. + (pthread_attr_setdetachstate): Rename "detached" to "detachedstate". + (pthread_attr_getdetachstate): Ditto. + + * exit.c (ptw32_exit): Fix incorrect check for detachedstate. + + * implement.h (ptw32_call_t): Remove env member. + +Sun Jul 26 13:06:12 1998 Ross Johnson + + * implement.h (ptw32_new_thread_entry): Fix prototype. + (ptw32_find_thread_entry): Ditto. + (ptw32_delete_thread_entry): Ditto. + (ptw32_exit): Add prototype. + + * exit.c (ptw32_exit): New function. Called from pthread_exit() + and ptw32_start_call() to exit the thread. It allows an extra + argument which is the return code passed to _endthreadex(). + (ptw32_exit): Move thread entry delete call from ptw32_vacuum() + into here. Add more explanation of thread entry deletion. + (ptw32_exit): Clarify comment. + + * create.c (ptw32_start_call): Change pthread_exit() call to + ptw32_exit() call. + + * exit.c (ptw32_vacuum): Add thread entry deletion code + moved from ptw32_start_call(). See next item. + (pthread_exit): Remove longjmp(). Add mutex lock around thread table + manipulation code. This routine now calls _enthreadex(). + + * create.c (ptw32_start_call): Remove setjmp() call and move + cleanup code out. Call pthread_exit(NULL) to terminate the thread. + +1998-07-26 Ben Elliston + + * tsd.c (pthread_getspecific): Update comments. + + * mutex.c (pthread_mutexattr_setpshared): Not supported; remove. + (pthread_mutexattr_getpshared): Likewise. + + * pthread.h (pthread_mutexattr_setpshared): Remove prototype. + (pthread_mutexattr_getpshared): Likewise. + +Sun Jul 26 00:09:59 1998 Ross Johnson + + * sync.c: Rename all instances of ptw32_count_mutex to + ptw32_table_mutex. + + * implement.h: Rename ptw32_count_mutex to + ptw32_table_mutex. + + * global.c: Rename ptw32_count_mutex to + ptw32_table_mutex. + + * create.c (pthread_create): Add critical sections. + (ptw32_start_call): Rename ptw32_count_mutex to + ptw32_table_mutex. + + * cancel.c (pthread_setcancelstate): Fix indirection bug and rename + "this" to "us". + + * signal.c (pthread_sigmask): Rename "this" to "us" and fix some + minor syntax errors. Declare "us" and initialise it. + + * sync.c (pthread_detach): Rename "this" to "target". + + * pthread.h: Converting PTHREAD_* defines to alias the (const int) + values in global.c. + + * global.c: Started converting PTHREAD_* defines to (const int) as + a part of making the eventual pthreads DLL binary compatible + through version changes. + + * condvar.c (cond_wait): Add cancelation point. This applies the + point to both pthread_cond_wait() and pthread_cond_timedwait(). + + * exit.c (pthread_exit): Rename "this" to "us". + + * implement.h: Add comment. + + * sync.c (pthread_join): I've satisfied myself that pthread_detach() + does set the detached attribute in the thread entry attributes + to PTHREAD_CREATE_DETACHED. "if" conditions were changed to test + that attribute instead of a separate flag. + + * create.c (pthread_create): Rename "this" to "us". + (pthread_create): cancelstate and canceltype are not attributes + so the copy to thread entry attribute storage was removed. + Only the thread itself can change it's cancelstate or canceltype, + ie. the thread must exist already. + + * private.c (ptw32_delete_thread_entry): Mutex locks removed. + Mutexes must be applied at the caller level. + (ptw32_new_thread_entry): Ditto. + (ptw32_new_thread_entry): Init cancelstate, canceltype, and + cancel_pending to default values. + (ptw32_new_thread_entry): Rename "this" to "new". + (ptw32_find_thread_entry): Rename "this" to "entry". + (ptw32_delete_thread_entry): Rename "thread_entry" to "entry". + + * create.c (ptw32_start_call): Mutexes changed to + ptw32_count_mutex. All access to the threads table entries is + under the one mutex. Otherwise chaos reigns. + +Sat Jul 25 23:16:51 1998 Ross Johnson + + * implement.h (ptw32_threads_thread): Move cancelstate and + canceltype members out of pthread_attr_t into here. + + * fork.c (fork): Add comment. + +1998-07-25 Ben Elliston + + * fork.c (fork): Autoconfiscate. + +Sat Jul 25 00:00:13 1998 Ross Johnson + + * create.c (ptw32_start_call): Set thread priority. Ensure our + thread entry is removed from the thread table but only if + pthread_detach() was called and there are no waiting joins. + (pthread_create): Set detach flag in thread entry if the + thread is created PTHREAD_CREATE_DETACHED. + + * pthread.h (pthread_attr_t): Rename member "detachedstate". + + * attr.c (pthread_attr_init): Rename attr members. + + * exit.c (pthread_exit): Fix indirection mistake. + + * implement.h (PTW32_THREADS_TABLE_INDEX): Add. + + * exit.c (ptw32_vacuum): Fix incorrect args to + ptw32_handler_pop_all() calls. + Make thread entry removal conditional. + + * sync.c (pthread_join): Add multiple join and async detach handling. + + * implement.h (PTW32_THREADS_TABLE_INDEX): Add. + + * global.c (ptw32_threads_mutex_table): Add. + + * implement.h (ptw32_once_flag): Remove. + (ptw32_once_lock): Ditto. + (ptw32_threads_mutex_table): Add. + + * global.c (ptw32_once_flag): Remove. + (ptw32_once_lock): Ditto. + + * sync.c (pthread_join): Fix tests involving new return value + from ptw32_find_thread_entry(). + (pthread_detach): Ditto. + + * private.c (ptw32_find_thread_entry): Failure return code + changed from -1 to NULL. + +Fri Jul 24 23:09:33 1998 Ross Johnson + + * create.c (pthread_create): Change . to -> in sigmask memcpy() args. + + * pthread.h: (pthread_cancel): Add function prototype. + (pthread_testcancel): Ditto. + +1998-07-24 Ben Elliston + + * pthread.h (pthread_condattr_t): Rename dummy structure member. + (pthread_mutexattr_t): Likewise. + +Fri Jul 24 21:13:55 1998 Ross Johnson + + * cancel.c (pthread_cancel): Implement. + (pthread_testcancel): Implement. + + * exit.c (pthread_exit): Add comment explaining the longjmp(). + + * implement.h (ptw32_threads_thread_t): New member cancelthread. + (PTW32_YES): Define. + (PTW32_NO): Define. + (RND_SIZEOF): Remove. + + * create.c (pthread_create): Rename cancelability to cancelstate. + + * pthread.h (pthread_attr_t): Rename cancelability to cancelstate. + (PTHREAD_CANCELED): Define. + +1998-07-24 Ben Elliston + + * pthread.h (SIG_BLOCK): Define if not already defined. + (SIG_UNBLOCK): Likewise. + (SIG_SETMASK): Likewise. + (pthread_attr_t): Add signal mask member. + (pthread_sigmask): Add function prototype. + + * signal.c (pthread_sigmask): Implement. + + * create.c: #include to get a prototype for memcpy(). + (pthread_create): New threads inherit their creator's signal + mask. Copy the signal mask to the new thread structure if we know + about signals. + +Fri Jul 24 16:33:17 1998 Ross Johnson + + * fork.c (pthread_atfork): Add all the necessary push calls. + Local implementation semantics: + If we get an ENOMEM at any time then ALL handlers + (including those from previous pthread_atfork() calls) will be + popped off each of the three atfork stacks before we return. + (fork): Add all the necessary pop calls. Add the thread cancellation + and join calls to the child fork. + Add #includes. + + * implement.h: (ptw32_handler_push): Fix return type and stack arg + type in prototype. + (ptw32_handler_pop): Fix stack arg type in prototype. + (ptw32_handler_pop_all): Fix stack arg type in prototype. + + * cleanup.c (ptw32_handler_push): Change return type to int and + return ENOMEM if malloc() fails. + + * sync.c (pthread_detach): Use equality test, not assignment. + + * create.c (ptw32_start_call): Add call to Win32 CloseHandle() + if thread is detached. + +1998-07-24 Ben Elliston + + * sync.c (pthread_detach): Close the Win32 thread handle to + emulate detached (or daemon) threads. + +Fri Jul 24 03:00:25 1998 Ross Johnson + + * sync.c (pthread_join): Save valueptr arg in joinvalueptr for + pthread_exit() to use. + + * private.c (ptw32_new_thread_entry): Initialise joinvalueptr to + NULL. + + * create.c (ptw32_start_call): Rewrite to facilitate joins. + pthread_exit() will do a longjmp() back to here. Does appropriate + cleanup and exit/return from the thread. + (pthread_create): _beginthreadex() now passes a pointer to our + thread table entry instead of just the call member of that entry. + + * implement.h (ptw32_threads_thread): New member + void ** joinvalueptr. + (ptw32_call_t): New member jmpbuf env. + + * exit.c (pthread_exit): Major rewrite to handle joins and handing + value pointer to joining thread. Uses longjmp() back to + ptw32_start_call(). + + * create.c (pthread_create): Ensure values of new attribute members + are copied to the thread attribute object. + + * attr.c (pthread_attr_destroy): Fix merge conflicts. + (pthread_attr_getdetachstate): Fix merge conflicts. + (pthread_attr_setdetachstate): Fix merge conflicts. + + * pthread.h: Fix merge conflicts. + + * sync.c (pthread_join): Fix merge conflicts. + +Fri Jul 24 00:21:21 1998 Ross Johnson + + * sync.c (pthread_join): Add check for valid and joinable + thread. + (pthread_detach): Implement. After checking for a valid and joinable + thread, it's still a no-op. + + * private.c (ptw32_find_thread_entry): Bug prevented returning + an error value in some cases. + + * attr.c (pthread_attr_setdetachedstate): Implement. + (pthread_attr_getdetachedstate): Implement. + + * implement.h: Move more hidden definitions into here from + pthread.h. + +1998-07-24 Ben Elliston + + * pthread.h (PTHREAD_CREATE_JOINABLE): Define. + (PTHREAD_CREATE_DETACHED): Likewise. + (pthread_attr_t): Add new structure member `detached'. + (pthread_attr_getdetachstate): Add function prototype. + (pthread_attr_setdetachstate): Likewise. + + * sync.c (pthread_join): Return if the target thread is detached. + + * attr.c (pthread_attr_init): Initialise cancelability and + canceltype structure members. + (pthread_attr_getdetachstate): Implement. + (pthread_attr_setdetachstate): Likewise. + + * implement.h (PTW32_CANCEL_DEFAULTS): Remove. Bit fields + proved to be too cumbersome. Set the defaults in attr.c using the + public PTHREAD_CANCEL_* constants. + + * cancel.c: New file. + + * pthread.h (sched_param): Define this type. + (pthread_attr_getschedparam): Add function prototype. + (pthread_attr_setschedparam): Likewise. + (pthread_setcancelstate): Likewise. + (pthread_setcanceltype): Likewise. + (sched_get_priority_min): Likewise. + (sched_get_priority_max): Likewise. + (pthread_mutexattr_setprotocol): Remove; not supported. + (pthread_mutexattr_getprotocol): Likewise. + (pthread_mutexattr_setprioceiling): Likewise. + (pthread_mutexattr_getprioceiling): Likewise. + (pthread_attr_t): Add canceltype member. Update comments. + (SCHED_OTHER): Define this scheduling policy constant. + (SCHED_FIFO): Likewise. + (SCHED_RR): Likewise. + (SCHED_MIN): Define the lowest possible value for this constant. + (SCHED_MAX): Likewise, the maximum possible value. + (PTHREAD_CANCEL_ASYNCHRONOUS): Redefine. + (PTHREAD_CANCEL_DEFERRED): Likewise. + + * sched.c: New file. + (pthread_setschedparam): Implement. + (pthread_getschedparam): Implement. + (sched_get_priority_max): Validate policy argument. + (sched_get_priority_min): Likewise. + + * mutex.c (pthread_mutexattr_setprotocol): Remove; not supported. + (pthread_mutexattr_getprotocol): Likewise. + (pthread_mutexattr_setprioceiling): Likewise. + (pthread_mutexattr_getprioceiling): Likewise. + +Fri Jul 24 00:21:21 1998 Ross Johnson + + * create.c (pthread_create): Arg to ptw32_new_thread_entry() + changed. See next entry. Move mutex locks out. Changes made yesterday + and today allow us to start the new thread running rather than + temporarily suspended. + + * private.c (ptw32_new_thread_entry): ptw32_thread_table + was changed back to a table of thread structures rather than pointers. + As such we're trading storage for increaded speed. This routine + was modified to work with the new table. Mutex lock put in around + global data accesses. + (ptw32_find_thread_entry): Ditto + (ptw32_delete_thread_entry): Ditto + +Thu Jul 23 23:25:30 1998 Ross Johnson + + * global.c: New. Global data objects declared here. These moved from + pthread.h. + + * pthread.h: Move implementation hidden definitions into + implement.h. + + * implement.h: Move implementation hidden definitions from + pthread.h. Add constants to index into the different handler stacks. + + * cleanup.c (ptw32_handler_push): Simplify args. Restructure. + (ptw32_handler_pop): Simplify args. Restructure. + (ptw32_handler_pop_all): Simplify args. Restructure. + +Wed Jul 22 00:16:22 1998 Ross Johnson + + * attr.c, implement.h, pthread.h, ChangeLog: Resolve CVS merge + conflicts. + + * private.c (ptw32_find_thread_entry): Changes to return type + to support leaner ptw32_threads_table[] which now only stores + ptw32_thread_thread_t *. + (ptw32_new_thread_entry): Internal changes. + (ptw32_delete_thread_entry): Internal changes to avoid contention. + Calling routines changed accordingly. + + * pthread.h: Modified cleanup macros to use new generic push and pop. + Added destructor and atfork stacks to ptw32_threads_thread_t. + + * cleanup.c (ptw32_handler_push, ptw32_handler_pop, + ptw32_handler_pop_all): Renamed cleanup push and pop routines + and made generic to handle destructors and atfork handlers as + well. + + * create.c (ptw32_start_call): New function is a wrapper for + all new threads. It allows us to do some cleanup when the thread + returns, ie. that is otherwise only done if the thread is cancelled. + + * exit.c (ptw32_vacuum): New function contains code from + pthread_exit() that we need in the new ptw32_start_call() + as well. + + * implement.h: Various additions and minor changes. + + * pthread.h: Various additions and minor changes. + Change cleanup handler macros to use generic handler push and pop + functions. + + * attr.c: Minor mods to all functions. + (is_attr): Implemented missing function. + + * create.c (pthread_create): More clean up. + + * private.c (ptw32_find_thread_entry): Implement. + (ptw32_delete_thread_entry): Implement. + (ptw32_new_thread_entry): Implement. + These functions manipulate the implementations internal thread + table and are part of general code cleanup and modularisation. + They replace ptw32_getthreadindex() which was removed. + + * exit.c (pthread_exit): Changed to use the new code above. + + * pthread.h: Add cancelability constants. Update comments. + +1998-07-22 Ben Elliston + + * attr.c (pthread_setstacksize): Update test of attr argument. + (pthread_getstacksize): Likewise. + (pthread_setstackaddr): Likewise. + (pthread_getstackaddr): Likewise. + (pthread_attr_init): No need to allocate any storage. + (pthread_attr_destroy): No need to free any storage. + + * mutex.c (is_attr): Not likely to be needed; remove. + (remove_attr): Likewise. + (insert_attr): Likewise. + + * implement.h (ptw32_mutexattr_t): Moved to a public definition + in pthread.h. There was little gain in hiding these details. + (ptw32_condattr_t): Likewise. + (ptw32_attr_t): Likewise. + + * pthread.h (pthread_atfork): Add function prototype. + (pthread_attr_t): Moved here from implement.h. + + * fork.c (pthread_atfork): Preliminary implementation. + (ptw32_fork): Likewise. + +Wed Jul 22 00:16:22 1998 Ross Johnson + + * cleanup.c (ptw32_cleanup_push): Implement. + (ptw32_cleanup_pop): Implement. + (ptw32_do_cancellation): Implement. + These are private to the implementation. The real cleanup functions + are macros. See below. + + * pthread.h (pthread_cleanup_push): Implement as a macro. + (pthread_cleanup_pop): Implement as a macro. + Because these are macros which start and end a block, the POSIX scoping + requirement is observed. See the comment in the file. + + * exit.c (pthread_exit): Refine the code. + + * create.c (pthread_create): Code cleanup. + + * implement.h (RND_SIZEOF): Add RND_SIZEOF(T) to round sizeof(T) + up to multiple of DWORD. + Add function prototypes. + + * private.c (ptw32_getthreadindex): "*thread" should have been + "thread". Detect empty slot fail condition. + +1998-07-20 Ben Elliston + + * misc.c (pthread_once): Implement. Don't use a per-application + flag and mutex--make `pthread_once_t' contain these elements in + their structure. The earlier version had incorrect semantics. + + * pthread.h (ptw32_once_flag): Add new variable. Remove. + (ptw32_once_lock): Add new mutex lock to ensure integrity of + access to ptw32_once_flag. Remove. + (pthread_once): Add function prototype. + (pthread_once_t): Define this type. + +Mon Jul 20 02:31:05 1998 Ross Johnson + + * private.c (ptw32_getthreadindex): Implement. + + * pthread.h: Add application static data dependent on + _PTHREADS_BUILD_DLL define. This is needed to avoid allocating + non-sharable static data within the pthread DLL. + + * implement.h: Add ptw32_cleanup_stack_t, ptw32_cleanup_node_t + and PTW32_HASH_INDEX. + + * exit.c (pthread_exit): Begin work on cleanup and de-allocate + thread-private storage. + + * create.c (pthread_create): Add thread to thread table. + Keep a thread-private copy of the attributes with default values + filled in when necessary. Same for the cleanup stack. Make + pthread_create C run-time library friendly by using _beginthreadex() + instead of CreateThread(). Fix error returns. + +Sun Jul 19 16:26:23 1998 Ross Johnson + + * implement.h: Rename pthreads_thread_count to ptw32_threads_count. + Create ptw32_threads_thread_t struct to keep thread specific data. + + * create.c: Rename pthreads_thread_count to ptw32_threads_count. + (pthread_create): Handle errors from CreateThread(). + +1998-07-19 Ben Elliston + + * condvar.c (pthread_cond_wait): Generalise. Moved from here .. + (cond_wait): To here. + (pthread_cond_timedwait): Implement; use generalised cond_wait(). + + * pthread.h (pthread_key_t): Define this type. + (pthread_key_create): Add function prototype. + (pthread_setspecific): Likewise. + (pthread_getspecific): Likwise. + (pthread_key_delete): Likewise. + + * tsd.c (pthread_key_create): Implement. + (pthread_setspecific): Likewise. + (pthread_getspecific): Likewise. + (pthread_key_delete): Likewise. + + * mutex.c (pthread_mutex_trylock): Return ENOSYS if this function + is called on a Win32 platform which is not Windows NT. + +1998-07-18 Ben Elliston + + * condvar.c (pthread_condattr_init): Do not attempt to malloc any + storage; none is needed now that condattr_t is an empty struct. + (pthread_condattr_destory): Likewise; do not free storage. + (pthread_condattr_setpshared): No longer supported; return ENOSYS. + (pthread_condattr_getpshared): Likewise. + (pthread_cond_init): Implement with help from Douglas Schmidt. + Remember to initialise the cv's internal mutex. + (pthread_cond_wait): Likewise. + (pthread_cond_signal): Likewise. + (pthread_cond_broadcast): Likewise. + (pthread_cond_timedwait): Preliminary implementation, but I need + to see some API documentation for `WaitForMultipleObject'. + (pthread_destory): Implement. + + * pthread.h (pthread_cond_init): Add function protoype. + (pthread_cond_broadcast): Likewise. + (pthread_cond_signal): Likewise. + (pthread_cond_timedwait): Likewise. + (pthread_cond_wait): Likewise. + (pthread_cond_destroy): Likewise. + (pthread_cond_t): Define this type. Fix for u_int. Do not assume + that the mutex contained withing the pthread_cond_t structure will + be a critical section. Use our new POSIX type! + + * implement.h (ptw32_condattr_t): Remove shared attribute. + +1998-07-17 Ben Elliston + + * pthread.h (PTHREADS_PROCESS_PRIVATE): Remove. + (PTHREAD_PROCESS_SHARED): Likewise. No support for mutexes shared + across processes for now. + (pthread_mutex_t): Use a Win32 CRITICAL_SECTION type for better + performance. + + * implement.h (ptw32_mutexattr_t): Remove shared attribute. + + * mutex.c (pthread_mutexattr_setpshared): This optional function + is no longer supported, since we want to implement POSIX mutex + variables using the much more efficient Win32 critical section + primitives. Critical section objects in Win32 cannot be shared + between processes. + (pthread_mutexattr_getpshared): Likewise. + (pthread_mutexattr_init): No need to malloc any storage; the + attributes structure is now empty. + (pthread_mutexattr_destroy): This is now a nop. + (pthread_mutex_init): Use InitializeCriticalSection(). + (pthread_mutex_destroy): Use DeleteCriticalSection(). + (pthread_mutex_lock): Use EnterCriticalSection(). + (pthread_mutex_trylock): Use TryEnterCriticalSection(). This is + not supported by Windows 9x, but trylock is a hack anyway, IMHO. + (pthread_mutex_unlock): Use LeaveCriticalSection(). + +1998-07-14 Ben Elliston + + * attr.c (pthread_attr_setstacksize): Implement. + (pthread_attr_getstacksize): Likewise. + (pthread_attr_setstackaddr): Likewise. + (pthread_attr_getstackaddr): Likewise. + (pthread_attr_init): Likewise. + (pthread_attr_destroy): Likewise. + + * condvar.c (pthread_condattr_init): Add `_cond' to function name. + + * mutex.c (pthread_mutex_lock): Add `_mutex' to function name. + (pthread_mutex_trylock): Likewise. + (pthread_mutex_unlock): Likewise. + + * pthread.h (pthread_condattr_setpshared): Fix typo. + (pthread_attr_init): Add function prototype. + (pthread_attr_destroy): Likewise. + (pthread_attr_setstacksize): Likewise. + (pthread_attr_getstacksize): Likewise. + (pthread_attr_setstackaddr): Likewise. + (pthread_attr_getstackaddr): Likewise. + +Mon Jul 13 01:09:55 1998 Ross Johnson + + * implement.h: Wrap in #ifndef _IMPLEMENT_H + + * create.c (pthread_create): Map stacksize attr to Win32. + + * mutex.c: Include implement.h + +1998-07-13 Ben Elliston + + * condvar.c (pthread_condattr_init): Implement. + (pthread_condattr_destroy): Likewise. + (pthread_condattr_setpshared): Likewise. + (pthread_condattr_getpshared): Likewise. + + * implement.h (PTHREAD_THREADS_MAX): Remove trailing semicolon. + (PTHREAD_STACK_MIN): Specify; needs confirming. + (ptw32_attr_t): Define this type. + (ptw32_condattr_t): Likewise. + + * pthread.h (pthread_mutex_t): Define this type. + (pthread_condattr_t): Likewise. + (pthread_mutex_destroy): Add function prototype. + (pthread_lock): Likewise. + (pthread_trylock): Likewise. + (pthread_unlock): Likewise. + (pthread_condattr_init): Likewise. + (pthread_condattr_destroy): Likewise. + (pthread_condattr_setpshared): Likewise. + (pthread_condattr_getpshared): Likewise. + + * mutex.c (pthread_mutex_init): Implement. + (pthread_mutex_destroy): Likewise. + (pthread_lock): Likewise. + (pthread_trylock): Likewise. + (pthread_unlock): Likewise. + +1998-07-12 Ben Elliston + + * implement.h (ptw32_mutexattr_t): Define this implementation + internal type. Application programmers only see a mutex attribute + object as a void pointer. + + * pthread.h (pthread_mutexattr_t): Define this type. + (pthread_mutexattr_init): Add function prototype. + (pthread_mutexattr_destroy): Likewise. + (pthread_mutexattr_setpshared): Likewise. + (pthread_mutexattr_getpshared): Likewise. + (pthread_mutexattr_setprotocol): Likewise. + (pthread_mutexattr_getprotocol): Likewise. + (pthread_mutexattr_setprioceiling): Likewise. + (pthread_mutexattr_getprioceiling): Likewise. + (PTHREAD_PROCESS_PRIVATE): Define. + (PTHREAD_PROCESS_SHARED): Define. + + * mutex.c (pthread_mutexattr_init): Implement. + (pthread_mutexattr_destroy): Implement. + (pthread_mutexattr_setprotocol): Implement. + (pthread_mutexattr_getprotocol): Likewise. + (pthread_mutexattr_setprioceiling): Likewise. + (pthread_mutexattr_getprioceiling): Likewise. + (pthread_mutexattr_setpshared): Likewise. + (pthread_mutexattr_getpshared): Likewise. + (insert_attr): New function; very preliminary implementation! + (is_attr): Likewise. + (remove_attr): Likewise. + +Sat Jul 11 14:48:54 1998 Ross Johnson + + * implement.h: Preliminary implementation specific defines. + + * create.c (pthread_create): Preliminary implementation. + +1998-07-11 Ben Elliston + + * sync.c (pthread_join): Implement. + + * misc.c (pthread_equal): Likewise. + + * pthread.h (pthread_join): Add function prototype. + (pthread_equal): Likewise. + +1998-07-10 Ben Elliston + + * misc.c (pthread_self): Implement. + + * exit.c (pthread_exit): Implement. + + * pthread.h (pthread_exit): Add function prototype. + (pthread_self): Likewise. + (pthread_t): Define this type. + +1998-07-09 Ben Elliston + + * create.c (pthread_create): A dummy stub right now. + + * pthread.h (pthread_create): Add function prototype. diff --git a/win32/3rdparty/pthreads/FAQ b/win32/3rdparty/pthreads/FAQ new file mode 100644 index 000000000..4f2d449b9 --- /dev/null +++ b/win32/3rdparty/pthreads/FAQ @@ -0,0 +1,403 @@ + ========================================= + PTHREADS-WIN32 Frequently Asked Questions + ========================================= + +INDEX +----- + +Q 1 What is it? + +Q 2 Which of the several dll versions do I use? + or, + What are all these pthread*.dll and pthread*.lib files? + +Q 3 What is the library naming convention? + +Q 4 Cleanup code default style or: it used to work when I built + the library myself, but now it doesn't - why? + +Q 5 Why is the default library version now less exception-friendly? + +Q 6 Should I use Cygwin or Mingw32 as a development environment? + +Q 7 Now that pthreads-win32 builds under Mingw32, why do I get + memory access violations (segfaults)? + +Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0) + +Q 9 Cancelation doesn't work for me, why? + +Q 10 How do I generate pthreadGCE.dll and libpthreadw32.a for use + with Mingw32? + +============================================================================= + +Q 1 What is it? +--- + +Pthreads-win32 is an Open Source Software implementation of the +Threads component of the POSIX 1003.1c 1995 Standard for Microsoft's +Win32 environment. Some functions from POSIX 1003.1b are also +supported including semaphores. Other related functions include +the set of read-write lock functions. The library also supports +some of the functionality of the Open Group's Single Unix +specification, version 2, namely mutex types. + +See the file "ANNOUNCE" for more information including standards +conformance details and list of supported routines. + + +------------------------------------------------------------------------------ + +Q 2 Which of the several dll versions do I use? +--- or, + What are all these pthread*.dll and pthread*.lib files? + +Simply, you only use one of them, but you need to choose carefully. + +The most important choice you need to make is whether to use a +version that uses exceptions internally, or not (there are versions +of the library that use exceptions as part of the thread +cancelation and cleanup implementation, and one that uses +setjmp/longjmp instead). + +There is some contension amongst POSIX threads experts as +to how POSIX threads cancelation and exit should work +with languages that include exceptions and handlers, e.g. +C++ and even C (Microsoft's Structured Exceptions). + +The issue is: should cancelation of a thread in, say, +a C++ application cause object destructors and C++ exception +handlers to be invoked as the stack unwinds during thread +exit, or not? + +There seems to be more opinion in favour of using the +standard C version of the library (no EH) with C++ applications +since this appears to be the assumption commercial pthreads +implementations make. Therefore, if you use an EH version +of pthreads-win32 then you may be under the illusion that +your application will be portable, when in fact it is likely to +behave very differently linked with other pthreads libraries. + +Now you may be asking: why have you kept the EH versions of +the library? + +There are a couple of reasons: +- there is division amongst the experts and so the code may + be needed in the future. (Yes, it's in the repository and we + can get it out anytime in the future, but ...) +- pthreads-win32 is one of the few implementations, and possibly + the only freely available one, that has EH versions. It may be + useful to people who want to play with or study application + behaviour under these conditions. + + +------------------------------------------------------------------------------ + +Q 3 What is the library naming convention? +--- + +Because the library is being built using various exception +handling schemes and compilers - and because the library +may not work reliably if these are mixed in an application, +each different version of the library has it's own name. + +Note 1: the incompatibility is really between EH implementations +of the different compilers. It should be possible to use the +standard C version from either compiler with C++ applications +built with a different compiler. If you use an EH version of +the library, then you must use the same compiler for the +application. This is another complication and dependency that +can be avoided by using only the standard C library version. + +Note 2: if you use a standard C pthread*.dll with a C++ +application, then any functions that you define that are +intended to be called via pthread_cleanup_push() must be +__cdecl. + +Note 3: the intention is to also name either the VC or GC +version (it should be arbitrary) as pthread.dll, including +pthread.lib and libpthread.a as appropriate. + +In general: + pthread[VG]{SE,CE,C}.dll + pthread[VG]{SE,CE,C}.lib + +where: + [VG] indicates the compiler + V - MS VC + G - GNU C + + {SE,CE,C} indicates the exception handling scheme + SE - Structured EH + CE - C++ EH + C - no exceptions - uses setjmp/longjmp + +For example: + pthreadVSE.dll (MSVC/SEH) + pthreadGCE.dll (GNUC/C++ EH) + pthreadGC.dll (GNUC/not dependent on exceptions) + +The GNU library archive file names have changed to: + + libpthreadGCE.a + libpthreadGC.a + + +------------------------------------------------------------------------------ + +Q 4 Cleanup code default style or: it used to work when I built +--- the library myself, but now it doesn't - why? + +Up to and including snapshot 2001-07-12, if not defined, the cleanup +style was determined automatically from the compiler used, and one +of the following was defined accordingly: + + __CLEANUP_SEH MSVC only + __CLEANUP_CXX C++, including MSVC++, GNU G++ + __CLEANUP_C C, including GNU GCC, not MSVC + +These defines determine the style of cleanup (see pthread.h) and, +most importantly, the way that cancelation and thread exit (via +pthread_exit) is performed (see the routine ptw32_throw() in private.c). + +In short, the exceptions versions of the library throw an exception +when a thread is canceled or exits (via pthread_exit()), which is +caught by a handler in the thread startup routine, so that the +the correct stack unwinding occurs regardless of where the thread +is when it's canceled or exits via pthread_exit(). + +After snapshot 2001-07-12, unless your build explicitly defines (e.g. +via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then +the build now ALWAYS defaults to __CLEANUP_C style cleanup. This style +uses setjmp/longjmp in the cancelation and pthread_exit implementations, +and therefore won't do stack unwinding even when linked to applications +that have it (e.g. C++ apps). This is for consistency with most/all +commercial Unix POSIX threads implementations. + +Although it was not clearly documented before, it is still necessary to +build your application using the same __CLEANUP_* define as was +used for the version of the library that you link with, so that the +correct parts of pthread.h are included. That is, the possible +defines require the following library versions: + + __CLEANUP_SEH pthreadVSE.dll + __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll + __CLEANUP_C pthreadVC.dll or pthreadGC.dll + +THE POINT OF ALL THIS IS: if you have not been defining one of these +explicitly, then the defaults have been set according to the compiler +and language you are using, as described at the top of this +section. + +THIS NOW CHANGES, as has been explained above. For example: + +If you were building your application with MSVC++ i.e. using C++ +exceptions (rather than SEH) and not explicitly defining one of +__CLEANUP_*, then __CLEANUP_C++ was defined for you in pthread.h. +You should have been linking with pthreadVCE.dll, which does +stack unwinding. + +If you now build your application as you had before, pthread.h will now +set __CLEANUP_C as the default style, and you will need to link +with pthreadVC.dll. Stack unwinding will now NOT occur when a +thread is canceled, nor when the thread calls pthread_exit(). + +Your application will now most likely behave differently to previous +versions, and in non-obvious ways. Most likely is that local +objects may not be destroyed or cleaned up after a thread +is canceled. + +If you want the same behaviour as before, then you must now define +__CLEANUP_C++ explicitly using a compiler option and link with +pthreadVCE.dll as you did before. + + +------------------------------------------------------------------------------ + +Q 5 Why is the default library version now less exception-friendly? +--- + +Because most commercial Unix POSIX threads implementations don't allow you to +choose to have stack unwinding. (Compaq's TRU64 Unix is possibly an exception.) + +Therefore, providing it in pthread-win32 as a default could be dangerous +and non-portable. We still provide the choice but you must now consciously +make it. + +WHY NOT REMOVE THE EXCEPTIONS VERSIONS OF THE LIBRARY ALTOGETHER? +There are a few reasons: +- because there are well respected POSIX threads people who believe + that POSIX threads implementations should be exceptions-aware and + do the expected thing in that context. (There are equally respected + people who believe it should not be easily accessible, if it's there + at all.) +- because pthreads-win32 is one of the few implementations that has + the choice, perhaps the only freely available one, and so offers + a laboratory to people who may want to explore the effects; +- although the code will always be around somewhere for anyone who + wants it, once it's removed from the current version it will not be + nearly as visible to people who may have a use for it. + + +------------------------------------------------------------------------------ + +Q 6 Should I use Cygwin or Mingw32 as a development environment? +--- + +Important: see Q7 also. + +Use Mingw32 with the MSVCRT library to build applications that use +the pthreads DLL. + +Cygwin's own internal support for POSIX threads is growing. +Consult that project's documentation for more information. + +------------------------------------------------------------------------------ + +Q 7 Now that pthreads-win32 builds under Mingw32, why do I get +--- memory access violations (segfaults)? + +The latest Mingw32 package has thread-safe exception handling (see Q10). +Also, see Q6 above. + +------------------------------------------------------------------------------ + +Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0) +--- + +> +> I'm a "rookie" when it comes to your pthread implementation. I'm currently +> desperately trying to install the prebuilt .dll file into my MSVC compiler. +> Could you please provide me with explicit instructions on how to do this (or +> direct me to a resource(s) where I can acquire such information)? +> +> Thank you, +> + +You should have a .dll, .lib, .def, and three .h files. It is recommended +that you use pthreadVC.dll, rather than pthreadVCE.dll or pthreadVSE.dll +(see Q2 above). + +The .dll can go in any directory listed in your PATH environment +variable, so putting it into C:\WINDOWS should work. + +The .lib file can go in any directory listed in your LIB environment +variable. + +The .h files can go in any directory listed in your INCLUDE +environment variable. + +Or you might prefer to put the .lib and .h files into a new directory +and add its path to LIB and INCLUDE. You can probably do this easiest +by editing the file:- + +C:\Program Files\DevStudio\vc\bin\vcvars32.bat + +The .def file isn't used by anything in the pre-compiled version but +is included for information. + +Cheers. +Ross + +------------------------------------------------------------------------------ + +Q 9 Cancelation doesn't work for me, why? +--- + +> I'm investigating a problem regarding thread cancelation. The thread I want +> to cancel has PTHREAD_CANCEL_ASYNCHRONOUS, however, this piece of code +> blocks on the join(): +> +> if ((retv = Pthread_cancel( recvThread )) == 0) +> { +> retv = Pthread_join( recvThread, 0 ); +> } +> +> Pthread_* are just macro's; they call pthread_*. +> +> The thread recvThread seems to block on a select() call. It doesn't get +> cancelled. +> +> Two questions: +> +> 1) is this normal behaviour? +> +> 2) if not, how does the cancel mechanism work? I'm not very familliar to +> win32 programming, so I don't really understand how the *Event() family of +> calls work. + +The answer to your first question is, normal POSIX behaviour would +be to asynchronously cancel the thread. However, even that doesn't +guarantee cancelation as the standard only says it should be +cancelled as soon as possible. + +Snapshot 99-11-02 or earlier only partially supports asynchronous cancellation. +Snapshots since then simulate async cancelation by poking the address of +a cancelation routine into the PC of the threads context. This requires +the thread to be resumed in some way for the cancelation to actually +proceed. This is not true async cancelation, but it is as close as we've +been able to get to it. + +If the thread you're trying to cancel is blocked (for instance, it could be +waiting for data from the network), it will only get cancelled when it unblocks +(when the data arrives). For true pre-emptive cancelation in these cases, +pthreads-win32 from snapshot 2004-05-16 can automatically recognise and use the +QueueUserAPCEx package by Panagiotis E. Hadjidoukas. This package is available +from the pthreads-win32 ftp site and is included in the pthreads-win32 +self-unpacking zip from 2004-05-16 onwards. + +Using deferred cancelation would normally be the way to go, however, +even though the POSIX threads standard lists a number of C library +functions that are defined as deferred cancelation points, there is +no hookup between those which are provided by Windows and the +pthreads-win32 library. + +Incidently, it's worth noting for code portability that the older POSIX +threads standards cancelation point lists didn't include "select" because +(as I read in Butenhof) it wasn't part of POSIX. However, it does appear in +the SUSV3. + +Effectively, the only mandatory cancelation points that pthreads-win32 +recognises are those the library implements itself, ie. + + pthread_testcancel + pthread_cond_wait + pthread_cond_timedwait + pthread_join + sem_wait + sem_timedwait + pthread_delay_np + +The following routines from the non-mandatory list in SUSV3 are +cancelation points in pthreads-win32: + + pthread_rwlock_wrlock + pthread_rwlock_timedwrlock + +The following routines from the non-mandatory list in SUSV3 are not +cancelation points in pthreads-win32: + + pthread_rwlock_rdlock + pthread_rwlock_timedrdlock + +Pthreads-win32 also provides two functions that allow you to create +cancelation points within your application, but only for cases where +a thread is going to block on a Win32 handle. These are: + + pthreadCancelableWait(HANDLE waitHandle) /* Infinite wait */ + + pthreadCancelableTimedWait(HANDLE waitHandle, DWORD timeout) + +------------------------------------------------------------------------------ + + +Q 10 How do I create thread-safe applications using +---- pthreadGCE.dll, libpthreadw32.a and Mingw32? + +This should not be a problem with recent versions of MinGW32. + +For early versions, see Thomas Pfaff's email at: +http://sources.redhat.com/ml/pthreads-win32/2002/msg00000.html +------------------------------------------------------------------------------ + diff --git a/win32/3rdparty/pthreads/GNUmakefile b/win32/3rdparty/pthreads/GNUmakefile new file mode 100644 index 000000000..6c48fd23c --- /dev/null +++ b/win32/3rdparty/pthreads/GNUmakefile @@ -0,0 +1,583 @@ +# +# -------------------------------------------------------------------------- +# +# Pthreads-win32 - POSIX Threads Library for Win32 +# Copyright(C) 1998 John E. Bossom +# Copyright(C) 1999,2005 Pthreads-win32 contributors +# +# Contact Email: rpj@callisto.canberra.edu.au +# +# The current list of contributors is contained +# in the file CONTRIBUTORS included with the source +# code distribution. The list can also be seen at the +# following World Wide Web location: +# http://sources.redhat.com/pthreads-win32/contributors.html +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library in the file COPYING.LIB; +# if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +DLL_VER = 2 +DLL_VERD= $(DLL_VER)d + +DEVROOT = C:\PTHREADS + +DLLDEST = $(DEVROOT)\DLL +LIBDEST = $(DEVROOT)\DLL + +# If Running MsysDTK +RM = rm -f +MV = mv -f +CP = cp -f + +# If not. +#RM = erase +#MV = rename +#CP = copy + +# For cross compiling use e.g. +# make CROSS=i386-mingw32msvc- clean GC-inlined +CROSS = + +AR = $(CROSS)ar +DLLTOOL = $(CROSS)dlltool +CC = $(CROSS)gcc +CXX = $(CROSS)g++ +RANLIB = $(CROSS)ranlib +RC = $(CROSS)windres + +OPT = $(CLEANUP) -O3 -finline-functions +DOPT = $(CLEANUP) -g -O0 +XOPT = + +RCFLAGS = --include-dir=. +LFLAGS = -lwsock32 + +# ---------------------------------------------------------------------- +# The library can be built with some alternative behaviour to +# facilitate development of applications on Win32 that will be ported +# to other POSIX systems. Nothing definable here will make the library +# non-compliant, but applications that make assumptions that POSIX +# does not garrantee may fail or misbehave under some settings. +# +# PTW32_THREAD_ID_REUSE_INCREMENT +# Purpose: +# POSIX says that applications should assume that thread IDs can be +# recycled. However, Solaris and some other systems use a [very large] +# sequence number as the thread ID, which provides virtual uniqueness. +# Pthreads-win32 provides pseudo-unique IDs when the default increment +# (1) is used, but pthread_t is not a scalar type like Solaris's. +# +# Usage: +# Set to any value in the range: 0 <= value <= 2^wordsize +# +# Examples: +# Set to 0 to emulate non recycle-unique behaviour like Linux or *BSD. +# Set to 1 for recycle-unique thread IDs (this is the default). +# Set to some other +ve value to emulate smaller word size types +# (i.e. will wrap sooner). +# +#PTW32_FLAGS = "-DPTW32_THREAD_ID_REUSE_INCREMENT=0" +# +# ---------------------------------------------------------------------- + +GC_CFLAGS = $(PTW32_FLAGS) +GCE_CFLAGS = $(PTW32_FLAGS) -mthreads + +## Mingw32 +MAKE ?= make +CFLAGS = $(OPT) $(XOPT) -I. -DHAVE_CONFIG_H -Wall + +DLL_INLINED_OBJS = \ + pthread.o \ + version.o + +# Agregate modules for inlinability +DLL_OBJS = \ + attr.o \ + barrier.o \ + cancel.o \ + cleanup.o \ + condvar.o \ + create.o \ + dll.o \ + errno.o \ + exit.o \ + fork.o \ + global.o \ + misc.o \ + mutex.o \ + nonportable.o \ + private.o \ + rwlock.o \ + sched.o \ + semaphore.o \ + signal.o \ + spin.o \ + sync.o \ + tsd.o \ + version.o + +# Separate modules for minimum size statically linked images +SMALL_STATIC_OBJS = \ + pthread_attr_init.o \ + pthread_attr_destroy.o \ + pthread_attr_getdetachstate.o \ + pthread_attr_setdetachstate.o \ + pthread_attr_getstackaddr.o \ + pthread_attr_setstackaddr.o \ + pthread_attr_getstacksize.o \ + pthread_attr_setstacksize.o \ + pthread_attr_getscope.o \ + pthread_attr_setscope.o \ + pthread_attr_setschedpolicy.o \ + pthread_attr_getschedpolicy.o \ + pthread_attr_setschedparam.o \ + pthread_attr_getschedparam.o \ + pthread_attr_setinheritsched.o \ + pthread_attr_getinheritsched.o \ + pthread_barrier_init.o \ + pthread_barrier_destroy.o \ + pthread_barrier_wait.o \ + pthread_barrierattr_init.o \ + pthread_barrierattr_destroy.o \ + pthread_barrierattr_setpshared.o \ + pthread_barrierattr_getpshared.o \ + pthread_setcancelstate.o \ + pthread_setcanceltype.o \ + pthread_testcancel.o \ + pthread_cancel.o \ + cleanup.o \ + pthread_condattr_destroy.o \ + pthread_condattr_getpshared.o \ + pthread_condattr_init.o \ + pthread_condattr_setpshared.o \ + pthread_cond_destroy.o \ + pthread_cond_init.o \ + pthread_cond_signal.o \ + pthread_cond_wait.o \ + create.o \ + dll.o \ + errno.o \ + pthread_exit.o \ + fork.o \ + global.o \ + pthread_mutex_init.o \ + pthread_mutex_destroy.o \ + pthread_mutexattr_init.o \ + pthread_mutexattr_destroy.o \ + pthread_mutexattr_getpshared.o \ + pthread_mutexattr_setpshared.o \ + pthread_mutexattr_settype.o \ + pthread_mutexattr_gettype.o \ + pthread_mutex_lock.o \ + pthread_mutex_timedlock.o \ + pthread_mutex_unlock.o \ + pthread_mutex_trylock.o \ + pthread_mutexattr_setkind_np.o \ + pthread_mutexattr_getkind_np.o \ + pthread_getw32threadhandle_np.o \ + pthread_delay_np.o \ + pthread_num_processors_np.o \ + pthread_win32_attach_detach_np.o \ + pthread_equal.o \ + pthread_getconcurrency.o \ + pthread_once.o \ + pthread_self.o \ + pthread_setconcurrency.o \ + pthread_rwlock_init.o \ + pthread_rwlock_destroy.o \ + pthread_rwlockattr_init.o \ + pthread_rwlockattr_destroy.o \ + pthread_rwlockattr_getpshared.o \ + pthread_rwlockattr_setpshared.o \ + pthread_rwlock_rdlock.o \ + pthread_rwlock_wrlock.o \ + pthread_rwlock_unlock.o \ + pthread_rwlock_tryrdlock.o \ + pthread_rwlock_trywrlock.o \ + pthread_setschedparam.o \ + pthread_getschedparam.o \ + pthread_timechange_handler_np.o \ + ptw32_is_attr.o \ + ptw32_cond_check_need_init.o \ + ptw32_MCS_lock.o \ + ptw32_mutex_check_need_init.o \ + ptw32_processInitialize.o \ + ptw32_processTerminate.o \ + ptw32_threadStart.o \ + ptw32_threadDestroy.o \ + ptw32_tkAssocCreate.o \ + ptw32_tkAssocDestroy.o \ + ptw32_callUserDestroyRoutines.o \ + ptw32_timespec.o \ + ptw32_throw.o \ + ptw32_InterlockedCompareExchange.o \ + ptw32_getprocessors.o \ + ptw32_calloc.o \ + ptw32_new.o \ + ptw32_reuse.o \ + ptw32_semwait.o \ + ptw32_relmillisecs.o \ + ptw32_rwlock_check_need_init.o \ + sched_get_priority_max.o \ + sched_get_priority_min.o \ + sched_setscheduler.o \ + sched_getscheduler.o \ + sched_yield.o \ + sem_init.o \ + sem_destroy.o \ + sem_trywait.o \ + sem_timedwait.o \ + sem_wait.o \ + sem_post.o \ + sem_post_multiple.o \ + sem_getvalue.o \ + sem_open.o \ + sem_close.o \ + sem_unlink.o \ + signal.o \ + pthread_kill.o \ + ptw32_spinlock_check_need_init.o \ + pthread_spin_init.o \ + pthread_spin_destroy.o \ + pthread_spin_lock.o \ + pthread_spin_unlock.o \ + pthread_spin_trylock.o \ + pthread_detach.o \ + pthread_join.o \ + pthread_key_create.o \ + pthread_key_delete.o \ + pthread_setspecific.o \ + pthread_getspecific.o \ + w32_CancelableWait.o \ + version.o + +INCL = \ + config.h \ + implement.h \ + semaphore.h \ + pthread.h \ + need_errno.h + +ATTR_SRCS = \ + pthread_attr_init.c \ + pthread_attr_destroy.c \ + pthread_attr_getdetachstate.c \ + pthread_attr_setdetachstate.c \ + pthread_attr_getstackaddr.c \ + pthread_attr_setstackaddr.c \ + pthread_attr_getstacksize.c \ + pthread_attr_setstacksize.c \ + pthread_attr_getscope.c \ + pthread_attr_setscope.c + +BARRIER_SRCS = \ + pthread_barrier_init.c \ + pthread_barrier_destroy.c \ + pthread_barrier_wait.c \ + pthread_barrierattr_init.c \ + pthread_barrierattr_destroy.c \ + pthread_barrierattr_setpshared.c \ + pthread_barrierattr_getpshared.c + +CANCEL_SRCS = \ + pthread_setcancelstate.c \ + pthread_setcanceltype.c \ + pthread_testcancel.c \ + pthread_cancel.c + +CONDVAR_SRCS = \ + ptw32_cond_check_need_init.c \ + pthread_condattr_destroy.c \ + pthread_condattr_getpshared.c \ + pthread_condattr_init.c \ + pthread_condattr_setpshared.c \ + pthread_cond_destroy.c \ + pthread_cond_init.c \ + pthread_cond_signal.c \ + pthread_cond_wait.c + +EXIT_SRCS = \ + pthread_exit.c + +MISC_SRCS = \ + pthread_equal.c \ + pthread_getconcurrency.c \ + pthread_kill.c \ + pthread_once.c \ + pthread_self.c \ + pthread_setconcurrency.c \ + ptw32_calloc.c \ + ptw32_MCS_lock.c \ + ptw32_new.c \ + ptw32_reuse.c \ + w32_CancelableWait.c + +MUTEX_SRCS = \ + ptw32_mutex_check_need_init.c \ + pthread_mutex_init.c \ + pthread_mutex_destroy.c \ + pthread_mutexattr_init.c \ + pthread_mutexattr_destroy.c \ + pthread_mutexattr_getpshared.c \ + pthread_mutexattr_setpshared.c \ + pthread_mutexattr_settype.c \ + pthread_mutexattr_gettype.c \ + pthread_mutex_lock.c \ + pthread_mutex_timedlock.c \ + pthread_mutex_unlock.c \ + pthread_mutex_trylock.c + +NONPORTABLE_SRCS = \ + pthread_mutexattr_setkind_np.c \ + pthread_mutexattr_getkind_np.c \ + pthread_getw32threadhandle_np.c \ + pthread_delay_np.c \ + pthread_num_processors_np.c \ + pthread_win32_attach_detach_np.c \ + pthread_timechange_handler_np.c + +PRIVATE_SRCS = \ + ptw32_is_attr.c \ + ptw32_processInitialize.c \ + ptw32_processTerminate.c \ + ptw32_threadStart.c \ + ptw32_threadDestroy.c \ + ptw32_tkAssocCreate.c \ + ptw32_tkAssocDestroy.c \ + ptw32_callUserDestroyRoutines.c \ + ptw32_semwait.c \ + ptw32_relmillisecs.c \ + ptw32_timespec.c \ + ptw32_throw.c \ + ptw32_InterlockedCompareExchange.c \ + ptw32_getprocessors.c + +RWLOCK_SRCS = \ + ptw32_rwlock_check_need_init.c \ + ptw32_rwlock_cancelwrwait.c \ + pthread_rwlock_init.c \ + pthread_rwlock_destroy.c \ + pthread_rwlockattr_init.c \ + pthread_rwlockattr_destroy.c \ + pthread_rwlockattr_getpshared.c \ + pthread_rwlockattr_setpshared.c \ + pthread_rwlock_rdlock.c \ + pthread_rwlock_timedrdlock.c \ + pthread_rwlock_wrlock.c \ + pthread_rwlock_timedwrlock.c \ + pthread_rwlock_unlock.c \ + pthread_rwlock_tryrdlock.c \ + pthread_rwlock_trywrlock.c + +SCHED_SRCS = \ + pthread_attr_setschedpolicy.c \ + pthread_attr_getschedpolicy.c \ + pthread_attr_setschedparam.c \ + pthread_attr_getschedparam.c \ + pthread_attr_setinheritsched.c \ + pthread_attr_getinheritsched.c \ + pthread_setschedparam.c \ + pthread_getschedparam.c \ + sched_get_priority_max.c \ + sched_get_priority_min.c \ + sched_setscheduler.c \ + sched_getscheduler.c \ + sched_yield.c + +SEMAPHORE_SRCS = \ + sem_init.c \ + sem_destroy.c \ + sem_trywait.c \ + sem_timedwait.c \ + sem_wait.c \ + sem_post.c \ + sem_post_multiple.c \ + sem_getvalue.c \ + sem_open.c \ + sem_close.c \ + sem_unlink.c + +SPIN_SRCS = \ + ptw32_spinlock_check_need_init.c \ + pthread_spin_init.c \ + pthread_spin_destroy.c \ + pthread_spin_lock.c \ + pthread_spin_unlock.c \ + pthread_spin_trylock.c + +SYNC_SRCS = \ + pthread_detach.c \ + pthread_join.c + +TSD_SRCS = \ + pthread_key_create.c \ + pthread_key_delete.c \ + pthread_setspecific.c \ + pthread_getspecific.c + + +GCE_DLL = pthreadGCE$(DLL_VER).dll +GCED_DLL= pthreadGCE$(DLL_VERD).dll +GCE_LIB = libpthreadGCE$(DLL_VER).a +GCED_LIB= libpthreadGCE$(DLL_VERD).a +GCE_INLINED_STAMP = pthreadGCE$(DLL_VER).stamp +GCED_INLINED_STAMP = pthreadGCE$(DLL_VERD).stamp + +GC_DLL = pthreadGC$(DLL_VER).dll +GCD_DLL = pthreadGC$(DLL_VERD).dll +GC_LIB = libpthreadGC$(DLL_VER).a +GCD_LIB = libpthreadGC$(DLL_VERD).a +GC_INLINED_STAMP = pthreadGC$(DLL_VER).stamp +GCD_INLINED_STAMP = pthreadGC$(DLL_VERD).stamp +GC_STATIC_STAMP = libpthreadGC$(DLL_VER).stamp +GCD_STATIC_STAMP = libpthreadGC$(DLL_VERD).stamp + +PTHREAD_DEF = pthread.def + +help: + @ echo "Run one of the following command lines:" + @ echo "make clean GC (to build the GNU C dll with C cleanup code)" + @ echo "make clean GCE (to build the GNU C dll with C++ exception handling)" + @ echo "make clean GC-inlined (to build the GNU C inlined dll with C cleanup code)" + @ echo "make clean GCE-inlined (to build the GNU C inlined dll with C++ exception handling)" + @ echo "make clean GC-static (to build the GNU C inlined static lib with C cleanup code)" + @ echo "make clean GC-debug (to build the GNU C debug dll with C cleanup code)" + @ echo "make clean GCE-debug (to build the GNU C debug dll with C++ exception handling)" + @ echo "make clean GC-inlined-debug (to build the GNU C inlined debug dll with C cleanup code)" + @ echo "make clean GCE-inlined-debug (to build the GNU C inlined debug dll with C++ exception handling)" + @ echo "make clean GC-static-debug (to build the GNU C inlined static debug lib with C cleanup code)" + +all: + @ $(MAKE) clean GCE + @ $(MAKE) clean GC + +GC: + $(MAKE) CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_OBJS)" $(GC_DLL) + +GC-debug: + $(MAKE) CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_OBJS)" DLL_VER=$(DLL_VERD) OPT="$(DOPT)" $(GCD_DLL) + +GCE: + $(MAKE) CC=$(CXX) CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_OBJS)" $(GCE_DLL) + +GCE-debug: + $(MAKE) CC=$(CXX) CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_OBJS)" DLL_VER=$(DLL_VERD) OPT="$(DOPT)" $(GCED_DLL) + +GC-inlined: + $(MAKE) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" $(GC_INLINED_STAMP) + +GC-inlined-debug: + $(MAKE) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" DLL_VER=$(DLL_VERD) OPT="$(DOPT)" $(GCD_INLINED_STAMP) + +GCE-inlined: + $(MAKE) CC=$(CXX) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" $(GCE_INLINED_STAMP) + +GCE-inlined-debug: + $(MAKE) CC=$(CXX) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" DLL_VER=$(DLL_VERD) OPT="$(DOPT)" $(GCED_INLINED_STAMP) + +GC-static: + $(MAKE) XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" $(GC_STATIC_STAMP) + +GC-static-debug: + $(MAKE) XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" DLL_VER=$(DLL_VERD) OPT="$(DOPT)" $(GCD_STATIC_STAMP) + +tests: + @ cd tests + @ $(MAKE) auto + +%.pre: %.c + $(CC) -E -o $@ $(CFLAGS) $^ + +%.s: %.c + $(CC) -c $(CFLAGS) -DPTW32_BUILD_INLINED -Wa,-ahl $^ > $@ + +%.o: %.rc + $(RC) $(RCFLAGS) $(CLEANUP) -o $@ $< + +.SUFFIXES: .dll .rc .c .o + +.c.o:; $(CC) -c -o $@ $(CFLAGS) $(XC_FLAGS) $< + + +$(GC_DLL) $(GCD_DLL): $(DLL_OBJS) + $(CC) $(OPT) -shared -o $(GC_DLL) $(DLL_OBJS) $(LFLAGS) + $(DLLTOOL) -z pthread.def $(DLL_OBJS) + $(DLLTOOL) -k --dllname $@ --output-lib $(GC_LIB) --def $(PTHREAD_DEF) + +$(GCE_DLL): $(DLL_OBJS) + $(CC) $(OPT) -mthreads -shared -o $(GCE_DLL) $(DLL_OBJS) $(LFLAGS) + $(DLLTOOL) -z pthread.def $(DLL_OBJS) + $(DLLTOOL) -k --dllname $@ --output-lib $(GCE_LIB) --def $(PTHREAD_DEF) + +$(GC_INLINED_STAMP) $(GCD_INLINED_STAMP): $(DLL_INLINED_OBJS) + $(CC) $(OPT) $(XOPT) -shared -o $(GC_DLL) $(DLL_INLINED_OBJS) $(LFLAGS) + $(DLLTOOL) -z pthread.def $(DLL_INLINED_OBJS) + $(DLLTOOL) -k --dllname $(GC_DLL) --output-lib $(GC_LIB) --def $(PTHREAD_DEF) + echo touched > $(GC_INLINED_STAMP) + +$(GCE_INLINED_STAMP) $(GCED_INLINED_STAMP): $(DLL_INLINED_OBJS) + $(CC) $(OPT) $(XOPT) -mthreads -shared -o $(GCE_DLL) $(DLL_INLINED_OBJS) $(LFLAGS) + $(DLLTOOL) -z pthread.def $(DLL_INLINED_OBJS) + $(DLLTOOL) -k --dllname $(GCE_DLL) --output-lib $(GCE_LIB) --def $(PTHREAD_DEF) + echo touched > $(GCE_INLINED_STAMP) + +$(GC_STATIC_STAMP) $(GCD_STATIC_STAMP): $(DLL_INLINED_OBJS) + $(RM) $(GC_LIB) + $(AR) -rv $(GC_LIB) $(DLL_INLINED_OBJS) + $(RANLIB) $(GC_LIB) + echo touched > $(GC_STATIC_STAMP) + +clean: + -$(RM) *~ + -$(RM) *.i + -$(RM) *.o + -$(RM) *.obj + -$(RM) *.exe + -$(RM) $(PTHREAD_DEF) + +realclean: clean + -$(RM) $(GC_LIB) + -$(RM) $(GCE_LIB) + -$(RM) $(GC_DLL) + -$(RM) $(GCE_DLL) + -$(RM) $(GC_INLINED_STAMP) + -$(RM) $(GCE_INLINED_STAMP) + -$(RM) $(GC_STATIC_STAMP) + -$(RM) $(GCD_LIB) + -$(RM) $(GCED_LIB) + -$(RM) $(GCD_DLL) + -$(RM) $(GCED_DLL) + -$(RM) $(GCD_INLINED_STAMP) + -$(RM) $(GCED_INLINED_STAMP) + -$(RM) $(GCD_STATIC_STAMP) + +attr.o: attr.c $(ATTR_SRCS) $(INCL) +barrier.o: barrier.c $(BARRIER_SRCS) $(INCL) +cancel.o: cancel.c $(CANCEL_SRCS) $(INCL) +condvar.o: condvar.c $(CONDVAR_SRCS) $(INCL) +exit.o: exit.c $(EXIT_SRCS) $(INCL) +misc.o: misc.c $(MISC_SRCS) $(INCL) +mutex.o: mutex.c $(MUTEX_SRCS) $(INCL) +nonportable.o: nonportable.c $(NONPORTABLE_SRCS) $(INCL) +private.o: private.c $(PRIVATE_SRCS) $(INCL) +rwlock.o: rwlock.c $(RWLOCK_SRCS) $(INCL) +sched.o: sched.c $(SCHED_SRCS) $(INCL) +semaphore.o: semaphore.c $(SEMAPHORE_SRCS) $(INCL) +spin.o: spin.c $(SPIN_SRCS) $(INCL) +sync.o: sync.c $(SYNC_SRCS) $(INCL) +tsd.o: tsd.c $(TSD_SRCS) $(INCL) +version.o: version.rc $(INCL) diff --git a/win32/3rdparty/pthreads/MAINTAINERS b/win32/3rdparty/pthreads/MAINTAINERS new file mode 100644 index 000000000..d253c1f69 --- /dev/null +++ b/win32/3rdparty/pthreads/MAINTAINERS @@ -0,0 +1,4 @@ +CVS Repository maintainers + +Ross Johnson rpj@ise.canberra.edu.au +Ben Elliston bje@cygnus.com diff --git a/win32/3rdparty/pthreads/NEWS b/win32/3rdparty/pthreads/NEWS new file mode 100644 index 000000000..18fe54325 --- /dev/null +++ b/win32/3rdparty/pthreads/NEWS @@ -0,0 +1,1110 @@ +RELEASE 2.8.0 +------------- +(2006-12-22) + +General +------- +New bug fixes in this release since 2.7.0 have not been applied to the +version 1.x.x series. It is probably time to drop version 1. + +Testing and verification +------------------------ +This release has not yet been tested on SMP architechtures. All tests pass +on a uni-processor system. + +Bug fixes +--------- +Sem_destroy could return EBUSY even though no threads were waiting on the +semaphore. Other races around invalidating semaphore structs (internally) +have been removed as well. + +New tests +--------- +semaphore5.c - tests the bug fix referred to above. + + +RELEASE 2.7.0 +------------- +(2005-06-04) + +General +------- +All new features in this release have been back-ported in release 1.11.0, +including the incorporation of MCS locks in pthread_once, however, versions +1 and 2 remain incompatible even though they are now identical in +performance and functionality. + +Testing and verification +------------------------ +This release has been tested (passed the test suite) on both uni-processor +and multi-processor systems. +- Tim Theisen + +Bug fixes +--------- +Pthread_once has been re-implemented to remove priority boosting and other +complexity to improve robustness. Races for Win32 handles that are not +recycle-unique have been removed. The general form of pthread_once is now +the same as that suggested earlier by Alexander Terekhov, but instead of the +'named mutex', a queue-based lock has been implemented which has the required +properties of dynamic self initialisation and destruction. This lock is also +efficient. The ABI is unaffected in as much as the size of pthread_once_t has +not changed and PTHREAD_ONCE_INIT has not changed, however, applications that +peek inside pthread_once_t, which is supposed to be opaque, will break. +- Vladimir Kliatchko + +New features +------------ +* Support for Mingw cross development tools added to GNUmakefile. +Mingw cross tools allow building the libraries on Linux. +- Mikael Magnusson + + +RELEASE 2.6.0 +------------- +(2005-05-19) + +General +------- +All of the bug fixes and new features in this release have been +back-ported in release 1.10.0. + +Testing and verification +------------------------ +This release has been tested (passed the test suite) on both uni-processor +and multi-processor systems. Thanks to Tim Theisen at TomoTherapy for +exhaustively running the MP tests and for providing crutial observations +and data when faults are detected. + +Bugs fixed +---------- + +* pthread_detach() now reclaims remaining thread resources if called after +the target thread has terminated. Previously, this routine did nothing in +this case. + +New tests +--------- + +* detach1.c - tests that pthread_detach properly invalidates the target +thread, which indicates that the thread resources have been reclaimed. + + +RELEASE 2.5.0 +------------- +(2005-05-09) + +General +------- + +The package now includes a reference documentation set consisting of +HTML formatted Unix-style manual pages that have been edited for +consistency with Pthreads-w32. The set can also be read online at: +http://sources.redhat.com/pthreads-win32/manual/index.html + +Thanks again to Tim Theisen for running the test suite pre-release +on an MP system. + +All of the bug fixes and new features in this release have been +back-ported in release 1.9.0. + +Bugs fixed +---------- + +* Thread Specific Data (TSD) key management has been ammended to +eliminate a source of (what was effectively) resource leakage (a HANDLE +plus memory for each key destruct routine/thread association). This was +not a true leak because these resources were eventually reclaimed when +pthread_key_delete was run AND each thread referencing the key had exited. +The problem was that these two conditions are often not met until very +late, and often not until the process is about to exit. + +The ammended implementation avoids the need for the problematic HANDLE +and reclaims the memory as soon as either the key is deleted OR the +thread exits, whichever is first. + +Thanks to Richard Hughes at Aculab for identifying and locating the leak. + +* TSD key destructors are now processed up to PTHREAD_DESTRUCTOR_ITERATIONS +times instead of just once. PTHREAD_DESTRUCTOR_ITERATIONS has been +defined in pthread.h for some time but not used. + +* Fix a semaphore accounting race between sem_post/sem_post_multiple +and sem_wait cancellation. This is the same issue as with +sem_timedwait that was fixed in the last release. + +* sem_init, sem_post, and sem_post_multiple now check that the +semaphore count never exceeds _POSIX_SEM_VALUE_MAX. + +* Although sigwait() is nothing more than a no-op, it should at least +be a cancellation point to be consistent with the standard. + +New tests +--------- + +* stress1.c - attempts to expose problems in condition variable +and semaphore timed wait logic. This test was inspired by Stephan +Mueller's sample test code used to identify the sem_timedwait bug +from the last release. It's not a part of the regular test suite +because it can take awhile to run. To run it: +nmake clean VC-stress + +* tsd2.c - tests that key destructors are re-run if the tsd key value is +not NULL after the destructor routine has run. Also tests that +pthread_setspecific() and pthread_getspecific() are callable from +destructors. + + +RELEASE 2.4.0 +------------- +(2005-04-26) + +General +------- + +There is now no plan to release a version 3.0.0 to fix problems in +pthread_once(). Other possible implementations of pthread_once +will still be investigated for a possible future release in an attempt +to reduce the current implementation's complexity. + +All of the bug fixes and new features in this release have been +back-ported for release 1.8.0. + +Bugs fixed +---------- + +* Fixed pthread_once race (failures on an MP system). Thanks to +Tim Theisen for running exhaustive pre-release testing on his MP system +using a range of compilers: + VC++ 6 + VC++ 7.1 + Intel C++ version 8.0 +All tests passed. +Some minor speed improvements were also done. + +* Fix integer overrun error in pthread_mutex_timedlock() - missed when +sem_timedwait() was fixed in release 2.2.0. This routine no longer returns +ENOTSUP when NEED_SEM is defined - it is supported (NEED_SEM is only +required for WinCE versions prior to 3.0). + +* Fix timeout bug in sem_timedwait(). +- Thanks to Stephan Mueller for reporting, providing diagnostic output +and test code. + +* Fix several problems in the NEED_SEM conditionally included code. +NEED_SEM included code is provided for systems that don't implement W32 +semaphores, such as WinCE prior to version 3.0. An alternate implementation +of POSIX semaphores is built using W32 events for these systems when +NEED_SEM is defined. This code has been completely rewritten in this +release to reuse most of the default POSIX semaphore code, and particularly, +to implement all of the sem_* routines supported by pthreads-win32. Tim +Theisen also run the test suite over the NEED_SEM code on his MP system. All +tests passed. + +* The library now builds without errors for the Borland Builder 5.5 compiler. + +New features +------------ + +* pthread_mutex_timedlock() and all sem_* routines provided by +pthreads-win32 are now implemented for WinCE versions prior to 3.0. Those +versions did not implement W32 semaphores. Define NEED_SEM in config.h when +building the library for these systems. + +Known issues in this release +---------------------------- + +* pthread_once is too complicated - but it works as far as testing can +determine.. + +* The Borland version of the dll fails some of the tests with a memory read +exception. The cause is not yet known but a compiler bug has not been ruled +out. + + +RELEASE 2.3.0 +------------- +(2005-04-12) + +General +------- + +Release 1.7.0 is a backport of features and bug fixes new in +this release. See earlier notes under Release 2.0.0/General. + +Bugs fixed +---------- + +* Fixed pthread_once potential for post once_routine cancellation +hanging due to starvation. See comments in pthread_once.c. +Momentary priority boosting is used to ensure that, after a +once_routine is cancelled, the thread that will run the +once_routine is not starved by higher priority waiting threads at +critical times. Priority boosting occurs only AFTER a once_routine +cancellation, and is applied only to that once_control. The +once_routine is run at the thread's normal base priority. + +New tests +--------- + +* once4.c: Aggressively tests pthread_once() under realtime +conditions using threads with varying priorities. Windows' +random priority boosting does not occur for threads with realtime +priority levels. + + +RELEASE 2.2.0 +------------- +(2005-04-04) + +General +------- + +* Added makefile targets to build static link versions of the library. +Both MinGW and MSVC. Please note that this does not imply any change +to the LGPL licensing, which still imposes psecific conditions on +distributing software that has been statically linked with this library. + +* There is a known bug in pthread_once(). Cancellation of the init_routine +exposes a potential starvation (i.e. deadlock) problem if a waiting thread +has a higher priority than the initting thread. This problem will be fixed +in version 3.0.0 of the library. + +Bugs fixed +---------- + +* Fix integer overrun error in sem_timedwait(). +Kevin Lussier + +* Fix preprocessor directives for static linking. +Dimitar Panayotov + + +RELEASE 2.1.0 +------------- +(2005-03-16) + +Bugs fixed +---------- + +* Reverse change to pthread_setcancelstate() in 2.0.0. + + +RELEASE 2.0.0 +------------- +(2005-03-16) + +General +------- + +This release represents an ABI change and the DLL version naming has +incremented from 1 to 2, e.g. pthreadVC2.dll. + +Version 1.4.0 back-ports the new functionality included in this +release. Please distribute DLLs built from that version with updates +to applications built on pthreads-win32 version 1.x.x. + +The package naming has changed, replacing the snapshot date with +the version number + descriptive information. E.g. this +release is "pthreads-w32-2-0-0-release". + +Bugs fixed +---------- + +* pthread_setcancelstate() no longer checks for a pending +async cancel event if the library is using alertable async +cancel. See the README file (Prerequisites section) for info +on adding alertable async cancelation. + +New features +------------ + +* pthread_once() now supports init_routine cancellability. + +New tests +--------- + +* Agressively test pthread_once() init_routine cancellability. + + +SNAPSHOT 2005-03-08 +------------------- +Version 1.3.0 + +Bug reports (fixed) +------------------- + +* Implicitly created threads leave Win32 handles behind after exiting. +- Dmitrii Semii + +* pthread_once() starvation problem. +- Gottlob Frege + +New tests +--------- + +* More intense testing of pthread_once(). + + +SNAPSHOT 2005-01-25 +------------------- +Version 1.2.0 + +Bug fixes +--------- + +* Attempted acquisition of a recursive mutex could cause waiting threads +to not be woken when the mutex was released. +- Ralf Kubis + +* Various package omissions have been fixed. + + +SNAPSHOT 2005-01-03 +------------------- +Version 1.1.0 + +Bug fixes +--------- + +* Unlocking recursive or errorcheck mutexes would sometimes +unexpectedly return an EPERM error (bug introduced in +snapshot-2004-11-03). +- Konstantin Voronkov + + +SNAPSHOT 2004-11-22 +------------------- +Version 1.0.0 + +This snapshot primarily fixes the condvar bug introduced in +snapshot-2004-11-03. DLL versioning has also been included to allow +applications to runtime check the Microsoft compatible DLL version +information, and to extend the DLL naming system for ABI and major +(non-backward compatible) API changes. See the README file for details. + +Bug fixes +--------- + +* Condition variables no longer deadlock (bug introduced in +snapshot-2004-11-03). +- Alexander Kotliarov and Nicolas at saintmac + +* DLL naming extended to avoid 'DLL hell' in the future, and to +accommodate the ABI change introduced in snapshot-2004-11-03. Snapshot +2004-11-03 will be removed from FTP sites. + +New features +------------ + +* A Microsoft-style version resource has been added to the DLL for +applications that wish to check DLL compatibility at runtime. + +* Pthreads-win32 DLL naming has been extended to allow incompatible DLL +versions to co-exist in the same filesystem. See the README file for details, +but briefly: while the version information inside the DLL will change with +each release from now on, the DLL version names will only change if the new +DLL is not backward compatible with older applications. + +The versioning scheme has been borrowed from GNU Libtool, and the DLL +naming scheme is from Cygwin. Provided the Libtool-style numbering rules are +honoured, the Cygwin DLL naming scheme automatcally ensures that DLL name +changes are minimal and that applications will not load an incompatible +pthreads-win32 DLL. + +Those who use the pre-built DLLs will find that the DLL/LIB names have a new +suffix (1) in this snapshot. E.g. pthreadVC1.dll etc. + +* The POSIX thread ID reuse uniqueness feature introduced in the last snapshot +has been kept as default, but the behaviour can now be controlled when the DLL +is built to effectively switch it off. This makes the library much more +sensitive to applications that assume that POSIX thread IDs are unique, i.e. +are not strictly compliant with POSIX. See the PTW32_THREAD_ID_REUSE_INCREMENT +macro comments in config.h for details. + +Other changes +------------- +Certain POSIX macros have changed. + +These changes are intended to conform to the Single Unix Specification version 3, +which states that, if set to 0 (zero) or not defined, then applications may use +sysconf() to determine their values at runtime. Pthreads-win32 does not +implement sysconf(). + +The following macros are no longer undefined, but defined and set to -1 +(not implemented): + + _POSIX_THREAD_ATTR_STACKADDR + _POSIX_THREAD_PRIO_INHERIT + _POSIX_THREAD_PRIO_PROTECT + _POSIX_THREAD_PROCESS_SHARED + +The following macros are defined and set to 200112L (implemented): + + _POSIX_THREADS + _POSIX_THREAD_SAFE_FUNCTIONS + _POSIX_THREAD_ATTR_STACKSIZE + _POSIX_THREAD_PRIORITY_SCHEDULING + _POSIX_SEMAPHORES + _POSIX_READER_WRITER_LOCKS + _POSIX_SPIN_LOCKS + _POSIX_BARRIERS + +The following macros are defined and set to appropriate values: + + _POSIX_THREAD_THREADS_MAX + _POSIX_SEM_VALUE_MAX + _POSIX_SEM_NSEMS_MAX + PTHREAD_DESTRUCTOR_ITERATIONS + PTHREAD_KEYS_MAX + PTHREAD_STACK_MIN + PTHREAD_THREADS_MAX + + +SNAPSHOT 2004-11-03 +------------------- + +DLLs produced from this snapshot cannot be used with older applications without +recompiling the application, due to a change to pthread_t to provide unique POSIX +thread IDs. + +Although this snapshot passes the extended test suite, many of the changes are +fairly major, and some applications may show different behaviour than previously, +so adopt with care. Hopefully, any changed behaviour will be due to the library +being better at it's job, not worse. + +Bug fixes +--------- + +* pthread_create() no longer accepts NULL as the thread reference arg. +A segfault (memory access fault) will result, and no thread will be +created. + +* pthread_barrier_wait() no longer acts as a cancelation point. + +* Fix potential race condition in pthread_once() +- Tristan Savatier + +* Changes to pthread_cond_destroy() exposed some coding weaknesses in several +test suite mini-apps because pthread_cond_destroy() now returns EBUSY if the CV +is still in use. + +New features +------------ + +* Added for compatibility: +PTHREAD_RECURSIVE_MUTEX_INITIALIZER, +PTHREAD_ERRORCHECK_MUTEX_INITIALIZER, +PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, +PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP + +* Initial support for Digital Mars compiler +- Anuj Goyal + +* Faster Mutexes. These have been been rewritten following a model provided by +Alexander Terekhov that reduces kernel space checks, and eliminates some additional +critical sections used to manage a race between timedlock expiration and unlock. +Please be aware that the new mutexes do not enforce strict absolute FIFO scheduling +of mutexes, however any out-of-order lock acquisition should be very rare. + +* Faster semaphores. Following a similar model to mutexes above, these have been +rewritten to use preliminary users space checks. + +* sem_getvalue() now returns the number of waiters. + +* The POSIX thread ID now has much stronger uniqueness characteristics. The library +garrantees not to reuse the same thread ID for at least 2^(wordsize) thread +destruction/creation cycles. + +New tests +--------- + +* semaphore4.c: Tests cancelation of the new sem_wait(). + +* semaphore4t.c: Likewise for sem_timedwait(). + +* rwlock8.c: Tests and times the slow execution paths of r/w locks, and the CVs, +mutexes, and semaphores that they're built on. + + +SNAPSHOT 2004-05-16 +------------------- + +Attempt to add Watcom to the list of compilers that can build the library. +This failed in the end due to it's non-thread-aware errno. The library +builds but the test suite fails. See README.Watcom for more details. + +Bug fixes +--------- +* Bug and memory leak in sem_init() +- Alex Blanco + +* ptw32_getprocessors() now returns CPU count of 1 for WinCE. +- James Ewing + +* pthread_cond_wait() could be canceled at a point where it should not +be cancelable. Fixed. +- Alexander Terekhov + +* sem_timedwait() had an incorrect timeout calculation. +- Philippe Di Cristo + +* Fix a memory leak left behind after threads are destroyed. +- P. van Bruggen + +New features +------------ +* Ported to AMD64. +- Makoto Kato + +* True pre-emptive asynchronous cancelation of threads. This is optional +and requires that Panagiotis E. Hadjidoukas's QueueUserAPCEx package be +installed. This package is included in the pthreads-win32 self-unpacking +Zip archive starting from this snapshot. See the README.txt file inside +the package for installation details. + +Note: If you don't use async cancelation in your application, or don't need +to cancel threads that are blocked on system resources such as network I/O, +then the default non-preemptive async cancelation is probably good enough. +However, pthreads-win32 auto-detects the availability of these components +at run-time, so you don't need to rebuild the library from source if you +change your mind later. + +All of the advice available in books and elsewhere on the undesirability +of using async cancelation in any application still stands, but this +feature is a welcome addition with respect to the library's conformance to +the POSIX standard. + +SNAPSHOT 2003-09-18 +------------------- + +Cleanup of thread priority management. In particular, setting of thread +priority now attempts to map invalid Win32 values within the range returned +by sched_get_priority_min/max() to useful values. See README.NONPORTABLE +under "Thread priority". + +Bug fixes +--------- +* pthread_getschedparam() now returns the priority given by the most recent +call to pthread_setschedparam() or established by pthread_create(), as +required by the standard. Previously, pthread_getschedparam() incorrectly +returned the running thread priority at the time of the call, which may have +been adjusted or temporarily promoted/demoted. + +* sched_get_priority_min() and sched_get_priority_max() now return -1 on error +and set errno. Previously, they incorrectly returned the error value directly. + + +SNAPSHOT 2003-09-04 +------------------- + +Bug fixes +--------- +* ptw32_cancelableWait() now allows cancelation of waiting implicit POSIX +threads. + +New test +-------- +* cancel8.c tests cancelation of Win32 threads waiting at a POSIX cancelation +point. + + +SNAPSHOT 2003-09-03 +------------------- + +Bug fixes +--------- +* pthread_self() would free the newly created implicit POSIX thread handle if +DuplicateHandle failed instead of recycle it (very unlikely). + +* pthread_exit() was neither freeing nor recycling the POSIX thread struct +for implicit POSIX threads. + +New feature - Cancelation of/by Win32 (non-POSIX) threads +--------------------------------------------------------- +Since John Bossom's original implementation, the library has allowed non-POSIX +initialised threads (Win32 threads) to call pthreads-win32 routines and +therefore interact with POSIX threads. This is done by creating an on-the-fly +POSIX thread ID for the Win32 thread that, once created, allows fully +reciprical interaction. This did not extend to thread cancelation (async or +deferred). Now it does. + +Any thread can be canceled by any other thread (Win32 or POSIX) if the former +thread's POSIX pthread_t value is known. It's TSD destructors and POSIX +cleanup handlers will be run before the thread exits with an exit code of +PTHREAD_CANCELED (retrieved with GetExitCodeThread()). + +This allows a Win32 thread to, for example, call POSIX CV routines in the same way +that POSIX threads would/should, with pthread_cond_wait() cancelability and +cleanup handlers (pthread_cond_wait() is a POSIX cancelation point). + +By adding cancelation, Win32 threads should now be able to call all POSIX +threads routines that make sense including semaphores, mutexes, condition +variables, read/write locks, barriers, spinlocks, tsd, cleanup push/pop, +cancelation, pthread_exit, scheduling, etc. + +Note that these on-the-fly 'implicit' POSIX thread IDs are initialised as detached +(not joinable) with deferred cancelation type. The POSIX thread ID will be created +automatically by any POSIX routines that need a POSIX handle (unless the routine +needs a pthread_t as a parameter of course). A Win32 thread can discover it's own +POSIX thread ID by calling pthread_self(), which will create the handle if +necessary and return the pthread_t value. + +New tests +--------- +Test the above new feature. + + +SNAPSHOT 2003-08-19 +------------------- + +This snapshot fixes some accidental corruption to new test case sources. +There are no changes to the library source code. + + +SNAPSHOT 2003-08-15 +------------------- + +Bug fixes +--------- + +* pthread.dsp now uses correct compile flags (/MD). +- Viv + +* pthread_win32_process_detach_np() fixed memory leak. +- Steven Reddie + +* pthread_mutex_destroy() fixed incorrect return code. +- Nicolas Barry + +* pthread_spin_destroy() fixed memory leak. +- Piet van Bruggen + +* Various changes to tighten arg checking, and to work with later versions of +MinGW32 and MsysDTK. + +* pthread_getschedparam() etc, fixed dangerous thread validity checking. +- Nicolas Barry + +* POSIX thread handles are now reused and their memory is not freed on thread exit. +This allows for stronger thread validity checking. + +New standard routine +-------------------- + +* pthread_kill() added to provide thread validity checking to applications. +It does not accept any non zero values for the signal arg. + +New test cases +-------------- + +* New test cases to confirm validity checking, pthread_kill(), and thread reuse. + + +SNAPSHOT 2003-05-10 +------------------- + +Bug fixes +--------- + +* pthread_mutex_trylock() now returns correct error values. +pthread_mutex_destroy() will no longer destroy a recursively locked mutex. +pthread_mutex_lock() is no longer inadvertantly behaving as a cancelation point. +- Thomas Pfaff + +* pthread_mutex_timedlock() no longer occasionally sets incorrect mutex +ownership, causing deadlocks in some applications. +- Robert Strycek and Alexander Terekhov + + +SNAPSHOT 2002-11-04 +------------------- + +Bug fixes +--------- + +* sem_getvalue() now returns the correct value under Win NT and WinCE. +- Rob Fanner + +* sem_timedwait() now uses tighter checks for unreasonable +abstime values - that would result in unexpected timeout values. + +* ptw32_cond_wait_cleanup() no longer mysteriously consumes +CV signals but may produce more spurious wakeups. It is believed +that the sem_timedwait() call is consuming a CV signal that it +shouldn't. +- Alexander Terekhov + +* Fixed a memory leak in ptw32_threadDestroy() for implicit threads. + +* Fixed potential for deadlock in pthread_cond_destroy(). +A deadlock could occur for statically declared CVs (PTHREAD_COND_INITIALIZER), +when one thread is attempting to destroy the condition variable while another +is attempting to dynamically initialize it. +- Michael Johnson + + +SNAPSHOT 2002-03-02 +------------------- + +Cleanup code default style. (IMPORTANT) +---------------------------------------------------------------------- +Previously, if not defined, the cleanup style was determined automatically +from the compiler/language, and one of the following was defined accordingly: + + __CLEANUP_SEH MSVC only + __CLEANUP_CXX C++, including MSVC++, GNU G++ + __CLEANUP_C C, including GNU GCC, not MSVC + +These defines determine the style of cleanup (see pthread.h) and, +most importantly, the way that cancelation and thread exit (via +pthread_exit) is performed (see the routine ptw32_throw() in private.c). + +In short, the exceptions versions of the library throw an exception +when a thread is canceled or exits (via pthread_exit()), which is +caught by a handler in the thread startup routine, so that the +the correct stack unwinding occurs regardless of where the thread +is when it's canceled or exits via pthread_exit(). + +In this and future snapshots, unless the build explicitly defines (e.g. +via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then +the build NOW always defaults to __CLEANUP_C style cleanup. This style +uses setjmp/longjmp in the cancelation and pthread_exit implementations, +and therefore won't do stack unwinding even when linked to applications +that have it (e.g. C++ apps). This is for consistency with most +current commercial Unix POSIX threads implementations. Compaq's TRU64 +may be an exception (no pun intended) and possible future trend. + +Although it was not clearly documented before, it is still necessary to +build your application using the same __CLEANUP_* define as was +used for the version of the library that you link with, so that the +correct parts of pthread.h are included. That is, the possible +defines require the following library versions: + + __CLEANUP_SEH pthreadVSE.dll + __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll + __CLEANUP_C pthreadVC.dll or pthreadGC.dll + +E.g. regardless of whether your app is C or C++, if you link with +pthreadVC.lib or libpthreadGC.a, then you must define __CLEANUP_C. + + +THE POINT OF ALL THIS IS: if you have not been defining one of these +explicitly, then the defaults as described at the top of this +section were being used. + +THIS NOW CHANGES, as has been explained above, but to try to make this +clearer here's an example: + +If you were building your application with MSVC++ i.e. using C++ +exceptions and not explicitly defining one of __CLEANUP_*, then +__CLEANUP_C++ was automatically defined for you in pthread.h. +You should have been linking with pthreadVCE.dll, which does +stack unwinding. + +If you now build your application as you had before, pthread.h will now +automatically set __CLEANUP_C as the default style, and you will need to +link with pthreadVC.dll. Stack unwinding will now NOT occur when a thread +is canceled, or the thread calls pthread_exit(). + +Your application will now most likely behave differently to previous +versions, and in non-obvious ways. Most likely is that locally +instantiated objects may not be destroyed or cleaned up after a thread +is canceled. + +If you want the same behaviour as before, then you must now define +__CLEANUP_C++ explicitly using a compiler option and link with +pthreadVCE.dll as you did before. + + +WHY ARE WE MAKING THE DEFAULT STYLE LESS EXCEPTION-FRIENDLY? +Because no commercial Unix POSIX threads implementation allows you to +choose to have stack unwinding. Therefore, providing it in pthread-win32 +as a default is dangerous. We still provide the choice but unless +you consciously choose to do otherwise, your pthreads applications will +now run or crash in similar ways irrespective of the threads platform +you use. Or at least this is the hope. + + +WHY NOT REMOVE THE EXCEPTIONS VERSIONS OF THE LIBRARY ALTOGETHER? +There are a few reasons: +- because there are well respected POSIX threads people who believe + that POSIX threads implementations should be exceptions aware and + do the expected thing in that context. (There are equally respected + people who believe it should not be easily accessible, if it's there + at all, for unconditional conformity to other implementations.) +- because pthreads-win32 is one of the few implementations that has + the choice, perhaps the only freely available one, and so offers + a laboratory to people who may want to explore the effects; +- although the code will always be around somewhere for anyone who + wants it, once it's removed from the current version it will not be + nearly as visible to people who may have a use for it. + + +Source module splitting +----------------------- +In order to enable smaller image sizes to be generated +for applications that link statically with the library, +most routines have been separated out into individual +source code files. + +This is being done in such a way as to be backward compatible. +The old source files are reused to congregate the individual +routine files into larger translation units (via a bunch of +# includes) so that the compiler can still optimise wherever +possible, e.g. through inlining, which can only be done +within the same translation unit. + +It is also possible to build the entire library by compiling +the single file named "pthread.c", which just #includes all +the secondary congregation source files. The compiler +may be able to use this to do more inlining of routines. + +Although the GNU compiler is able to produce libraries with +the necessary separation (the -ffunction-segments switch), +AFAIK, the MSVC and other compilers don't have this feature. + +Finally, since I use makefiles and command-line compilation, +I don't know what havoc this reorganisation may wreak amongst +IDE project file users. You should be able to continue +using your existing project files without modification. + + +New non-portable functions +-------------------------- +pthread_num_processors_np(): + Returns the number of processors in the system that are + available to the process, as determined from the processor + affinity mask. + +pthread_timechange_handler_np(): + To improve tolerance against operator or time service initiated + system clock changes. + + This routine can be called by an application when it + receives a WM_TIMECHANGE message from the system. At present + it broadcasts all condition variables so that waiting threads + can wake up and re-evaluate their conditions and restart + their timed waits if required. + - Suggested by Alexander Terekhov + + +Platform dependence +------------------- +As Win95 doesn't provide one, the library now contains +it's own InterlockedCompareExchange() routine, which is used +whenever Windows doesn't provide it. InterlockedCompareExchange() +is used to implement spinlocks and barriers, and also in mutexes. +This routine relies on the CMPXCHG machine instruction which +is not available on i386 CPUs. This library (from snapshot +20010712 onwards) is therefore no longer supported on i386 +processor platforms. + + +New standard routines +--------------------- +For source code portability only - rwlocks cannot be process shared yet. + + pthread_rwlockattr_init() + pthread_rwlockattr_destroy() + pthread_rwlockattr_setpshared() + pthread_rwlockattr_getpshared() + +As defined in the new POSIX standard, and the Single Unix Spec version 3: + + sem_timedwait() + pthread_mutex_timedlock() - Alexander Terekhov and Thomas Pfaff + pthread_rwlock_timedrdlock() - adapted from pthread_rwlock_rdlock() + pthread_rwlock_timedwrlock() - adapted from pthread_rwlock_wrlock() + + +pthread.h no longer includes windows.h +-------------------------------------- +[Not yet for G++] + +This was done to prevent conflicts. + +HANDLE, DWORD, and NULL are temporarily defined within pthread.h if +they are not already. + + +pthread.h, sched.h and semaphore.h now use dllexport/dllimport +-------------------------------------------------------------- +Not only to avoid the need for the pthread.def file, but to +improve performance. Apparently, declaring functions with dllimport +generates a direct call to the function and avoids the overhead +of a stub function call. + +Bug fixes +--------- +* Fixed potential NULL pointer dereferences in pthread_mutexattr_init, +pthread_mutexattr_getpshared, pthread_barrierattr_init, +pthread_barrierattr_getpshared, and pthread_condattr_getpshared. +- Scott McCaskill + +* Removed potential race condition in pthread_mutex_trylock and +pthread_mutex_lock; +- Alexander Terekhov + +* The behaviour of pthread_mutex_trylock in relation to +recursive mutexes was inconsistent with commercial implementations. +Trylock would return EBUSY if the lock was owned already by the +calling thread regardless of mutex type. Trylock now increments the +recursion count and returns 0 for RECURSIVE mutexes, and will +return EDEADLK rather than EBUSY for ERRORCHECK mutexes. This is +consistent with Solaris. +- Thomas Pfaff + +* Found a fix for the library and workaround for applications for +the known bug #2, i.e. where __CLEANUP_CXX or __CLEANUP_SEH is defined. +See the "Known Bugs in this snapshot" section below. + +This could be made transparent to applications by replacing the macros that +define the current C++ and SEH versions of pthread_cleanup_push/pop +with the C version, but AFAIK cleanup handlers would not then run in the +correct sequence with destructors and exception cleanup handlers when +an exception occurs. + +* Cancelation once started in a thread cannot now be inadvertantly +double canceled. That is, once a thread begins it's cancelation run, +cancelation is disabled and a subsequent cancel request will +return an error (ESRCH). + +* errno: An incorrect compiler directive caused a local version +of errno to be used instead of the Win32 errno. Both instances are +thread-safe but applications checking errno after a pthreads-win32 +call would be wrong. Fixing this also fixed a bad compiler +option in the testsuite (/MT should have been /MD) which is +needed to link with the correct library MSVCRT.LIB. + + +SNAPSHOT 2001-07-12 +------------------- + +To be added + + +SNAPSHOT 2001-07-03 +------------------- + +To be added + + +SNAPSHOT 2000-08-13 +------------------- + +New: +- Renamed DLL and LIB files: + pthreadVSE.dll (MS VC++/Structured EH) + pthreadVSE.lib + pthreadVCE.dll (MS VC++/C++ EH) + pthreadVCE.lib + pthreadGCE.dll (GNU G++/C++ EH) + libpthreadw32.a + + Both your application and the pthread dll should use the + same exception handling scheme. + +Bugs fixed: +- MSVC++ C++ exception handling. + +Some new tests have been added. + + +SNAPSHOT 2000-08-10 +------------------- + +New: +- asynchronous cancelation on X86 (Jason Nye) +- Makefile compatible with MS nmake to replace + buildlib.bat +- GNUmakefile for Mingw32 +- tests/Makefile for MS nmake replaces runall.bat +- tests/GNUmakefile for Mingw32 + +Bugs fixed: +- kernel32 load/free problem +- attempt to hide internel exceptions from application + exception handlers (__try/__except and try/catch blocks) +- Win32 thread handle leakage bug + (David Baggett/Paul Redondo/Eyal Lebedinsky) + +Some new tests have been added. + + +SNAPSHOT 1999-11-02 +------------------- + +Bugs fixed: +- ctime_r macro had an incorrect argument (Erik Hensema), +- threads were not being created + PTHREAD_CANCEL_DEFERRED. This should have + had little effect as deferred is the only + supported type. (Ross Johnson). + +Some compatibility improvements added, eg. +- pthread_setcancelstate accepts NULL pointer + for the previous value argument. Ditto for + pthread_setcanceltype. This is compatible + with Solaris but should not affect + standard applications (Erik Hensema) + +Some new tests have been added. + + +SNAPSHOT 1999-10-17 +------------------- + +Bug fix - Cancelation of threads waiting on condition variables +now works properly (Lorin Hochstein and Peter Slacik) + + +SNAPSHOT 1999-08-12 +------------------- + +Fixed exception stack cleanup if calling pthread_exit() +- (Lorin Hochstein and John Bossom). + +Fixed bugs in condition variables - (Peter Slacik): + - additional contention checks + - properly adjust number of waiting threads after timed + condvar timeout. + + +SNAPSHOT 1999-05-30 +------------------- + +Some minor bugs have been fixed. See the ChangeLog file for details. + +Some more POSIX 1b functions are now included but ony return an +error (ENOSYS) if called. They are: + + sem_open + sem_close + sem_unlink + sem_getvalue + + +SNAPSHOT 1999-04-07 +------------------- + +Some POSIX 1b functions which were internally supported are now +available as exported functions: + + sem_init + sem_destroy + sem_wait + sem_trywait + sem_post + sched_yield + sched_get_priority_min + sched_get_priority_max + +Some minor bugs have been fixed. See the ChangeLog file for details. + + +SNAPSHOT 1999-03-16 +------------------- + +Initial release. + diff --git a/win32/3rdparty/pthreads/Nmakefile b/win32/3rdparty/pthreads/Nmakefile new file mode 100644 index 000000000..e6c74dd71 --- /dev/null +++ b/win32/3rdparty/pthreads/Nmakefile @@ -0,0 +1,24 @@ +/* + * nmake file for uwin pthread library + */ + +VERSION = - +CCFLAGS = -V -g $(CC.DLL) +HAVE_CONFIG_H == 1 +_MT == 1 +_timeb == timeb +_ftime == ftime +_errno == _ast_errno + +$(INCLUDEDIR) :INSTALLDIR: pthread.h sched.h + +pthread $(VERSION) :LIBRARY: attr.c barrier.c cancel.c cleanup.c condvar.c \ + create.c dll.c exit.c fork.c global.c misc.c mutex.c private.c \ + rwlock.c sched.c semaphore.c spin.c sync.c tsd.c nonportable.c + +:: ANNOUNCE CONTRIBUTORS COPYING.LIB ChangeLog FAQ GNUmakefile MAINTAINERS \ + Makefile Makefile.in Makefile.vc NEWS PROGRESS README README.WinCE \ + TODO WinCE-PORT install-sh errno.c tests tests.mk acconfig.h \ + config.guess config.h.in config.sub configure configure.in signal.c \ + README.CV README.NONPORTABLE pthread.dsp pthread.dsw + diff --git a/win32/3rdparty/pthreads/Nmakefile.tests b/win32/3rdparty/pthreads/Nmakefile.tests new file mode 100644 index 000000000..203560b6c --- /dev/null +++ b/win32/3rdparty/pthreads/Nmakefile.tests @@ -0,0 +1,260 @@ +/* for running tests */ +CCFLAGS = -g +_MT == 1 +_timeb == timeb +_ftime == ftime + +.SOURCE: tests +/* +:PACKAGE: pthread +*/ + +set keepgoing + +":test:" : .MAKE .OPERATOR + local I + $(<:D:B:S=.pass) : .IMPLICIT $(>:D:B:S=.pass) + for I $(<) $(>) + $(I:D:B:S=.pass) : .VIRTUAL .FORCE $(I) + $(>) + end +sizes:: sizes.c +loadfree:: loadfree.c +mutex1:: mutex1.c +mutex1e:: mutex1e.c +mutex1n:: mutex1n.c +mutex1r:: mutex1r.c +mutex2:: mutex2.c +mutex2r:: mutex2r.c +mutex2e:: mutex2e.c +exit1:: exit1.c +condvar1:: condvar1.c +condvar1_1:: condvar1_1.c +condvar1_2:: condvar1_2.c +self1:: self1.c +condvar2:: condvar2.c +condvar2_1:: condvar2_1.c +condvar3_1:: condvar3_1.c +condvar3_2:: condvar3_2.c +condvar3_3:: condvar3_3.c +create1.:: create1.c +create2.:: create2.c +cancel1:: cancel1.c +cancel2:: cancel2.c +mutex3:: mutex3.c +mutex3r:: mutex3r.c +mutex3e:: mutex3e.c +mutex4:: mutex4.c +mutex5:: mutex5.c +mutex6:: mutex6.c +mutex6e:: mutex6e.c +mutex6n:: mutex6n.c +mutex6r:: mutex6r.c +mutex7:: mutex7.c +mutex6s:: mutex6s.c +mutex6rs:: mutex6rs.c +mutex6es:: mutex6es.c +mutex7e:: mutex7e.c +mutex7n:: mutex7n.c +mutex7r:: mutex7r.c +mutex8:: mutex8.c +mutex8e:: mutex8e.c +mutex8n:: mutex8n.c +mutex8r:: mutex8r.c +equal1:: equal1.c +exit2:: exit2.c +exit3:: exit3.c +exit4:: exit4.c +exit5:: exit5.c +join0:: join0.c +join1:: join1.c +join2:: join2.c +join3:: join3.c +kill1:: kill1.c +count1:: count1.c +once1:: once1.c +tsd1:: tsd1.c +self2:: self2.c +eyal1:: eyal1.c +condvar3:: condvar3.c +condvar4:: condvar4.c +condvar5:: condvar5.c +condvar6:: condvar6.c +condvar7:: condvar7.c +condvar8:: condvar8.c +condvar9:: condvar9.c +errno1:: errno1.c +reuse1.:: reuse1.c +reuse2.:: reuse2.c +rwlock1:: rwlock1.c +rwlock2:: rwlock2.c +rwlock3:: rwlock3.c +rwlock4:: rwlock4.c +rwlock5:: rwlock5.c +rwlock6:: rwlock6.c +rwlock7:: rwlock7.c +rwlock8:: rwlock8.c +rwlock2_t:: rwlock2_t.c +rwlock3_t:: rwlock3_t.c +rwlock4_t:: rwlock4_t.c +rwlock5_t:: rwlock5_t.c +rwlock6_t:: rwlock6_t.c +rwlock6_t2:: rwlock6_t2.c +semaphore1:: semaphore1.c +semaphore2:: semaphore2.c +semaphore3:: semaphore3.c +context1:: context1.c +cancel3:: cancel3.c +cancel4:: cancel4.c +cancel5:: cancel5.c +cancel6a:: cancel6a.c +cancel6d:: cancel6d.c +cancel7:: cancel7.c +cleanup0:: cleanup0.c +cleanup1:: cleanup1.c +cleanup2:: cleanup2.c +cleanup3:: cleanup3.c +priority1:: priority1.c +priority2:: priority2.c +inherit1:: inherit1.c +spin1:: spin1.c +spin2:: spin2.c +spin3:: spin3.c +spin4:: spin4.c +barrier1:: barrier1.c +barrier2:: barrier2.c +barrier3:: barrier3.c +barrier4:: barrier4.c +barrier5:: barrier5.c +exception1:: exception1.c +exception2:: exception2.c +exception3:: exception3.c +benchtest1:: benchtest1.c +benchtest2:: benchtest2.c +benchtest3:: benchtest3.c +benchtest4:: benchtest4.c +benchtest5:: benchtest5.c +valid1:: valid1.c +valid2:: valid2.c +cancel9:: cancel9.c + +sizes: :test: sizes +loadfree: :test: +mutex5 :test: loadfree +mutex1 :test: loadfree +mutex1n :test: loadfree +mutex1r :test: loadfree +mutex1e :test: loadfree +semaphore1 :test: loadfree +semaphore2 :test: loadfree +semaphore3 :test: loadfree +mutex2 :test: loadfree +mutex2r :test: loadfree +mutex2e :test: loadfree +exit1 :test: loadfree +condvar1 :test: loadfree +kill1 :test: loadfree +condvar1_1 :test: condvar1 +condvar1_2 :test: join2 +self1 :test: loadfree +condvar2 :test: condvar1 +condvar2_1 :test: condvar2 +create1 :test: mutex2 +create2 :test: create1 +reuse1 :test: create2 +reuse2 :test: reuse1 +cancel1 :test: create1 +cancel2 :test: cancel1 +mutex3 :test: create1 +mutex3r :test: create1 +mutex3e :test: create1 +mutex4 :test: mutex3 +mutex6 :test: mutex4 +mutex6n :test: mutex4 +mutex6e :test: mutex4 +mutex6r :test: mutex4 +mutex6s :test: mutex6 +mutex6rs :test: mutex6r +mutex6es :test: mutex6e +mutex7 :test: mutex6 +mutex7n :test: mutex6n +mutex7e :test: mutex6e +mutex7r :test: mutex6r +mutex8 :test: mutex7 +mutex8n :test: mutex7n +mutex8e :test: mutex7e +mutex8r :test: mutex7r +equal1 :test: create1 +exit2 :test: create1 +exit3 :test: create1 +exit4 :test: kill1 +exit5 :test: exit4 +join0 :test: create1 +join1 :test: create1 +join2 :test: create1 +join3 :test: join2 +count1 :test: join1 +once1 :test: create1 +tsd1 :test: join1 +self2 :test: create1 +eyal1 :test: tsd1 +condvar3 :test: create1 +condvar3_1 :test: condvar3 +condvar3_2 :test: condvar3_1 +condvar3_3 :test: condvar3_2 +condvar4 :test: create1 +condvar5 :test: condvar4 +condvar6 :test: condvar5 +condvar7 :test: condvar6 cleanup1 +condvar8 :test: condvar7 +condvar9 :test: condvar8 +errno1 :test: mutex3 +rwlock1 :test: condvar6 +rwlock2 :test: rwlock1 +rwlock3 :test: rwlock2 +rwlock4 :test: rwlock3 +rwlock5 :test: rwlock4 +rwlock6 :test: rwlock5 +rwlock7 :test: rwlock6 +rwlock8 :test: rwlock7 +rwlock2_t :test: rwlock2 +rwlock3_t :test: rwlock2_t +rwlock4_t :test: rwlock3_t +rwlock5_t :test: rwlock4_t +rwlock6_t :test: rwlock5_t +rwlock6_t2 :test: rwlock6_t +context1 :test: cancel2 +cancel3 :test: context1 +cancel4 :test: cancel3 +cancel5 :test: cancel3 +cancel6a :test: cancel3 +cancel6d :test: cancel3 +cancel7 :test: kill1 +cleanup0 :test: cancel5 +cleanup1 :test: cleanup0 +cleanup2 :test: cleanup1 +cleanup3 :test: cleanup2 +priority1 :test: join1 +priority2 :test: priority1 +inherit1 :test: join1 +spin1 :test: +spin2 :test: spin1.c +spin3 :test: spin2.c +spin4 :test: spin3.c +barrier1 :test: +barrier2 :test: barrier1.c +barrier3 :test: barrier2.c +barrier4 :test: barrier3.c +barrier5 :test: barrier4.c +benchtest1 :test: mutex3 +benchtest2 :test: benchtest1 +benchtest3 :test: benchtest2 +benchtest4 :test: benchtest3 +benchtest5 :test: benchtest4 +exception1 :test: cancel4 +exception2 :test: exception1 +exception3 :test: exception2 +exit4 :test: exit3 +valid1 :test: join1 +valid2 :test: valid1 +cancel9 :test: cancel8 diff --git a/win32/3rdparty/pthreads/PROGRESS b/win32/3rdparty/pthreads/PROGRESS new file mode 100644 index 000000000..9abf0bca4 --- /dev/null +++ b/win32/3rdparty/pthreads/PROGRESS @@ -0,0 +1,4 @@ +Please see the ANNOUNCE file "Level of Standards Conformance" +or the web page: + +http://sources.redhat.com/pthreads-win32/conformance.html diff --git a/win32/3rdparty/pthreads/README b/win32/3rdparty/pthreads/README new file mode 100644 index 000000000..564933302 --- /dev/null +++ b/win32/3rdparty/pthreads/README @@ -0,0 +1,593 @@ +PTHREADS-WIN32 +============== + +Pthreads-win32 is free software, distributed under the GNU Lesser +General Public License (LGPL). See the file 'COPYING.LIB' for terms +and conditions. Also see the file 'COPYING' for information +specific to pthreads-win32, copyrights and the LGPL. + + +What is it? +----------- + +Pthreads-win32 is an Open Source Software implementation of the +Threads component of the POSIX 1003.1c 1995 Standard (or later) +for Microsoft's Win32 environment. Some functions from POSIX +1003.1b are also supported including semaphores. Other related +functions include the set of read-write lock functions. The +library also supports some of the functionality of the Open +Group's Single Unix specification, version 2, namely mutex types, +plus some common and pthreads-win32 specific non-portable +routines (see README.NONPORTABLE). + +See the file "ANNOUNCE" for more information including standards +conformance details and the list of supported and unsupported +routines. + + +Prerequisites +------------- +MSVC or GNU C (MinGW32 MSys development kit) + To build from source. + +QueueUserAPCEx by Panagiotis E. Hadjidoukas + For true async cancelation of threads (including blocked threads). + This is a DLL and Windows driver that provides pre-emptive APC + by forcing threads into an alertable state when the APC is queued. + Both the DLL and driver are provided with the pthreads-win32.exe + self-unpacking ZIP, and on the pthreads-win32 FTP site (in source + and pre-built forms). Currently this is a separate LGPL package to + pthreads-win32. See the README in the QueueUserAPCEx folder for + installation instructions. + + Pthreads-win32 will automatically detect if the QueueUserAPCEx DLL + QuserEx.DLL is available and whether the driver AlertDrv.sys is + loaded. If it is not available, pthreads-win32 will simulate async + cancelation, which means that it can async cancel only threads that + are runnable. The simulated async cancellation cannot cancel blocked + threads. + + +Library naming +-------------- + +Because the library is being built using various exception +handling schemes and compilers - and because the library +may not work reliably if these are mixed in an application, +each different version of the library has it's own name. + +Note 1: the incompatibility is really between EH implementations +of the different compilers. It should be possible to use the +standard C version from either compiler with C++ applications +built with a different compiler. If you use an EH version of +the library, then you must use the same compiler for the +application. This is another complication and dependency that +can be avoided by using only the standard C library version. + +Note 2: if you use a standard C pthread*.dll with a C++ +application, then any functions that you define that are +intended to be called via pthread_cleanup_push() must be +__cdecl. + +Note 3: the intention was to also name either the VC or GC +version (it should be arbitrary) as pthread.dll, including +pthread.lib and libpthread.a as appropriate. This is no longer +likely to happen. + +Note 4: the compatibility number was added so that applications +can differentiate between binary incompatible versions of the +libs and dlls. + +In general: + pthread[VG]{SE,CE,C}c.dll + pthread[VG]{SE,CE,C}c.lib + +where: + [VG] indicates the compiler + V - MS VC, or + G - GNU C + + {SE,CE,C} indicates the exception handling scheme + SE - Structured EH, or + CE - C++ EH, or + C - no exceptions - uses setjmp/longjmp + + c - DLL compatibility number indicating ABI and API + compatibility with applications built against + any snapshot with the same compatibility number. + See 'Version numbering' below. + +The name may also be suffixed by a 'd' to indicate a debugging version +of the library. E.g. pthreadVC2d.lib. Debugging versions contain +additional information for debugging (symbols etc) and are often not +optimised in any way (compiled with optimisation turned off). + +For example: + pthreadVSE.dll (MSVC/SEH) + pthreadGCE.dll (GNUC/C++ EH) + pthreadGC.dll (GNUC/not dependent on exceptions) + pthreadVC1.dll (MSVC/not dependent on exceptions - not binary + compatible with pthreadVC.dll) + pthreadVC2.dll (MSVC/not dependent on exceptions - not binary + compatible with pthreadVC1.dll or pthreadVC.dll) + +The GNU library archive file names have correspondingly changed to: + + libpthreadGCEc.a + libpthreadGCc.a + + +Versioning numbering +-------------------- + +Version numbering is separate from the snapshot dating system, and +is the canonical version identification system embedded within the +DLL using the Microsoft version resource system. The versioning +system chosen follows the GNU Libtool system. See +http://www.gnu.org/software/libtool/manual.html section 6.2. + +See the resource file 'version.rc'. + +Microsoft version numbers use 4 integers: + + 0.0.0.0 + +Pthreads-win32 uses the first 3 following the Libtool convention. +The fourth is commonly used for the build number, but will be reserved +for future use. + + current.revision.age.0 + +The numbers are changed as follows: + +1. If the library source code has changed at all since the last update, + then increment revision (`c:r:a' becomes `c:r+1:a'). +2. If any interfaces have been added, removed, or changed since the last + update, increment current, and set revision to 0. +3. If any interfaces have been added since the last public release, then + increment age. +4. If any interfaces have been removed or changed since the last public + release, then set age to 0. + + +DLL compatibility numbering is an attempt to ensure that applications +always load a compatible pthreads-win32 DLL by using a DLL naming system +that is consistent with the version numbering system. It also allows +older and newer DLLs to coexist in the same filesystem so that older +applications can continue to be used. For pre .NET Windows systems, +this inevitably requires incompatible versions of the same DLLs to have +different names. + +Pthreads-win32 has adopted the Cygwin convention of appending a single +integer number to the DLL name. The number used is based on the library +version number and is computed as 'current' - 'age'. + +(See http://home.att.net/~perlspinr/libversioning.html for a nicely +detailed explanation.) + +Using this method, DLL name/s will only change when the DLL's +backwards compatibility changes. Note that the addition of new +'interfaces' will not of itself change the DLL's compatibility for older +applications. + + +Which of the several dll versions to use? +----------------------------------------- +or, +--- +What are all these pthread*.dll and pthread*.lib files? +------------------------------------------------------- + +Simple, use either pthreadGCv.* if you use GCC, or pthreadVCv.* if you +use MSVC - where 'v' is the DLL versioning (compatibility) number. + +Otherwise, you need to choose carefully and know WHY. + +The most important choice you need to make is whether to use a +version that uses exceptions internally, or not. There are versions +of the library that use exceptions as part of the thread +cancelation and exit implementation. The default version uses +setjmp/longjmp. + +There is some contension amongst POSIX threads experts as +to how POSIX threads cancelation and exit should work +with languages that use exceptions, e.g. C++ and even C +(Microsoft's Structured Exceptions). + +The issue is: should cancelation of a thread in, say, +a C++ application cause object destructors and C++ exception +handlers to be invoked as the stack unwinds during thread +exit, or not? + +There seems to be more opinion in favour of using the +standard C version of the library (no EH) with C++ applications +for the reason that this appears to be the assumption commercial +pthreads implementations make. Therefore, if you use an EH version +of pthreads-win32 then you may be under the illusion that +your application will be portable, when in fact it is likely to +behave differently when linked with other pthreads libraries. + +Now you may be asking: then why have you kept the EH versions of +the library? + +There are a couple of reasons: +- there is division amongst the experts and so the code may + be needed in the future. Yes, it's in the repository and we + can get it out anytime in the future, but it would be difficult + to find. +- pthreads-win32 is one of the few implementations, and possibly + the only freely available one, that has EH versions. It may be + useful to people who want to play with or study application + behaviour under these conditions. + +Notes: + +[If you use either pthreadVCE or pthreadGCE] + +1. [See also the discussion in the FAQ file - Q2, Q4, and Q5] + +If your application contains catch(...) blocks in your POSIX +threads then you will need to replace the "catch(...)" with the macro +"PtW32Catch", eg. + + #ifdef PtW32Catch + PtW32Catch { + ... + } + #else + catch(...) { + ... + } + #endif + +Otherwise neither pthreads cancelation nor pthread_exit() will work +reliably when using versions of the library that use C++ exceptions +for cancelation and thread exit. + +This is due to what is believed to be a C++ compliance error in VC++ +whereby you may not have multiple handlers for the same exception in +the same try/catch block. GNU G++ doesn't have this restriction. + + +Other name changes +------------------ + +All snapshots prior to and including snapshot 2000-08-13 +used "_pthread_" as the prefix to library internal +functions, and "_PTHREAD_" to many library internal +macros. These have now been changed to "ptw32_" and "PTW32_" +respectively so as to not conflict with the ANSI standard's +reservation of identifiers beginning with "_" and "__" for +use by compiler implementations only. + +If you have written any applications and you are linking +statically with the pthreads-win32 library then you may have +included a call to _pthread_processInitialize. You will +now have to change that to ptw32_processInitialize. + + +Cleanup code default style +-------------------------- + +Previously, if not defined, the cleanup style was determined automatically +from the compiler used, and one of the following was defined accordingly: + + __CLEANUP_SEH MSVC only + __CLEANUP_CXX C++, including MSVC++, GNU G++ + __CLEANUP_C C, including GNU GCC, not MSVC + +These defines determine the style of cleanup (see pthread.h) and, +most importantly, the way that cancelation and thread exit (via +pthread_exit) is performed (see the routine ptw32_throw()). + +In short, the exceptions versions of the library throw an exception +when a thread is canceled, or exits via pthread_exit(). This exception is +caught by a handler in the thread startup routine, so that the +the correct stack unwinding occurs regardless of where the thread +is when it's canceled or exits via pthread_exit(). + +In this snapshot, unless the build explicitly defines (e.g. via a +compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then +the build NOW always defaults to __CLEANUP_C style cleanup. This style +uses setjmp/longjmp in the cancelation and pthread_exit implementations, +and therefore won't do stack unwinding even when linked to applications +that have it (e.g. C++ apps). This is for consistency with most/all +commercial Unix POSIX threads implementations. + +Although it was not clearly documented before, it is still necessary to +build your application using the same __CLEANUP_* define as was +used for the version of the library that you link with, so that the +correct parts of pthread.h are included. That is, the possible +defines require the following library versions: + + __CLEANUP_SEH pthreadVSE.dll + __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll + __CLEANUP_C pthreadVC.dll or pthreadGC.dll + +It is recommended that you let pthread.h use it's default __CLEANUP_C +for both library and application builds. That is, don't define any of +the above, and then link with pthreadVC.lib (MSVC or MSVC++) and +libpthreadGC.a (MinGW GCC or G++). The reason is explained below, but +another reason is that the prebuilt pthreadVCE.dll is currently broken. +Versions built with MSVC++ later than version 6 may not be broken, but I +can't verify this yet. + +WHY ARE WE MAKING THE DEFAULT STYLE LESS EXCEPTION-FRIENDLY? +Because no commercial Unix POSIX threads implementation allows you to +choose to have stack unwinding. Therefore, providing it in pthread-win32 +as a default is dangerous. We still provide the choice but unless +you consciously choose to do otherwise, your pthreads applications will +now run or crash in similar ways irrespective of the pthreads platform +you use. Or at least this is the hope. + + +Building under VC++ using C++ EH, Structured EH, or just C +---------------------------------------------------------- + +From the source directory run nmake without any arguments to list +help information. E.g. + +$ nmake + +Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 +Copyright (C) Microsoft Corp 1988-1998. All rights reserved. + +Run one of the following command lines: +nmake clean VCE (to build the MSVC dll with C++ exception handling) +nmake clean VSE (to build the MSVC dll with structured exception handling) +nmake clean VC (to build the MSVC dll with C cleanup code) +nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) +nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) +nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) +nmake clean VC-static (to build the MSVC static lib with C cleanup code) +nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) +nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) +nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) +nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) +nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) +nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) +nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) + + +The pre-built dlls are normally built using the *-inlined targets. + +You can run the testsuite by changing to the "tests" directory and +running nmake. E.g.: + +$ cd tests +$ nmake + +Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 +Copyright (C) Microsoft Corp 1988-1998. All rights reserved. + +Run one of the following command lines: +nmake clean VC (to test using VC dll with VC (no EH) applications) +nmake clean VCX (to test using VC dll with VC++ (EH) applications) +nmake clean VCE (to test using the VCE dll with VC++ EH applications) +nmake clean VSE (to test using VSE dll with VC (SEH) applications) +nmake clean VC-bench (to benchtest using VC dll with C bench app) +nmake clean VCX-bench (to benchtest using VC dll with C++ bench app) +nmake clean VCE-bench (to benchtest using VCE dll with C++ bench app) +nmake clean VSE-bench (to benchtest using VSE dll with SEH bench app) +nmake clean VC-static (to test using VC static lib with VC (no EH) applications) + + +Building under Mingw32 +---------------------- + +The dll can be built easily with recent versions of Mingw32. +(The distributed versions are built using Mingw32 and MsysDTK +from www.mingw32.org.) + +From the source directory, run make for help information. E.g.: + +$ make +Run one of the following command lines: +make clean GC (to build the GNU C dll with C cleanup code) +make clean GCE (to build the GNU C dll with C++ exception handling) +make clean GC-inlined (to build the GNU C inlined dll with C cleanup code) +make clean GCE-inlined (to build the GNU C inlined dll with C++ exception handling) +make clean GC-static (to build the GNU C inlined static lib with C cleanup code) +make clean GC-debug (to build the GNU C debug dll with C cleanup code) +make clean GCE-debug (to build the GNU C debug dll with C++ exception handling) +make clean GC-inlined-debug (to build the GNU C inlined debug dll with C cleanup code) +make clean GCE-inlined-debug (to build the GNU C inlined debug dll with C++ exception handling) +make clean GC-static-debug (to build the GNU C inlined static debug lib with C cleanup code) + + +The pre-built dlls are normally built using the *-inlined targets. + +You can run the testsuite by changing to the "tests" directory and +running make for help information. E.g.: + +$ cd tests +$ make +Run one of the following command lines: +make clean GC (to test using GC dll with C (no EH) applications) +make clean GCX (to test using GC dll with C++ (EH) applications) +make clean GCE (to test using GCE dll with C++ (EH) applications) +make clean GC-bench (to benchtest using GNU C dll with C cleanup code) +make clean GCE-bench (to benchtest using GNU C dll with C++ exception handling) +make clean GC-static (to test using GC static lib with C (no EH) applications) + + +Building under Linux using the Mingw32 cross development tools +-------------------------------------------------------------- + +You can build the library without leaving Linux by using the Mingw32 cross +development toolchain. See http://www.libsdl.org/extras/win32/cross/ for +tools and info. The GNUmakefile contains some support for this, for example: + +make CROSS=i386-mingw32msvc- clean GC-inlined + +will build pthreadGCn.dll and libpthreadGCn.a (n=version#), provided your +cross-tools/bin directory is in your PATH (or use the cross-make.sh script +at the URL above). + + +Building the library as a statically linkable library +----------------------------------------------------- + +General: PTW32_STATIC_LIB must be defined for both the library build and the +application build. The makefiles supplied and used by the following 'make' +command lines will define this for you. + +MSVC (creates pthreadVCn.lib as a static link lib): + +nmake clean VC-static + + +MinGW32 (creates libpthreadGCn.a as a static link lib): + +make clean GC-static + + +Define PTW32_STATIC_LIB when building your application. Also, your +application must call a two non-portable routines to initialise the +some state on startup and cleanup before exit. One other routine needs +to be called to cleanup after any Win32 threads have called POSIX API +routines. See README.NONPORTABLE or the html reference manual pages for +details on these routines: + +BOOL pthread_win32_process_attach_np (void); +BOOL pthread_win32_process_detach_np (void); +BOOL pthread_win32_thread_attach_np (void); // Currently a no-op +BOOL pthread_win32_thread_detach_np (void); + + +The tests makefiles have the same targets but only check that the +static library is statically linkable. They don't run the full +testsuite. To run the full testsuite, build the dlls and run the +dll test targets. + + +Building the library under Cygwin +--------------------------------- + +Cygwin is implementing it's own POSIX threads routines and these +will be the ones to use if you develop using Cygwin. + + +Ready to run binaries +--------------------- + +For convenience, the following ready-to-run files can be downloaded +from the FTP site (see under "Availability" below): + + pthread.h + semaphore.h + sched.h + pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp + pthreadVC.lib + pthreadVCE.dll - built with MSVC++ compiler using C++ EH + pthreadVCE.lib + pthreadVSE.dll - built with MSVC compiler using SEH + pthreadVSE.lib + pthreadGC.dll - built with Mingw32 GCC + libpthreadGC.a - derived from pthreadGC.dll + pthreadGCE.dll - built with Mingw32 G++ + libpthreadGCE.a - derived from pthreadGCE.dll + +As of August 2003 pthreads-win32 pthreadG* versions are built and tested +using the MinGW + MsysDTK environment current as of that date or later. +The following file MAY be needed for older MinGW environments. + + gcc.dll - needed to build and run applications that use + pthreadGCE.dll. + + +Building applications with GNU compilers +---------------------------------------- + +If you're using pthreadGC.dll: + +With the three header files, pthreadGC.dll and libpthreadGC.a in the +same directory as your application myapp.c, you could compile, link +and run myapp.c under Mingw32 as follows: + + gcc -o myapp.exe myapp.c -I. -L. -lpthreadGC + myapp + +Or put pthreadGC.dll in an appropriate directory in your PATH, +put libpthreadGC.a in your system lib directory, and +put the three header files in your system include directory, +then use: + + gcc -o myapp.exe myapp.c -lpthreadGC + myapp + + +If you're using pthreadGCE.dll: + +With the three header files, pthreadGCE.dll, gcc.dll and libpthreadGCE.a +in the same directory as your application myapp.c, you could compile, +link and run myapp.c under Mingw32 as follows: + + gcc -x c++ -o myapp.exe myapp.c -I. -L. -lpthreadGCE + myapp + +Or put pthreadGCE.dll and gcc.dll in an appropriate directory in +your PATH, put libpthreadGCE.a in your system lib directory, and +put the three header files in your system include directory, +then use: + + gcc -x c++ -o myapp.exe myapp.c -lpthreadGCE + myapp + + +Availability +------------ + +The complete source code in either unbundled, self-extracting +Zip file, or tar/gzipped format can be found at: + + ftp://sources.redhat.com/pub/pthreads-win32 + +The pre-built DLL, export libraries and matching pthread.h can +be found at: + + ftp://sources.redhat.com/pub/pthreads-win32/dll-latest + +Home page: + + http://sources.redhat.com/pthreads-win32/ + + +Mailing list +------------ + +There is a mailing list for discussing pthreads on Win32. +To join, send email to: + + pthreads-win32-subscribe@sources.redhat.com + +Unsubscribe by sending mail to: + + pthreads-win32-unsubscribe@sources.redhat.com + + +Acknowledgements +---------------- + +See the ANNOUNCE file for acknowledgements. +See the 'CONTRIBUTORS' file for the list of contributors. + +As much as possible, the ChangeLog file attributes +contributions and patches that have been incorporated +in the library to the individuals responsible. + +Finally, thanks to all those who work on and contribute to the +POSIX and Single Unix Specification standards. The maturity of an +industry can be measured by it's open standards. + +---- +Ross Johnson + + + + + + + + + diff --git a/win32/3rdparty/pthreads/README.Borland b/win32/3rdparty/pthreads/README.Borland new file mode 100644 index 000000000..a130d2bd2 --- /dev/null +++ b/win32/3rdparty/pthreads/README.Borland @@ -0,0 +1,57 @@ +In ptw32_InterlockedCompareExchange.c, I've added a section for +Borland's compiler; it's identical to that for the MS compiler except +that it uses /* ... */ comments instead of ; comments. + +[RPJ: need to define HAVE_TASM32 in config.h to use the above.] + + +The other file is a makefile suitable for use with Borland's compiler +(run "make -fBmakefile" in the directory). It builds a single version +of the library, pthreadBC.dll and the corresponding pthreadBC.lib +import library, which is comparable to the pthreadVC version; I can't +personally see any demand for the versions that include structured or +C++ exception cancellation handling so I haven't attempted to build +those versions of the library. (I imagine a static version might be +of use to some, but we can't legally use that on my commercial +projects so I can't try that out, unfortunately.) + +[RPJ: Added tests\Bmakefile as well.] + +Borland C++ doesn't define the ENOSYS constant used by pthreads-win32; +rather than make more extensive patches to the pthreads-win32 source I +have a mostly-arbitrary constant for it in the makefile. However this +doesn't make it visible to the application using the library, so if +anyone actually wants to use this constant in their apps (why?) +someone might like to make a seperate NEED_BCC_something define to add +this stuff. + +The makefile also #defines EDEADLK as EDEADLOCK, _timeb as timeb, and +_ftime as ftime, to deal with the minor differences between the two +RTLs' naming conventions, and sets the compiler flags as required to +get a normal compile of the library. + +[RPJ: Moved errno values and _timeb etc to pthread.h, so apps will also +use them.] + +(While I'm on the subject, the reason Borland users should recompile +the library, rather than using the impdef/implib technique suggested +previously on the mailing list, is that a) the errno constants are +different, so the results returned by the pthread_* functions can be +meaningless, and b) the errno variable/pseudo-variable itself is +different in the MS & BCC runtimes, so you can't access the +pthreadVC's errno from a Borland C++-compiled host application +correctly - I imagine there are other potential problems from the RTL +mismatch too.) + +[RPJ: Make sure you use the same RTL in both dll and application builds. +The dll and tests Bmakefiles use cw32mti.lib. Having some trouble with +memory read exceptions running the test suite using BCC55.] + +Best regards, +Will + +-- +Will Bryant +Systems Architect, eCOSM Limited +Cell +64 21 655 443, office +64 3 365 4176 +http://www.ecosm.com/ diff --git a/win32/3rdparty/pthreads/README.CV b/win32/3rdparty/pthreads/README.CV new file mode 100644 index 000000000..698728b95 --- /dev/null +++ b/win32/3rdparty/pthreads/README.CV @@ -0,0 +1,3036 @@ +README.CV -- Condition Variables +-------------------------------- + +The original implementation of condition variables in +pthreads-win32 was based on a discussion paper: + +"Strategies for Implementing POSIX Condition Variables +on Win32": http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + +The changes suggested below were made on Feb 6 2001. This +file is included in the package for the benefit of anyone +interested in understanding the pthreads-win32 implementation +of condition variables and the (sometimes subtle) issues that +it attempts to resolve. + +Thanks go to the individuals whose names appear throughout +the following text. + +Ross Johnson + +-------------------------------------------------------------------- + +fyi.. (more detailed problem description/demos + possible fix/patch) + +regards, +alexander. + + +Alexander Terekhov +31.01.2001 17:43 + +To: ace-bugs@cs.wustl.edu +cc: +From: Alexander Terekhov/Germany/IBM@IBMDE +Subject: Implementation of POSIX CVs: spur.wakeups/lost + signals/deadlocks/unfairness + + + + ACE VERSION: + + 5.1.12 (pthread-win32 snapshot 2000-12-29) + + HOST MACHINE and OPERATING SYSTEM: + + IBM IntelliStation Z Pro, 2 x XEON 1GHz, Win2K + + TARGET MACHINE and OPERATING SYSTEM, if different from HOST: + COMPILER NAME AND VERSION (AND PATCHLEVEL): + + Microsoft Visual C++ 6.0 + + AREA/CLASS/EXAMPLE AFFECTED: + + Implementation of POSIX condition variables - OS.cpp/.h + + DOES THE PROBLEM AFFECT: + + EXECUTION? YES! + + SYNOPSIS: + + a) spurious wakeups (minor problem) + b) lost signals + c) broadcast deadlock + d) unfairness (minor problem) + + DESCRIPTION: + + Please see attached copy of discussion thread + from comp.programming.threads for more details on + some reported problems. (i've also posted a "fyi" + message to ace-users a week or two ago but + unfortunately did not get any response so far). + + It seems that current implementation suffers from + two essential problems: + + 1) cond.waiters_count does not accurately reflect + number of waiters blocked on semaphore - w/o + proper synchronisation that could result (in the + time window when counter is not accurate) + in spurious wakeups organised by subsequent + _signals and _broadcasts. + + 2) Always having (with no e.g. copy_and_clear/..) + the same queue in use (semaphore+counter) + neither signal nor broadcast provide 'atomic' + behaviour with respect to other threads/subsequent + calls to signal/broadcast/wait. + + Each problem and combination of both could produce + various nasty things: + + a) spurious wakeups (minor problem) + + it is possible that waiter(s) which was already + unblocked even so is still counted as blocked + waiter. signal and broadcast will release + semaphore which will produce a spurious wakeup + for a 'real' waiter coming later. + + b) lost signals + + signalling thread ends up consuming its own + signal. please see demo/discussion below. + + c) broadcast deadlock + + last_waiter processing code does not correctly + handle the case with multiple threads + waiting for the end of broadcast. + please see demo/discussion below. + + d) unfairness (minor problem) + + without SignalObjectAndWait some waiter(s) + may end up consuming broadcasted signals + multiple times (spurious wakeups) because waiter + thread(s) can be preempted before they call + semaphore wait (but after count++ and mtx.unlock). + + REPEAT BY: + + See below... run problem demos programs (tennis.cpp and + tennisb.cpp) number of times concurrently (on multiprocessor) + and in multiple sessions or just add a couple of "Sleep"s + as described in the attached copy of discussion thread + from comp.programming.threads + + SAMPLE FIX/WORKAROUND: + + See attached patch to pthread-win32.. well, I can not + claim that it is completely bug free but at least my + test and tests provided by pthreads-win32 seem to work. + Perhaps that will help. + + regards, + alexander. + + +>> Forum: comp.programming.threads +>> Thread: pthread_cond_* implementation questions +. +. +. +David Schwartz wrote: + +> terekhov@my-deja.com wrote: +> +>> BTW, could you please also share your view on other perceived +>> "problems" such as nested broadcast deadlock, spurious wakeups +>> and (the latest one) lost signals?? +> +>I'm not sure what you mean. The standard allows an implementation +>to do almost whatever it likes. In fact, you could implement +>pthread_cond_wait by releasing the mutex, sleeping a random +>amount of time, and then reacquiring the mutex. Of course, +>this would be a pretty poor implementation, but any code that +>didn't work under that implementation wouldn't be strictly +>compliant. + +The implementation you suggested is indeed correct +one (yes, now I see it :). However it requires from +signal/broadcast nothing more than to "{ return 0; }" +That is not the case for pthread-win32 and ACE +implementations. I do think that these implementations +(basically the same implementation) have some serious +problems with wait/signal/broadcast calls. I am looking +for help to clarify whether these problems are real +or not. I think that I can demonstrate what I mean +using one or two small sample programs. +. +. +. +========== +tennis.cpp +========== + +#include "ace/Synch.h" +#include "ace/Thread.h" + +enum GAME_STATE { + + START_GAME, + PLAYER_A, // Player A playes the ball + PLAYER_B, // Player B playes the ball + GAME_OVER, + ONE_PLAYER_GONE, + BOTH_PLAYERS_GONE + +}; + +enum GAME_STATE eGameState; +ACE_Mutex* pmtxGameStateLock; +ACE_Condition< ACE_Mutex >* pcndGameStateChange; + +void* + playerA( + void* pParm + ) +{ + + // For access to game state variable + pmtxGameStateLock->acquire(); + + // Play loop + while ( eGameState < GAME_OVER ) { + + // Play the ball + cout << endl << "PLAYER-A" << endl; + + // Now its PLAYER-B's turn + eGameState = PLAYER_B; + + // Signal to PLAYER-B that now it is his turn + pcndGameStateChange->signal(); + + // Wait until PLAYER-B finishes playing the ball + do { + + pcndGameStateChange->wait(); + + if ( PLAYER_B == eGameState ) + cout << endl << "----PLAYER-A: SPURIOUS WAKEUP!!!" << endl; + + } while ( PLAYER_B == eGameState ); + + } + + // PLAYER-A gone + eGameState = (GAME_STATE)(eGameState+1); + cout << endl << "PLAYER-A GONE" << endl; + + // No more access to state variable needed + pmtxGameStateLock->release(); + + // Signal PLAYER-A gone event + pcndGameStateChange->broadcast(); + + return 0; + +} + +void* + playerB( + void* pParm + ) +{ + + // For access to game state variable + pmtxGameStateLock->acquire(); + + // Play loop + while ( eGameState < GAME_OVER ) { + + // Play the ball + cout << endl << "PLAYER-B" << endl; + + // Now its PLAYER-A's turn + eGameState = PLAYER_A; + + // Signal to PLAYER-A that now it is his turn + pcndGameStateChange->signal(); + + // Wait until PLAYER-A finishes playing the ball + do { + + pcndGameStateChange->wait(); + + if ( PLAYER_A == eGameState ) + cout << endl << "----PLAYER-B: SPURIOUS WAKEUP!!!" << endl; + + } while ( PLAYER_A == eGameState ); + + } + + // PLAYER-B gone + eGameState = (GAME_STATE)(eGameState+1); + cout << endl << "PLAYER-B GONE" << endl; + + // No more access to state variable needed + pmtxGameStateLock->release(); + + // Signal PLAYER-B gone event + pcndGameStateChange->broadcast(); + + return 0; + +} + + +int +main (int, ACE_TCHAR *[]) +{ + + pmtxGameStateLock = new ACE_Mutex(); + pcndGameStateChange = new ACE_Condition< ACE_Mutex >( *pmtxGameStateLock +); + + // Set initial state + eGameState = START_GAME; + + // Create players + ACE_Thread::spawn( playerA ); + ACE_Thread::spawn( playerB ); + + // Give them 5 sec. to play + Sleep( 5000 );//sleep( 5 ); + + // Set game over state + pmtxGameStateLock->acquire(); + eGameState = GAME_OVER; + + // Let them know + pcndGameStateChange->broadcast(); + + // Wait for players to stop + do { + + pcndGameStateChange->wait(); + + } while ( eGameState < BOTH_PLAYERS_GONE ); + + // Cleanup + cout << endl << "GAME OVER" << endl; + pmtxGameStateLock->release(); + delete pcndGameStateChange; + delete pmtxGameStateLock; + + return 0; + +} + +=========== +tennisb.cpp +=========== +#include "ace/Synch.h" +#include "ace/Thread.h" + +enum GAME_STATE { + + START_GAME, + PLAYER_A, // Player A playes the ball + PLAYER_B, // Player B playes the ball + GAME_OVER, + ONE_PLAYER_GONE, + BOTH_PLAYERS_GONE + +}; + +enum GAME_STATE eGameState; +ACE_Mutex* pmtxGameStateLock; +ACE_Condition< ACE_Mutex >* pcndGameStateChange; + +void* + playerA( + void* pParm + ) +{ + + // For access to game state variable + pmtxGameStateLock->acquire(); + + // Play loop + while ( eGameState < GAME_OVER ) { + + // Play the ball + cout << endl << "PLAYER-A" << endl; + + // Now its PLAYER-B's turn + eGameState = PLAYER_B; + + // Signal to PLAYER-B that now it is his turn + pcndGameStateChange->broadcast(); + + // Wait until PLAYER-B finishes playing the ball + do { + + pcndGameStateChange->wait(); + + if ( PLAYER_B == eGameState ) + cout << endl << "----PLAYER-A: SPURIOUS WAKEUP!!!" << endl; + + } while ( PLAYER_B == eGameState ); + + } + + // PLAYER-A gone + eGameState = (GAME_STATE)(eGameState+1); + cout << endl << "PLAYER-A GONE" << endl; + + // No more access to state variable needed + pmtxGameStateLock->release(); + + // Signal PLAYER-A gone event + pcndGameStateChange->broadcast(); + + return 0; + +} + +void* + playerB( + void* pParm + ) +{ + + // For access to game state variable + pmtxGameStateLock->acquire(); + + // Play loop + while ( eGameState < GAME_OVER ) { + + // Play the ball + cout << endl << "PLAYER-B" << endl; + + // Now its PLAYER-A's turn + eGameState = PLAYER_A; + + // Signal to PLAYER-A that now it is his turn + pcndGameStateChange->broadcast(); + + // Wait until PLAYER-A finishes playing the ball + do { + + pcndGameStateChange->wait(); + + if ( PLAYER_A == eGameState ) + cout << endl << "----PLAYER-B: SPURIOUS WAKEUP!!!" << endl; + + } while ( PLAYER_A == eGameState ); + + } + + // PLAYER-B gone + eGameState = (GAME_STATE)(eGameState+1); + cout << endl << "PLAYER-B GONE" << endl; + + // No more access to state variable needed + pmtxGameStateLock->release(); + + // Signal PLAYER-B gone event + pcndGameStateChange->broadcast(); + + return 0; + +} + + +int +main (int, ACE_TCHAR *[]) +{ + + pmtxGameStateLock = new ACE_Mutex(); + pcndGameStateChange = new ACE_Condition< ACE_Mutex >( *pmtxGameStateLock +); + + // Set initial state + eGameState = START_GAME; + + // Create players + ACE_Thread::spawn( playerA ); + ACE_Thread::spawn( playerB ); + + // Give them 5 sec. to play + Sleep( 5000 );//sleep( 5 ); + + // Make some noise + pmtxGameStateLock->acquire(); + cout << endl << "---Noise ON..." << endl; + pmtxGameStateLock->release(); + for ( int i = 0; i < 100000; i++ ) + pcndGameStateChange->broadcast(); + cout << endl << "---Noise OFF" << endl; + + // Set game over state + pmtxGameStateLock->acquire(); + eGameState = GAME_OVER; + cout << endl << "---Stopping the game..." << endl; + + // Let them know + pcndGameStateChange->broadcast(); + + // Wait for players to stop + do { + + pcndGameStateChange->wait(); + + } while ( eGameState < BOTH_PLAYERS_GONE ); + + // Cleanup + cout << endl << "GAME OVER" << endl; + pmtxGameStateLock->release(); + delete pcndGameStateChange; + delete pmtxGameStateLock; + + return 0; + +} +. +. +. +David Schwartz wrote: +>> > It's compliant +>> +>> That is really good. +> +>> Tomorrow (I have to go urgently now) I will try to +>> demonstrate the lost-signal "problem" of current +>> pthread-win32 and ACE-(variant w/o SingleObjectAndWait) +>> implementations: players start suddenly drop their balls :-) +>> (with no change in source code). +> +>Signals aren't lost, they're going to the main thread, +>which isn't coded correctly to handle them. Try this: +> +> // Wait for players to stop +> do { +> +> pthread_cond_wait( &cndGameStateChange,&mtxGameStateLock ); +>printf("Main thread stole a signal\n"); +> +> } while ( eGameState < BOTH_PLAYERS_GONE ); +> +>I bet everytime you thing a signal is lost, you'll see that printf. +>The signal isn't lost, it was stolen by another thread. + +well, you can probably loose your bet.. it was indeed stolen +by "another" thread but not the one you seem to think of. + +I think that what actually happens is the following: + +H:\SA\UXX\pt\PTHREADS\TESTS>tennis3.exe + +PLAYER-A + +PLAYER-B + +----PLAYER-B: SPURIOUS WAKEUP!!! + +PLAYER-A GONE + +PLAYER-B GONE + +GAME OVER + +H:\SA\UXX\pt\PTHREADS\TESTS> + +here you can see that PLAYER-B after playing his first +ball (which came via signal from PLAYER-A) just dropped +it down. What happened is that his signal to player A +was consumed as spurious wakeup by himself (player B). + +The implementation has a problem: + +================ +waiting threads: +================ + +{ /** Critical Section + + inc cond.waiters_count + +} + + /* + /* Atomic only if using Win32 SignalObjectAndWait + /* + cond.mtx.release + + /*** ^^-- A THREAD WHICH DID SIGNAL MAY ACQUIRE THE MUTEX, + /*** GO INTO WAIT ON THE SAME CONDITION AND OVERTAKE + /*** ORIGINAL WAITER(S) CONSUMING ITS OWN SIGNAL! + + cond.sem.wait + +Player-A after playing game's initial ball went into +wait (called _wait) but was pre-empted before reaching +wait semaphore. He was counted as waiter but was not +actually waiting/blocked yet. + +=============== +signal threads: +=============== + +{ /** Critical Section + + waiters_count = cond.waiters_count + +} + + if ( waiters_count != 0 ) + + sem.post 1 + + endif + +Player-B after he received signal/ball from Player A +called _signal. The _signal did see that there was +one waiter blocked on the condition (Player-A) and +released the semaphore.. (but it did not unblock +Player-A because he was not actually blocked). +Player-B thread continued its execution, called _wait, +was counted as second waiter BUT was allowed to slip +through opened semaphore gate (which was opened for +Player-B) and received his own signal. Player B remained +blocked followed by Player A. Deadlock happened which +lasted until main thread came in and said game over. + +It seems to me that the implementation fails to +correctly implement the following statement +from specification: + +http://www.opengroup.org/ +onlinepubs/007908799/xsh/pthread_cond_wait.html + +"These functions atomically release mutex and cause +the calling thread to block on the condition variable +cond; atomically here means "atomically with respect +to access by another thread to the mutex and then the +condition variable". That is, if another thread is +able to acquire the mutex after the about-to-block +thread has released it, then a subsequent call to +pthread_cond_signal() or pthread_cond_broadcast() +in that thread behaves as if it were issued after +the about-to-block thread has blocked." + +Question: Am I right? + +(I produced the program output above by simply +adding ?Sleep( 1 )?: + +================ +waiting threads: +================ + +{ /** Critical Section + + inc cond.waiters_count + +} + + /* + /* Atomic only if using Win32 SignalObjectAndWait + /* + cond.mtx.release + +Sleep( 1 ); // Win32 + + /*** ^^-- A THREAD WHICH DID SIGNAL MAY ACQUIRE THE MUTEX, + /*** GO INTO WAIT ON THE SAME CONDITION AND OVERTAKE + /*** ORIGINAL WAITER(S) CONSUMING ITS OWN SIGNAL! + + cond.sem.wait + +to the source code of pthread-win32 implementation: + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/pthreads/ +condvar.c?rev=1.36&content-type=text/ +x-cvsweb-markup&cvsroot=pthreads-win32 + + + /* + * We keep the lock held just long enough to increment the count of + * waiters by one (above). + * Note that we can't keep it held across the + * call to sem_wait since that will deadlock other calls + * to pthread_cond_signal + */ + cleanup_args.mutexPtr = mutex; + cleanup_args.cv = cv; + cleanup_args.resultPtr = &result; + + pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) +&cleanup_args); + + if ((result = pthread_mutex_unlock (mutex)) == 0) + {((result +Sleep( 1 ); // @AT + + /* + * Wait to be awakened by + * pthread_cond_signal, or + * pthread_cond_broadcast, or + * a timeout + * + * Note: + * ptw32_sem_timedwait is a cancelation point, + * hence providing the + * mechanism for making pthread_cond_wait a cancelation + * point. We use the cleanup mechanism to ensure we + * re-lock the mutex and decrement the waiters count + * if we are canceled. + */ + if (ptw32_sem_timedwait (&(cv->sema), abstime) == -1) { + result = errno; + } + } + + pthread_cleanup_pop (1); /* Always cleanup */ + + +BTW, on my system (2 CPUs) I can manage to get +signals lost even without any source code modification +if I run the tennis program many times in different +shell sessions. +. +. +. +David Schwartz wrote: +>terekhov@my-deja.com wrote: +> +>> well, it might be that the program is in fact buggy. +>> but you did not show me any bug. +> +>You're right. I was close but not dead on. I was correct, however, +>that the code is buggy because it uses 'pthread_cond_signal' even +>though not any thread waiting on the condition variable can do the +>job. I was wrong in which thread could be waiting on the cv but +>unable to do the job. + +Okay, lets change 'pthread_cond_signal' to 'pthread_cond_broadcast' +but also add some noise from main() right before declaring the game +to be over (I need it in order to demonstrate another problem of +pthread-win32/ACE implementations - broadcast deadlock)... +. +. +. +It is my understanding of POSIX conditions, +that on correct implementation added noise +in form of unnecessary broadcasts from main, +should not break the tennis program. The +only 'side effect' of added noise on correct +implementation would be 'spurious wakeups' of +players (in fact they are not spurious, +players just see them as spurious) unblocked, +not by another player but by main before +another player had a chance to acquire the +mutex and change the game state variable: +. +. +. + +PLAYER-B + +PLAYER-A + +---Noise ON... + +PLAYER-B + +PLAYER-A + +. +. +. + +PLAYER-B + +PLAYER-A + +----PLAYER-A: SPURIOUS WAKEUP!!! + +PLAYER-B + +PLAYER-A + +---Noise OFF + +PLAYER-B + +---Stopping the game... + +PLAYER-A GONE + +PLAYER-B GONE + +GAME OVER + +H:\SA\UXX\pt\PTHREADS\TESTS> + +On pthread-win32/ACE implementations the +program could stall: + +. +. +. + +PLAYER-A + +PLAYER-B + +PLAYER-A + +PLAYER-B + +PLAYER-A + +PLAYER-B + +PLAYER-A + +PLAYER-B + +---Noise ON... + +PLAYER-A + +---Noise OFF +^C +H:\SA\UXX\pt\PTHREADS\TESTS> + + +The implementation has problems: + +================ +waiting threads: +================ + +{ /** Critical Section + + inc cond.waiters_count + +} + + /* + /* Atomic only if using Win32 SignalObjectAndWait + /* + cond.mtx.release + cond.sem.wait + + /*** ^^-- WAITER CAN BE PREEMPTED AFTER BEING UNBLOCKED... + +{ /** Critical Section + + dec cond.waiters_count + + /*** ^^- ...AND BEFORE DECREMENTING THE COUNT (1) + + last_waiter = ( cond.was_broadcast && + cond.waiters_count == 0 ) + + if ( last_waiter ) + + cond.was_broadcast = FALSE + + endif + +} + + if ( last_waiter ) + + /* + /* Atomic only if using Win32 SignalObjectAndWait + /* + cond.auto_reset_event_or_sem.post /* Event for Win32 + cond.mtx.acquire + + /*** ^^-- ...AND BEFORE CALL TO mtx.acquire (2) + + /*** ^^-- NESTED BROADCASTS RESULT IN A DEADLOCK + + + else + + cond.mtx.acquire + + /*** ^^-- ...AND BEFORE CALL TO mtx.acquire (3) + + endif + + +================== +broadcast threads: +================== + +{ /** Critical Section + + waiters_count = cond.waiters_count + + if ( waiters_count != 0 ) + + cond.was_broadcast = TRUE + + endif + +} + +if ( waiters_count != 0 ) + + cond.sem.post waiters_count + + /*** ^^^^^--- SPURIOUS WAKEUPS DUE TO (1) + + cond.auto_reset_event_or_sem.wait /* Event for Win32 + + /*** ^^^^^--- DEADLOCK FOR FURTHER BROADCASTS IF THEY + HAPPEN TO GO INTO WAIT WHILE PREVIOUS + BROADCAST IS STILL IN PROGRESS/WAITING + +endif + +a) cond.waiters_count does not accurately reflect +number of waiters blocked on semaphore - that could +result (in the time window when counter is not accurate) +in spurios wakeups organised by subsequent _signals +and _broadcasts. From standard compliance point of view +that is OK but that could be a real problem from +performance/efficiency point of view. + +b) If subsequent broadcast happen to go into wait on +cond.auto_reset_event_or_sem before previous +broadcast was unblocked from cond.auto_reset_event_or_sem +by its last waiter, one of two blocked threads will +remain blocked because last_waiter processing code +fails to unblock both threads. + +In the situation with tennisb.c the Player-B was put +in a deadlock by noise (broadcast) coming from main +thread. And since Player-B holds the game state +mutex when it calls broadcast, the whole program +stalled: Player-A was deadlocked on mutex and +main thread after finishing with producing the noise +was deadlocked on mutex too (needed to declare the +game over) + +(I produced the program output above by simply +adding ?Sleep( 1 )?: + +================== +broadcast threads: +================== + +{ /** Critical Section + + waiters_count = cond.waiters_count + + if ( waiters_count != 0 ) + + cond.was_broadcast = TRUE + + endif + +} + +if ( waiters_count != 0 ) + +Sleep( 1 ); //Win32 + + cond.sem.post waiters_count + + /*** ^^^^^--- SPURIOUS WAKEUPS DUE TO (1) + + cond.auto_reset_event_or_sem.wait /* Event for Win32 + + /*** ^^^^^--- DEADLOCK FOR FURTHER BROADCASTS IF THEY + HAPPEN TO GO INTO WAIT WHILE PREVIOUS + BROADCAST IS STILL IN PROGRESS/WAITING + +endif + +to the source code of pthread-win32 implementation: + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/pthreads/ +condvar.c?rev=1.36&content-type=text/ +x-cvsweb-markup&cvsroot=pthreads-win32 + + if (wereWaiters) + {(wereWaiters)sroot=pthreads-win32eb.cgi/pthreads/Yem...m + /* + * Wake up all waiters + */ + +Sleep( 1 ); //@AT + +#ifdef NEED_SEM + + result = (ptw32_increase_semaphore( &cv->sema, cv->waiters ) + ? 0 + : EINVAL); + +#else /* NEED_SEM */ + + result = (ReleaseSemaphore( cv->sema, cv->waiters, NULL ) + ? 0 + : EINVAL); + +#endif /* NEED_SEM */ + + } + + (void) pthread_mutex_unlock(&(cv->waitersLock)); + + if (wereWaiters && result == 0) + {(wereWaiters + /* + * Wait for all the awakened threads to acquire their part of + * the counting semaphore + */ + + if (WaitForSingleObject (cv->waitersDone, INFINITE) + == WAIT_OBJECT_0) + { + result = 0; + } + else + { + result = EINVAL; + } + + } + + return (result); + +} + +BTW, on my system (2 CPUs) I can manage to get +the program stalled even without any source code +modification if I run the tennisb program many +times in different shell sessions. + +=================== +pthread-win32 patch +=================== +struct pthread_cond_t_ { + long nWaitersBlocked; /* Number of threads blocked +*/ + long nWaitersUnblocked; /* Number of threads unblocked +*/ + long nWaitersToUnblock; /* Number of threads to unblock +*/ + sem_t semBlockQueue; /* Queue up threads waiting for the +*/ + /* condition to become signalled +*/ + sem_t semBlockLock; /* Semaphore that guards access to +*/ + /* | waiters blocked count/block queue +*/ + /* +-> Mandatory Sync.LEVEL-1 +*/ + pthread_mutex_t mtxUnblockLock; /* Mutex that guards access to +*/ + /* | waiters (to)unblock(ed) counts +*/ + /* +-> Optional* Sync.LEVEL-2 +*/ +}; /* Opt*) for _timedwait and +cancellation*/ + +int +pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr) + int result = EAGAIN; + pthread_cond_t cv = NULL; + + if (cond == NULL) + {(cond + return EINVAL; + } + + if ((attr != NULL && *attr != NULL) && + ((*attr)->pshared == PTHREAD_PROCESS_SHARED)) + { + /* + * Creating condition variable that can be shared between + * processes. + */ + result = ENOSYS; + + goto FAIL0; + } + + cv = (pthread_cond_t) calloc (1, sizeof (*cv)); + + if (cv == NULL) + {(cv + result = ENOMEM; + goto FAIL0; + } + + cv->nWaitersBlocked = 0; + cv->nWaitersUnblocked = 0; + cv->nWaitersToUnblock = 0; + + if (sem_init (&(cv->semBlockLock), 0, 1) != 0) + {(sem_init + goto FAIL0; + } + + if (sem_init (&(cv->semBlockQueue), 0, 0) != 0) + {(sem_init + goto FAIL1; + } + + if (pthread_mutex_init (&(cv->mtxUnblockLock), 0) != 0) + {(pthread_mutex_init + goto FAIL2; + } + + + result = 0; + + goto DONE; + + /* + * ------------- + * Failed... + * ------------- + */ +FAIL2: + (void) sem_destroy (&(cv->semBlockQueue)); + +FAIL1: + (void) sem_destroy (&(cv->semBlockLock)); + +FAIL0: +DONE: + *cond = cv; + + return (result); + +} /* pthread_cond_init */ + +int +pthread_cond_destroy (pthread_cond_t * cond) +{ + int result = 0; + pthread_cond_t cv; + + /* + * Assuming any race condition here is harmless. + */ + if (cond == NULL + || *cond == NULL) + { + return EINVAL; + } + + if (*cond != (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) + {(*cond + cv = *cond; + + /* + * Synchronize access to waiters blocked count (LEVEL-1) + */ + if (sem_wait(&(cv->semBlockLock)) != 0) + {(sem_wait(&(cv->semBlockLock)) + return errno; + } + + /* + * Synchronize access to waiters (to)unblock(ed) counts (LEVEL-2) + */ + if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) + {((result + (void) sem_post(&(cv->semBlockLock)); + return result; + } + + /* + * Check whether cv is still busy (still has waiters blocked) + */ + if (cv->nWaitersBlocked - cv->nWaitersUnblocked > 0) + {(cv->nWaitersBlocked + (void) sem_post(&(cv->semBlockLock)); + (void) pthread_mutex_unlock(&(cv->mtxUnblockLock)); + return EBUSY; + } + + /* + * Now it is safe to destroy + */ + (void) sem_destroy (&(cv->semBlockLock)); + (void) sem_destroy (&(cv->semBlockQueue)); + (void) pthread_mutex_unlock (&(cv->mtxUnblockLock)); + (void) pthread_mutex_destroy (&(cv->mtxUnblockLock)); + + free(cv); + *cond = NULL; + } + else + { + /* + * See notes in ptw32_cond_check_need_init() above also. + */ + EnterCriticalSection(&ptw32_cond_test_init_lock); + + /* + * Check again. + */ + if (*cond == (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) + {(*cond + /* + * This is all we need to do to destroy a statically + * initialised cond that has not yet been used (initialised). + * If we get to here, another thread + * waiting to initialise this cond will get an EINVAL. + */ + *cond = NULL; + } + else + { + /* + * The cv has been initialised while we were waiting + * so assume it's in use. + */ + result = EBUSY; + } + + LeaveCriticalSection(&ptw32_cond_test_init_lock); + } + + return (result); +} + +/* + * Arguments for cond_wait_cleanup, since we can only pass a + * single void * to it. + */ +typedef struct { + pthread_mutex_t * mutexPtr; + pthread_cond_t cv; + int * resultPtr; +} ptw32_cond_wait_cleanup_args_t; + +static void +ptw32_cond_wait_cleanup(void * args) +{ + ptw32_cond_wait_cleanup_args_t * cleanup_args = +(ptw32_cond_wait_cleanup_args_t *) args; + pthread_cond_t cv = cleanup_args->cv; + int * resultPtr = cleanup_args->resultPtr; + int eLastSignal; /* enum: 1=yes 0=no -1=cancelled/timedout w/o signal(s) +*/ + int result; + + /* + * Whether we got here as a result of signal/broadcast or because of + * timeout on wait or thread cancellation we indicate that we are no + * longer waiting. The waiter is responsible for adjusting waiters + * (to)unblock(ed) counts (protected by unblock lock). + * Unblock lock/Sync.LEVEL-2 supports _timedwait and cancellation. + */ + if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) + {((result + *resultPtr = result; + return; + } + + cv->nWaitersUnblocked++; + + eLastSignal = (cv->nWaitersToUnblock == 0) ? + -1 : (--cv->nWaitersToUnblock == 0); + + /* + * No more LEVEL-2 access to waiters (to)unblock(ed) counts needed + */ + if ((result = pthread_mutex_unlock(&(cv->mtxUnblockLock))) != 0) + {((result + *resultPtr = result; + return; + } + + /* + * If last signal... + */ + if (eLastSignal == 1) + {(eLastSignal + /* + * ...it means that we have end of 'atomic' signal/broadcast + */ + if (sem_post(&(cv->semBlockLock)) != 0) + {(sem_post(&(cv->semBlockLock)) + *resultPtr = errno; + return; + } + } + /* + * If not last signal and not timed out/cancelled wait w/o signal... + */ + else if (eLastSignal == 0) + { + /* + * ...it means that next waiter can go through semaphore + */ + if (sem_post(&(cv->semBlockQueue)) != 0) + {(sem_post(&(cv->semBlockQueue)) + *resultPtr = errno; + return; + } + } + + /* + * XSH: Upon successful return, the mutex has been locked and is owned + * by the calling thread + */ + if ((result = pthread_mutex_lock(cleanup_args->mutexPtr)) != 0) + {((result + *resultPtr = result; + } + +} /* ptw32_cond_wait_cleanup */ + +static int +ptw32_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime) +{ + int result = 0; + pthread_cond_t cv; + ptw32_cond_wait_cleanup_args_t cleanup_args; + + if (cond == NULL || *cond == NULL) + {(cond + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static condition variable. We check + * again inside the guarded section of ptw32_cond_check_need_init() + * to avoid race conditions. + */ + if (*cond == (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) + {(*cond + result = ptw32_cond_check_need_init(cond); + } + + if (result != 0 && result != EBUSY) + {(result + return result; + } + + cv = *cond; + + /* + * Synchronize access to waiters blocked count (LEVEL-1) + */ + if (sem_wait(&(cv->semBlockLock)) != 0) + {(sem_wait(&(cv->semBlockLock)) + return errno; + } + + cv->nWaitersBlocked++; + + /* + * Thats it. Counted means waiting, no more access needed + */ + if (sem_post(&(cv->semBlockLock)) != 0) + {(sem_post(&(cv->semBlockLock)) + return errno; + } + + /* + * Setup this waiter cleanup handler + */ + cleanup_args.mutexPtr = mutex; + cleanup_args.cv = cv; + cleanup_args.resultPtr = &result; + + pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) &cleanup_args); + + /* + * Now we can release 'mutex' and... + */ + if ((result = pthread_mutex_unlock (mutex)) == 0) + {((result + + /* + * ...wait to be awakened by + * pthread_cond_signal, or + * pthread_cond_broadcast, or + * timeout, or + * thread cancellation + * + * Note: + * + * ptw32_sem_timedwait is a cancellation point, + * hence providing the mechanism for making + * pthread_cond_wait a cancellation point. + * We use the cleanup mechanism to ensure we + * re-lock the mutex and adjust (to)unblock(ed) waiters + * counts if we are cancelled, timed out or signalled. + */ + if (ptw32_sem_timedwait (&(cv->semBlockQueue), abstime) != 0) + {(ptw32_sem_timedwait + result = errno; + } + } + + /* + * Always cleanup + */ + pthread_cleanup_pop (1); + + + /* + * "result" can be modified by the cleanup handler. + */ + return (result); + +} /* ptw32_cond_timedwait */ + + +static int +ptw32_cond_unblock (pthread_cond_t * cond, + int unblockAll) +{ + int result; + pthread_cond_t cv; + + if (cond == NULL || *cond == NULL) + {(cond + return EINVAL; + } + + cv = *cond; + + /* + * No-op if the CV is static and hasn't been initialised yet. + * Assuming that any race condition is harmless. + */ + if (cv == (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) + {(cv + return 0; + } + + /* + * Synchronize access to waiters blocked count (LEVEL-1) + */ + if (sem_wait(&(cv->semBlockLock)) != 0) + {(sem_wait(&(cv->semBlockLock)) + return errno; + } + + /* + * Synchronize access to waiters (to)unblock(ed) counts (LEVEL-2) + * This sync.level supports _timedwait and cancellation + */ + if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) + {((result + return result; + } + + /* + * Adjust waiters blocked and unblocked counts (collect garbage) + */ + if (cv->nWaitersUnblocked != 0) + {(cv->nWaitersUnblocked + cv->nWaitersBlocked -= cv->nWaitersUnblocked; + cv->nWaitersUnblocked = 0; + } + + /* + * If (after adjustment) there are still some waiters blocked counted... + */ + if ( cv->nWaitersBlocked > 0) + {( + /* + * We will unblock first waiter and leave semBlockLock/LEVEL-1 locked + * LEVEL-1 access is left disabled until last signal/unblock +completes + */ + cv->nWaitersToUnblock = (unblockAll) ? cv->nWaitersBlocked : 1; + + /* + * No more LEVEL-2 access to waiters (to)unblock(ed) counts needed + * This sync.level supports _timedwait and cancellation + */ + if ((result = pthread_mutex_unlock(&(cv->mtxUnblockLock))) != 0) + {((result + return result; + } + + + /* + * Now, with LEVEL-2 lock released let first waiter go through +semaphore + */ + if (sem_post(&(cv->semBlockQueue)) != 0) + {(sem_post(&(cv->semBlockQueue)) + return errno; + } + } + /* + * No waiter blocked - no more LEVEL-1 access to blocked count needed... + */ + else if (sem_post(&(cv->semBlockLock)) != 0) + { + return errno; + } + /* + * ...and no more LEVEL-2 access to waiters (to)unblock(ed) counts needed +too + * This sync.level supports _timedwait and cancellation + */ + else + { + result = pthread_mutex_unlock(&(cv->mtxUnblockLock)); + } + + return(result); + +} /* ptw32_cond_unblock */ + +int +pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex) +{ + /* The NULL abstime arg means INFINITE waiting. */ + return(ptw32_cond_timedwait(cond, mutex, NULL)); +} /* pthread_cond_wait */ + + +int +pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime) +{ + if (abstime == NULL) + {(abstime + return EINVAL; + } + + return(ptw32_cond_timedwait(cond, mutex, abstime)); +} /* pthread_cond_timedwait */ + + +int +pthread_cond_signal (pthread_cond_t * cond) +{ + /* The '0'(FALSE) unblockAll arg means unblock ONE waiter. */ + return(ptw32_cond_unblock(cond, 0)); +} /* pthread_cond_signal */ + +int +pthread_cond_broadcast (pthread_cond_t * cond) +{ + /* The '1'(TRUE) unblockAll arg means unblock ALL waiters. */ + return(ptw32_cond_unblock(cond, 1)); +} /* pthread_cond_broadcast */ + + + + +TEREKHOV@de.ibm.com on 17.01.2001 01:00:57 + +Please respond to TEREKHOV@de.ibm.com + +To: pthreads-win32@sourceware.cygnus.com +cc: schmidt@uci.edu +Subject: win32 conditions: sem+counter+event = broadcast_deadlock + + spur.wakeup/unfairness/incorrectness ?? + + + + + + + +Hi, + +Problem 1: broadcast_deadlock + +It seems that current implementation does not provide "atomic" +broadcasts. That may lead to "nested" broadcasts... and it seems +that nested case is not handled correctly -> producing a broadcast +DEADLOCK as a result. + +Scenario: + +N (>1) waiting threads W1..N are blocked (in _wait) on condition's +semaphore. + +Thread B1 calls pthread_cond_broadcast, which results in "releasing" N +W threads via incrementing semaphore counter by N (stored in +cv->waiters) BUT cv->waiters counter does not change!! The caller +thread B1 remains blocked on cv->waitersDone event (auto-reset!!) BUT +condition is not protected from starting another broadcast (when called +on another thread) while still waiting for the "old" broadcast to +complete on thread B1. + +M (>=0, waiters counter. + +L (N-M) "late" waiter W threads are a) still blocked/not returned from +their semaphore wait call or b) were preempted after sem_wait but before +lock( &cv->waitersLock ) or c) are blocked on cv->waitersLock. + +cv->waiters is still > 0 (= L). + +Another thread B2 (or some W thread from M group) calls +pthread_cond_broadcast and gains access to counter... neither a) nor b) +prevent thread B2 in pthread_cond_broadcast from gaining access to +counter and starting another broadcast ( for c) - it depends on +cv->waitersLock scheduling rules: FIFO=OK, PRTY=PROBLEM,... ) + +That call to pthread_cond_broadcast (on thread B2) will result in +incrementing semaphore by cv->waiters (=L) which is INCORRECT (all +W1..N were in fact already released by thread B1) and waiting on +_auto-reset_ event cv->waitersDone which is DEADLY WRONG (produces a +deadlock)... + +All late W1..L threads now have a chance to complete their _wait call. +Last W_L thread sets an auto-reselt event cv->waitersDone which will +release either B1 or B2 leaving one of B threads in a deadlock. + +Problem 2: spur.wakeup/unfairness/incorrectness + +It seems that: + +a) because of the same problem with counter which does not reflect the +actual number of NOT RELEASED waiters, the signal call may increment +a semaphore counter w/o having a waiter blocked on it. That will result +in (best case) spurious wake ups - performance degradation due to +unnecessary context switches and predicate re-checks and (in worth case) +unfairness/incorrectness problem - see b) + +b) neither signal nor broadcast prevent other threads - "new waiters" +(and in the case of signal, the caller thread as well) from going into +_wait and overtaking "old" waiters (already released but still not returned +from sem_wait on condition's semaphore). Win semaphore just [API DOC]: +"Maintains a count between zero and some maximum value, limiting the number +of threads that are simultaneously accessing a shared resource." Calling +ReleaseSemaphore does not imply (at least not documented) that on return +from ReleaseSemaphore all waiters will in fact become released (returned +from their Wait... call) and/or that new waiters calling Wait... afterwards +will become less importance. It is NOT documented to be an atomic release +of +waiters... And even if it would be there is still a problem with a thread +being preempted after Wait on semaphore and before Wait on cv->waitersLock +and scheduling rules for cv->waitersLock itself +(??WaitForMultipleObjects??) +That may result in unfairness/incorrectness problem as described +for SetEvent impl. in "Strategies for Implementing POSIX Condition +Variables +on Win32": http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + +Unfairness -- The semantics of the POSIX pthread_cond_broadcast function is +to wake up all threads currently blocked in wait calls on the condition +variable. The awakened threads then compete for the external_mutex. To +ensure +fairness, all of these threads should be released from their +pthread_cond_wait calls and allowed to recheck their condition expressions +before other threads can successfully complete a wait on the condition +variable. + +Unfortunately, the SetEvent implementation above does not guarantee that +all +threads sleeping on the condition variable when cond_broadcast is called +will +acquire the external_mutex and check their condition expressions. Although +the Pthreads specification does not mandate this degree of fairness, the +lack of fairness can cause starvation. + +To illustrate the unfairness problem, imagine there are 2 threads, C1 and +C2, +that are blocked in pthread_cond_wait on condition variable not_empty_ that +is guarding a thread-safe message queue. Another thread, P1 then places two +messages onto the queue and calls pthread_cond_broadcast. If C1 returns +from +pthread_cond_wait, dequeues and processes the message, and immediately +waits +again then it and only it may end up acquiring both messages. Thus, C2 will +never get a chance to dequeue a message and run. + +The following illustrates the sequence of events: + +1. Thread C1 attempts to dequeue and waits on CV non_empty_ +2. Thread C2 attempts to dequeue and waits on CV non_empty_ +3. Thread P1 enqueues 2 messages and broadcasts to CV not_empty_ +4. Thread P1 exits +5. Thread C1 wakes up from CV not_empty_, dequeues a message and runs +6. Thread C1 waits again on CV not_empty_, immediately dequeues the 2nd + message and runs +7. Thread C1 exits +8. Thread C2 is the only thread left and blocks forever since + not_empty_ will never be signaled + +Depending on the algorithm being implemented, this lack of fairness may +yield +concurrent programs that have subtle bugs. Of course, application +developers +should not rely on the fairness semantics of pthread_cond_broadcast. +However, +there are many cases where fair implementations of condition variables can +simplify application code. + +Incorrectness -- A variation on the unfairness problem described above +occurs +when a third consumer thread, C3, is allowed to slip through even though it +was not waiting on condition variable not_empty_ when a broadcast occurred. + +To illustrate this, we will use the same scenario as above: 2 threads, C1 +and +C2, are blocked dequeuing messages from the message queue. Another thread, +P1 +then places two messages onto the queue and calls pthread_cond_broadcast. +C1 +returns from pthread_cond_wait, dequeues and processes the message. At this +time, C3 acquires the external_mutex, calls pthread_cond_wait and waits on +the events in WaitForMultipleObjects. Since C2 has not had a chance to run +yet, the BROADCAST event is still signaled. C3 then returns from +WaitForMultipleObjects, and dequeues and processes the message in the +queue. +Thus, C2 will never get a chance to dequeue a message and run. + +The following illustrates the sequence of events: + +1. Thread C1 attempts to dequeue and waits on CV non_empty_ +2. Thread C2 attempts to dequeue and waits on CV non_empty_ +3. Thread P1 enqueues 2 messages and broadcasts to CV not_empty_ +4. Thread P1 exits +5. Thread C1 wakes up from CV not_empty_, dequeues a message and runs +6. Thread C1 exits +7. Thread C3 waits on CV not_empty_, immediately dequeues the 2nd + message and runs +8. Thread C3 exits +9. Thread C2 is the only thread left and blocks forever since + not_empty_ will never be signaled + +In the above case, a thread that was not waiting on the condition variable +when a broadcast occurred was allowed to proceed. This leads to incorrect +semantics for a condition variable. + + +COMMENTS??? + +regards, +alexander. + +----------------------------------------------------------------------------- + +Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* + implementation questions +Date: Wed, 21 Feb 2001 11:54:47 +0100 +From: TEREKHOV@de.ibm.com +To: lthomas@arbitrade.com +CC: rpj@ise.canberra.edu.au, Thomas Pfaff , + Nanbor Wang + +Hi Louis, + +generation number 8.. + +had some time to revisit timeouts/spurious wakeup problem.. +found some bugs (in 7.b/c/d) and something to improve +(7a - using IPC semaphores but it should speedup Win32 +version as well). + +regards, +alexander. + +---------- Algorithm 8a / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ALL ------ +given: +semBlockLock - bin.semaphore +semBlockQueue - semaphore +mtxExternal - mutex or CS +mtxUnblockLock - mutex or CS +nWaitersGone - int +nWaitersBlocked - int +nWaitersToUnblock - int + +wait( timeout ) { + + [auto: register int result ] // error checking omitted + [auto: register int nSignalsWasLeft ] + [auto: register int nWaitersWasGone ] + + sem_wait( semBlockLock ); + nWaitersBlocked++; + sem_post( semBlockLock ); + + unlock( mtxExternal ); + bTimedOut = sem_wait( semBlockQueue,timeout ); + + lock( mtxUnblockLock ); + if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { + if ( bTimeout ) { // timeout (or canceled) + if ( 0 != nWaitersBlocked ) { + nWaitersBlocked--; + } + else { + nWaitersGone++; // count spurious wakeups + } + } + if ( 0 == --nWaitersToUnblock ) { + if ( 0 != nWaitersBlocked ) { + sem_post( semBlockLock ); // open the gate + nSignalsWasLeft = 0; // do not open the gate below +again + } + else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { + nWaitersGone = 0; + } + } + } + else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious +semaphore :-) + sem_wait( semBlockLock ); + nWaitersBlocked -= nWaitersGone; // something is going on here - +test of timeouts? :-) + sem_post( semBlockLock ); + nWaitersGone = 0; + } + unlock( mtxUnblockLock ); + + if ( 1 == nSignalsWasLeft ) { + if ( 0 != nWaitersWasGone ) { + // sem_adjust( -nWaitersWasGone ); + while ( nWaitersWasGone-- ) { + sem_wait( semBlockLock ); // better now than spurious +later + } + } + sem_post( semBlockLock ); // open the gate + } + + lock( mtxExternal ); + + return ( bTimedOut ) ? ETIMEOUT : 0; +} + +signal(bAll) { + + [auto: register int result ] + [auto: register int nSignalsToIssue] + + lock( mtxUnblockLock ); + + if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + if ( 0 == nWaitersBlocked ) { // NO-OP + return unlock( mtxUnblockLock ); + } + if (bAll) { + nWaitersToUnblock += nSignalsToIssue=nWaitersBlocked; + nWaitersBlocked = 0; + } + else { + nSignalsToIssue = 1; + nWaitersToUnblock++; + nWaitersBlocked--; + } + } + else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + sem_wait( semBlockLock ); // close the gate + if ( 0 != nWaitersGone ) { + nWaitersBlocked -= nWaitersGone; + nWaitersGone = 0; + } + if (bAll) { + nSignalsToIssue = nWaitersToUnblock = nWaitersBlocked; + nWaitersBlocked = 0; + } + else { + nSignalsToIssue = nWaitersToUnblock = 1; + nWaitersBlocked--; + } + } + else { // NO-OP + return unlock( mtxUnblockLock ); + } + + unlock( mtxUnblockLock ); + sem_post( semBlockQueue,nSignalsToIssue ); + return result; +} + +---------- Algorithm 8b / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ONEBYONE +------ +given: +semBlockLock - bin.semaphore +semBlockQueue - bin.semaphore +mtxExternal - mutex or CS +mtxUnblockLock - mutex or CS +nWaitersGone - int +nWaitersBlocked - int +nWaitersToUnblock - int + +wait( timeout ) { + + [auto: register int result ] // error checking omitted + [auto: register int nWaitersWasGone ] + [auto: register int nSignalsWasLeft ] + + sem_wait( semBlockLock ); + nWaitersBlocked++; + sem_post( semBlockLock ); + + unlock( mtxExternal ); + bTimedOut = sem_wait( semBlockQueue,timeout ); + + lock( mtxUnblockLock ); + if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { + if ( bTimeout ) { // timeout (or canceled) + if ( 0 != nWaitersBlocked ) { + nWaitersBlocked--; + nSignalsWasLeft = 0; // do not unblock next waiter +below (already unblocked) + } + else { + nWaitersGone = 1; // spurious wakeup pending!! + } + } + if ( 0 == --nWaitersToUnblock && + if ( 0 != nWaitersBlocked ) { + sem_post( semBlockLock ); // open the gate + nSignalsWasLeft = 0; // do not open the gate below +again + } + else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { + nWaitersGone = 0; + } + } + } + else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious +semaphore :-) + sem_wait( semBlockLock ); + nWaitersBlocked -= nWaitersGone; // something is going on here - +test of timeouts? :-) + sem_post( semBlockLock ); + nWaitersGone = 0; + } + unlock( mtxUnblockLock ); + + if ( 1 == nSignalsWasLeft ) { + if ( 0 != nWaitersWasGone ) { + // sem_adjust( -1 ); + sem_wait( semBlockQueue ); // better now than spurious +later + } + sem_post( semBlockLock ); // open the gate + } + else if ( 0 != nSignalsWasLeft ) { + sem_post( semBlockQueue ); // unblock next waiter + } + + lock( mtxExternal ); + + return ( bTimedOut ) ? ETIMEOUT : 0; +} + +signal(bAll) { + + [auto: register int result ] + + lock( mtxUnblockLock ); + + if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + if ( 0 == nWaitersBlocked ) { // NO-OP + return unlock( mtxUnblockLock ); + } + if (bAll) { + nWaitersToUnblock += nWaitersBlocked; + nWaitersBlocked = 0; + } + else { + nWaitersToUnblock++; + nWaitersBlocked--; + } + unlock( mtxUnblockLock ); + } + else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + sem_wait( semBlockLock ); // close the gate + if ( 0 != nWaitersGone ) { + nWaitersBlocked -= nWaitersGone; + nWaitersGone = 0; + } + if (bAll) { + nWaitersToUnblock = nWaitersBlocked; + nWaitersBlocked = 0; + } + else { + nWaitersToUnblock = 1; + nWaitersBlocked--; + } + unlock( mtxUnblockLock ); + sem_post( semBlockQueue ); + } + else { // NO-OP + unlock( mtxUnblockLock ); + } + + return result; +} + +---------- Algorithm 8c / IMPL_EVENT,UNBLOCK_STRATEGY == UNBLOCK_ONEBYONE +--------- +given: +hevBlockLock - auto-reset event +hevBlockQueue - auto-reset event +mtxExternal - mutex or CS +mtxUnblockLock - mutex or CS +nWaitersGone - int +nWaitersBlocked - int +nWaitersToUnblock - int + +wait( timeout ) { + + [auto: register int result ] // error checking omitted + [auto: register int nSignalsWasLeft ] + [auto: register int nWaitersWasGone ] + + wait( hevBlockLock,INFINITE ); + nWaitersBlocked++; + set_event( hevBlockLock ); + + unlock( mtxExternal ); + bTimedOut = wait( hevBlockQueue,timeout ); + + lock( mtxUnblockLock ); + if ( 0 != (SignalsWasLeft = nWaitersToUnblock) ) { + if ( bTimeout ) { // timeout (or canceled) + if ( 0 != nWaitersBlocked ) { + nWaitersBlocked--; + nSignalsWasLeft = 0; // do not unblock next waiter +below (already unblocked) + } + else { + nWaitersGone = 1; // spurious wakeup pending!! + } + } + if ( 0 == --nWaitersToUnblock ) + if ( 0 != nWaitersBlocked ) { + set_event( hevBlockLock ); // open the gate + nSignalsWasLeft = 0; // do not open the gate below +again + } + else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { + nWaitersGone = 0; + } + } + } + else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious +event :-) + wait( hevBlockLock,INFINITE ); + nWaitersBlocked -= nWaitersGone; // something is going on here - +test of timeouts? :-) + set_event( hevBlockLock ); + nWaitersGone = 0; + } + unlock( mtxUnblockLock ); + + if ( 1 == nSignalsWasLeft ) { + if ( 0 != nWaitersWasGone ) { + reset_event( hevBlockQueue ); // better now than spurious +later + } + set_event( hevBlockLock ); // open the gate + } + else if ( 0 != nSignalsWasLeft ) { + set_event( hevBlockQueue ); // unblock next waiter + } + + lock( mtxExternal ); + + return ( bTimedOut ) ? ETIMEOUT : 0; +} + +signal(bAll) { + + [auto: register int result ] + + lock( mtxUnblockLock ); + + if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + if ( 0 == nWaitersBlocked ) { // NO-OP + return unlock( mtxUnblockLock ); + } + if (bAll) { + nWaitersToUnblock += nWaitersBlocked; + nWaitersBlocked = 0; + } + else { + nWaitersToUnblock++; + nWaitersBlocked--; + } + unlock( mtxUnblockLock ); + } + else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + wait( hevBlockLock,INFINITE ); // close the gate + if ( 0 != nWaitersGone ) { + nWaitersBlocked -= nWaitersGone; + nWaitersGone = 0; + } + if (bAll) { + nWaitersToUnblock = nWaitersBlocked; + nWaitersBlocked = 0; + } + else { + nWaitersToUnblock = 1; + nWaitersBlocked--; + } + unlock( mtxUnblockLock ); + set_event( hevBlockQueue ); + } + else { // NO-OP + unlock( mtxUnblockLock ); + } + + return result; +} + +---------- Algorithm 8d / IMPL_EVENT,UNBLOCK_STRATEGY == UNBLOCK_ALL ------ +given: +hevBlockLock - auto-reset event +hevBlockQueueS - auto-reset event // for signals +hevBlockQueueB - manual-reset even // for broadcasts +mtxExternal - mutex or CS +mtxUnblockLock - mutex or CS +eBroadcast - int // 0: no broadcast, 1: broadcast, 2: +broadcast after signal(s) +nWaitersGone - int +nWaitersBlocked - int +nWaitersToUnblock - int + +wait( timeout ) { + + [auto: register int result ] // error checking omitted + [auto: register int eWasBroadcast ] + [auto: register int nSignalsWasLeft ] + [auto: register int nWaitersWasGone ] + + wait( hevBlockLock,INFINITE ); + nWaitersBlocked++; + set_event( hevBlockLock ); + + unlock( mtxExternal ); + bTimedOut = waitformultiple( hevBlockQueueS,hevBlockQueueB,timeout,ONE ); + + lock( mtxUnblockLock ); + if ( 0 != (SignalsWasLeft = nWaitersToUnblock) ) { + if ( bTimeout ) { // timeout (or canceled) + if ( 0 != nWaitersBlocked ) { + nWaitersBlocked--; + nSignalsWasLeft = 0; // do not unblock next waiter +below (already unblocked) + } + else if ( 1 != eBroadcast ) { + nWaitersGone = 1; + } + } + if ( 0 == --nWaitersToUnblock ) { + if ( 0 != nWaitersBlocked ) { + set_event( hevBlockLock ); // open the gate + nSignalsWasLeft = 0; // do not open the gate below +again + } + else { + if ( 0 != (eWasBroadcast = eBroadcast) ) { + eBroadcast = 0; + } + if ( 0 != (nWaitersWasGone = nWaitersGone ) { + nWaitersGone = 0; + } + } + } + else if ( 0 != eBroadcast ) { + nSignalsWasLeft = 0; // do not unblock next waiter +below (already unblocked) + } + } + else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious +event :-) + wait( hevBlockLock,INFINITE ); + nWaitersBlocked -= nWaitersGone; // something is going on here - +test of timeouts? :-) + set_event( hevBlockLock ); + nWaitersGone = 0; + } + unlock( mtxUnblockLock ); + + if ( 1 == nSignalsWasLeft ) { + if ( 0 != eWasBroadcast ) { + reset_event( hevBlockQueueB ); + } + if ( 0 != nWaitersWasGone ) { + reset_event( hevBlockQueueS ); // better now than spurious +later + } + set_event( hevBlockLock ); // open the gate + } + else if ( 0 != nSignalsWasLeft ) { + set_event( hevBlockQueueS ); // unblock next waiter + } + + lock( mtxExternal ); + + return ( bTimedOut ) ? ETIMEOUT : 0; +} + +signal(bAll) { + + [auto: register int result ] + [auto: register HANDLE hevBlockQueue ] + + lock( mtxUnblockLock ); + + if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + if ( 0 == nWaitersBlocked ) { // NO-OP + return unlock( mtxUnblockLock ); + } + if (bAll) { + nWaitersToUnblock += nWaitersBlocked; + nWaitersBlocked = 0; + eBroadcast = 2; + hevBlockQueue = hevBlockQueueB; + } + else { + nWaitersToUnblock++; + nWaitersBlocked--; + return unlock( mtxUnblockLock ); + } + } + else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + wait( hevBlockLock,INFINITE ); // close the gate + if ( 0 != nWaitersGone ) { + nWaitersBlocked -= nWaitersGone; + nWaitersGone = 0; + } + if (bAll) { + nWaitersToUnblock = nWaitersBlocked; + nWaitersBlocked = 0; + eBroadcast = 1; + hevBlockQueue = hevBlockQueueB; + } + else { + nWaitersToUnblock = 1; + nWaitersBlocked--; + hevBlockQueue = hevBlockQueueS; + } + } + else { // NO-OP + return unlock( mtxUnblockLock ); + } + + unlock( mtxUnblockLock ); + set_event( hevBlockQueue ); + return result; +} +---------------------- Forwarded by Alexander Terekhov/Germany/IBM on +02/21/2001 09:13 AM --------------------------- + +Alexander Terekhov +02/20/2001 04:33 PM + +To: Louis Thomas +cc: + +From: Alexander Terekhov/Germany/IBM@IBMDE +Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio + n questions +Importance: Normal + +>Sorry, gotta take a break and work on something else for a while. +>Real work +>calls, unfortunately. I'll get back to you in two or three days. + +ok. no problem. here is some more stuff for pauses you might have +in between :) + +---------- Algorithm 7d / IMPL_EVENT,UNBLOCK_STRATEGY == UNBLOCK_ALL ------ +given: +hevBlockLock - auto-reset event +hevBlockQueueS - auto-reset event // for signals +hevBlockQueueB - manual-reset even // for broadcasts +mtxExternal - mutex or CS +mtxUnblockLock - mutex or CS +bBroadcast - int +nWaitersGone - int +nWaitersBlocked - int +nWaitersToUnblock - int + +wait( timeout ) { + + [auto: register int result ] // error checking omitted + [auto: register int bWasBroadcast ] + [auto: register int nSignalsWasLeft ] + + wait( hevBlockLock,INFINITE ); + nWaitersBlocked++; + set_event( hevBlockLock ); + + unlock( mtxExternal ); + bTimedOut = waitformultiple( hevBlockQueueS,hevBlockQueueB,timeout,ONE ); + + lock( mtxUnblockLock ); + if ( 0 != (SignalsWasLeft = nWaitersToUnblock) ) { + if ( bTimeout ) { // timeout (or canceled) + if ( 0 != nWaitersBlocked ) { + nWaitersBlocked--; + nSignalsWasLeft = 0; // do not unblock next waiter +below (already unblocked) + } + else if ( !bBroadcast ) { + wait( hevBlockQueueS,INFINITE ); // better now than spurious +later + } + } + if ( 0 == --nWaitersToUnblock ) { + if ( 0 != nWaitersBlocked ) { + if ( bBroadcast ) { + reset_event( hevBlockQueueB ); + bBroadcast = false; + } + set_event( hevBlockLock ); // open the gate + nSignalsWasLeft = 0; // do not open the gate below +again + } + else if ( false != (bWasBroadcast = bBroadcast) ) { + bBroadcast = false; + } + } + else { + bWasBroadcast = bBroadcast; + } + } + else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious +event :-) + wait( hevBlockLock,INFINITE ); + nWaitersBlocked -= nWaitersGone; // something is going on here - +test of timeouts? :-) + set_event( hevBlockLock ); + nWaitersGone = 0; + } + unlock( mtxUnblockLock ); + + if ( 1 == nSignalsWasLeft ) { + if ( bWasBroadcast ) { + reset_event( hevBlockQueueB ); + } + set_event( hevBlockLock ); // open the gate + } + else if ( 0 != nSignalsWasLeft && !bWasBroadcast ) { + set_event( hevBlockQueueS ); // unblock next waiter + } + + lock( mtxExternal ); + + return ( bTimedOut ) ? ETIMEOUT : 0; +} + +signal(bAll) { + + [auto: register int result ] + [auto: register HANDLE hevBlockQueue ] + + lock( mtxUnblockLock ); + + if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + if ( 0 == nWaitersBlocked ) { // NO-OP + return unlock( mtxUnblockLock ); + } + if (bAll) { + nWaitersToUnblock += nWaitersBlocked; + nWaitersBlocked = 0; + bBroadcast = true; + hevBlockQueue = hevBlockQueueB; + } + else { + nWaitersToUnblock++; + nWaitersBlocked--; + return unlock( mtxUnblockLock ); + } + } + else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + wait( hevBlockLock,INFINITE ); // close the gate + if ( 0 != nWaitersGone ) { + nWaitersBlocked -= nWaitersGone; + nWaitersGone = 0; + } + if (bAll) { + nWaitersToUnblock = nWaitersBlocked; + nWaitersBlocked = 0; + bBroadcast = true; + hevBlockQueue = hevBlockQueueB; + } + else { + nWaitersToUnblock = 1; + nWaitersBlocked--; + hevBlockQueue = hevBlockQueueS; + } + } + else { // NO-OP + return unlock( mtxUnblockLock ); + } + + unlock( mtxUnblockLock ); + set_event( hevBlockQueue ); + return result; +} + + +---------------------------------------------------------------------------- + +Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio + n questions +Date: Mon, 26 Feb 2001 22:20:12 -0600 +From: Louis Thomas +To: "'TEREKHOV@de.ibm.com'" +CC: rpj@ise.canberra.edu.au, Thomas Pfaff , + Nanbor Wang + + +Sorry all. Busy week. + +> this insures the fairness +> which POSIX does not (e.g. two subsequent broadcasts - the gate does +insure +> that first wave waiters will start the race for the mutex before waiters +> from the second wave - Linux pthreads process/unblock both waves +> concurrently...) + +I'm not sure how we are any more fair about this than Linux. We certainly +don't guarantee that the threads released by the first broadcast will get +the external mutex before the threads of the second wave. In fact, it is +possible that those threads will never get the external mutex if there is +enough contention for it. + +> e.g. i was thinking about implementation with a pool of +> N semaphores/counters [...] + +I considered that too. The problem is as you mentioned in a). You really +need to assign threads to semaphores once you know how you want to wake them +up, not when they first begin waiting which is the only time you can assign +them. + +> well, i am not quite sure that i've fully understood your scenario, + +Hmm. Well, it think it's an important example, so I'll try again. First, we +have thread A which we KNOW is waiting on a condition. As soon as it becomes +unblocked for any reason, we will know because it will set a flag. Since the +flag is not set, we are 100% confident that thread A is waiting on the +condition. We have another thread, thread B, which has acquired the mutex +and is about to wait on the condition. Thus it is pretty clear that at any +point, either just A is waiting, or A and B are waiting. Now thread C comes +along. C is about to do a broadcast on the condition. A broadcast is +guaranteed to unblock all threads currently waiting on a condition, right? +Again, we said that either just A is waiting, or A and B are both waiting. +So, when C does its broadcast, depending upon whether B has started waiting +or not, thread C will unblock A or unblock A and B. Either way, C must +unblock A, right? + +Now, you said anything that happens is correct so long as a) "a signal is +not lost between unlocking the mutex and waiting on the condition" and b) "a +thread must not steal a signal it sent", correct? Requirement b) is easy to +satisfy: in this scenario, thread C will never wait on the condition, so it +won't steal any signals. Requirement a) is not hard either. The only way we +could fail to meet requirement a) in this scenario is if thread B was +started waiting but didn't wake up because a signal was lost. This will not +happen. + +Now, here is what happens. Assume thread C beats thread B. Thread C looks to +see how many threads are waiting on the condition. Thread C sees just one +thread, thread A, waiting. It does a broadcast waking up just one thread +because just one thread is waiting. Next, before A can become unblocked, +thread B begins waiting. Now there are two threads waiting, but only one +will be unblocked. Suppose B wins. B will become unblocked. A will not +become unblocked, because C only unblocked one thread (sema_post cond, 1). +So at the end, B finishes and A remains blocked. + +We have met both of your requirements, so by your rules, this is an +acceptable outcome. However, I think that the spec says this is an +unacceptable outcome! We know for certain that A was waiting and that C did +a broadcast, but A did not become unblocked! Yet, the spec says that a +broadcast wakes up all waiting threads. This did not happen. Do you agree +that this shows your rules are not strict enough? + +> and what about N2? :) this one does allow almost everything. + +Don't get me started about rule #2. I'll NEVER advocate an algorithm that +uses rule 2 as an excuse to suck! + +> but it is done (decrement)under mutex protection - this is not a subject +> of a race condition. + +You are correct. My mistake. + +> i would remove "_bTimedOut=false".. after all, it was a real timeout.. + +I disagree. A thread that can't successfully retract its waiter status can't +really have timed out. If a thread can't return without executing extra code +to deal with the fact that someone tried to unblock it, I think it is a poor +idea to pretend we +didn't realize someone was trying to signal us. After all, a signal is more +important than a time out. + +> when nSignaled != 0, it is possible to update nWaiters (--) and do not +> touch nGone + +I realize this, but I was thinking that writing it the other ways saves +another if statement. + +> adjust only if nGone != 0 and save one cache memory write - probably much +slower than 'if' + +Hmm. You are probably right. + +> well, in a strange (e.g. timeout test) program you may (theoretically) +> have an overflow of nWaiters/nGone counters (with waiters repeatedly +timing +> out and no signals at all). + +Also true. Not only that, but you also have the possibility that one could +overflow the number of waiters as well! However, considering the limit you +have chosen for nWaitersGone, I suppose it is unlikely that anyone would be +able to get INT_MAX/2 threads waiting on a single condition. :) + +Analysis of 8a: + +It looks correct to me. + +What are IPC semaphores? + +In the line where you state, "else if ( nWaitersBlocked > nWaitersGone ) { +// HARMLESS RACE CONDITION!" there is no race condition for nWaitersGone +because nWaitersGone is never modified without holding mtxUnblockLock. You +are correct that there is a harmless race on nWaitersBlocked, which can +increase and make the condition become true just after we check it. If this +happens, we interpret it as the wait starting after the signal. + +I like your optimization of this. You could improve Alg. 6 as follows: +---------- Algorithm 6b ---------- +signal(bAll) { + _nSig=0 + lock counters + // this is safe because nWaiting can only be decremented by a thread that + // owns counters and nGone can only be changed by a thread that owns +counters. + if (nWaiting>nGone) { + if (0==nSignaled) { + sema_wait gate // close gate if not already closed + } + if (nGone>0) { + nWaiting-=nGone + nGone=0 + } + _nSig=bAll?nWaiting:1 + nSignaled+=_nSig + nWaiting-=_nSig + } + unlock counters + if (0!=_nSig) { + sema_post queue, _nSig + } +} +---------- ---------- ---------- +I guess this wouldn't apply to Alg 8a because nWaitersGone changes meanings +depending upon whether the gate is open or closed. + +In the loop "while ( nWaitersWasGone-- ) {" you do a sema_wait on +semBlockLock. Perhaps waiting on semBlockQueue would be a better idea. + +What have you gained by making the last thread to be signaled do the waits +for all the timed out threads, besides added complexity? It took me a long +time to figure out what your objective was with this, to realize you were +using nWaitersGone to mean two different things, and to verify that you +hadn't introduced any bug by doing this. Even now I'm not 100% sure. + +What has all this playing about with nWaitersGone really gained us besides a +lot of complexity (it is much harder to verify that this solution is +correct), execution overhead (we now have a lot more if statements to +evaluate), and space overhead (more space for the extra code, and another +integer in our data)? We did manage to save a lock/unlock pair in an +uncommon case (when a time out occurs) at the above mentioned expenses in +the common cases. + +As for 8b, c, and d, they look ok though I haven't studied them thoroughly. +What would you use them for? + + Later, + -Louis! :) + +----------------------------------------------------------------------------- + +Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio + n questions +Date: Tue, 27 Feb 2001 15:51:28 +0100 +From: TEREKHOV@de.ibm.com +To: Louis Thomas +CC: rpj@ise.canberra.edu.au, Thomas Pfaff , + Nanbor Wang + +Hi Louis, + +>> that first wave waiters will start the race for the mutex before waiters +>> from the second wave - Linux pthreads process/unblock both waves +>> concurrently...) +> +>I'm not sure how we are any more fair about this than Linux. We certainly +>don't guarantee that the threads released by the first broadcast will get +>the external mutex before the threads of the second wave. In fact, it is +>possible that those threads will never get the external mutex if there is +>enough contention for it. + +correct. but gate is nevertheless more fair than Linux because of the +barrier it establishes between two races (1st and 2nd wave waiters) for +the mutex which under 'normal' circumstances (e.g. all threads of equal +priorities,..) will 'probably' result in fair behaviour with respect to +mutex ownership. + +>> well, i am not quite sure that i've fully understood your scenario, +> +>Hmm. Well, it think it's an important example, so I'll try again. ... + +ok. now i seem to understand this example. well, now it seems to me +that the only meaningful rule is just: + +a) "a signal is not lost between unlocking the mutex and waiting on the +condition" + +and that the rule + +b) "a thread must not steal a signal it sent" + +is not needed at all because a thread which violates b) also violates a). + +i'll try to explain.. + +i think that the most important thing is how POSIX defines waiter's +visibility: + +"if another thread is able to acquire the mutex after the about-to-block +thread +has released it, then a subsequent call to pthread_cond_signal() or +pthread_cond_broadcast() in that thread behaves as if it were issued after +the about-to-block thread has blocked. " + +my understanding is the following: + +1) there is no guarantees whatsoever with respect to whether +signal/broadcast +will actually unblock any 'waiter' if it is done w/o acquiring the mutex +first +(note that a thread may release it before signal/broadcast - it does not +matter). + +2) it is guaranteed that waiters become 'visible' - eligible for unblock as +soon +as signalling thread acquires the mutex (but not before!!) + +so.. + +>So, when C does its broadcast, depending upon whether B has started +waiting +>or not, thread C will unblock A or unblock A and B. Either way, C must +>unblock A, right? + +right. but only if C did acquire the mutex prior to broadcast (it may +release it before broadcast as well). + +implementation will violate waiters visibility rule (signal will become +lost) +if C will not unblock A. + +>Now, here is what happens. Assume thread C beats thread B. Thread C looks +to +>see how many threads are waiting on the condition. Thread C sees just one +>thread, thread A, waiting. It does a broadcast waking up just one thread +>because just one thread is waiting. Next, before A can become unblocked, +>thread B begins waiting. Now there are two threads waiting, but only one +>will be unblocked. Suppose B wins. B will become unblocked. A will not +>become unblocked, because C only unblocked one thread (sema_post cond, 1). +>So at the end, B finishes and A remains blocked. + +thread C did acquire the mutex ("Thread C sees just one thread, thread A, +waiting"). beginning from that moment it is guaranteed that subsequent +broadcast will unblock A. Otherwise we will have a lost signal with respect +to A. I do think that it does not matter whether the signal was physically +(completely) lost or was just stolen by another thread (B) - in both cases +it was simply lost with respect to A. + +>..Do you agree that this shows your rules are not strict enough? + +probably the opposite.. :-) i think that it shows that the only meaningful +rule is + +a) "a signal is not lost between unlocking the mutex and waiting on the +condition" + +with clarification of waiters visibility as defined by POSIX above. + +>> i would remove "_bTimedOut=false".. after all, it was a real timeout.. +> +>I disagree. A thread that can't successfully retract its waiter status +can't +>really have timed out. If a thread can't return without executing extra +code +>to deal with the fact that someone tried to unblock it, I think it is a +poor +>idea to pretend we +>didn't realize someone was trying to signal us. After all, a signal is +more +>important than a time out. + +a) POSIX does allow timed out thread to consume a signal (cancelled is +not). +b) ETIMEDOUT status just says that: "The time specified by abstime to +pthread_cond_timedwait() has passed." +c) it seem to me that hiding timeouts would violate "The +pthread_cond_timedwait() +function is the same as pthread_cond_wait() except that an error is +returned if +the absolute time specified by abstime passes (that is, system time equals +or +exceeds abstime) before the condition cond is signaled or broadcasted" +because +the abs. time did really pass before cond was signaled (waiter was +released via semaphore). however, if it really matters, i could imaging +that we +can save an abs. time of signal/broadcast and compare it with timeout after +unblock to find out whether it was a 'real' timeout or not. absent this +check +i do think that hiding timeouts would result in technical violation of +specification.. but i think that this check is not important and we can +simply +trust timeout error code provided by wait since we are not trying to make +'hard' realtime implementation. + +>What are IPC semaphores? + + +int semctl(int, int, int, ...); +int semget(key_t, int, int); +int semop(int, struct sembuf *, size_t); + +they support adjustment of semaphore counter (semvalue) +in one single call - imaging Win32 ReleaseSemaphore( hsem,-N ) + +>In the line where you state, "else if ( nWaitersBlocked > nWaitersGone ) { +>// HARMLESS RACE CONDITION!" there is no race condition for nWaitersGone +>because nWaitersGone is never modified without holding mtxUnblockLock. You +>are correct that there is a harmless race on nWaitersBlocked, which can +>increase and make the condition become true just after we check it. If +this +>happens, we interpret it as the wait starting after the signal. + +well, the reason why i've asked on comp.programming.threads whether this +race +condition is harmless or not is that in order to be harmless it should not +violate the waiters visibility rule (see above). Fortunately, we increment +the counter under protection of external mutex.. so that any (signalling) +thread which will acquire the mutex next, should see the updated counter +(in signal) according to POSIX memory visibility rules and mutexes +(memory barriers). But i am not so sure how it actually works on +Win32/INTEL +which does not explicitly define any memory visibility rules :( + +>I like your optimization of this. You could improve Alg. 6 as follows: +>---------- Algorithm 6b ---------- +>signal(bAll) { +> _nSig=0 +> lock counters +> // this is safe because nWaiting can only be decremented by a thread +that +> // owns counters and nGone can only be changed by a thread that owns +>counters. +> if (nWaiting>nGone) { +> if (0==nSignaled) { +> sema_wait gate // close gate if not already closed +> } +> if (nGone>0) { +> nWaiting-=nGone +> nGone=0 +> } +> _nSig=bAll?nWaiting:1 +> nSignaled+=_nSig +> nWaiting-=_nSig +> } +> unlock counters +> if (0!=_nSig) { +> sema_post queue, _nSig +> } +>} +>---------- ---------- ---------- +>I guess this wouldn't apply to Alg 8a because nWaitersGone changes +meanings +>depending upon whether the gate is open or closed. + +agree. + +>In the loop "while ( nWaitersWasGone-- ) {" you do a sema_wait on +>semBlockLock. Perhaps waiting on semBlockQueue would be a better idea. + +you are correct. my mistake. + +>What have you gained by making the last thread to be signaled do the waits +>for all the timed out threads, besides added complexity? It took me a long +>time to figure out what your objective was with this, to realize you were +>using nWaitersGone to mean two different things, and to verify that you +>hadn't introduced any bug by doing this. Even now I'm not 100% sure. +> +>What has all this playing about with nWaitersGone really gained us besides +a +>lot of complexity (it is much harder to verify that this solution is +>correct), execution overhead (we now have a lot more if statements to +>evaluate), and space overhead (more space for the extra code, and another +>integer in our data)? We did manage to save a lock/unlock pair in an +>uncommon case (when a time out occurs) at the above mentioned expenses in +>the common cases. + +well, please consider the following: + +1) with multiple waiters unblocked (but some timed out) the trick with +counter +seem to ensure potentially higher level of concurrency by not delaying +most of unblocked waiters for semaphore cleanup - only the last one +will be delayed but all others would already contend/acquire/release +the external mutex - the critical section protected by mtxUnblockLock is +made smaller (increment + couple of IFs is faster than system/kernel call) +which i think is good in general. however, you are right, this is done +at expense of 'normal' waiters.. + +2) some semaphore APIs (e.g. POSIX IPC sems) do allow to adjust the +semaphore counter in one call => less system/kernel calls.. imagine: + +if ( 1 == nSignalsWasLeft ) { + if ( 0 != nWaitersWasGone ) { + ReleaseSemaphore( semBlockQueue,-nWaitersWasGone ); // better now +than spurious later + } + sem_post( semBlockLock ); // open the gate + } + +3) even on win32 a single thread doing multiple cleanup calls (to wait) +will probably result in faster execution (because of processor caching) +than multiple threads each doing a single call to wait. + +>As for 8b, c, and d, they look ok though I haven't studied them +thoroughly. +>What would you use them for? + +8b) for semaphores which do not allow to unblock multiple waiters +in a single call to post/release (e.g. POSIX realtime semaphores - +) + +8c/8d) for WinCE prior to 3.0 (WinCE 3.0 does have semaphores) + +ok. so, which one is the 'final' algorithm(s) which we should use in +pthreads-win32?? + +regards, +alexander. + +---------------------------------------------------------------------------- + +Louis Thomas on 02/27/2001 05:20:12 AM + +Please respond to Louis Thomas + +To: Alexander Terekhov/Germany/IBM@IBMDE +cc: rpj@ise.canberra.edu.au, Thomas Pfaff , Nanbor Wang + +Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio + n questions + +Sorry all. Busy week. + +> this insures the fairness +> which POSIX does not (e.g. two subsequent broadcasts - the gate does +insure +> that first wave waiters will start the race for the mutex before waiters +> from the second wave - Linux pthreads process/unblock both waves +> concurrently...) + +I'm not sure how we are any more fair about this than Linux. We certainly +don't guarantee that the threads released by the first broadcast will get +the external mutex before the threads of the second wave. In fact, it is +possible that those threads will never get the external mutex if there is +enough contention for it. + +> e.g. i was thinking about implementation with a pool of +> N semaphores/counters [...] + +I considered that too. The problem is as you mentioned in a). You really +need to assign threads to semaphores once you know how you want to wake +them +up, not when they first begin waiting which is the only time you can assign +them. + +> well, i am not quite sure that i've fully understood your scenario, + +Hmm. Well, it think it's an important example, so I'll try again. First, we +have thread A which we KNOW is waiting on a condition. As soon as it +becomes +unblocked for any reason, we will know because it will set a flag. Since +the +flag is not set, we are 100% confident that thread A is waiting on the +condition. We have another thread, thread B, which has acquired the mutex +and is about to wait on the condition. Thus it is pretty clear that at any +point, either just A is waiting, or A and B are waiting. Now thread C comes +along. C is about to do a broadcast on the condition. A broadcast is +guaranteed to unblock all threads currently waiting on a condition, right? +Again, we said that either just A is waiting, or A and B are both waiting. +So, when C does its broadcast, depending upon whether B has started waiting +or not, thread C will unblock A or unblock A and B. Either way, C must +unblock A, right? + +Now, you said anything that happens is correct so long as a) "a signal is +not lost between unlocking the mutex and waiting on the condition" and b) +"a +thread must not steal a signal it sent", correct? Requirement b) is easy to +satisfy: in this scenario, thread C will never wait on the condition, so it +won't steal any signals. Requirement a) is not hard either. The only way +we +could fail to meet requirement a) in this scenario is if thread B was +started waiting but didn't wake up because a signal was lost. This will not +happen. + +Now, here is what happens. Assume thread C beats thread B. Thread C looks +to +see how many threads are waiting on the condition. Thread C sees just one +thread, thread A, waiting. It does a broadcast waking up just one thread +because just one thread is waiting. Next, before A can become unblocked, +thread B begins waiting. Now there are two threads waiting, but only one +will be unblocked. Suppose B wins. B will become unblocked. A will not +become unblocked, because C only unblocked one thread (sema_post cond, 1). +So at the end, B finishes and A remains blocked. + +We have met both of your requirements, so by your rules, this is an +acceptable outcome. However, I think that the spec says this is an +unacceptable outcome! We know for certain that A was waiting and that C did +a broadcast, but A did not become unblocked! Yet, the spec says that a +broadcast wakes up all waiting threads. This did not happen. Do you agree +that this shows your rules are not strict enough? + +> and what about N2? :) this one does allow almost everything. + +Don't get me started about rule #2. I'll NEVER advocate an algorithm that +uses rule 2 as an excuse to suck! + +> but it is done (decrement)under mutex protection - this is not a subject +> of a race condition. + +You are correct. My mistake. + +> i would remove "_bTimedOut=false".. after all, it was a real timeout.. + +I disagree. A thread that can't successfully retract its waiter status +can't +really have timed out. If a thread can't return without executing extra +code +to deal with the fact that someone tried to unblock it, I think it is a +poor +idea to pretend we +didn't realize someone was trying to signal us. After all, a signal is more +important than a time out. + +> when nSignaled != 0, it is possible to update nWaiters (--) and do not +> touch nGone + +I realize this, but I was thinking that writing it the other ways saves +another if statement. + +> adjust only if nGone != 0 and save one cache memory write - probably much +slower than 'if' + +Hmm. You are probably right. + +> well, in a strange (e.g. timeout test) program you may (theoretically) +> have an overflow of nWaiters/nGone counters (with waiters repeatedly +timing +> out and no signals at all). + +Also true. Not only that, but you also have the possibility that one could +overflow the number of waiters as well! However, considering the limit you +have chosen for nWaitersGone, I suppose it is unlikely that anyone would be +able to get INT_MAX/2 threads waiting on a single condition. :) + +Analysis of 8a: + +It looks correct to me. + +What are IPC semaphores? + +In the line where you state, "else if ( nWaitersBlocked > nWaitersGone ) { +// HARMLESS RACE CONDITION!" there is no race condition for nWaitersGone +because nWaitersGone is never modified without holding mtxUnblockLock. You +are correct that there is a harmless race on nWaitersBlocked, which can +increase and make the condition become true just after we check it. If this +happens, we interpret it as the wait starting after the signal. + +I like your optimization of this. You could improve Alg. 6 as follows: +---------- Algorithm 6b ---------- +signal(bAll) { + _nSig=0 + lock counters + // this is safe because nWaiting can only be decremented by a thread that + // owns counters and nGone can only be changed by a thread that owns +counters. + if (nWaiting>nGone) { + if (0==nSignaled) { + sema_wait gate // close gate if not already closed + } + if (nGone>0) { + nWaiting-=nGone + nGone=0 + } + _nSig=bAll?nWaiting:1 + nSignaled+=_nSig + nWaiting-=_nSig + } + unlock counters + if (0!=_nSig) { + sema_post queue, _nSig + } +} +---------- ---------- ---------- +I guess this wouldn't apply to Alg 8a because nWaitersGone changes meanings +depending upon whether the gate is open or closed. + +In the loop "while ( nWaitersWasGone-- ) {" you do a sema_wait on +semBlockLock. Perhaps waiting on semBlockQueue would be a better idea. + +What have you gained by making the last thread to be signaled do the waits +for all the timed out threads, besides added complexity? It took me a long +time to figure out what your objective was with this, to realize you were +using nWaitersGone to mean two different things, and to verify that you +hadn't introduced any bug by doing this. Even now I'm not 100% sure. + +What has all this playing about with nWaitersGone really gained us besides +a +lot of complexity (it is much harder to verify that this solution is +correct), execution overhead (we now have a lot more if statements to +evaluate), and space overhead (more space for the extra code, and another +integer in our data)? We did manage to save a lock/unlock pair in an +uncommon case (when a time out occurs) at the above mentioned expenses in +the common cases. + +As for 8b, c, and d, they look ok though I haven't studied them thoroughly. +What would you use them for? + + Later, + -Louis! :) + diff --git a/win32/3rdparty/pthreads/README.NONPORTABLE b/win32/3rdparty/pthreads/README.NONPORTABLE new file mode 100644 index 000000000..aa43297e1 --- /dev/null +++ b/win32/3rdparty/pthreads/README.NONPORTABLE @@ -0,0 +1,285 @@ +This file documents non-portable functions and other issues. + +Non-portable functions included in pthreads-win32 +------------------------------------------------- + +BOOL +pthread_win32_test_features_np(int mask) + + This routine allows an application to check which + run-time auto-detected features are available within + the library. + + The possible features are: + + PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE + Return TRUE if the native version of + InterlockedCompareExchange() is being used. + PTW32_ALERTABLE_ASYNC_CANCEL + Return TRUE is the QueueUserAPCEx package + QUSEREX.DLL is available and the AlertDrv.sys + driver is loaded into Windows, providing + alertable (pre-emptive) asyncronous threads + cancelation. If this feature returns FALSE + then the default async cancel scheme is in + use, which cannot cancel blocked threads. + + Features may be Or'ed into the mask parameter, in which case + the routine returns TRUE if any of the Or'ed features would + return TRUE. At this stage it doesn't make sense to Or features + but it may some day. + + +void * +pthread_timechange_handler_np(void *) + + To improve tolerance against operator or time service + initiated system clock changes. + + This routine can be called by an application when it + receives a WM_TIMECHANGE message from the system. At + present it broadcasts all condition variables so that + waiting threads can wake up and re-evaluate their + conditions and restart their timed waits if required. + + It has the same return type and argument type as a + thread routine so that it may be called directly + through pthread_create(), i.e. as a separate thread. + + Parameters + + Although a parameter must be supplied, it is ignored. + The value NULL can be used. + + Return values + + It can return an error EAGAIN to indicate that not + all condition variables were broadcast for some reason. + Otherwise, 0 is returned. + + If run as a thread, the return value is returned + through pthread_join(). + + The return value should be cast to an integer. + + +HANDLE +pthread_getw32threadhandle_np(pthread_t thread); + + Returns the win32 thread handle that the POSIX + thread "thread" is running as. + + Applications can use the win32 handle to set + win32 specific attributes of the thread. + + +int +pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, int kind) + +int +pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, int *kind) + + These two routines are included for Linux compatibility + and are direct equivalents to the standard routines + pthread_mutexattr_settype + pthread_mutexattr_gettype + + pthread_mutexattr_setkind_np accepts the following + mutex kinds: + PTHREAD_MUTEX_FAST_NP + PTHREAD_MUTEX_ERRORCHECK_NP + PTHREAD_MUTEX_RECURSIVE_NP + + These are really just equivalent to (respectively): + PTHREAD_MUTEX_NORMAL + PTHREAD_MUTEX_ERRORCHECK + PTHREAD_MUTEX_RECURSIVE + +int +pthread_delay_np (const struct timespec *interval); + + This routine causes a thread to delay execution for a specific period of time. + This period ends at the current time plus the specified interval. The routine + will not return before the end of the period is reached, but may return an + arbitrary amount of time after the period has gone by. This can be due to + system load, thread priorities, and system timer granularity. + + Specifying an interval of zero (0) seconds and zero (0) nanoseconds is + allowed and can be used to force the thread to give up the processor or to + deliver a pending cancelation request. + + This routine is a cancelation point. + + The timespec structure contains the following two fields: + + tv_sec is an integer number of seconds. + tv_nsec is an integer number of nanoseconds. + + Return Values + + If an error condition occurs, this routine returns an integer value + indicating the type of error. Possible return values are as follows: + + 0 Successful completion. + [EINVAL] The value specified by interval is invalid. + +int +pthread_num_processors_np + + This routine (found on HPUX systems) returns the number of processors + in the system. This implementation actually returns the number of + processors available to the process, which can be a lower number + than the system's number, depending on the process's affinity mask. + +BOOL +pthread_win32_process_attach_np (void); + +BOOL +pthread_win32_process_detach_np (void); + +BOOL +pthread_win32_thread_attach_np (void); + +BOOL +pthread_win32_thread_detach_np (void); + + These functions contain the code normally run via dllMain + when the library is used as a dll but which need to be + called explicitly by an application when the library + is statically linked. + + You will need to call pthread_win32_process_attach_np() before + you can call any pthread routines when statically linking. + You should call pthread_win32_process_detach_np() before + exiting your application to clean up. + + pthread_win32_thread_attach_np() is currently a no-op, but + pthread_win32_thread_detach_np() is needed to clean up + the implicit pthread handle that is allocated to a Win32 thread if + it calls certain pthreads routines. Call this routine when the + Win32 thread exits. + + These functions invariably return TRUE except for + pthread_win32_process_attach_np() which will return FALSE + if pthreads-win32 initialisation fails. + +int +pthreadCancelableWait (HANDLE waitHandle); + +int +pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout); + + These two functions provide hooks into the pthread_cancel + mechanism that will allow you to wait on a Windows handle + and make it a cancellation point. Both functions block + until either the given w32 handle is signaled, or + pthread_cancel has been called. It is implemented using + WaitForMultipleObjects on 'waitHandle' and a manually + reset w32 event used to implement pthread_cancel. + + +Non-portable issues +------------------- + +Thread priority + + POSIX defines a single contiguous range of numbers that determine a + thread's priority. Win32 defines priority classes and priority + levels relative to these classes. Classes are simply priority base + levels that the defined priority levels are relative to such that, + changing a process's priority class will change the priority of all + of it's threads, while the threads retain the same relativity to each + other. + + A Win32 system defines a single contiguous monotonic range of values + that define system priority levels, just like POSIX. However, Win32 + restricts individual threads to a subset of this range on a + per-process basis. + + The following table shows the base priority levels for combinations + of priority class and priority value in Win32. + + Process Priority Class Thread Priority Level + ----------------------------------------------------------------- + 1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE + 1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + 1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + 1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + 1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE + 2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 7 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 11 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + 15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + 15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + 15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + 15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + 16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE + 17 REALTIME_PRIORITY_CLASS -7 + 18 REALTIME_PRIORITY_CLASS -6 + 19 REALTIME_PRIORITY_CLASS -5 + 20 REALTIME_PRIORITY_CLASS -4 + 21 REALTIME_PRIORITY_CLASS -3 + 22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + 23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + 24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + 25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + 26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + 27 REALTIME_PRIORITY_CLASS 3 + 28 REALTIME_PRIORITY_CLASS 4 + 29 REALTIME_PRIORITY_CLASS 5 + 30 REALTIME_PRIORITY_CLASS 6 + 31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + + Windows NT: Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported. + + + As you can see, the real priority levels available to any individual + Win32 thread are non-contiguous. + + An application using pthreads-win32 should not make assumptions about + the numbers used to represent thread priority levels, except that they + are monotonic between the values returned by sched_get_priority_min() + and sched_get_priority_max(). E.g. Windows 95, 98, NT, 2000, XP make + available a non-contiguous range of numbers between -15 and 15, while + at least one version of WinCE (3.0) defines the minimum priority + (THREAD_PRIORITY_LOWEST) as 5, and the maximum priority + (THREAD_PRIORITY_HIGHEST) as 1. + + Internally, pthreads-win32 maps any priority levels between + THREAD_PRIORITY_IDLE and THREAD_PRIORITY_LOWEST to THREAD_PRIORITY_LOWEST, + or between THREAD_PRIORITY_TIME_CRITICAL and THREAD_PRIORITY_HIGHEST to + THREAD_PRIORITY_HIGHEST. Currently, this also applies to + REALTIME_PRIORITY_CLASSi even if levels -7, -6, -5, -4, -3, 3, 4, 5, and 6 + are supported. + + If it wishes, a Win32 application using pthreads-win32 can use the Win32 + defined priority macros THREAD_PRIORITY_IDLE through + THREAD_PRIORITY_TIME_CRITICAL. diff --git a/win32/3rdparty/pthreads/README.Watcom b/win32/3rdparty/pthreads/README.Watcom new file mode 100644 index 000000000..2974928a3 --- /dev/null +++ b/win32/3rdparty/pthreads/README.Watcom @@ -0,0 +1,62 @@ +Watcom compiler notes +===================== + +Status +------ +Not yet usable. Although the library builds under Watcom it +substantially fails the test suite. + +There is a working Wmakefile for wmake for the library build. + +invoke as any of: +wmake -f Wmakefile clean WC +wmake -f Wmakefile clean WC-inlined +wmake -f Wmakefile clean WCE +wmake -f Wmakefile clean WCE-inlined + +These build pthreadWC.dll and pthreadWCE.dll. + +There is a working Wmakefile for wmake for the test suite. + +invoke as any of: +wmake -f Wmakefile clean WC +wmake -f Wmakefile clean WCX +wmake -f Wmakefile clean WCE +wmake -f Wmakefile clean WC-bench +wmake -f Wmakefile clean WCX-bench +wmake -f Wmakefile clean WCE-bench + + +Current known problems +---------------------- + +Library build: +The Watcom compiler uses a different default call convention to MS C or GNU C and so +applications are not compatible with pthreadVC.dll etc using pre 2003-10-14 versions +of pthread.h, sched.h, or semaphore.h. The cdecl attribute can be used on exposed +function prototypes to force compatibility with MS C built DLLs. + +However, there appear to be other incompatibilities. Errno.h, for example, defines +different values for the standard C and POSIX errors to those defined by the MS C +errno.h. It may be that references to Watcom's threads compatible 'errno' do set +and return translated numbers consistently, but I have not verified this. + +Watcom defines errno as a dereferenced pointer returned by the function +_get_errno_ptr(). This is similar to both the MS and GNU C environments for +multithreaded use. However, the Watcom version appears to have a number of problems: + +- different threads return the same pointer value. Compare with the MS and GNU C +versions which correctly return different values (since each thread must maintain +a thread specific errno value). + +- an errno value set within the DLL appears as zero in the application even though +both share the same thread. + +Therefore applications built using the Watcom compiler may need to use +a Watcom built version of the library (pthreadWC.dll). If this is the case, then +the cdecl function attribute should not be required. + +Application builds: +The test suite fails with the Watcom compiler. + +Test semaphore1.c fails for pthreadWC.dll because errno returns 0 instead of EAGAIN. diff --git a/win32/3rdparty/pthreads/README.WinCE b/win32/3rdparty/pthreads/README.WinCE new file mode 100644 index 000000000..a2cd8c213 --- /dev/null +++ b/win32/3rdparty/pthreads/README.WinCE @@ -0,0 +1,6 @@ +WinCE port +---------- +(See the file WinCE-PORT for a detailed explanation.) + +Make sure you define "WINCE" amongst your compiler flags (eg. -DWINCE). +The config.h file will define all the necessary defines for you. diff --git a/win32/3rdparty/pthreads/TODO b/win32/3rdparty/pthreads/TODO new file mode 100644 index 000000000..fa9efc46e --- /dev/null +++ b/win32/3rdparty/pthreads/TODO @@ -0,0 +1,7 @@ + Things that aren't done yet + --------------------------- + +1. Implement PTHREAD_PROCESS_SHARED for semaphores, mutexes, + condition variables, read/write locks, barriers. + + diff --git a/win32/3rdparty/pthreads/WinCE-PORT b/win32/3rdparty/pthreads/WinCE-PORT new file mode 100644 index 000000000..f5981a9db --- /dev/null +++ b/win32/3rdparty/pthreads/WinCE-PORT @@ -0,0 +1,217 @@ +NOTE: The comments in this file relate to the original WinCE port +done by Tristan Savatier. The semaphore routines have been +completely rewritten since (2005-04-25), having been progressively +broken more and more by changes to the library. All of the semaphore +routines implemented for W9x/WNT/2000 and up should now also work for +WinCE. Also, pthread_mutex_timedlock should now work. [RPJ] + +---- + +Some interesting news: + +I have been able to port pthread-win32 to Windows-CE, +which uses a subset of the WIN32 API. + +Since we intend to keep using pthread-win32 for our +Commercial WinCE developments, I would be very interested +if WinCE support could be added to the main source tree +of pthread-win32. Also, I would like to be credited +for this port :-) + +Now, here is the story... + +The port was performed and tested on a Casio "Cassiopeia" +PalmSize PC, which runs a MIP processor. The OS in the +Casio is WinCE version 2.11, but I used VC++ 6.0 with +the WinCE SDK for version 2.01. + +I used pthread-win32 to port a heavily multithreaded +commercial application (real-time MPEG video player) +from Linux to WinCE. I consider the changes that +I have done to be quite well tested. + +Overall the modifications that we had to do are minor. + +The WinCE port were based on pthread-win32-snap-1999-05-30, +but I am certain that they can be integrated very easiely +to more recent versions of the source. + +I have attached the modified source code: +pthread-win32-snap-1999-05-30-WinCE. + +All the changes do not affect the code compiled on non-WinCE +environment, provided that the macros used for WinCE compilation +are not used, of course! + +Overall description of the WinCE port: +------------------------------------- + +Most of the changes had to be made in areas where +pthread-win32 was relying on some standard-C librairies +(e.g. _ftime, calloc, errno), which are not available +on WinCE. We have changed the code to use native Win32 +API instead (or in some cases we made wrappers). + +The Win32 Semaphores are not available, +so we had to re-implement Semaphores using mutexes +and events. + +Limitations / known problems of the WinCE port: +---------------------------------------------- + +Not all the semaphore routines have been ported +(semaphores are defined by Posix but are not part +pf pthread). I have just done enough to make +pthread routines (that rely internally on semaphores) +work, like signal conditions. + +I noticed that the Win32 threads work slightly +differently on WinCE. This may have some impact +on some tricky parts of pthread-win32, but I have +not really investigated. For example, on WinCE, +the process is killed if the main thread falls off +the bottom (or calls pthread_exit), regardless +of the existence of any other detached thread. +Microsoft manual indicates that this behavior is +deffirent from that of Windows Threads for other +Win32 platforms. + + +Detailed descriptions of the changes and rationals: + +------------------------------------ +- use a new macro NEED_ERRNO. + +If defined, the code in errno.c that defines a reentrant errno +is compiled, regardless of _MT and _REENTRANT. + +Rational: On WinCE, there is no support for , or +any other standard C library, i.e. even if _MT or _REENTRANT +is defined, errno is not provided by any library. NEED_ERRNO +must be set to compile for WinCE. + +------------------------------------ +- In implement.h, change #include to #include "semaphore.h". + +Rational: semaphore.h is provided in pthread-win32 and should not +be searched in the systems standard include. would not compile. +This change does not seem to create problems on "classic" win32 +(e.g. win95). + +------------------------------------ +- use a new macro NEED_CALLOC. + +If defined, some code in misc.c will provide a replacement +for calloc, which is not available on Win32. + + +------------------------------------ +- use a new macro NEED_CREATETHREAD. + +If defined, implement.h defines the macro _beginthreadex +and _endthreadex. + +Rational: On WinCE, the wrappers _beginthreadex and _endthreadex +do not exist. The native Win32 routines must be used. + +------------------------------------ +- in misc.c: + +#ifdef NEED_DUPLICATEHANDLE + /* DuplicateHandle does not exist on WinCE */ + self->threadH = GetCurrentThread(); +#else + if( !DuplicateHandle( + GetCurrentProcess(), + GetCurrentThread(), + GetCurrentProcess(), + &self->threadH, + 0, + FALSE, + DUPLICATE_SAME_ACCESS ) ) + { + free( self ); + return (NULL); + } +#endif + +Rational: On WinCE, DuplicateHandle does not exist. I could not understand +why DuplicateHandle must be used. It seems to me that getting the current +thread handle with GetCurrentThread() is sufficient, and it seems to work +perfectly fine, so maybe DuplicateHandle was just plain useless to begin with ? + +------------------------------------ +- In private.c, added some code at the beginning of ptw32_processInitialize +to detect the case of multiple calls to ptw32_processInitialize. + +Rational: In order to debug pthread-win32, it is easier to compile +it as a regular library (it is not possible to debug DLL's on winCE). +In that case, the application must call ptw32_rocessInitialize() +explicitely, to initialize pthread-win32. It is safer in this circumstance +to handle the case where ptw32_processInitialize() is called on +an already initialized library: + +int +ptw32_processInitialize (void) +{ + if (ptw32_processInitialized) { + /* + * ignore if already initialized. this is useful for + * programs that uses a non-dll pthread + * library. such programs must call ptw32_processInitialize() explicitely, + * since this initialization routine is automatically called only when + * the dll is loaded. + */ + return TRUE; + } + ptw32_processInitialized = TRUE; + [...] +} + +------------------------------------ +- in private.c, if macro NEED_FTIME is defined, add routines to +convert timespec_to_filetime and filetime_to_timespec, and modified +code that was using _ftime() to use Win32 API instead. + +Rational: _ftime is not available on WinCE. It is necessary to use +the native Win32 time API instead. + +Note: the routine timespec_to_filetime is provided as a convenience and a mean +to test that filetime_to_timespec works, but it is not used by the library. + +------------------------------------ +- in semaphore.c, if macro NEED_SEM is defined, add code for the routines +_increase_semaphore and _decrease_semaphore, and modify significantly +the implementation of the semaphores so that it does not use CreateSemaphore. + +Rational: CreateSemaphore is not available on WinCE. I had to re-implement +semaphores using mutexes and Events. + +Note: Only the semaphore routines that are used by pthread are implemented +(i.e. signal conditions rely on a subset of the semaphores routines, and +this subset works). Some other semaphore routines (e.g. sem_trywait) are +not yet supported on my WinCE port (and since I don't need them, I am not +planning to do anything about them). + +------------------------------------ +- in tsd.c, changed the code that defines TLS_OUT_OF_INDEXES + +/* TLS_OUT_OF_INDEXES not defined on WinCE */ +#ifndef TLS_OUT_OF_INDEXES +#define TLS_OUT_OF_INDEXES 0xffffffff +#endif + +Rational: TLS_OUT_OF_INDEXES is not defined in any standard include file +on WinCE. + +------------------------------------ +- added file need_errno.h + +Rational: On WinCE, there is no errno.h file. need_errno.h is just a +copy of windows version of errno.h, with minor modifications due to the fact +that some of the error codes are defined by the WinCE socket library. +In pthread.h, if NEED_ERRNO is defined, the file need_errno.h is +included (instead of ). + + +-- eof diff --git a/win32/3rdparty/pthreads/attr.c b/win32/3rdparty/pthreads/attr.c new file mode 100644 index 000000000..a9d55f4a4 --- /dev/null +++ b/win32/3rdparty/pthreads/attr.c @@ -0,0 +1,53 @@ +/* + * attr.c + * + * Description: + * This translation unit agregates operations on thread attribute objects. + * It is used for inline optimisation. + * + * The included modules are used separately when static executable sizes + * must be minimised. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +#include "pthread_attr_init.c" +#include "pthread_attr_destroy.c" +#include "pthread_attr_getdetachstate.c" +#include "pthread_attr_setdetachstate.c" +#include "pthread_attr_getstackaddr.c" +#include "pthread_attr_setstackaddr.c" +#include "pthread_attr_getstacksize.c" +#include "pthread_attr_setstacksize.c" +#include "pthread_attr_getscope.c" +#include "pthread_attr_setscope.c" diff --git a/win32/3rdparty/pthreads/barrier.c b/win32/3rdparty/pthreads/barrier.c new file mode 100644 index 000000000..41b950cd1 --- /dev/null +++ b/win32/3rdparty/pthreads/barrier.c @@ -0,0 +1,47 @@ +/* + * barrier.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#include "pthread_barrier_init.c" +#include "pthread_barrier_destroy.c" +#include "pthread_barrier_wait.c" +#include "pthread_barrierattr_init.c" +#include "pthread_barrierattr_destroy.c" +#include "pthread_barrierattr_getpshared.c" +#include "pthread_barrierattr_setpshared.c" diff --git a/win32/3rdparty/pthreads/builddmc.bat b/win32/3rdparty/pthreads/builddmc.bat new file mode 100644 index 000000000..3edbaebb3 --- /dev/null +++ b/win32/3rdparty/pthreads/builddmc.bat @@ -0,0 +1,9 @@ +; Build the pthreads library with the Digital Mars Compiler +; +set DMCDIR=c:\dm + +; RELEASE +%DMCDIR%\bin\dmc -D_WIN32_WINNT -D_MT -DHAVE_CONFIG_H -I.;c:\dm\include -o+all -WD pthread.c user32.lib+kernel32.lib+wsock32.lib -L/impl -L/NODEBUG -L/SU:WINDOWS + +; DEBUG +%DMCDIR%\bin\dmc -g -D_WIN32_WINNT -D_MT -DHAVE_CONFIG_H -I.;c:\dm\include -o+all -WD pthread.c user32.lib+kernel32.lib+wsock32.lib -L/impl -L/SU:WINDOWS diff --git a/win32/3rdparty/pthreads/cancel.c b/win32/3rdparty/pthreads/cancel.c new file mode 100644 index 000000000..1bd14ebe6 --- /dev/null +++ b/win32/3rdparty/pthreads/cancel.c @@ -0,0 +1,44 @@ +/* + * cancel.c + * + * Description: + * POSIX thread functions related to thread cancellation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#include "pthread_setcancelstate.c" +#include "pthread_setcanceltype.c" +#include "pthread_testcancel.c" +#include "pthread_cancel.c" diff --git a/win32/3rdparty/pthreads/cleanup.c b/win32/3rdparty/pthreads/cleanup.c new file mode 100644 index 000000000..381d1e87c --- /dev/null +++ b/win32/3rdparty/pthreads/cleanup.c @@ -0,0 +1,148 @@ +/* + * cleanup.c + * + * Description: + * This translation unit implements routines associated + * with cleaning up threads. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +/* + * The functions ptw32_pop_cleanup and ptw32_push_cleanup + * are implemented here for applications written in C with no + * SEH or C++ destructor support. + */ + +ptw32_cleanup_t * +ptw32_pop_cleanup (int execute) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function pops the most recently pushed cleanup + * handler. If execute is nonzero, then the cleanup handler + * is executed if non-null. + * + * PARAMETERS + * execute + * if nonzero, execute the cleanup handler + * + * + * DESCRIPTION + * This function pops the most recently pushed cleanup + * handler. If execute is nonzero, then the cleanup handler + * is executed if non-null. + * NOTE: specify 'execute' as nonzero to avoid duplication + * of common cleanup code. + * + * RESULTS + * N/A + * + * ------------------------------------------------------ + */ +{ + ptw32_cleanup_t *cleanup; + + cleanup = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey); + + if (cleanup != NULL) + { + if (execute && (cleanup->routine != NULL)) + { + + (*cleanup->routine) (cleanup->arg); + + } + + pthread_setspecific (ptw32_cleanupKey, (void *) cleanup->prev); + + } + + return (cleanup); + +} /* ptw32_pop_cleanup */ + + +void +ptw32_push_cleanup (ptw32_cleanup_t * cleanup, + ptw32_cleanup_callback_t routine, void *arg) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function pushes a new cleanup handler onto the thread's stack + * of cleanup handlers. Each cleanup handler pushed onto the stack is + * popped and invoked with the argument 'arg' when + * a) the thread exits by calling 'pthread_exit', + * b) when the thread acts on a cancellation request, + * c) or when the thread calls pthread_cleanup_pop with a nonzero + * 'execute' argument + * + * PARAMETERS + * cleanup + * a pointer to an instance of pthread_cleanup_t, + * + * routine + * pointer to a cleanup handler, + * + * arg + * parameter to be passed to the cleanup handler + * + * + * DESCRIPTION + * This function pushes a new cleanup handler onto the thread's stack + * of cleanup handlers. Each cleanup handler pushed onto the stack is + * popped and invoked with the argument 'arg' when + * a) the thread exits by calling 'pthread_exit', + * b) when the thread acts on a cancellation request, + * c) or when the thrad calls pthread_cleanup_pop with a nonzero + * 'execute' argument + * NOTE: pthread_push_cleanup, ptw32_pop_cleanup must be paired + * in the same lexical scope. + * + * RESULTS + * pthread_cleanup_t * + * pointer to the previous cleanup + * + * ------------------------------------------------------ + */ +{ + cleanup->routine = routine; + cleanup->arg = arg; + + cleanup->prev = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey); + + pthread_setspecific (ptw32_cleanupKey, (void *) cleanup); + +} /* ptw32_push_cleanup */ diff --git a/win32/3rdparty/pthreads/condvar.c b/win32/3rdparty/pthreads/condvar.c new file mode 100644 index 000000000..704f4d793 --- /dev/null +++ b/win32/3rdparty/pthreads/condvar.c @@ -0,0 +1,50 @@ +/* + * condvar.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + */ + +#include "pthread.h" +#include "implement.h" + +#include "ptw32_cond_check_need_init.c" +#include "pthread_condattr_init.c" +#include "pthread_condattr_destroy.c" +#include "pthread_condattr_getpshared.c" +#include "pthread_condattr_setpshared.c" +#include "pthread_cond_init.c" +#include "pthread_cond_destroy.c" +#include "pthread_cond_wait.c" +#include "pthread_cond_signal.c" diff --git a/win32/3rdparty/pthreads/config.h b/win32/3rdparty/pthreads/config.h new file mode 100644 index 000000000..d6638dfaf --- /dev/null +++ b/win32/3rdparty/pthreads/config.h @@ -0,0 +1,134 @@ +/* config.h */ + +#ifndef PTW32_CONFIG_H +#define PTW32_CONFIG_H + +/********************************************************************* + * Defaults: see target specific redefinitions below. + *********************************************************************/ + +/* We're building the pthreads-win32 library */ +#define PTW32_BUILD + +/* Do we know about the C type sigset_t? */ +#undef HAVE_SIGSET_T + +/* Define if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define if you have the Borland TASM32 or compatible assembler. */ +#undef HAVE_TASM32 + +/* Define if you don't have Win32 DuplicateHandle. (eg. WinCE) */ +#undef NEED_DUPLICATEHANDLE + +/* Define if you don't have Win32 _beginthreadex. (eg. WinCE) */ +#undef NEED_CREATETHREAD + +/* Define if you don't have Win32 errno. (eg. WinCE) */ +#undef NEED_ERRNO + +/* Define if you don't have Win32 calloc. (eg. WinCE) */ +#undef NEED_CALLOC + +/* Define if you don't have Win32 ftime. (eg. WinCE) */ +#undef NEED_FTIME + +/* Define if you don't have Win32 semaphores. (eg. WinCE 2.1 or earlier) */ +#undef NEED_SEM + +/* Define if you need to convert string parameters to unicode. (eg. WinCE) */ +#undef NEED_UNICODE_CONSTS + +/* Define if your C (not C++) compiler supports "inline" functions. */ +#undef HAVE_C_INLINE + +/* Do we know about type mode_t? */ +#undef HAVE_MODE_T + +/* Define if you have the timespec struct */ +#undef HAVE_STRUCT_TIMESPEC + +/* Define if you don't have the GetProcessAffinityMask() */ +#undef NEED_PROCESS_AFFINITY_MASK + +/* +# ---------------------------------------------------------------------- +# The library can be built with some alternative behaviour to better +# facilitate development of applications on Win32 that will be ported +# to other POSIX systems. +# +# Nothing described here will make the library non-compliant and strictly +# compliant applications will not be affected in any way, but +# applications that make assumptions that POSIX does not guarantee are +# not strictly compliant and may fail or misbehave with some settings. +# +# PTW32_THREAD_ID_REUSE_INCREMENT +# Purpose: +# POSIX says that applications should assume that thread IDs can be +# recycled. However, Solaris (and some other systems) use a [very large] +# sequence number as the thread ID, which provides virtual uniqueness. +# This provides a very high but finite level of safety for applications +# that are not meticulous in tracking thread lifecycles e.g. applications +# that call functions which target detached threads without some form of +# thread exit synchronisation. +# +# Usage: +# Set to any value in the range: 0 <= value < 2^wordsize. +# Set to 0 to emulate reusable thread ID behaviour like Linux or *BSD. +# Set to 1 for unique thread IDs like Solaris (this is the default). +# Set to some factor of 2^wordsize to emulate smaller word size types +# (i.e. will wrap sooner). This might be useful to emulate some embedded +# systems. +# +# define PTW32_THREAD_ID_REUSE_INCREMENT 0 +# +# ---------------------------------------------------------------------- + */ +#undef PTW32_THREAD_ID_REUSE_INCREMENT + + +/********************************************************************* + * Target specific groups + * + * If you find that these are incorrect or incomplete please report it + * to the pthreads-win32 maintainer. Thanks. + *********************************************************************/ +#ifdef WINCE +#define NEED_DUPLICATEHANDLE +#define NEED_CREATETHREAD +#define NEED_ERRNO +#define NEED_CALLOC +#define NEED_FTIME +//#define NEED_SEM +#define NEED_UNICODE_CONSTS +#define NEED_PROCESS_AFFINITY_MASK +#endif + +#ifdef _UWIN +#define HAVE_MODE_T +#define HAVE_STRUCT_TIMESPEC +#endif + +#ifdef __GNUC__ +#define HAVE_C_INLINE +#endif + +#ifdef __MINGW32__ +#define HAVE_MODE_T +#endif + +#ifdef __BORLANDC__ +#endif + +#ifdef __WATCOMC__ +#endif + +#ifdef __DMC__ +#define HAVE_SIGNAL_H +#define HAVE_C_INLINE +#endif + + + +#endif diff --git a/win32/3rdparty/pthreads/create.c b/win32/3rdparty/pthreads/create.c new file mode 100644 index 000000000..9e9388b20 --- /dev/null +++ b/win32/3rdparty/pthreads/create.c @@ -0,0 +1,305 @@ +/* + * create.c + * + * Description: + * This translation unit implements routines associated with spawning a new + * thread. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#ifndef _UWIN +#include +#endif + +int +pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void *(*start) (void *), void *arg) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function creates a thread running the start function, + * passing it the parameter value, 'arg'. The 'attr' + * argument specifies optional creation attributes. + * The identity of the new thread is returned + * via 'tid', which should not be NULL. + * + * PARAMETERS + * tid + * pointer to an instance of pthread_t + * + * attr + * optional pointer to an instance of pthread_attr_t + * + * start + * pointer to the starting routine for the new thread + * + * arg + * optional parameter passed to 'start' + * + * + * DESCRIPTION + * This function creates a thread running the start function, + * passing it the parameter value, 'arg'. The 'attr' + * argument specifies optional creation attributes. + * The identity of the new thread is returned + * via 'tid', which should not be the NULL pointer. + * + * RESULTS + * 0 successfully created thread, + * EINVAL attr invalid, + * EAGAIN insufficient resources. + * + * ------------------------------------------------------ + */ +{ + pthread_t thread; + ptw32_thread_t * tp; + register pthread_attr_t a; + HANDLE threadH = 0; + int result = EAGAIN; + int run = PTW32_TRUE; + ThreadParms *parms = NULL; + long stackSize; + int priority; + pthread_t self; + + /* + * Before doing anything, check that tid can be stored through + * without invoking a memory protection error (segfault). + * Make sure that the assignment below can't be optimised out by the compiler. + * This is assured by conditionally assigning *tid again at the end. + */ + tid->x = 0; + + if (attr != NULL) + { + a = *attr; + } + else + { + a = NULL; + } + + if ((thread = ptw32_new ()).p == NULL) + { + goto FAIL0; + } + + tp = (ptw32_thread_t *) thread.p; + + priority = tp->sched_priority; + + if ((parms = (ThreadParms *) malloc (sizeof (*parms))) == NULL) + { + goto FAIL0; + } + + parms->tid = thread; + parms->start = start; + parms->arg = arg; + +#if defined(HAVE_SIGSET_T) + + /* + * Threads inherit their initial sigmask from their creator thread. + */ + self = pthread_self(); + tp->sigmask = ((ptw32_thread_t *)self.p)->sigmask; + +#endif /* HAVE_SIGSET_T */ + + + if (a != NULL) + { + stackSize = a->stacksize; + tp->detachState = a->detachstate; + priority = a->param.sched_priority; + +#if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL) + /* WinCE */ +#else + /* Everything else */ + + /* + * Thread priority must be set to a valid system level + * without altering the value set by pthread_attr_setschedparam(). + */ + + /* + * PTHREAD_EXPLICIT_SCHED is the default because Win32 threads + * don't inherit their creator's priority. They are started with + * THREAD_PRIORITY_NORMAL (win32 value). The result of not supplying + * an 'attr' arg to pthread_create() is equivalent to defaulting to + * PTHREAD_EXPLICIT_SCHED and priority THREAD_PRIORITY_NORMAL. + */ + if (PTHREAD_INHERIT_SCHED == a->inheritsched) + { + /* + * If the thread that called pthread_create() is a Win32 thread + * then the inherited priority could be the result of a temporary + * system adjustment. This is not the case for POSIX threads. + */ +#if ! defined(HAVE_SIGSET_T) + self = pthread_self (); +#endif + priority = ((ptw32_thread_t *) self.p)->sched_priority; + } + +#endif + + } + else + { + /* + * Default stackSize + */ + stackSize = PTHREAD_STACK_MIN; + } + + tp->state = run ? PThreadStateInitial : PThreadStateSuspended; + + tp->keys = NULL; + + /* + * Threads must be started in suspended mode and resumed if necessary + * after _beginthreadex returns us the handle. Otherwise we set up a + * race condition between the creating and the created threads. + * Note that we also retain a local copy of the handle for use + * by us in case thread.p->threadH gets NULLed later but before we've + * finished with it here. + */ + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + + tp->threadH = + threadH = + (HANDLE) _beginthreadex ((void *) NULL, /* No security info */ + (unsigned) stackSize, /* default stack size */ + ptw32_threadStart, + parms, + (unsigned) + CREATE_SUSPENDED, + (unsigned *) &(tp->thread)); + + if (threadH != 0) + { + if (a != NULL) + { + (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority); + } + + if (run) + { + ResumeThread (threadH); + } + } + +#else /* __MINGW32__ && ! __MSVCRT__ */ + + /* + * This lock will force pthread_threadStart() to wait until we have + * the thread handle and have set the priority. + */ + (void) pthread_mutex_lock (&tp->cancelLock); + + tp->threadH = + threadH = + (HANDLE) _beginthread (ptw32_threadStart, (unsigned) stackSize, /* default stack size */ + parms); + + /* + * Make the return code match _beginthreadex's. + */ + if (threadH == (HANDLE) - 1L) + { + tp->threadH = threadH = 0; + } + else + { + if (!run) + { + /* + * beginthread does not allow for create flags, so we do it now. + * Note that beginthread itself creates the thread in SUSPENDED + * mode, and then calls ResumeThread to start it. + */ + SuspendThread (threadH); + } + + if (a != NULL) + { + (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority); + } + } + + (void) pthread_mutex_unlock (&tp->cancelLock); + +#endif /* __MINGW32__ && ! __MSVCRT__ */ + + result = (threadH != 0) ? 0 : EAGAIN; + + /* + * Fall Through Intentionally + */ + + /* + * ------------ + * Failure Code + * ------------ + */ + +FAIL0: + if (result != 0) + { + + ptw32_threadDestroy (thread); + tp = NULL; + + if (parms != NULL) + { + free (parms); + } + } + else + { + *tid = thread; + } + +#ifdef _UWIN + if (result == 0) + pthread_count++; +#endif + return (result); + +} /* pthread_create */ diff --git a/win32/3rdparty/pthreads/dll.c b/win32/3rdparty/pthreads/dll.c new file mode 100644 index 000000000..c1cd4e96e --- /dev/null +++ b/win32/3rdparty/pthreads/dll.c @@ -0,0 +1,92 @@ +/* + * dll.c + * + * Description: + * This translation unit implements DLL initialisation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PTW32_STATIC_LIB + +#include "pthread.h" +#include "implement.h" + +#ifdef _MSC_VER +/* + * lpvReserved yields an unreferenced formal parameter; + * ignore it + */ +#pragma warning( disable : 4100 ) +#endif + +#ifdef __cplusplus +/* + * Dear c++: Please don't mangle this name. -thanks + */ +extern "C" +#endif /* __cplusplus */ + BOOL WINAPI +DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) +{ + BOOL result = PTW32_TRUE; + + switch (fdwReason) + { + + case DLL_PROCESS_ATTACH: + result = pthread_win32_process_attach_np (); + break; + + case DLL_THREAD_ATTACH: + /* + * A thread is being created + */ + result = pthread_win32_thread_attach_np (); + break; + + case DLL_THREAD_DETACH: + /* + * A thread is exiting cleanly + */ + result = pthread_win32_thread_detach_np (); + break; + + case DLL_PROCESS_DETACH: + (void) pthread_win32_thread_detach_np (); + result = pthread_win32_process_detach_np (); + break; + } + + return (result); + +} /* DllMain */ + +#endif /* PTW32_STATIC_LIB */ diff --git a/win32/3rdparty/pthreads/errno.c b/win32/3rdparty/pthreads/errno.c new file mode 100644 index 000000000..9998bb8d5 --- /dev/null +++ b/win32/3rdparty/pthreads/errno.c @@ -0,0 +1,94 @@ +/* + * errno.c + * + * Description: + * This translation unit implements routines associated with spawning a new + * thread. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#if defined(NEED_ERRNO) + +#include "pthread.h" +#include "implement.h" + +static int reallyBad = ENOMEM; + +/* + * Re-entrant errno. + * + * Each thread has it's own errno variable in pthread_t. + * + * The benefit of using the pthread_t structure + * instead of another TSD key is TSD keys are limited + * on Win32 to 64 per process. Secondly, to implement + * it properly without using pthread_t you'd need + * to dynamically allocate an int on starting the thread + * and store it manually into TLS and then ensure that you free + * it on thread termination. We get all that for free + * by simply storing the errno on the pthread_t structure. + * + * MSVC and Mingw32 already have their own thread-safe errno. + * + * #if defined( _REENTRANT ) || defined( _MT ) + * #define errno *_errno() + * + * int *_errno( void ); + * #else + * extern int errno; + * #endif + * + */ + +int * +_errno (void) +{ + pthread_t self; + int *result; + + if ((self = pthread_self ()) == NULL) + { + /* + * Yikes! unable to allocate a thread! + * Throw an exception? return an error? + */ + result = &reallyBad; + } + else + { + result = &(self->ptErrno); + } + + return (result); + +} /* _errno */ + +#endif /* (NEED_ERRNO) */ diff --git a/win32/3rdparty/pthreads/exit.c b/win32/3rdparty/pthreads/exit.c new file mode 100644 index 000000000..7eb9671bb --- /dev/null +++ b/win32/3rdparty/pthreads/exit.c @@ -0,0 +1,44 @@ +/* + * exit.c + * + * Description: + * This translation unit implements routines associated with exiting from + * a thread. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#ifndef _UWIN +# include +#endif + +#include "pthread_exit.c" diff --git a/win32/3rdparty/pthreads/fork.c b/win32/3rdparty/pthreads/fork.c new file mode 100644 index 000000000..8a29550ca --- /dev/null +++ b/win32/3rdparty/pthreads/fork.c @@ -0,0 +1,39 @@ +/* + * fork.c + * + * Description: + * Implementation of fork() for POSIX threads. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + + +#include "pthread.h" +#include "implement.h" diff --git a/win32/3rdparty/pthreads/global.c b/win32/3rdparty/pthreads/global.c new file mode 100644 index 000000000..2b5542298 --- /dev/null +++ b/win32/3rdparty/pthreads/global.c @@ -0,0 +1,115 @@ +/* + * global.c + * + * Description: + * This translation unit instantiates data associated with the implementation + * as a whole. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int ptw32_processInitialized = PTW32_FALSE; +ptw32_thread_t * ptw32_threadReuseTop = PTW32_THREAD_REUSE_EMPTY; +ptw32_thread_t * ptw32_threadReuseBottom = PTW32_THREAD_REUSE_EMPTY; +pthread_key_t ptw32_selfThreadKey = NULL; +pthread_key_t ptw32_cleanupKey = NULL; +pthread_cond_t ptw32_cond_list_head = NULL; +pthread_cond_t ptw32_cond_list_tail = NULL; + +int ptw32_concurrency = 0; + +/* What features have been auto-detaected */ +int ptw32_features = 0; + +BOOL ptw32_smp_system = PTW32_TRUE; /* Safer if assumed true initially. */ + +/* + * Function pointer to InterlockedCompareExchange if it exists, otherwise + * it will be set at runtime to a substitute local version with the same + * functionality but may be architecture specific. + */ +PTW32_INTERLOCKED_LONG + (WINAPI * ptw32_interlocked_compare_exchange) (PTW32_INTERLOCKED_LPLONG, + PTW32_INTERLOCKED_LONG, + PTW32_INTERLOCKED_LONG) = + NULL; + +/* + * Function pointer to QueueUserAPCEx if it exists, otherwise + * it will be set at runtime to a substitute routine which cannot unblock + * blocked threads. + */ +DWORD (*ptw32_register_cancelation) (PAPCFUNC, HANDLE, DWORD) = NULL; + +/* + * Global lock for managing pthread_t struct reuse. + */ +CRITICAL_SECTION ptw32_thread_reuse_lock; + +/* + * Global lock for testing internal state of statically declared mutexes. + */ +CRITICAL_SECTION ptw32_mutex_test_init_lock; + +/* + * Global lock for testing internal state of PTHREAD_COND_INITIALIZER + * created condition variables. + */ +CRITICAL_SECTION ptw32_cond_test_init_lock; + +/* + * Global lock for testing internal state of PTHREAD_RWLOCK_INITIALIZER + * created read/write locks. + */ +CRITICAL_SECTION ptw32_rwlock_test_init_lock; + +/* + * Global lock for testing internal state of PTHREAD_SPINLOCK_INITIALIZER + * created spin locks. + */ +CRITICAL_SECTION ptw32_spinlock_test_init_lock; + +/* + * Global lock for condition variable linked list. The list exists + * to wake up CVs when a WM_TIMECHANGE message arrives. See + * w32_TimeChangeHandler.c. + */ +CRITICAL_SECTION ptw32_cond_list_lock; + +#ifdef _UWIN +/* + * Keep a count of the number of threads. + */ +int pthread_count = 0; +#endif diff --git a/win32/3rdparty/pthreads/implement.h b/win32/3rdparty/pthreads/implement.h new file mode 100644 index 000000000..3d9648365 --- /dev/null +++ b/win32/3rdparty/pthreads/implement.h @@ -0,0 +1,710 @@ +/* + * implement.h + * + * Definitions that don't need to be public. + * + * Keeps all the internals out of pthread.h + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _IMPLEMENT_H +#define _IMPLEMENT_H + +#ifdef _WIN32_WINNT +#undef _WIN32_WINNT +#endif +#define _WIN32_WINNT 0x400 + +#include + +/* + * In case windows.h doesn't define it (e.g. WinCE perhaps) + */ +#ifdef WINCE +typedef VOID (APIENTRY *PAPCFUNC)(DWORD dwParam); +#endif + +/* + * note: ETIMEDOUT is correctly defined in winsock.h + */ +#include + +/* + * In case ETIMEDOUT hasn't been defined above somehow. + */ +#ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +#if !defined(malloc) +#include +#endif + +#if !defined(INT_MAX) +#include +#endif + +/* use local include files during development */ +#include "semaphore.h" +#include "sched.h" + +#if defined(HAVE_C_INLINE) || defined(__cplusplus) +#define INLINE inline +#else +#define INLINE +#endif + +#if defined (__MINGW32__) || (_MSC_VER >= 1300) +#define PTW32_INTERLOCKED_LONG long +#define PTW32_INTERLOCKED_LPLONG long* +#else +#define PTW32_INTERLOCKED_LONG PVOID +#define PTW32_INTERLOCKED_LPLONG PVOID* +#endif + +#if defined(__MINGW32__) +#include +#elif defined(__BORLANDC__) +#define int64_t ULONGLONG +#else +#define int64_t _int64 +#endif + +typedef enum +{ + /* + * This enumeration represents the state of the thread; + * The thread is still "alive" if the numeric value of the + * state is greater or equal "PThreadStateRunning". + */ + PThreadStateInitial = 0, /* Thread not running */ + PThreadStateRunning, /* Thread alive & kicking */ + PThreadStateSuspended, /* Thread alive but suspended */ + PThreadStateCancelPending, /* Thread alive but is */ + /* has cancelation pending. */ + PThreadStateCanceling, /* Thread alive but is */ + /* in the process of terminating */ + /* due to a cancellation request */ + PThreadStateException, /* Thread alive but exiting */ + /* due to an exception */ + PThreadStateLast +} +PThreadState; + + +typedef struct ptw32_thread_t_ ptw32_thread_t; + +struct ptw32_thread_t_ +{ +#ifdef _UWIN + DWORD dummy[5]; +#endif + DWORD thread; + HANDLE threadH; /* Win32 thread handle - POSIX thread is invalid if threadH == 0 */ + pthread_t ptHandle; /* This thread's permanent pthread_t handle */ + ptw32_thread_t * prevReuse; /* Links threads on reuse stack */ + volatile PThreadState state; + void *exitStatus; + void *parms; + int ptErrno; + int detachState; + pthread_mutex_t threadLock; /* Used for serialised access to public thread state */ + int sched_priority; /* As set, not as currently is */ + pthread_mutex_t cancelLock; /* Used for async-cancel safety */ + int cancelState; + int cancelType; + HANDLE cancelEvent; +#ifdef __CLEANUP_C + jmp_buf start_mark; +#endif /* __CLEANUP_C */ +#if HAVE_SIGSET_T + sigset_t sigmask; +#endif /* HAVE_SIGSET_T */ + int implicit:1; + void *keys; + void *nextAssoc; +}; + + +/* + * Special value to mark attribute objects as valid. + */ +#define PTW32_ATTR_VALID ((unsigned long) 0xC4C0FFEE) + +struct pthread_attr_t_ +{ + unsigned long valid; + void *stackaddr; + size_t stacksize; + int detachstate; + struct sched_param param; + int inheritsched; + int contentionscope; +#if HAVE_SIGSET_T + sigset_t sigmask; +#endif /* HAVE_SIGSET_T */ +}; + + +/* + * ==================== + * ==================== + * Semaphores, Mutexes and Condition Variables + * ==================== + * ==================== + */ + +struct sem_t_ +{ + int value; + pthread_mutex_t lock; + HANDLE sem; +#ifdef NEED_SEM + int leftToUnblock; +#endif +}; + +#define PTW32_OBJECT_AUTO_INIT ((void *) -1) +#define PTW32_OBJECT_INVALID NULL + +struct pthread_mutex_t_ +{ + LONG lock_idx; /* Provides exclusive access to mutex state + via the Interlocked* mechanism. + 0: unlocked/free. + 1: locked - no other waiters. + -1: locked - with possible other waiters. + */ + int recursive_count; /* Number of unlocks a thread needs to perform + before the lock is released (recursive + mutexes only). */ + int kind; /* Mutex type. */ + pthread_t ownerThread; + HANDLE event; /* Mutex release notification to waiting + threads. */ +}; + +struct pthread_mutexattr_t_ +{ + int pshared; + int kind; +}; + +/* + * Possible values, other than PTW32_OBJECT_INVALID, + * for the "interlock" element in a spinlock. + * + * In this implementation, when a spinlock is initialised, + * the number of cpus available to the process is checked. + * If there is only one cpu then "interlock" is set equal to + * PTW32_SPIN_USE_MUTEX and u.mutex is a initialised mutex. + * If the number of cpus is greater than 1 then "interlock" + * is set equal to PTW32_SPIN_UNLOCKED and the number is + * stored in u.cpus. This arrangement allows the spinlock + * routines to attempt an InterlockedCompareExchange on "interlock" + * immediately and, if that fails, to try the inferior mutex. + * + * "u.cpus" isn't used for anything yet, but could be used at + * some point to optimise spinlock behaviour. + */ +#define PTW32_SPIN_UNLOCKED (1) +#define PTW32_SPIN_LOCKED (2) +#define PTW32_SPIN_USE_MUTEX (3) + +struct pthread_spinlock_t_ +{ + long interlock; /* Locking element for multi-cpus. */ + union + { + int cpus; /* No. of cpus if multi cpus, or */ + pthread_mutex_t mutex; /* mutex if single cpu. */ + } u; +}; + +struct pthread_barrier_t_ +{ + unsigned int nCurrentBarrierHeight; + unsigned int nInitialBarrierHeight; + int iStep; + int pshared; + sem_t semBarrierBreeched[2]; +}; + +struct pthread_barrierattr_t_ +{ + int pshared; +}; + +struct pthread_key_t_ +{ + DWORD key; + void (*destructor) (void *); + pthread_mutex_t keyLock; + void *threads; +}; + + +typedef struct ThreadParms ThreadParms; +typedef struct ThreadKeyAssoc ThreadKeyAssoc; + +struct ThreadParms +{ + pthread_t tid; + void *(*start) (void *); + void *arg; +}; + + +struct pthread_cond_t_ +{ + long nWaitersBlocked; /* Number of threads blocked */ + long nWaitersGone; /* Number of threads timed out */ + long nWaitersToUnblock; /* Number of threads to unblock */ + sem_t semBlockQueue; /* Queue up threads waiting for the */ + /* condition to become signalled */ + sem_t semBlockLock; /* Semaphore that guards access to */ + /* | waiters blocked count/block queue */ + /* +-> Mandatory Sync.LEVEL-1 */ + pthread_mutex_t mtxUnblockLock; /* Mutex that guards access to */ + /* | waiters (to)unblock(ed) counts */ + /* +-> Optional* Sync.LEVEL-2 */ + pthread_cond_t next; /* Doubly linked list */ + pthread_cond_t prev; +}; + + +struct pthread_condattr_t_ +{ + int pshared; +}; + +#define PTW32_RWLOCK_MAGIC 0xfacade2 + +struct pthread_rwlock_t_ +{ + pthread_mutex_t mtxExclusiveAccess; + pthread_mutex_t mtxSharedAccessCompleted; + pthread_cond_t cndSharedAccessCompleted; + int nSharedAccessCount; + int nExclusiveAccessCount; + int nCompletedSharedAccessCount; + int nMagic; +}; + +struct pthread_rwlockattr_t_ +{ + int pshared; +}; + +/* + * MCS lock queue node - see ptw32_MCS_lock.c + */ +struct ptw32_mcs_node_t_ +{ + struct ptw32_mcs_node_t_ **lock; /* ptr to tail of queue */ + struct ptw32_mcs_node_t_ *next; /* ptr to successor in queue */ + LONG readyFlag; /* set after lock is released by + predecessor */ + LONG nextFlag; /* set after 'next' ptr is set by + successor */ +}; + +typedef struct ptw32_mcs_node_t_ ptw32_mcs_local_node_t; +typedef struct ptw32_mcs_node_t_ *ptw32_mcs_lock_t; + + +struct ThreadKeyAssoc +{ + /* + * Purpose: + * This structure creates an association between a thread and a key. + * It is used to implement the implicit invocation of a user defined + * destroy routine for thread specific data registered by a user upon + * exiting a thread. + * + * Graphically, the arrangement is as follows, where: + * + * K - Key with destructor + * (head of chain is key->threads) + * T - Thread that has called pthread_setspecific(Kn) + * (head of chain is thread->keys) + * A - Association. Each association is a node at the + * intersection of two doubly-linked lists. + * + * T1 T2 T3 + * | | | + * | | | + * K1 -----+-----A-----A-----> + * | | | + * | | | + * K2 -----A-----A-----+-----> + * | | | + * | | | + * K3 -----A-----+-----A-----> + * | | | + * | | | + * V V V + * + * Access to the association is guarded by two locks: the key's + * general lock (guarding the row) and the thread's general + * lock (guarding the column). This avoids the need for a + * dedicated lock for each association, which not only consumes + * more handles but requires that: before the lock handle can + * be released - both the key must be deleted and the thread + * must have called the destructor. The two-lock arrangement + * allows the resources to be freed as soon as either thread or + * key is concluded. + * + * To avoid deadlock: whenever both locks are required, the key + * and thread locks are always acquired in the order: key lock + * then thread lock. An exception to this exists when a thread + * calls the destructors, however this is done carefully to + * avoid deadlock. + * + * An association is created when a thread first calls + * pthread_setspecific() on a key that has a specified + * destructor. + * + * An association is destroyed either immediately after the + * thread calls the key destructor function on thread exit, or + * when the key is deleted. + * + * Attributes: + * thread + * reference to the thread that owns the + * association. This is actually the pointer to the + * thread struct itself. Since the association is + * destroyed before the thread exits, this can never + * point to a different logical thread to the one that + * created the assoc, i.e. after thread struct reuse. + * + * key + * reference to the key that owns the association. + * + * nextKey + * The pthread_t->keys attribute is the head of a + * chain of associations that runs through the nextKey + * link. This chain provides the 1 to many relationship + * between a pthread_t and all pthread_key_t on which + * it called pthread_setspecific. + * + * prevKey + * Similarly. + * + * nextThread + * The pthread_key_t->threads attribute is the head of + * a chain of assoctiations that runs through the + * nextThreads link. This chain provides the 1 to many + * relationship between a pthread_key_t and all the + * PThreads that have called pthread_setspecific for + * this pthread_key_t. + * + * prevThread + * Similarly. + * + * Notes: + * 1) As soon as either the key or the thread is no longer + * referencing the association, it can be destroyed. The + * association will be removed from both chains. + * + * 2) Under WIN32, an association is only created by + * pthread_setspecific if the user provided a + * destroyRoutine when they created the key. + * + * + */ + ptw32_thread_t * thread; + pthread_key_t key; + ThreadKeyAssoc *nextKey; + ThreadKeyAssoc *nextThread; + ThreadKeyAssoc *prevKey; + ThreadKeyAssoc *prevThread; +}; + + +#ifdef __CLEANUP_SEH +/* + * -------------------------------------------------------------- + * MAKE_SOFTWARE_EXCEPTION + * This macro constructs a software exception code following + * the same format as the standard Win32 error codes as defined + * in WINERROR.H + * Values are 32 bit values layed out as follows: + * + * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + * +---+-+-+-----------------------+-------------------------------+ + * |Sev|C|R| Facility | Code | + * +---+-+-+-----------------------+-------------------------------+ + * + * Severity Values: + */ +#define SE_SUCCESS 0x00 +#define SE_INFORMATION 0x01 +#define SE_WARNING 0x02 +#define SE_ERROR 0x03 + +#define MAKE_SOFTWARE_EXCEPTION( _severity, _facility, _exception ) \ +( (DWORD) ( ( (_severity) << 30 ) | /* Severity code */ \ + ( 1 << 29 ) | /* MS=0, User=1 */ \ + ( 0 << 28 ) | /* Reserved */ \ + ( (_facility) << 16 ) | /* Facility Code */ \ + ( (_exception) << 0 ) /* Exception Code */ \ + ) ) + +/* + * We choose one specific Facility/Error code combination to + * identify our software exceptions vs. WIN32 exceptions. + * We store our actual component and error code within + * the optional information array. + */ +#define EXCEPTION_PTW32_SERVICES \ + MAKE_SOFTWARE_EXCEPTION( SE_ERROR, \ + PTW32_SERVICES_FACILITY, \ + PTW32_SERVICES_ERROR ) + +#define PTW32_SERVICES_FACILITY 0xBAD +#define PTW32_SERVICES_ERROR 0xDEED + +#endif /* __CLEANUP_SEH */ + +/* + * Services available through EXCEPTION_PTW32_SERVICES + * and also used [as parameters to ptw32_throw()] as + * generic exception selectors. + */ + +#define PTW32_EPS_EXIT (1) +#define PTW32_EPS_CANCEL (2) + + +/* Useful macros */ +#define PTW32_MAX(a,b) ((a)<(b)?(b):(a)) +#define PTW32_MIN(a,b) ((a)>(b)?(b):(a)) + + +/* Declared in global.c */ +extern PTW32_INTERLOCKED_LONG (WINAPI * + ptw32_interlocked_compare_exchange) + (PTW32_INTERLOCKED_LPLONG, PTW32_INTERLOCKED_LONG, PTW32_INTERLOCKED_LONG); + +/* Declared in pthread_cancel.c */ +extern DWORD (*ptw32_register_cancelation) (PAPCFUNC, HANDLE, DWORD); + +/* Thread Reuse stack bottom marker. Must not be NULL or any valid pointer to memory. */ +#define PTW32_THREAD_REUSE_EMPTY ((ptw32_thread_t *) 1) + +extern int ptw32_processInitialized; +extern ptw32_thread_t * ptw32_threadReuseTop; +extern ptw32_thread_t * ptw32_threadReuseBottom; +extern pthread_key_t ptw32_selfThreadKey; +extern pthread_key_t ptw32_cleanupKey; +extern pthread_cond_t ptw32_cond_list_head; +extern pthread_cond_t ptw32_cond_list_tail; + +extern int ptw32_mutex_default_kind; + +extern int ptw32_concurrency; + +extern int ptw32_features; + +extern BOOL ptw32_smp_system; /* True: SMP system, False: Uni-processor system */ + +extern CRITICAL_SECTION ptw32_thread_reuse_lock; +extern CRITICAL_SECTION ptw32_mutex_test_init_lock; +extern CRITICAL_SECTION ptw32_cond_list_lock; +extern CRITICAL_SECTION ptw32_cond_test_init_lock; +extern CRITICAL_SECTION ptw32_rwlock_test_init_lock; +extern CRITICAL_SECTION ptw32_spinlock_test_init_lock; + +#ifdef _UWIN +extern int pthread_count; +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* + * ===================== + * ===================== + * Forward Declarations + * ===================== + * ===================== + */ + + int ptw32_is_attr (const pthread_attr_t * attr); + + int ptw32_cond_check_need_init (pthread_cond_t * cond); + int ptw32_mutex_check_need_init (pthread_mutex_t * mutex); + int ptw32_rwlock_check_need_init (pthread_rwlock_t * rwlock); + + PTW32_INTERLOCKED_LONG WINAPI + ptw32_InterlockedCompareExchange (PTW32_INTERLOCKED_LPLONG location, + PTW32_INTERLOCKED_LONG value, + PTW32_INTERLOCKED_LONG comparand); + + LONG WINAPI + ptw32_InterlockedExchange (LPLONG location, + LONG value); + + DWORD + ptw32_RegisterCancelation (PAPCFUNC callback, + HANDLE threadH, DWORD callback_arg); + + int ptw32_processInitialize (void); + + void ptw32_processTerminate (void); + + void ptw32_threadDestroy (pthread_t tid); + + void ptw32_pop_cleanup_all (int execute); + + pthread_t ptw32_new (void); + + pthread_t ptw32_threadReusePop (void); + + void ptw32_threadReusePush (pthread_t thread); + + int ptw32_getprocessors (int *count); + + int ptw32_setthreadpriority (pthread_t thread, int policy, int priority); + + void ptw32_rwlock_cancelwrwait (void *arg); + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + unsigned __stdcall +#else + void +#endif + ptw32_threadStart (void *vthreadParms); + + void ptw32_callUserDestroyRoutines (pthread_t thread); + + int ptw32_tkAssocCreate (ptw32_thread_t * thread, pthread_key_t key); + + void ptw32_tkAssocDestroy (ThreadKeyAssoc * assoc); + + int ptw32_semwait (sem_t * sem); + + DWORD ptw32_relmillisecs (const struct timespec * abstime); + + void ptw32_mcs_lock_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * node); + + void ptw32_mcs_lock_release (ptw32_mcs_local_node_t * node); + +#ifdef NEED_FTIME + void ptw32_timespec_to_filetime (const struct timespec *ts, FILETIME * ft); + void ptw32_filetime_to_timespec (const FILETIME * ft, struct timespec *ts); +#endif + +/* Declared in misc.c */ +#ifdef NEED_CALLOC +#define calloc(n, s) ptw32_calloc(n, s) + void *ptw32_calloc (size_t n, size_t s); +#endif + +/* Declared in private.c */ + void ptw32_throw (DWORD exception); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#ifdef _UWIN_ +# ifdef _MT +# ifdef __cplusplus +extern "C" +{ +# endif + _CRTIMP unsigned long __cdecl _beginthread (void (__cdecl *) (void *), + unsigned, void *); + _CRTIMP void __cdecl _endthread (void); + _CRTIMP unsigned long __cdecl _beginthreadex (void *, unsigned, + unsigned (__stdcall *) (void *), + void *, unsigned, unsigned *); + _CRTIMP void __cdecl _endthreadex (unsigned); +# ifdef __cplusplus +} +# endif +# endif +#else +# include +#endif + + +/* + * Defaults. Could be overridden when building the inlined version of the dll. + * See ptw32_InterlockedCompareExchange.c + */ +#ifndef PTW32_INTERLOCKED_COMPARE_EXCHANGE +#define PTW32_INTERLOCKED_COMPARE_EXCHANGE ptw32_interlocked_compare_exchange +#endif + +#ifndef PTW32_INTERLOCKED_EXCHANGE +#define PTW32_INTERLOCKED_EXCHANGE InterlockedExchange +#endif + + +/* + * Check for old and new versions of cygwin. See the FAQ file: + * + * Question 1 - How do I get pthreads-win32 to link under Cygwin or Mingw32? + * + * Patch by Anders Norlander + */ +#if defined(__CYGWIN32__) || defined(__CYGWIN__) || defined(NEED_CREATETHREAD) + +/* + * Macro uses args so we can cast start_proc to LPTHREAD_START_ROUTINE + * in order to avoid warnings because of return type + */ + +#define _beginthreadex(security, \ + stack_size, \ + start_proc, \ + arg, \ + flags, \ + pid) \ + CreateThread(security, \ + stack_size, \ + (LPTHREAD_START_ROUTINE) start_proc, \ + arg, \ + flags, \ + pid) + +#define _endthreadex ExitThread + +#endif /* __CYGWIN32__ || __CYGWIN__ || NEED_CREATETHREAD */ + + +#endif /* _IMPLEMENT_H */ diff --git a/win32/3rdparty/pthreads/manual/ChangeLog b/win32/3rdparty/pthreads/manual/ChangeLog new file mode 100644 index 000000000..c07cdd702 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/ChangeLog @@ -0,0 +1,62 @@ +2005-05-06 Ross Johnson + + * PortabilityIssues.html: Was nonPortableIssues.html. + * index.html: Updated; add table of contents at top. + * *.html: Add Pthreads-win32 header info; add link back to the + index page 'index.html'. + +2005-05-06 Ross Johnson + + * index.html: New. + * nonPortableIssues.html: New. + * pthread_attr_init.html: New. + * pthread_attr_setstackaddr.html: New. + * pthread_attr_setstacksize.html: New. + * pthread_barrierattr_init.html: New. + * pthread_barrierattr_setpshared.html: New. + * pthread_barrier_init.html: New. + * pthread_barrier_wait.html: New. + * pthreadCancelableWait.html: New. + * pthread_cancel.html: New. + * pthread_cleanup_push.html: New. + * pthread_condattr_init.html: New. + * pthread_condattr_setpshared.html: New. + * pthread_cond_init.html: New. + * pthread_create.html: New. + * pthread_delay_np.html: New. + * pthread_detach.html: New. + * pthread_equal.html: New. + * pthread_exit.html: New. + * pthread_getw32threadhandle_np.html: New. + * pthread_join.html: New. + * pthread_key_create.html: New. + * pthread_kill.html: New. + * pthread_mutexattr_init.html: New. + * pthread_mutexattr_setpshared.html: New. + * pthread_mutex_init.html: New. + * pthread_num_processors_np.html: New. + * pthread_once.html: New. + * pthread_rwlockattr_init.html: New. + * pthread_rwlockattr_setpshared.html: New. + * pthread_rwlock_init.html: New. + * pthread_rwlock_rdlock.html: New. + * pthread_rwlock_timedrdlock.html: New. + * pthread_rwlock_timedwrlock.html: New. + * pthread_rwlock_unlock.html: New. + * pthread_rwlock_wrlock.html: New. + * pthread_self.html: New. + * pthread_setcancelstate.html: New. + * pthread_setcanceltype.html: New. + * pthread_setconcurrency.html: New. + * pthread_setschedparam.html: New. + * pthread_spin_init.html: New. + * pthread_spin_lock.html: New. + * pthread_spin_unlock.html: New. + * pthread_timechange_handler_np.html: New. + * pthread_win32_attach_detach_np.html: New. + * pthread_win32_test_features_np.html: New. + * sched_get_priority_max.html: New. + * sched_getscheduler.html: New. + * sched_setscheduler.html: New. + * sched_yield.html: New. + * sem_init.html: New. diff --git a/win32/3rdparty/pthreads/manual/PortabilityIssues.html b/win32/3rdparty/pthreads/manual/PortabilityIssues.html new file mode 100644 index 000000000..376a5f00e --- /dev/null +++ b/win32/3rdparty/pthreads/manual/PortabilityIssues.html @@ -0,0 +1,718 @@ + + + + + PORTABILITYISSUES manual page + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

Portability issues

+

Synopsis

+

Thread priority

+

Description

+

Thread priority

+

POSIX defines a single contiguous range +of numbers that determine a thread's priority. Win32 defines priority +classes - and priority levels relative to these classes. Classes are +simply priority base levels that the defined priority levels are +relative to such that, changing a process's priority class will +change the priority of all of it's threads, while the threads retain +the same relativity to each other.

+

A Win32 system defines a single +contiguous monotonic range of values that define system priority +levels, just like POSIX. However, Win32 restricts individual threads +to a subset of this range on a per-process basis.

+

The following table shows the base +priority levels for combinations of priority class and priority value +in Win32.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+


+

+
+

Process Priority Class

+
+

Thread Priority Level

+
+

1

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_IDLE

+
+

1

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_IDLE

+
+

1

+
+

NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_IDLE

+
+

1

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_IDLE

+
+

1

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_IDLE

+
+

2

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

3

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

4

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

4

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

5

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

5

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

5

+
+

Background NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

6

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

6

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

6

+
+

Background NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

7

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

7

+
+

Background NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

7

+
+

Foreground NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

8

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

8

+
+

NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

8

+
+

Foreground NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

8

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

9

+
+

NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

9

+
+

Foreground NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

9

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

10

+
+

Foreground NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

10

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

11

+
+

Foreground NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

11

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

11

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

12

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

12

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

13

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

14

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

15

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

15

+
+

HIGH_PRIORITY_CLASS

+
+

THREAD_PRIORITY_TIME_CRITICAL

+
+

15

+
+

IDLE_PRIORITY_CLASS

+
+

THREAD_PRIORITY_TIME_CRITICAL

+
+

15

+
+

BELOW_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_TIME_CRITICAL

+
+

15

+
+

NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_TIME_CRITICAL

+
+

15

+
+

ABOVE_NORMAL_PRIORITY_CLASS

+
+

THREAD_PRIORITY_TIME_CRITICAL

+
+

16

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_IDLE

+
+

17

+
+

REALTIME_PRIORITY_CLASS

+
+

-7

+
+

18

+
+

REALTIME_PRIORITY_CLASS

+
+

-6

+
+

19

+
+

REALTIME_PRIORITY_CLASS

+
+

-5

+
+

20

+
+

REALTIME_PRIORITY_CLASS

+
+

-4

+
+

21

+
+

REALTIME_PRIORITY_CLASS

+
+

-3

+
+

22

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_LOWEST

+
+

23

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_BELOW_NORMAL

+
+

24

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_NORMAL

+
+

25

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_ABOVE_NORMAL

+
+

26

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_HIGHEST

+
+

27

+
+

REALTIME_PRIORITY_CLASS

+
+

3

+
+

28

+
+

REALTIME_PRIORITY_CLASS

+
+

4

+
+

29

+
+

REALTIME_PRIORITY_CLASS

+
+

5

+
+

30

+
+

REALTIME_PRIORITY_CLASS

+
+

6

+
+

31

+
+

REALTIME_PRIORITY_CLASS

+
+

THREAD_PRIORITY_TIME_CRITICAL

+
+
+
+

Windows NT: Values -7, -6, -5, -4, -3, 3, +4, 5, and 6 are not supported.

+

As you can see, the real priority levels +available to any individual Win32 thread are non-contiguous.

+

An application using Pthreads-w32 should +not make assumptions about the numbers used to represent thread +priority levels, except that they are monotonic between the values +returned by sched_get_priority_min() and sched_get_priority_max(). +E.g. Windows 95, 98, NT, 2000, XP make available a non-contiguous +range of numbers between -15 and 15, while at least one version of +WinCE (3.0) defines the minimum priority (THREAD_PRIORITY_LOWEST) as +5, and the maximum priority (THREAD_PRIORITY_HIGHEST) as 1.

+

Internally, pthreads-win32 maps any +priority levels between THREAD_PRIORITY_IDLE and +THREAD_PRIORITY_LOWEST to THREAD_PRIORITY_LOWEST, or between +THREAD_PRIORITY_TIME_CRITICAL and THREAD_PRIORITY_HIGHEST to +THREAD_PRIORITY_HIGHEST. Currently, this also applies to +REALTIME_PRIORITY_CLASS even if levels -7, -6, -5, -4, -3, 3, 4, 5, +and 6 are supported.

+

If it wishes, a Win32 application using +pthreads-w32 can use the Win32 defined priority macros +THREAD_PRIORITY_IDLE through THREAD_PRIORITY_TIME_CRITICAL.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+

See also

+



+

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/index.html b/win32/3rdparty/pthreads/manual/index.html new file mode 100644 index 000000000..a209dc01a --- /dev/null +++ b/win32/3rdparty/pthreads/manual/index.html @@ -0,0 +1,146 @@ + + + + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Table of Contents

+

POSIX +threads API reference
Miscellaneous +POSIX thread safe routines provided by Pthreads-w32
Non-portable +Pthreads-w32 routines
Other

+

POSIX threads API reference

+

pthread_attr_destroy

+

pthread_attr_getdetachstate

+

pthread_attr_getinheritsched

+

pthread_attr_getschedparam

+

pthread_attr_getschedpolicy

+

pthread_attr_getscope

+

pthread_attr_getstackaddr

+

pthread_attr_getstacksize

+

pthread_attr_init

+

pthread_attr_setdetachstate

+

pthread_attr_setinheritsched

+

pthread_attr_setschedparam

+

pthread_attr_setschedpolicy

+

pthread_attr_setscope

+

pthread_attr_setstackaddr

+

pthread_attr_setstacksize

+

pthread_barrierattr_destroy

+

pthread_barrierattr_getpshared

+

pthread_barrierattr_init

+

pthread_barrierattr_setpshared

+

pthread_barrier_destroy

+

pthread_barrier_init

+

pthread_barrier_wait

+

pthread_cancel

+

pthread_cleanup_pop

+

pthread_cleanup_push

+

pthread_condattr_destroy

+

pthread_condattr_getpshared

+

pthread_condattr_init

+

pthread_condattr_setpshared

+

pthread_cond_broadcast

+

pthread_cond_destroy

+

pthread_cond_init

+

pthread_cond_signal

+

pthread_cond_timedwait

+

pthread_cond_wait

+

pthread_create

+

pthread_detach

+

pthread_equal

+

pthread_exit

+

pthread_getconcurrency

+

pthread_getschedparam

+

pthread_getspecific

+

pthread_join

+

pthread_key_create

+

pthread_key_delete

+

pthread_kill

+

pthread_mutexattr_destroy

+

pthread_mutexattr_getkind_np

+

pthread_mutexattr_getpshared

+

pthread_mutexattr_gettype

+

pthread_mutexattr_init

+

pthread_mutexattr_setkind_np

+

pthread_mutexattr_setpshared

+

pthread_mutexattr_settype

+

pthread_mutex_destroy

+

pthread_mutex_init

+

pthread_mutex_lock

+

pthread_mutex_timedlock

+

pthread_mutex_trylock

+

pthread_mutex_unlock

+

pthread_once

+

pthread_rwlockattr_destroy

+

pthread_rwlockattr_getpshared

+

pthread_rwlockattr_init

+

pthread_rwlockattr_setpshared

+

pthread_rwlock_destroy

+

pthread_rwlock_init

+

pthread_rwlock_rdlock

+

pthread_rwlock_timedrdlock

+

pthread_rwlock_timedwrlock

+

pthread_rwlock_tryrdlock

+

pthread_rwlock_trywrlock

+

pthread_rwlock_unlock

+

pthread_rwlock_wrlock

+

pthread_self

+

pthread_setcancelstate

+

pthread_setcanceltype

+

pthread_setconcurrency

+

pthread_setschedparam

+

pthread_setspecific

+

pthread_sigmask

+

pthread_spin_destroy

+

pthread_spin_init

+

pthread_spin_lock

+

pthread_spin_trylock

+

pthread_spin_unlock

+

pthread_testcancel

+

sched_get_priority_max

+

sched_get_priority_min

+

sched_getscheduler

+

sched_setscheduler

+

sched_yield

+

sem_close

+

sem_destroy

+

sem_getvalue

+

sem_init

+

sem_open

+

sem_post

+

sem_post_multiple

+

sem_timedwait

+

sem_trywait

+

sem_unlink

+

sem_wait

+

sigwait

+

Miscellaneous POSIX thread safe +routines provided by Pthreads-w32

+

asctime_r

+

ctime_r

+

gmtime_r

+

localtime_r

+

rand_r

+

Non-portable Pthreads-w32 routines

+

pthreadCancelableTimedWait

+

pthreadCancelableWait

+

pthread_delay_np

+

pthread_getw32threadhandle_np

+

pthread_num_processors_np

+

pthread_win32_test_features_np

+

pthread_timechange_handler_np

+

pthread_win32_process_attach_np

+

pthread_win32_process_detach_np

+

pthread_win32_thread_attach_np

+

pthread_win32_thread_detach_np

+

Other

+

Portability +issues

+ + diff --git a/win32/3rdparty/pthreads/manual/pthreadCancelableWait.html b/win32/3rdparty/pthreads/manual/pthreadCancelableWait.html new file mode 100644 index 000000000..9d7c1a458 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthreadCancelableWait.html @@ -0,0 +1,86 @@ + + + + + PTHREADCANCELLABLEWAIT manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthreadCancelableTimedWait, +pthreadCancelableWait – provide cancellation hooks for user Win32 +routines

+

Synopsis

+

#include <pthread.h> +

+

int pthreadCancelableTimedWait (HANDLE waitHandle, +DWORD timeout);

+

int pthreadCancelableWait (HANDLE waitHandle);

+

Description

+

These two functions provide hooks into the pthread_cancel() +mechanism that will allow you to wait on a Windows handle and make it +a cancellation point. Both functions block until either the given +Win32 HANDLE is signalled, or pthread_cancel() +has been called. They are implemented using WaitForMultipleObjects +on waitHandle and the manually reset Win32 event handle that +is the target of pthread_cancel(). +These routines may be called from Win32 native threads but +pthread_cancel() will +require that thread's POSIX thread ID that the thread must retrieve +using pthread_self().

+

pthreadCancelableTimedWait is the timed version that will +return with the code ETIMEDOUT if the interval timeout +milliseconds elapses before waitHandle is signalled.

+

Cancellation

+

These routines allow routines that block on Win32 HANDLEs to be +cancellable via pthread_cancel().

+

Return Value

+



+

+

Errors

+

The pthreadCancelableTimedWait function returns the +following error code on error: +

+
+
+
ETIMEDOUT +
+
+

+The interval timeout milliseconds elapsed before waitHandle +was signalled.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+

See also

+

pthread_cancel(), +pthread_self()

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_attr_init.html b/win32/3rdparty/pthreads/manual/pthread_attr_init.html new file mode 100644 index 000000000..fa5ab5811 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_attr_init.html @@ -0,0 +1,280 @@ + + + + + PTHREAD_ATTR_INIT(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_attr_init, pthread_attr_destroy, +pthread_attr_setdetachstate, pthread_attr_getdetachstate, +pthread_attr_setschedparam, pthread_attr_getschedparam, +pthread_attr_setschedpolicy, pthread_attr_getschedpolicy, +pthread_attr_setinheritsched, pthread_attr_getinheritsched, +pthread_attr_setscope, pthread_attr_getscope - thread creation +attributes +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_attr_init(pthread_attr_t *attr); +

+

int pthread_attr_destroy(pthread_attr_t *attr); +

+

int pthread_attr_setdetachstate(pthread_attr_t *attr, +int detachstate); +

+

int pthread_attr_getdetachstate(const pthread_attr_t *attr, +int *detachstate); +

+

int pthread_attr_setschedpolicy(pthread_attr_t *attr, +int policy); +

+

int pthread_attr_getschedpolicy(const pthread_attr_t *attr, +int *policy); +

+

int pthread_attr_setschedparam(pthread_attr_t *attr, +const struct sched_param *param); +

+

int pthread_attr_getschedparam(const pthread_attr_t *attr, +struct sched_param *param); +

+

int pthread_attr_setinheritsched(pthread_attr_t *attr, +int inherit); +

+

int pthread_attr_getinheritsched(const pthread_attr_t *attr, +int *inherit); +

+

int pthread_attr_setscope(pthread_attr_t *attr, +int scope); +

+

int pthread_attr_getscope(const pthread_attr_t *attr, +int *scope); +

+

Description

+

Setting attributes for threads is achieved by filling a thread +attribute object attr of type pthread_attr_t, then +passing it as second argument to pthread_create(3) +. Passing NULL is equivalent to passing a thread attribute +object with all attributes set to their default values. +

+

pthread_attr_init initializes the thread attribute object +attr and fills it with default values for the attributes. (The +default values are listed below for each attribute.) +

+

Each attribute attrname (see below for a list of all +attributes) can be individually set using the function +pthread_attr_setattrname and retrieved using the +function pthread_attr_getattrname. +

+

pthread_attr_destroy destroys a thread attribute object, +which must not then be reused until it is reinitialized. +

+

Attribute objects are consulted only when creating a new thread. +The same attribute object can be used for creating several threads. +Modifying an attribute object after a call to pthread_create +does not change the attributes of the thread previously created. +

+

The following thread attributes are supported: +

+

detachstate

+

Control whether the thread is created in the joinable state (value +PTHREAD_CREATE_JOINABLE) or in the detached state ( +PTHREAD_CREATE_DETACHED). +

+

Default value: PTHREAD_CREATE_JOINABLE. +

+

In the joinable state, another thread can synchronize on the +thread termination and recover its termination code using +pthread_join(3) . When a +joinable thread terminates, some of the thread resources are kept +allocated, and released only when another thread performs +pthread_join(3) on that +thread. +

+

In the detached state, the thread's resources are released +immediately when it terminates. pthread_join(3) +cannot be used to synchronize on the thread termination. +

+

A thread created in the joinable state can later be put in the +detached thread using pthread_detach(3) +. +

+

schedpolicy

+

Select the scheduling policy for the thread: one of SCHED_OTHER +(regular, non-real-time scheduling), SCHED_RR (real-time, +round-robin) or SCHED_FIFO (real-time, first-in first-out). +

+

Pthreads-w32 only supports SCHED_OTHER - attempting +to set one of the other policies will return an error ENOTSUP.

+

Default value: SCHED_OTHER. +

+

Pthreads-w32 only supports SCHED_OTHER - attempting +to set one of the other policies will return an error ENOTSUP.

+

The scheduling policy of a thread can be changed after creation +with pthread_setschedparam(3) +. +

+

schedparam

+

Contain the scheduling parameters (essentially, the scheduling +priority) for the thread.

+

Pthreads-w32 supports the priority levels defined by the +Windows system it is running on. Under Windows, thread priorities are +relative to the process priority class, which must be set via the +Windows W32 API.

+

Default value: priority is 0 (Win32 level THREAD_PRIORITY_NORMAL). +

+

The scheduling priority of a thread can be changed after creation +with pthread_setschedparam(3) +. +

+

inheritsched

+

Indicate whether the scheduling policy and scheduling parameters +for the newly created thread are determined by the values of the +schedpolicy and schedparam attributes (value +PTHREAD_EXPLICIT_SCHED) or are inherited from the parent +thread (value PTHREAD_INHERIT_SCHED). +

+

Default value: PTHREAD_EXPLICIT_SCHED. +

+

scope

+

Define the scheduling contention scope for the created thread. The +only value supported in the Pthreads-w32 implementation is +PTHREAD_SCOPE_SYSTEM, meaning that the threads contend for CPU +time with all processes running on the machine. The other value +specified by the standard, PTHREAD_SCOPE_PROCESS, means that +scheduling contention occurs only between the threads of the running +process.

+

Pthreads-w32 only supports PTHREAD_SCOPE_SYSTEM.

+

Default value: PTHREAD_SCOPE_SYSTEM. +

+

Return Value

+

All functions return 0 on success and a non-zero error code on +error. On success, the pthread_attr_getattrname +functions also store the current value of the attribute attrname +in the location pointed to by their second argument. +

+

Errors

+

The pthread_attr_setdetachstate function returns the +following error codes on error: +

+
+
+
EINVAL +
+ the specified detachstate is not one of + PTHREAD_CREATE_JOINABLE or PTHREAD_CREATE_DETACHED. +
+
+

+The pthread_attr_setschedparam function returns the following +error codes on error: +

+
+
+
EINVAL +
+ the priority specified in param is outside the range of + allowed priorities for the scheduling policy currently in attr + (1 to 99 for SCHED_FIFO and SCHED_RR; 0 for + SCHED_OTHER). +
+
+

+The pthread_attr_setschedpolicy function returns the following +error codes on error: +

+
+
+
EINVAL +
+ the specified policy is not one of SCHED_OTHER, + SCHED_FIFO, or SCHED_RR. +
+ ENOTSUP +
+ policy is not SCHED_OTHER, the only value supported + by Pthreads-w32.
+
+

+The pthread_attr_setinheritsched function returns the +following error codes on error: +

+
+
+
EINVAL +
+ the specified inherit is not one of PTHREAD_INHERIT_SCHED + or PTHREAD_EXPLICIT_SCHED. +
+
+

+The pthread_attr_setscope function returns the following error +codes on error: +

+
+
+
EINVAL +
+ the specified scope is not one of PTHREAD_SCOPE_SYSTEM + or PTHREAD_SCOPE_PROCESS. +
+ ENOTSUP +
+ the specified scope is PTHREAD_SCOPE_PROCESS (not + supported by Pthreads-w32). +
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_create(3) , +pthread_join(3) , +pthread_detach(3) , +pthread_setschedparam(3) +. +

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_attr_setstackaddr.html b/win32/3rdparty/pthreads/manual/pthread_attr_setstackaddr.html new file mode 100644 index 000000000..868832c0a --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_attr_setstackaddr.html @@ -0,0 +1,158 @@ + + + + + "PTHREAD_ATTR_GETSTACKADDR"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_attr_getstackaddr, pthread_attr_setstackaddr - get and set +the stackaddr attribute +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_attr_getstackaddr(const pthread_attr_t *restrict +attr, void **restrict stackaddr);
int +pthread_attr_setstackaddr(pthread_attr_t *
attr, void +*stackaddr); +

+

Description

+

The pthread_attr_getstackaddr and pthread_attr_setstackaddr +functions, respectively, shall get and set the thread creation +stackaddr attribute in the attr object. +

+

The stackaddr attribute specifies the location of storage +to be used for the created thread’s stack. The size of the storage +shall be at least {PTHREAD_STACK_MIN}. +

+

Pthreads-w32 defines _POSIX_THREAD_ATTR_STACKADDR in +pthread.h as -1 to indicate that these routines are implemented but +cannot used to set or get the stack address. These routines always +return the error ENOSYS when called.

+

Return Value

+

Upon successful completion, pthread_attr_getstackaddr and +pthread_attr_setstackaddr shall return a value of 0; +otherwise, an error number shall be returned to indicate the error. +

+

The pthread_attr_getstackaddr function stores the stackaddr +attribute value in stackaddr if successful. +

+

Errors

+

The pthread_attr_setstackaddr function always returns the +following error code: +

+
+
+
ENOSYS
+ The function is not supported. +
+
+

+The pthread_attr_getstackaddr function always returns the +following error code: +

+
+
+
ENOSYS
+ The function is not supported. +
+
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

The specification of the stackaddr attribute presents +several ambiguities that make portable use of these interfaces +impossible. The description of the single address parameter as a +"stack" does not specify a particular relationship between +the address and the "stack" implied by that address. For +example, the address may be taken as the low memory address of a +buffer intended for use as a stack, or it may be taken as the address +to be used as the initial stack pointer register value for the new +thread. These two are not the same except for a machine on which the +stack grows "up" from low memory to high, and on which a +"push" operation first stores the value in memory and then +increments the stack pointer register. Further, on a machine where +the stack grows "down" from high memory to low, +interpretation of the address as the "low memory" address +requires a determination of the intended size of the stack. +IEEE Std 1003.1-2001 has introduced the new interfaces +pthread_attr_setstack(3) +and pthread_attr_getstack(3) +to resolve these ambiguities. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_attr_destroy(3) +, pthread_attr_getdetachstate(3) +, pthread_attr_getstack(3) +, pthread_attr_getstacksize(3) +, pthread_attr_setstack(3) +, pthread_create(3) , the +Base Definitions volume of IEEE Std 1003.1-2001, +<limits.h>, <pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_attr_setstacksize.html b/win32/3rdparty/pthreads/manual/pthread_attr_setstacksize.html new file mode 100644 index 000000000..ae9d031f4 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_attr_setstacksize.html @@ -0,0 +1,127 @@ + + + + + "PTHREAD_ATTR_GETSTACKSIZE"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_attr_getstacksize, pthread_attr_setstacksize - get and set +the stacksize attribute +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_attr_getstacksize(const pthread_attr_t *restrict +attr, size_t *restrict stacksize);
int +pthread_attr_setstacksize(pthread_attr_t *
attr, size_t +stacksize); +

+

Description

+

The pthread_attr_getstacksize and pthread_attr_setstacksize +functions, respectively, shall get and set the thread creation +stacksize attribute in the attr object. +

+

The stacksize attribute shall define the minimum stack size +(in bytes) allocated for the created threads stack. +

+

Pthreads-w32 defines _POSIX_THREAD_ATTR_STACKSIZE in +pthread.h to indicate that these routines are implemented and may be +used to set or get the stack size.

+

Default value: 0 (in Pthreads-w32 a value of 0 means the stack +will grow as required)

+

Return Value

+

Upon successful completion, pthread_attr_getstacksize and +pthread_attr_setstacksize shall return a value of 0; +otherwise, an error number shall be returned to indicate the error. +

+

The pthread_attr_getstacksize function stores the stacksize +attribute value in stacksize if successful. +

+

Errors

+

The pthread_attr_setstacksize function shall fail if: +

+
+
EINVAL +
+ The value of stacksize is less than {PTHREAD_STACK_MIN} or + exceeds a system-imposed limit. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_attr_destroy(3) +, pthread_attr_getstackaddr(3) +, pthread_attr_getdetachstate(3) +, pthread_create(3) , +the Base Definitions volume of IEEE Std 1003.1-2001, +<limits.h>, <pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_barrier_init.html b/win32/3rdparty/pthreads/manual/pthread_barrier_init.html new file mode 100644 index 000000000..065c1296f --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_barrier_init.html @@ -0,0 +1,200 @@ + + + + + "PTHREAD_BARRIER_DESTROY"(P) manual page + + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_barrier_destroy, pthread_barrier_init - destroy and +initialize a barrier object (ADVANCED REALTIME THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_barrier_destroy(pthread_barrier_t *barrier); +
int pthread_barrier_init(pthread_barrier_t *restrict
barrier, +const pthread_barrierattr_t *restrict attr, unsigned +count); +

+

Description

+

The pthread_barrier_destroy function shall destroy the +barrier referenced by barrier and release any resources used +by the barrier. The effect of subsequent use of the barrier is +undefined until the barrier is reinitialized by another call to +pthread_barrier_init . An implementation may use this function +to set barrier to an invalid value. The results are undefined +if pthread_barrier_destroy is called when any thread is +blocked on the barrier, or if this function is called with an +uninitialized barrier. +

+

The pthread_barrier_init function shall allocate any +resources required to use the barrier referenced by barrier +and shall initialize the barrier with attributes referenced by attr. +If attr is NULL, the default barrier attributes shall be used; +the effect is the same as passing the address of a default barrier +attributes object. The results are undefined if pthread_barrier_init +is called when any thread is blocked on the barrier (that is, has not +returned from the pthread_barrier_wait(3) +call). The results are undefined if a barrier is used without first +being initialized. The results are undefined if pthread_barrier_init +is called specifying an already initialized barrier. +

+

The count argument specifies the number of threads that +must call pthread_barrier_wait(3) +before any of them successfully return from the call. The value +specified by count must be greater than zero. +

+

If the pthread_barrier_init function fails, the barrier +shall not be initialized and the contents of barrier are +undefined. +

+

Only the object referenced by barrier may be used for +performing synchronization. The result of referring to copies of that +object in calls to pthread_barrier_destroy or +pthread_barrier_wait(3) +is undefined.

+

Return Value

+

Upon successful completion, these functions shall return zero; +otherwise, an error number shall be returned to indicate the error. +

+

Errors

+

The pthread_barrier_destroy function may fail if: +

+
+
EBUSY +
+ The implementation has detected an attempt to destroy a barrier + while it is in use (for example, while being used in a + pthread_barrier_wait(3) + call) by another thread. +
+ EINVAL +
+ The value specified by barrier is invalid. +
+

+The pthread_barrier_init function shall fail if: +

+
+
EAGAIN +
+ The system lacks the necessary resources to initialize another + barrier. +
+ EINVAL +
+ The value specified by count is equal to zero. +
+ ENOMEM +
+ Insufficient memory exists to initialize the barrier. +
+

+The pthread_barrier_init function may fail if: +

+
+
EBUSY +
+ The implementation has detected an attempt to reinitialize a barrier + while it is in use (for example, while being used in a + pthread_barrier_wait(3) + call) by another thread. +
+ EINVAL +
+ The value specified by attr is invalid. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

The pthread_barrier_destroy and pthread_barrier_init +functions are part of the Barriers option and need not be provided on +all implementations. +

+

Pthreads-w32 defines _POSIX_BARRIERS to indicate +that these routines are implemented and may be used.

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

Known Bugs

+
+
In + pthreads-win32, + pthread_barrier_wait(3) + may deadlock if the number of running threads able to wait on the + barrier object exceeds the value given as the count + parameter in pthread_barrier_init. +
+

+See Also

+

pthread_barrier_wait(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/pthread_barrier_wait.html b/win32/3rdparty/pthreads/manual/pthread_barrier_wait.html new file mode 100644 index 000000000..693d8bd15 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_barrier_wait.html @@ -0,0 +1,167 @@ + + + + + "PTHREAD_BARRIER_WAIT"(P) manual page + + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_barrier_wait - synchronize at a barrier (ADVANCED +REALTIME THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_barrier_wait(pthread_barrier_t *barrier); + +

+

Description

+

The pthread_barrier_wait function shall synchronize +participating threads at the barrier referenced by barrier. +The calling thread shall block until the required number of threads +have called pthread_barrier_wait specifying the barrier. +

+

When the required number of threads have called +pthread_barrier_wait specifying the barrier, the constant +PTHREAD_BARRIER_SERIAL_THREAD shall be returned to one +unspecified thread and zero shall be returned to each of the +remaining threads. At this point, the barrier shall be reset to the +state it had as a result of the most recent pthread_barrier_init(3) +function that referenced it. +

+

The constant PTHREAD_BARRIER_SERIAL_THREAD is defined in +<pthread.h> and its value shall be distinct from any +other value returned by pthread_barrier_wait . +

+

The results are undefined if this function is called with an +uninitialized barrier. +

+

If a signal is delivered to a thread blocked on a barrier, upon +return from the signal handler the thread shall resume waiting at the +barrier if the barrier wait has not completed (that is, if the +required number of threads have not arrived at the barrier during the +execution of the signal handler); otherwise, the thread shall +continue as normal from the completed barrier wait. Until the thread +in the signal handler returns from it, it is unspecified whether +other threads may proceed past the barrier once they have all reached +it. +

+

A thread that has blocked on a barrier shall not prevent any +unblocked thread that is eligible to use the same processing +resources from eventually making forward progress in its execution. +Eligibility for processing resources shall be determined by the +scheduling policy. +

+

Return Value

+

Upon successful completion, the pthread_barrier_wait +function shall return PTHREAD_BARRIER_SERIAL_THREAD for a +single (arbitrary) thread synchronized at the barrier and zero for +each of the other threads. Otherwise, an error number shall be +returned to indicate the error. +

+

Errors

+

The pthread_barrier_wait function may fail if: +

+
+
EINVAL +
+ The value specified by barrier does not refer to an + initialized barrier object. +
+

+This function shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using this function may be subject to priority +inversion, as discussed in the Base Definitions volume of +IEEE Std 1003.1-2001, Section 3.285, Priority Inversion. +

+

The pthread_barrier_wait function is part of the Barriers +option and need not be provided on all implementations. +

+

Pthreads-w32 defines _POSIX_BARRIERS to indicate +that this routine is implemented and may be used.

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

Known Bugs

+
+
In + pthreads-win32, + pthread_barrier_wait may deadlock if the number of running + threads able to wait on the barrier object exceeds the value given + as the count parameter in + pthread_barrier_init(3). +
+

+See Also

+

pthread_barrier_destroy(3), +pthread_barrier_init(3), +the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/pthread_barrierattr_init.html b/win32/3rdparty/pthreads/manual/pthread_barrierattr_init.html new file mode 100644 index 000000000..a7c802735 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_barrierattr_init.html @@ -0,0 +1,142 @@ + + + + + "PTHREAD_BARRIERATTR_DESTROY"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_barrierattr_destroy, pthread_barrierattr_init - destroy +and initialize the barrier attributes object (ADVANCED REALTIME +THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_barrierattr_destroy(pthread_barrierattr_t *attr); +
int pthread_barrierattr_init(pthread_barrierattr_t *
attr); + +

+

Description

+

The pthread_barrierattr_destroy function shall destroy a +barrier attributes object. A destroyed attr attributes object +can be reinitialized using pthread_barrierattr_init ; the +results of otherwise referencing the object after it has been +destroyed are undefined. An implementation may cause +pthread_barrierattr_destroy to set the object referenced by +attr to an invalid value. +

+

The pthread_barrierattr_init function shall initialize a +barrier attributes object attr with the default value for all +of the attributes defined by the implementation. +

+

Results are undefined if pthread_barrierattr_init is called +specifying an already initialized attr attributes object. +

+

After a barrier attributes object has been used to initialize one +or more barriers, any function affecting the attributes object +(including destruction) shall not affect any previously initialized +barrier. +

+

Return Value

+

If successful, the pthread_barrierattr_destroy and +pthread_barrierattr_init functions shall return zero; +otherwise, an error number shall be returned to indicate the error. +

+

Errors

+

The pthread_barrierattr_destroy function may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+

+The pthread_barrierattr_init function shall fail if: +

+
+
ENOMEM +
+ Insufficient memory exists to initialize the barrier attributes + object. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

The pthread_barrierattr_destroy and +pthread_barrierattr_init functions are part of the Barriers +option and need not be provided on all implementations. +

+

Pthreads-w32 defines _POSIX_BARRIERS to indicate +that these routines are implemented and may be used.

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_barrierattr_getpshared(3) +, pthread_barrierattr_setpshared(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h>. +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_barrierattr_setpshared.html b/win32/3rdparty/pthreads/manual/pthread_barrierattr_setpshared.html new file mode 100644 index 000000000..2c62d3dce --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_barrierattr_setpshared.html @@ -0,0 +1,159 @@ + + + + + "PTHREAD_BARRIERATTR_GETPSHARED"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_barrierattr_getpshared, pthread_barrierattr_setpshared - +get and set the process-shared attribute of the barrier attributes +object (ADVANCED REALTIME THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_barrierattr_getpshared(const pthread_barrierattr_t +* restrict attr, int *restrict pshared); +
int pthread_barrierattr_setpshared(pthread_barrierattr_t *
attr, +int pshared); +

+

Description

+

The pthread_barrierattr_getpshared function shall obtain +the value of the process-shared attribute from the attributes +object referenced by attr. The pthread_barrierattr_setpshared +function shall set the process-shared attribute in an +initialized attributes object referenced by attr. +

+

The process-shared attribute is set to +PTHREAD_PROCESS_SHARED to permit a barrier to be operated upon by any +thread that has access to the memory where the barrier is allocated. +If the process-shared attribute is PTHREAD_PROCESS_PRIVATE, +the barrier shall only be operated upon by threads created within the +same process as the thread that initialized the barrier; if threads +of different processes attempt to operate on such a barrier, the +behavior is undefined. The default value of the attribute shall be +PTHREAD_PROCESS_PRIVATE. Both constants PTHREAD_PROCESS_SHARED and +PTHREAD_PROCESS_PRIVATE are defined in <pthread.h>. +

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that these routines are implemented but +that the process shared attribute is not supported.

+

Additional attributes, their default values, and the names of the +associated functions to get and set those attribute values are +implementation-defined. +

+

Return Value

+

If successful, the pthread_barrierattr_getpshared function +shall return zero and store the value of the process-shared +attribute of attr into the object referenced by the pshared +parameter. Otherwise, an error number shall be returned to indicate +the error. +

+

If successful, the pthread_barrierattr_setpshared function +shall return zero; otherwise, an error number shall be returned to +indicate the error. +

+

Errors

+

These functions may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+ The pthread_barrierattr_setpshared function may fail if: +
+ EINVAL +
+ The new value specified for the process-shared attribute is + not one of the legal values PTHREAD_PROCESS_SHARED or + PTHREAD_PROCESS_PRIVATE. +
+ ENOSYS +
+ The value specified by attr was PTHREAD_PROCESS_SHARED + (Pthreads-w32).
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

The pthread_barrierattr_getpshared and +pthread_barrierattr_setpshared functions are part of the +Barriers option and need not be provided on all implementations. +

+

Pthreads-w32 defines _POSIX_BARRIERS and +_POSIX_THREAD_PROCESS_SHARED in pthread.h as -1 to indicate +that these routines are implemented and may be used, but do not +support the process shared option.

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_barrier_destroy(3) +, pthread_barrierattr_destroy(3) +, pthread_barrierattr_init(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_cancel.html b/win32/3rdparty/pthreads/manual/pthread_cancel.html new file mode 100644 index 000000000..d9acd7727 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_cancel.html @@ -0,0 +1,205 @@ + + + + + PTHREAD_CANCEL(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, +pthread_testcancel - thread cancellation +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_cancel(pthread_t thread); +

+

int pthread_setcancelstate(int state, int +*oldstate); +

+

int pthread_setcanceltype(int type, int +*oldtype); +

+

void pthread_testcancel(void); +

+

Description

+

Cancellation is the mechanism by which a thread can terminate the +execution of another thread. More precisely, a thread can send a +cancellation request to another thread. Depending on its settings, +the target thread can then either ignore the request, honor it +immediately, or defer it until it reaches a cancellation point. +

+

When a thread eventually honors a cancellation request, it +performs as if pthread_exit(PTHREAD_CANCELED) has been called +at that point: all cleanup handlers are executed in reverse order, +destructor functions for thread-specific data are called, and finally +the thread stops executing with the return value PTHREAD_CANCELED. +See pthread_exit(3) for more +information. +

+

pthread_cancel sends a cancellation request to the thread +denoted by the thread argument. +

+

pthread_setcancelstate changes the cancellation state for +the calling thread -- that is, whether cancellation requests are +ignored or not. The state argument is the new cancellation +state: either PTHREAD_CANCEL_ENABLE to enable cancellation, or +PTHREAD_CANCEL_DISABLE to disable cancellation (cancellation +requests are ignored). If oldstate is not NULL, the +previous cancellation state is stored in the location pointed to by +oldstate, and can thus be restored later by another call to +pthread_setcancelstate. +

+

pthread_setcanceltype changes the type of responses to +cancellation requests for the calling thread: asynchronous +(immediate) or deferred. The type argument is the new +cancellation type: either PTHREAD_CANCEL_ASYNCHRONOUS to +cancel the calling thread as soon as the cancellation request is +received, or PTHREAD_CANCEL_DEFERRED to keep the cancellation +request pending until the next cancellation point. If oldtype +is not NULL, the previous cancellation state is stored in the +location pointed to by oldtype, and can thus be restored later +by another call to pthread_setcanceltype. +

+

Pthreads-w32 provides two levels of support for +PTHREAD_CANCEL_ASYNCHRONOUS: full and partial. Full support +requires an additional DLL and driver be installed on the Windows +system (see the See Also section below) that allows blocked threads +to be cancelled immediately. Partial support means that the target +thread will not cancel until it resumes execution naturally. Partial +support is provided if either the DLL or the driver are not +automatically detected by the pthreads-w32 library at run-time.

+

Threads are always created by pthread_create(3) +with cancellation enabled and deferred. That is, the initial +cancellation state is PTHREAD_CANCEL_ENABLE and the initial +type is PTHREAD_CANCEL_DEFERRED. +

+

Cancellation points are those points in the program execution +where a test for pending cancellation requests is performed and +cancellation is executed if positive. The following POSIX threads +functions are cancellation points: +

+

pthread_join(3) +
pthread_cond_wait(3) +
pthread_cond_timedwait(3) +
pthread_testcancel(3)
sem_wait(3) +
sem_timedwait(3)
sigwait(3)

+

Pthreads-w32 provides two functions to enable additional +cancellation points to be created in user functions that block on +Win32 HANDLEs:

+

pthreadCancelableWait() +
pthreadCancelableTimedWait()

+

All other POSIX threads functions are guaranteed not to be +cancellation points. That is, they never perform cancellation in +deferred cancellation mode. +

+

pthread_testcancel does nothing except testing for pending +cancellation and executing it. Its purpose is to introduce explicit +checks for cancellation in long sequences of code that do not call +cancellation point functions otherwise. +

+

Return Value

+

pthread_cancel, pthread_setcancelstate and +pthread_setcanceltype return 0 on success and a non-zero error +code on error. +

+

Errors

+

pthread_cancel returns the following error code on error: +

+
+
+
ESRCH +
+ no thread could be found corresponding to that specified by the + thread ID. +
+
+

+pthread_setcancelstate returns the following error code on +error: +

+
+
+
EINVAL +
+ the state argument is not +
+
+
+PTHREAD_CANCEL_ENABLE nor PTHREAD_CANCEL_DISABLE +
+

pthread_setcanceltype returns the following error code on +error: +

+
+
+
EINVAL +
+ the type argument is not +
+
+
+PTHREAD_CANCEL_DEFERRED nor PTHREAD_CANCEL_ASYNCHRONOUS +
+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_exit(3) , +pthread_cleanup_push(3) +, pthread_cleanup_pop(3) +, Pthreads-w32 package README file 'Prerequisites' section. +

+

Bugs

+

POSIX specifies that a number of system calls (basically, all +system calls that may block, such as read(2) +, write(2) , wait(2) +, etc.) and library functions that may call these system calls (e.g. +fprintf(3) ) are cancellation +points. Pthreads-win32 is not integrated enough with the C +library to implement this, and thus none of the C library functions +is a cancellation point. +

+

A workaround for these calls is to temporarily switch to +asynchronous cancellation (assuming full asynchronous cancellation +support is installed). So, checking for cancellation during a read +system call, for instance, can be achieved as follows: +

+


+
+
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldCancelType);
+read(fd, buffer, length);
+pthread_setcanceltype(oldCancelType, NULL);
+
+
Table of Contents
+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_cleanup_push.html b/win32/3rdparty/pthreads/manual/pthread_cleanup_push.html new file mode 100644 index 000000000..0fc071e19 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_cleanup_push.html @@ -0,0 +1,140 @@ + + + + + PTHREAD_CLEANUP(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_cleanup_push, pthread_cleanup_pop - install and remove +cleanup handlers +

+

Synopsis

+

#include <pthread.h> +

+

void pthread_cleanup_push(void (*routine) (void +*), void *arg); +

+

void pthread_cleanup_pop(int execute); +

+

Description

+

Cleanup handlers are functions that get called when a thread +terminates, either by calling pthread_exit(3) +or because of cancellation. Cleanup handlers are installed and +removed following a stack-like discipline. +

+

The purpose of cleanup handlers is to free the resources that a +thread may hold at the time it terminates. In particular, if a thread +exits or is cancelled while it owns a locked mutex, the mutex will +remain locked forever and prevent other threads from executing +normally. The best way to avoid this is, just before locking the +mutex, to install a cleanup handler whose effect is to unlock the +mutex. Cleanup handlers can be used similarly to free blocks +allocated with malloc(3) or close +file descriptors on thread termination. +

+

pthread_cleanup_push installs the routine function +with argument arg as a cleanup handler. From this point on to +the matching pthread_cleanup_pop, the function routine +will be called with arguments arg when the thread terminates, +either through pthread_exit(3) +or by cancellation. If several cleanup handlers are active at that +point, they are called in LIFO order: the most recently installed +handler is called first. +

+

pthread_cleanup_pop removes the most recently installed +cleanup handler. If the execute argument is not 0, it also +executes the handler, by calling the routine function with +arguments arg. If the execute argument is 0, the +handler is only removed but not executed. +

+

Matching pairs of pthread_cleanup_push and +pthread_cleanup_pop must occur in the same function, at the +same level of block nesting. Actually, pthread_cleanup_push +and pthread_cleanup_pop are macros, and the expansion of +pthread_cleanup_push introduces an open brace { with +the matching closing brace } being introduced by the expansion +of the matching pthread_cleanup_pop. +

+

Return Value

+
None. +
+

Errors

+
None. +
+

Author

+
Xavier Leroy +<Xavier.Leroy@inria.fr> +
+
Modified by +Ross Johnson for use with Pthreads-w32.
+

See Also

+
pthread_exit(3) +, pthread_cancel(3) , +pthread_setcanceltype(3) . +
+

Example

+
Here is how +to lock a mutex mut in such a way that it will be unlocked if +the thread is canceled while mut is locked: +
+
pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
+pthread_mutex_lock(&mut);
+/* do some work */
+pthread_mutex_unlock(&mut);
+pthread_cleanup_pop(0);
+Equivalently, the last two lines can be replaced by +
+
pthread_cleanup_pop(1);
+Notice that the code above is safe only in deferred cancellation mode +(see pthread_setcanceltype(3) +). In asynchronous cancellation mode, a cancellation can occur +between pthread_cleanup_push and pthread_mutex_lock, or +between pthread_mutex_unlock and pthread_cleanup_pop, +resulting in both cases in the thread trying to unlock a mutex not +locked by the current thread. This is the main reason why +asynchronous cancellation is difficult to use. +
+
If the code +above must also work in asynchronous cancellation mode, then it must +switch to deferred mode for locking and unlocking the mutex: +
+
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
+pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
+pthread_mutex_lock(&mut);
+/* do some work */
+pthread_cleanup_pop(1);
+pthread_setcanceltype(oldtype, NULL);
+
+
+Table of Contents
+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_cond_init.html b/win32/3rdparty/pthreads/manual/pthread_cond_init.html new file mode 100644 index 000000000..937e490a0 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_cond_init.html @@ -0,0 +1,313 @@ + + + + + PTHREAD_COND(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, +pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait - +operations on conditions +

+

Synopsis

+

#include <pthread.h> +

+

pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +

+

int pthread_cond_init(pthread_cond_t *cond, +pthread_condattr_t *cond_attr); +

+

int pthread_cond_signal(pthread_cond_t *cond); +

+

int pthread_cond_broadcast(pthread_cond_t *cond); +

+

int pthread_cond_wait(pthread_cond_t *cond, +pthread_mutex_t *mutex); +

+

int pthread_cond_timedwait(pthread_cond_t *cond, +pthread_mutex_t *mutex, const struct timespec +*abstime); +

+

int pthread_cond_destroy(pthread_cond_t *cond); +

+

Description

+

A condition (short for ‘‘condition variable’’) is a +synchronization device that allows threads to suspend execution and +relinquish the processors until some predicate on shared data is +satisfied. The basic operations on conditions are: signal the +condition (when the predicate becomes true), and wait for the +condition, suspending the thread execution until another thread +signals the condition. +

+

A condition variable must always be associated with a mutex, to +avoid the race condition where a thread prepares to wait on a +condition variable and another thread signals the condition just +before the first thread actually waits on it. +

+

pthread_cond_init initializes the condition variable cond, +using the condition attributes specified in cond_attr, or +default attributes if cond_attr is NULL. +

+

Variables of type pthread_cond_t can also be initialized +statically, using the constant PTHREAD_COND_INITIALIZER. In +the Pthreads-w32 implementation, an application should still +call pthread_cond_destroy at some point to ensure that any +resources consumed by the condition variable are released.

+

pthread_cond_signal restarts one of the threads that are +waiting on the condition variable cond. If no threads are +waiting on cond, nothing happens. If several threads are +waiting on cond, exactly one is restarted, but it is not +specified which. +

+

pthread_cond_broadcast restarts all the threads that are +waiting on the condition variable cond. Nothing happens if no +threads are waiting on cond. +

+

pthread_cond_wait atomically unlocks the mutex (as +per pthread_unlock_mutex) and waits for the condition variable +cond to be signalled. The thread execution is suspended and +does not consume any CPU time until the condition variable is +signalled. The mutex must be locked by the calling thread on +entrance to pthread_cond_wait. Before returning to the calling +thread, pthread_cond_wait re-acquires mutex (as per +pthread_lock_mutex). +

+

Unlocking the mutex and suspending on the condition variable is +done atomically. Thus, if all threads always acquire the mutex before +signalling the condition, this guarantees that the condition cannot +be signalled (and thus ignored) between the time a thread locks the +mutex and the time it waits on the condition variable. +

+

pthread_cond_timedwait atomically unlocks mutex and +waits on cond, as pthread_cond_wait does, but it also +bounds the duration of the wait. If cond has not been +signalled within the amount of time specified by abstime, the +mutex mutex is re-acquired and pthread_cond_timedwait +returns the error ETIMEDOUT. The abstime parameter +specifies an absolute time, with the same origin as time(2) +and gettimeofday(2). +

+

pthread_cond_destroy destroys a condition variable, freeing +the resources it might hold. No threads must be waiting on the +condition variable on entrance to pthread_cond_destroy.

+

Cancellation

+

pthread_cond_wait and pthread_cond_timedwait are +cancellation points. If a thread is cancelled while suspended in one +of these functions, the thread immediately resumes execution, then +locks again the mutex argument to pthread_cond_wait and +pthread_cond_timedwait, and finally executes the cancellation. +Consequently, cleanup handlers are assured that mutex is +locked when they are called. +

+

Async-signal Safety

+

The condition functions are not async-signal safe, and should not +be called from a signal handler. In particular, calling +pthread_cond_signal or pthread_cond_broadcast from a +signal handler may deadlock the calling thread. +

+

Return Value

+

All condition variable functions return 0 on success and a +non-zero error code on error. +

+

Errors

+

pthread_cond_init, pthread_cond_signal, +pthread_cond_broadcast, and pthread_cond_wait never +return an error code. +

+

The pthread_cond_init function returns the following error +codes on error: +

+
+
+
EINVAL +
+ The cond argument is invalid. +
+ ENOMEM +
+
+
+There was not enough memory to allocate the condition variable. +
+

The pthread_cond_signal function returns the following +error codes on error: +

+
+
+
EINVAL +
+ The cond argument is invalid. +
+
+

+The pthread_cond_broadcast function returns the following +error codes on error: +

+
+
+
EINVAL +
+ The cond argument is invalid. +
+
+

+The pthread_cond_wait function returns the following error +codes on error: +

+
+
+
EINVAL +
+ The cond argument is invalid. +
+ ENOMEM +
+
+
+There was not enough memory to allocate the statically initialised +condition variable. Statically initialised condition variables are +dynamically allocated by the first thread to wait on them.
+

The pthread_cond_timedwait function returns the following +error codes on error: +

+
+
+
EINVAL +
+
+

+The cond argument is invalid. +

+
+
+
ETIMEDOUT +
+ The condition variable was not signalled before the timeout + specified by abstime +
+ ENOMEM +
+
+
+There was not enough memory to allocate the statically initialised +condition variable. Statically initialised condition variables are +dynamically allocated by the first thread to wait on them. +
+

The pthread_cond_destroy function returns the following +error code on error: +

+
+
+
EINVAL +
+
+

+The cond argument is invalid. +

+
+
+
EBUSY +
+ Some threads are currently waiting on cond. +
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_condattr_init(3) +, pthread_mutex_lock(3) +, pthread_mutex_unlock(3) +, pthread_cancel(3). +

+

Example

+

Consider two shared variables x and y, protected by +the mutex mut, and a condition variable cond that is to +be signaled whenever x becomes greater than y. +

+
int x,y;
+pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+Waiting until x is greater than y is performed as +follows: +
+
pthread_mutex_lock(&mut);
+while (x <= y) {
+        pthread_cond_wait(&cond, &mut);
+}
+/* operate on x and y */
+pthread_mutex_unlock(&mut);
+Modifications on x and y that may cause x to +become greater than y should signal the condition if needed: +
+
pthread_mutex_lock(&mut);
+/* modify x and y */
+if (x > y) pthread_cond_broadcast(&cond);
+pthread_mutex_unlock(&mut);
+If it can be proved that at most one waiting thread needs to be waken +up (for instance, if there are only two threads communicating through +x and y), pthread_cond_signal can be used as a +slightly more efficient alternative to pthread_cond_broadcast. +If in doubt, use pthread_cond_broadcast. +
+
To wait for x to +become greater than y with a timeout of 5 seconds, do: +
+
struct timeval now;
+struct timespec timeout;
+int retcode;
+pthread_mutex_lock(&mut);
+gettimeofday(&now);
+timeout.tv_sec = now.tv_sec + 5;
+timeout.tv_nsec = now.tv_usec * 1000;
+retcode = 0;
+while (x <= y && retcode != ETIMEDOUT) {
+        retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
+}
+if (retcode == ETIMEDOUT) {
+        /* timeout occurred */
+} else {
+        /* operate on x and y */
+}
+pthread_mutex_unlock(&mut);
+
+
+Table of Contents
+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_condattr_init.html b/win32/3rdparty/pthreads/manual/pthread_condattr_init.html new file mode 100644 index 000000000..8b8b2f2aa --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_condattr_init.html @@ -0,0 +1,98 @@ + + + + + PTHREAD_CONDATTR(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_condattr_init, pthread_condattr_destroy - condition +creation +

+

attributes +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_condattr_init(pthread_condattr_t *attr); +

+

int pthread_condattr_destroy(pthread_condattr_t *attr); +

+

Description

+

Condition attributes can be specified at condition creation time, +by passing a condition attribute object as second argument to +pthread_cond_init(3) . +Passing NULL is equivalent to passing a condition attribute +object with all attributes set to their default values. +

+

pthread_condattr_init initializes the condition attribute +object attr and fills it with default values for the +attributes. pthread_condattr_destroy destroys a condition +attribute object, which must not be reused until it is reinitialized.

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that the attribute routines are +implemented but that the process shared attribute is not supported.

+

Return Value

+

All condition variable functions return 0 on success and a +non-zero error code on error.

+

Errors

+

The pthread_condattr_init function returns the following +error code on error: +

+
+
+
ENOMEM +
+ The was insufficient memory to create the attribute. + +
+
+

+The pthread_condattr_destroy function returns the following +error code on error: +

+
+
+
EINVAL +
+ The attr argument is not valid. + +
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_cond_init(3) . +

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_condattr_setpshared.html b/win32/3rdparty/pthreads/manual/pthread_condattr_setpshared.html new file mode 100644 index 000000000..eda357e07 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_condattr_setpshared.html @@ -0,0 +1,153 @@ + + + + + "PTHREAD_CONDATTR_GETPSHARED"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_condattr_getpshared, pthread_condattr_setpshared - get and +set the process-shared condition variable attributes +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_condattr_getpshared(const pthread_condattr_t +*restrict attr, int *restrict pshared); +
int pthread_condattr_setpshared(pthread_condattr_t *
attr, +int pshared); +

+

Description

+

The pthread_condattr_getpshared function shall obtain the +value of the process-shared attribute from the attributes +object referenced by attr. The pthread_condattr_setpshared +function shall set the process-shared attribute in an +initialized attributes object referenced by attr. +

+

The process-shared attribute is set to +PTHREAD_PROCESS_SHARED to permit a condition variable to be +operated upon by any thread that has access to the memory where the +condition variable is allocated, even if the condition variable is +allocated in memory that is shared by multiple processes. If the +process-shared attribute is PTHREAD_PROCESS_PRIVATE, +the condition variable shall only be operated upon by threads created +within the same process as the thread that initialized the condition +variable; if threads of differing processes attempt to operate on +such a condition variable, the behavior is undefined. The default +value of the attribute is PTHREAD_PROCESS_PRIVATE. +

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that these routines are implemented but +that the process shared attribute is not supported.

+

Return Value

+

If successful, the pthread_condattr_setpshared function +shall return zero; otherwise, an error number shall be returned to +indicate the error. +

+

If successful, the pthread_condattr_getpshared function +shall return zero and store the value of the process-shared +attribute of attr into the object referenced by the pshared +parameter. Otherwise, an error number shall be returned to indicate +the error. +

+

Errors

+

The pthread_condattr_getpshared and +pthread_condattr_setpshared functions may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+

+The pthread_condattr_setpshared function may fail if: +

+
+
EINVAL +
+ The new value specified for the attribute is outside the range of + legal values for that attribute. +
+ ENOSYS +
+ The value specified by attr was PTHREAD_PROCESS_SHARED + (Pthreads-w32).
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that these routines are implemented and +may be used, but do not support the process shared option.

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_create(3) , +pthread_cond_destroy(3) , +pthread_condattr_destroy(3) +, pthread_mutex_destroy(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_create.html b/win32/3rdparty/pthreads/manual/pthread_create.html new file mode 100644 index 000000000..d1ebbc3e1 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_create.html @@ -0,0 +1,94 @@ + + + + + PTHREAD_CREATE(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_create - create a new thread +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_create(pthread_t * thread, +pthread_attr_t * attr, void * (*start_routine)(void +*), void * arg); +

+

Description

+

pthread_create creates a new thread of control that +executes concurrently with the calling thread. The new thread applies +the function start_routine passing it arg as first +argument. The new thread terminates either explicitly, by calling +pthread_exit(3) , or +implicitly, by returning from the start_routine function. The +latter case is equivalent to calling pthread_exit(3) +with the result returned by start_routine as exit code. +

+

The initial signal state of the new thread is inherited from it's +creating thread and there are no pending signals. Pthreads-w32 +does not yet implement signals.

+

The attr argument specifies thread attributes to be applied +to the new thread. See pthread_attr_init(3) +for a complete list of thread attributes. The attr argument +can also be NULL, in which case default attributes are used: +the created thread is joinable (not detached) and has default (non +real-time) scheduling policy. +

+

Return Value

+

On success, the identifier of the newly created thread is stored +in the location pointed by the thread argument, and a 0 is +returned. On error, a non-zero error code is returned. +

+

Errors

+
+
EAGAIN +
+
+
+ Not enough system resources to create a process for the new + thread, or
more than PTHREAD_THREADS_MAX threads are + already active. +
+
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_exit(3) , +pthread_join(3) , +pthread_detach(3) , +pthread_attr_init(3) . +

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_delay_np.html b/win32/3rdparty/pthreads/manual/pthread_delay_np.html new file mode 100644 index 000000000..ce533e24e --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_delay_np.html @@ -0,0 +1,71 @@ + + + + + PTHREAD_DELAY_NP manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_delay_np – suspend the +thread for a specified period

+

Synopsis

+

#include <pthread.h> +

+

int pthread_delay_np (const struct timespec *interval);

+

Description

+

pthread_delay_np causes a thread to delay execution for a +specific period of time. This period ends at the current time plus +the specified interval. The routine will not return before the end of +the period is reached, but may return an arbitrary amount of time +after the period has gone by. This can be due to system load, thread +priorities, and system timer granularity.

+

Specifying an interval of zero (0) seconds and zero (0) +nanoseconds is allowed and can be used to force the thread to give up +the processor or to deliver a pending cancellation request.

+

Cancellation

+

pthread_delay_np is a cancellation point.

+

Return Value

+

If an error condition occurs, pthread_delay_np returns an +integer value indicating the type of error.

+

Errors

+

The pthread_delay_np function returns the following error +code on error: +

+
+
+
EINVAL +
+
+

+The value specified by interval is invalid.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_detach.html b/win32/3rdparty/pthreads/manual/pthread_detach.html new file mode 100644 index 000000000..252adb813 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_detach.html @@ -0,0 +1,90 @@ + + + + + PTHREAD_DETACH(3) manual page + + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_detach - put a running thread in the detached state +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_detach(pthread_t th); +

+

Description

+

pthread_detach puts the thread th in the detached +state. This guarantees that the resources consumed by th will +be freed immediately when th terminates. However, this +prevents other threads from synchronizing on the termination of th +using pthread_join. If, when pthread_detach is called, +th has already terminated, all of th's remaining +resources will be freed.

+

A thread can be created initially in the detached state, using the +detachstate attribute to pthread_create(3) +. In contrast, pthread_detach applies to threads created in +the joinable state, and which need to be put in the detached state +later. +

+

After pthread_detach completes, subsequent attempts to +perform pthread_join on th will fail. If another thread +is already joining the thread th at the time pthread_detach +is called, th will be detached and pthread_join will +eventually return when th terminates but may not return with +th's correct return code. +

+

Return Value

+

On success, 0 is returned. On error, a non-zero error code is +returned. +

+

Errors

+
+
ESRCH +
+ No thread could be found corresponding to that specified by th +
+ EINVAL +
+ the thread th is already in the detached state +
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_create(3) , +pthread_join(3) , +pthread_attr_setdetachstate(3) +

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/pthread_equal.html b/win32/3rdparty/pthreads/manual/pthread_equal.html new file mode 100644 index 000000000..6f610634e --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_equal.html @@ -0,0 +1,48 @@ + + + + + +PTHREAD_EQUAL(3) manual page + + +Table of Contents

+ +

+

Name

+pthread_equal - compare two thread identifiers +

+

Synopsis

+#include <pthread.h> + +

int pthread_equal(pthread_t thread1, pthread_t thread2); +

+

Description

+pthread_equal +determines if two thread identifiers refer to the same thread. +

+

Return Value

+A +non-zero value is returned if thread1 and thread2 refer to the same thread. +Otherwise, 0 is returned. +

+

Author

+Xavier Leroy <Xavier.Leroy@inria.fr> +

+

See Also

+pthread_self(3) +. +

+ +


+Table of Contents

+

+ + diff --git a/win32/3rdparty/pthreads/manual/pthread_exit.html b/win32/3rdparty/pthreads/manual/pthread_exit.html new file mode 100644 index 000000000..e97318f54 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_exit.html @@ -0,0 +1,59 @@ + + + + + +PTHREAD_EXIT(3) manual page + + +Table of Contents

+ +

+

Name

+pthread_exit - terminate the calling thread +

+

Synopsis

+#include <pthread.h> + +

void pthread_exit(void *retval); +

+

Description

+pthread_exit terminates the +execution of the calling thread. All cleanup handlers that have been set +for the calling thread with pthread_cleanup_push(3) + are executed in reverse +order (the most recently pushed handler is executed first). Finalization +functions for thread-specific data are then called for all keys that have +non- NULL values associated with them in the calling thread (see pthread_key_create(3) +). +Finally, execution of the calling thread is stopped. +

The retval argument +is the return value of the thread. It can be consulted from another thread +using pthread_join(3) +. +

+

Return Value

+The pthread_exit function never returns. + +

+

Author

+Xavier Leroy <Xavier.Leroy@inria.fr> +

+

See Also

+pthread_create(3) +, pthread_join(3) +. +

+ +


+Table of Contents

+

+ + diff --git a/win32/3rdparty/pthreads/manual/pthread_getw32threadhandle_np.html b/win32/3rdparty/pthreads/manual/pthread_getw32threadhandle_np.html new file mode 100644 index 000000000..7e8de6438 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_getw32threadhandle_np.html @@ -0,0 +1,57 @@ + + + + + PTHREAD_GETW32THREADHANDLE_NP manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_getw32threadhandle_np – get +the Win32 thread handle associated with a thread

+

Synopsis

+

#include <pthread.h> +

+

HANDLE pthread_getw32threadhandle_np(pthread_t thread);

+

Description

+

Returns the Win32 native thread HANDLE that the POSIX +thread thread is running as.

+

Applications can use the Win32 handle to set Win32 specific +attributes of the thread.

+

Cancellation

+

None.

+

Return Value

+

pthread_getw32threadhandle_np returns the Win32 native +thread HANDLE for the specified POSIX thread thread.

+

Errors

+

None.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_join.html b/win32/3rdparty/pthreads/manual/pthread_join.html new file mode 100644 index 000000000..3e3f3b902 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_join.html @@ -0,0 +1,118 @@ + + + + + PTHREAD_JOIN(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_join - wait for termination of another thread +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_join(pthread_t th, void +**thread_return); +

+

Description

+

pthread_join suspends the execution of the calling thread +until the thread identified by th terminates, either by +calling pthread_exit(3) or by +being cancelled. +

+

If thread_return is not NULL, the return value of th +is stored in the location pointed to by thread_return. The +return value of th is either the argument it gave to +pthread_exit(3) , or +PTHREAD_CANCELED if th was cancelled. +

+

The joined thread th must be in the joinable state: it must +not have been detached using pthread_detach(3) +or the PTHREAD_CREATE_DETACHED attribute to pthread_create(3) +. +

+

When a joinable thread terminates, its memory resources (thread +descriptor and stack) are not deallocated until another thread +performs pthread_join on it. Therefore, pthread_join +must be called once for each joinable thread created to avoid memory +leaks. +

+

At most one thread can wait for the termination of a given thread. +Calling pthread_join on a thread th on which another +thread is already waiting for termination returns an error. +

+

Cancellation

+

pthread_join is a cancellation point. If a thread is +cancelled while suspended in pthread_join, the thread +execution resumes immediately and the cancellation is executed +without waiting for the th thread to terminate. If +cancellation occurs during pthread_join, the th thread +remains not joined. +

+

Return Value

+

On success, the return value of th is stored in the +location pointed to by thread_return, and 0 is returned. On +error, a non-zero error code is returned. +

+

Errors

+
+
ESRCH +
+ No thread could be found corresponding to that specified by th. +
+ EINVAL +
+ The th thread has been detached. +
+ EINVAL +
+ Another thread is already waiting on termination of th. +
+ EDEADLK +
+ The th argument refers to the calling thread. +
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

See Also

+

pthread_exit(3) , +pthread_detach(3) , +pthread_create(3) , +pthread_attr_setdetachstate(3) +, pthread_cleanup_push(3) +, pthread_key_create(3) +. +

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_key_create.html b/win32/3rdparty/pthreads/manual/pthread_key_create.html new file mode 100644 index 000000000..5ecca6995 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_key_create.html @@ -0,0 +1,211 @@ + + + + + PTHREAD_SPECIFIC(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_key_create, pthread_key_delete, pthread_setspecific, +pthread_getspecific - management of thread-specific data +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_key_create(pthread_key_t *key, void +(*destr_function) (void *)); +

+

int pthread_key_delete(pthread_key_t key); +

+

int pthread_setspecific(pthread_key_t key, const +void *pointer); +

+

void * pthread_getspecific(pthread_key_t key); +

+

Description

+

Programs often need global or static variables that have different +values in different threads. Since threads share one memory space, +this cannot be achieved with regular variables. Thread-specific data +is the POSIX threads answer to this need. +

+

Each thread possesses a private memory block, the thread-specific +data area, or TSD area for short. This area is indexed by TSD keys. +The TSD area associates values of type void * to TSD keys. TSD +keys are common to all threads, but the value associated with a given +TSD key can be different in each thread. +

+

For concreteness, the TSD areas can be viewed as arrays of void +* pointers, TSD keys as integer indices into these arrays, and +the value of a TSD key as the value of the corresponding array +element in the calling thread. +

+

When a thread is created, its TSD area initially associates NULL +with all keys. +

+

pthread_key_create allocates a new TSD key. The key is +stored in the location pointed to by key. There is a limit of +PTHREAD_KEYS_MAX on the number of keys allocated at a given +time. The value initially associated with the returned key is NULL +in all currently executing threads. +

+

The destr_function argument, if not NULL, specifies +a destructor function associated with the key. When a thread +terminates via pthread_exit or by cancellation, destr_function +is called with arguments the value associated with the key in that +thread. The destr_function is not called if that value is NULL +or the key has been deleted. The order in which destructor +functions are called at thread termination time is unspecified. +

+

Before the destructor function is called, the NULL value is +associated with the key in the current thread. A destructor function +might, however, re-associate non- NULL values to that key or +some other key. To deal with this, if after all the destructors have +been called for all non- NULL values, there are still some +non- NULL values with associated destructors, then the process +is repeated.

+

pthread_key_delete deallocates a TSD key. It does not check +whether non- NULL values are associated with that key in the +currently executing threads, nor call the destructor function +associated with the key. +

+

pthread_setspecific changes the value associated with key +in the calling thread, storing the given pointer instead. +

+

pthread_getspecific returns the value currently associated +with key in the calling thread. +

+

The routines pthread_setspecific, pthread_getspecific, +and pthread_key_delete can be called from destr_function +targeting any valid key including the key on which destr_function +is currently operating. If pthread_getspecific is called on +the key whose thread specific data is being destroyed, the value NULL +is returned, unless pthread_setspecific was called previously +on that key from within destr_function to set the value to +non-NULL. For some implementations the effect of calling +pthread_setspecific from within destr_function can be +either memory leakage or infinite loops if destr_function has +already been called at least PTHREAD_DESTRUCTOR_ITERATIONS +times.

+

Pthreads-w32 stops running key +destr_function routines after PTHREAD_DESTRUCTOR_ITERATIONS +iterations, even if some non- NULL values with associated +descriptors remain. If memory is allocated and associated with a key +from within destr_function, that memory may not be reclaimed +because that key's destr_function, may not run again.

+

Return Value

+

pthread_key_create, pthread_key_delete, and +pthread_setspecific return 0 on success and a non-zero error +code on failure. If successful, pthread_key_create stores the +newly allocated key in the location pointed to by its key +argument. +

+

pthread_getspecific returns the value associated with key +on success, and NULL on error. +

+

Errors

+

pthread_key_create returns the following error code on +error: +

+
+
+
EAGAIN +
+
+
+PTHREAD_KEYS_MAX keys are already allocated +
+
+
+
ENOMEM +
+
+
+Insufficient memory to allocate the key. +
+

pthread_key_delete and pthread_setspecific return +the following error code on error: +

+
+
+
EINVAL +
+ key is not a valid, allocated TSD key +
+
+

+pthread_getspecific returns NULL if key is not a +valid, allocated TSD key. +

+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_create(3) , +pthread_exit(3) , +pthread_testcancel(3) . +

+

Example

+

The following code fragment allocates a thread-specific array of +100 characters, with automatic reclamation at thread exit: +

+


+
+
/* Key for the thread-specific buffer */
+static pthread_key_t buffer_key;
+/* Once-only initialisation of the key */
+static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
+/* Allocate the thread-specific buffer */
+void buffer_alloc(void)
+{
+  pthread_once(&buffer_key_once, buffer_key_alloc);
+  pthread_setspecific(buffer_key, malloc(100));
+}
+/* Return the thread-specific buffer */
+char * get_buffer(void)
+{
+  return (char *) pthread_getspecific(buffer_key);
+}
+/* Allocate the key */
+static void buffer_key_alloc()
+{
+  pthread_key_create(&buffer_key, buffer_destroy);
+}
+/* Free the thread-specific buffer */
+static void buffer_destroy(void * buf)
+{
+  free(buf);
+}
+
+
+Table of Contents
+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/pthread_kill.html b/win32/3rdparty/pthreads/manual/pthread_kill.html new file mode 100644 index 000000000..33d61b21c --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_kill.html @@ -0,0 +1,152 @@ + + + + + PTHREAD_SIGNAL(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_sigmask, pthread_kill, sigwait - handling of signals in +threads +

+

Synopsis

+

#include <pthread.h>
#include <signal.h> +

+

int pthread_sigmask(int how, const sigset_t +*newmask, sigset_t *oldmask); +

+

int pthread_kill(pthread_t thread, int signo); +

+

int sigwait(const sigset_t *set, int *sig);

+

Description

+

pthread_sigmask changes the signal mask for the calling +thread as described by the how and newmask arguments. +If oldmask is not NULL, the previous signal mask is +stored in the location pointed to by oldmask. Pthreads-w32 +implements this function but no other function uses the signal mask +yet.

+

The meaning of the how and newmask arguments is the +same as for sigprocmask(2). +If how is SIG_SETMASK, the signal mask is set to +newmask. If how is SIG_BLOCK, the signals +specified to newmask are added to the current signal mask. If +how is SIG_UNBLOCK, the signals specified to newmask +are removed from the current signal mask. +

+

Recall that signal masks are set on a per-thread basis, but signal +actions and signal handlers, as set with sigaction(2), are +shared between all threads. +

+

pthread_kill send signal number signo to the thread +thread. Pthreads-w32 only supports signal number 0, +which does not send any signal but causes pthread_kill to +return an error if thread is not valid.

+

sigwait suspends the calling thread until one of the +signals in set is delivered to the calling thread. It then +stores the number of the signal received in the location pointed to +by sig and returns. The signals in set must be blocked +and not ignored on entrance to sigwait. If the delivered +signal has a signal handler function attached, that function is not +called. Pthreads-w32 implements this function as a +cancellation point only - it does not wait for any signals and does +not change the location pointed to by sig.

+

Cancellation

+

sigwait is a cancellation point. +

+

Return Value

+

On success, 0 is returned. On failure, a non-zero error code is +returned. +

+

Errors

+

The pthread_sigmask function returns the following error +codes on error: +

+
+
+
EINVAL +
+ how is not one of SIG_SETMASK, SIG_BLOCK, or + SIG_UNBLOCK +
+
+

+The pthread_kill function returns the following error codes on +error: +

+
+
+
EINVAL +
+ signo is not a valid signal number or is unsupported.
+ ESRCH +
+ the thread thread does not exist (e.g. it has already + terminated) +
+
+

+The sigwait function never returns an error. +

+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

+

+

Notes

+

In any implementation, for sigwait to work reliably, the +signals being waited for must be blocked in all threads, not only in +the calling thread, since otherwise the POSIX semantics for signal +delivery do not guarantee that it’s the thread doing the sigwait +that will receive the signal. The best way to achieve this is to +block those signals before any threads are created, and never unblock +them in the program other than by calling sigwait. This works +because all threads inherit their initial sigmask from their creating +thread.

+

Bugs

+

Pthreads-w32 does not implement signals yet and so these +routines have almost no use except to prevent the compiler or linker +from complaining. pthread_kill is useful in determining if the +thread is a valid thread, but since many threads implementations +reuse thread IDs, the valid thread may no longer be the thread you +think it is, and so this method of determining thread validity is not +portable, and very risky. Pthreads-w32 from version 1.0.0 +onwards implements pseudo-unique thread IDs, so applications that use +this technique (but really shouldn't) have some protection.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_mutex_init.html b/win32/3rdparty/pthreads/manual/pthread_mutex_init.html new file mode 100644 index 000000000..f9982cf61 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_mutex_init.html @@ -0,0 +1,277 @@ + + + + + PTHREAD_MUTEX(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, +pthread_mutex_timedlock, pthread_mutex_unlock, pthread_mutex_destroy +- operations on mutexes +

+

Synopsis

+

#include <pthread.h> +

+

#include <time.h>

+

pthread_mutex_t fastmutex = +PTHREAD_MUTEX_INITIALIZER; +

+

pthread_mutex_t recmutex = +PTHREAD_RECURSIVE_MUTEX_INITIALIZER; +

+

pthread_mutex_t errchkmutex = +PTHREAD_ERRORCHECK_MUTEX_INITIALIZER; +

+

pthread_mutex_t recmutex = +PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +

+

pthread_mutex_t errchkmutex = +PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; +

+

int pthread_mutex_init(pthread_mutex_t *mutex, +const pthread_mutexattr_t *mutexattr); +

+

int pthread_mutex_lock(pthread_mutex_t *mutex); +

+

int pthread_mutex_trylock(pthread_mutex_t *mutex); +

+

int pthread_mutex_timedlock(pthread_mutex_t *mutex, +const struct timespec *abs_timeout); +

+

int pthread_mutex_unlock(pthread_mutex_t *mutex); +

+

int pthread_mutex_destroy(pthread_mutex_t *mutex); +

+

Description

+

A mutex is a MUTual EXclusion device, and is useful for protecting +shared data structures from concurrent modifications, and +implementing critical sections and monitors. +

+

A mutex has two possible states: unlocked (not owned by any +thread), and locked (owned by one thread). A mutex can never be owned +by two different threads simultaneously. A thread attempting to lock +a mutex that is already locked by another thread is suspended until +the owning thread unlocks the mutex first. +

+

pthread_mutex_init initializes the mutex object pointed to +by mutex according to the mutex attributes specified in +mutexattr. If mutexattr is NULL, default +attributes are used instead. +

+

The type of a mutex determines whether it can be locked again by a +thread that already owns it. The default type is “normal”. See +pthread_mutexattr_init(3) +for more information on mutex attributes. +

+

Variables of type pthread_mutex_t can also be initialized +statically, using the constants PTHREAD_MUTEX_INITIALIZER (for +normal “fast” mutexes), PTHREAD_RECURSIVE_MUTEX_INITIALIZER +(for recursive mutexes), and PTHREAD_ERRORCHECK_MUTEX_INITIALIZER +(for error checking mutexes). In +the Pthreads-w32 implementation, an application should still +call pthread_mutex_destroy at some point to ensure that any +resources consumed by the mutex are released.

+

pthread_mutex_lock locks the given mutex. If the mutex is +currently unlocked, it becomes locked and owned by the calling +thread, and pthread_mutex_lock returns immediately. If the +mutex is already locked by another thread, pthread_mutex_lock +suspends the calling thread until the mutex is unlocked. +

+

If the mutex is already locked by the calling thread, the behavior +of pthread_mutex_lock depends on the type of the mutex. If the +mutex is of the “normal” type, the calling thread is suspended +until the mutex is unlocked, thus effectively causing the calling +thread to deadlock. If the mutex is of the ‘‘error checking’’ +type, pthread_mutex_lock returns immediately with the error +code EDEADLK. If the mutex is of the ‘‘recursive’’ +type, pthread_mutex_lock succeeds and returns immediately, +recording the number of times the calling thread has locked the +mutex. An equal number of pthread_mutex_unlock operations must +be performed before the mutex returns to the unlocked state. +

+

pthread_mutex_trylock behaves identically to +pthread_mutex_lock, except that it does not block the calling +thread if the mutex is already locked by another thread (or by the +calling thread in the case of a “normal” mutex). Instead, +pthread_mutex_trylock returns immediately with the error code +EBUSY. +

+

pthread_mutex_timedlock behaves identically to +pthread_mutex_lock, except that if it cannot acquire the lock +before the abs_timeout time, the call returns with the error +code ETIMEDOUT. If the mutex can be locked immediately it is, +and the abs_timeout parameter is ignored.

+

pthread_mutex_unlock unlocks the given mutex. The mutex is +assumed to be locked and owned by the calling thread on entrance to +pthread_mutex_unlock. If the mutex is of the “normal” +type, pthread_mutex_unlock always returns it to the unlocked +state. If it is of the ‘‘recursive’’ type, it decrements the +locking count of the mutex (number of pthread_mutex_lock +operations performed on it by the calling thread), and only when this +count reaches zero is the mutex actually unlocked. +

+

On ‘‘error checking’’ mutexes, pthread_mutex_unlock +actually checks at run-time that the mutex is locked on entrance, and +that it was locked by the same thread that is now calling +pthread_mutex_unlock. If these conditions are not met, an +error code is returned and the mutex remains unchanged. ‘‘Normal’’ +mutexes perform no such checks, thus allowing a locked mutex to be +unlocked by a thread other than its owner. This is non-portable +behavior and is not meant to be used as a feature.

+

pthread_mutex_destroy destroys a mutex object, freeing the +resources it might hold. The mutex must be unlocked on entrance.

+

Cancellation

+

None of the mutex functions is a cancellation point, not even +pthread_mutex_lock, in spite of the fact that it can suspend a +thread for arbitrary durations. This way, the status of mutexes at +cancellation points is predictable, allowing cancellation handlers to +unlock precisely those mutexes that need to be unlocked before the +thread stops executing. Consequently, threads using deferred +cancellation should never hold a mutex for extended periods of time. +

+

Async-signal Safety

+

The mutex functions are not async-signal safe. What this means is +that they should not be called from a signal handler. In particular, +calling pthread_mutex_lock or pthread_mutex_unlock from +a signal handler may deadlock the calling thread. +

+

Return Value

+

pthread_mutex_init always returns 0. The other mutex +functions return 0 on success and a non-zero error code on error. +

+

Errors

+

The pthread_mutex_lock function returns the following error +code on error: +

+
+
+
EINVAL +
+ the mutex has not been properly initialized. +
+ EDEADLK +
+ the mutex is already locked by the calling thread (‘‘error + checking’’ mutexes only). +
+
+

+The pthread_mutex_trylock function returns the following error +codes on error: +

+
+
+
EBUSY +
+ the mutex could not be acquired because it was currently locked. +
+ EINVAL +
+ the mutex has not been properly initialized. +
+
+

+The pthread_mutex_timedlock function returns the following +error codes on error: +

+
+
+
ETIMEDOUT +
+ the mutex could not be acquired before the abs_timeout time + arrived. +
+ EINVAL +
+ the mutex has not been properly initialized. +
+
+

+The pthread_mutex_unlock function returns the following error +code on error: +

+
+
+
EINVAL +
+ the mutex has not been properly initialized. +
+ EPERM +
+ the calling thread does not own the mutex (‘‘error checking’’ + mutexes only). +
+
+

+The pthread_mutex_destroy function returns the following error +code on error: +

+
+
+
EBUSY +
+ the mutex is currently locked. +
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_mutexattr_init(3) +, pthread_mutexattr_settype(3) +, pthread_cancel(3) . +

+

Example

+

A shared global variable x can be protected by a mutex as +follows: +

+
int x;
+pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+All accesses and modifications to x should be bracketed by +calls to pthread_mutex_lock and pthread_mutex_unlock as +follows: +
+
pthread_mutex_lock(&mut);
+/* operate on x */
+pthread_mutex_unlock(&mut);
+
+
Table of +Contents
+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_mutexattr_init.html b/win32/3rdparty/pthreads/manual/pthread_mutexattr_init.html new file mode 100644 index 000000000..f3df9936d --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_mutexattr_init.html @@ -0,0 +1,157 @@ + + + + + PTHREAD_MUTEXATTR(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_mutexattr_init, pthread_mutexattr_destroy, +pthread_mutexattr_settype, pthread_mutexattr_gettype - mutex creation +attributes +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_mutexattr_init(pthread_mutexattr_t *attr); +

+

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); +

+

int pthread_mutexattr_settype(pthread_mutexattr_t *attr, +int type); +

+

int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, +int *type); +

+

int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, +int type); +

+

int pthread_mutexattr_getkind_np(const pthread_mutexattr_t +*attr, int *type); +

+

Description

+

Mutex attributes can be specified at mutex creation time, by +passing a mutex attribute object as second argument to +pthread_mutex_init(3) . +Passing NULL is equivalent to passing a mutex attribute object +with all attributes set to their default values. +

+

pthread_mutexattr_init initializes the mutex attribute +object attr and fills it with default values for the +attributes. +

+

pthread_mutexattr_destroy destroys a mutex attribute +object, which must not be reused until it is reinitialized.

+

The following mutex types are supported:

+

PTHREAD_MUTEX_NORMAL - for +‘‘fast’’ mutexes.

+

PTHREAD_MUTEX_RECURSIVE - for +‘‘recursive’’ mutexes.

+

PTHREAD_MUTEX_ERRORCHECK - for +‘‘error checking’’ mutexes.

+

The mutex type determines what happens if a thread attempts to +lock a mutex it already owns with pthread_mutex_lock(3) +. If the mutex is of the “normal” or “fast” type, +pthread_mutex_lock(3) +simply suspends the calling thread forever. If the mutex is of the +‘‘error checking’’ type, pthread_mutex_lock(3) +returns immediately with the error code EDEADLK. If the mutex +is of the ‘‘recursive’’ type, the call to +pthread_mutex_lock(3) +returns immediately with a success return code. The number of times +the thread owning the mutex has locked it is recorded in the mutex. +The owning thread must call pthread_mutex_unlock(3) +the same number of times before the mutex returns to the unlocked +state. +

+

The default mutex type is PTHREAD_MUTEX_NORMAL

+

Pthreads-w32 also recognises the following equivalent types +that are used by Linux:

+

PTHREAD_MUTEX_FAST_NP +– equivalent to PTHREAD_MUTEX_NORMAL

+

PTHREAD_MUTEX_RECURSIVE_NP

+

PTHREAD_MUTEX_ERRORCHECK_NP

+

pthread_mutexattr_settype sets the mutex type attribute in +attr to the value specified by type. +

+

pthread_mutexattr_gettype retrieves the current value of +the mutex kind attribute in attr and stores it in the location +pointed to by type. +

+

Pthreads-w32 also recognises the following equivalent +functions that are used in Linux:

+

pthread_mutexattr_setkind_np is an alias for +pthread_mutexattr_settype. +

+

pthread_mutexattr_getkind_np is +an alias for pthread_mutexattr_gettype. +

+

Return Value

+

pthread_mutexattr_init, pthread_mutexattr_destroy +and pthread_mutexattr_gettype always return 0. +

+

pthread_mutexattr_settype returns 0 on success and a +non-zero error code on error. +

+

Errors

+

On error, pthread_mutexattr_settype returns the following +error code: +

+
+
EINVAL +
+ type is none of:
PTHREAD_MUTEX_NORMAL, + PTHREAD_MUTEX_FAST_NP,
PTHREAD_MUTEX_RECURSIVE, + PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK
, + PTHREAD_MUTEX_ERRORCHECK_NP +
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_mutex_init(3) +, pthread_mutex_lock(3) +, pthread_mutex_unlock(3) +. +

+

Notes

+

For speed, Pthreads-w32 never checks the thread ownership +of mutexes of type PTHREAD_MUTEX_NORMAL (or +PTHREAD_MUTEX_FAST_NP) when performing operations on the +mutex. It is therefore possible for one thread to lock such a mutex +and another to unlock it.

+

When developing code, it is a +common precaution to substitute the error checking type, and drop in +the normal type for release if the extra performance is required.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_mutexattr_setpshared.html b/win32/3rdparty/pthreads/manual/pthread_mutexattr_setpshared.html new file mode 100644 index 000000000..25bf9f60b --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_mutexattr_setpshared.html @@ -0,0 +1,151 @@ + + + + + "PTHREAD_MUTEXATTR_GETPSHARED"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_mutexattr_getpshared, pthread_mutexattr_setpshared - get +and set the process-shared attribute +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_mutexattr_getpshared(const pthread_mutexattr_t * +restrict attr, int *restrict pshared); +
int pthread_mutexattr_setpshared(pthread_mutexattr_t *
attr, +int pshared); +

+

Description

+

The pthread_mutexattr_getpshared function shall obtain the +value of the process-shared attribute from the attributes +object referenced by attr. The pthread_mutexattr_setpshared +function shall set the process-shared attribute in an +initialized attributes object referenced by attr. +

+

The process-shared attribute is set to +PTHREAD_PROCESS_SHARED to permit a mutex to be operated upon +by any thread that has access to the memory where the mutex is +allocated, even if the mutex is allocated in memory that is shared by +multiple processes. If the process-shared attribute is +PTHREAD_PROCESS_PRIVATE, the mutex shall only be operated upon +by threads created within the same process as the thread that +initialized the mutex; if threads of differing processes attempt to +operate on such a mutex, the behavior is undefined. The default value +of the attribute shall be PTHREAD_PROCESS_PRIVATE. +

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that these routines are implemented but +the process shared option is not supported.

+

Return Value

+

Upon successful completion, pthread_mutexattr_setpshared +shall return zero; otherwise, an error number shall be returned to +indicate the error. +

+

Upon successful completion, pthread_mutexattr_getpshared +shall return zero and store the value of the process-shared +attribute of attr into the object referenced by the pshared +parameter. Otherwise, an error number shall be returned to indicate +the error. +

+

Errors

+

The pthread_mutexattr_getpshared and +pthread_mutexattr_setpshared functions may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+

+The pthread_mutexattr_setpshared function may fail if: +

+
+
EINVAL +
+ The new value specified for the attribute is outside the range of + legal values for that attribute. +
+ ENOTSUP +
+ The new value specified for the attribute is PTHREAD_PROCESS_SHARED. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_cond_destroy(3) +, pthread_create(3) , +pthread_mutex_destroy(3) +, pthread_mutexattr_destroy(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_num_processors_np.html b/win32/3rdparty/pthreads/manual/pthread_num_processors_np.html new file mode 100644 index 000000000..050941065 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_num_processors_np.html @@ -0,0 +1,57 @@ + + + + + PTHREAD_NUM_PROCESSORS_NP manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_num_processors_np – get the +number of processors (CPUs) in use by the process

+

Synopsis

+

#include <pthread.h> +

+

int pthread_num_processors_np(void);

+

Description

+

pthread_num_processors_np returns the number of processors +in the system. This implementation actually returns the number of +processors available to the process, which can be a lower number than +the system's number, depending on the process's affinity mask.

+

Cancellation

+

None.

+

Return Value

+

pthread_num_processors_np returns the number of processors +currently available to the process.

+

Errors

+

None.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_once.html b/win32/3rdparty/pthreads/manual/pthread_once.html new file mode 100644 index 000000000..856fb8653 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_once.html @@ -0,0 +1,83 @@ + + + + + PTHREAD_ONCE(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_once - once-only initialization +

+

Synopsis

+

#include <pthread.h> +

+

pthread_once_t once_control = PTHREAD_ONCE_INIT; +

+

int pthread_once(pthread_once_t *once_control, +void (*init_routine) (void)); +

+

Description

+

The purpose of pthread_once is to ensure that a piece of +initialization code is executed at most once. The once_control +argument points to a static or extern variable statically initialized +to PTHREAD_ONCE_INIT. +

+

The first time pthread_once is called with a given +once_control argument, it calls init_routine with no +argument and changes the value of the once_control variable to +record that initialization has been performed. Subsequent calls to +pthread_once with the same once_control argument do +nothing. +

+

Cancellation

+

While pthread_once is not a cancellation point, +init_routine can be. The effect on once_control of a +cancellation inside the init_routine is to leave it as if +pthread_once had not been called by the cancelled thread.

+

Return Value

+

pthread_once +returns 0 on success, or an error code on failure.

+

Errors

+

The pthread_once function returns the following error code +on error: +

+
+
+
EINVAL +
+
+

+The once_control or init_routine parameter is NULL.

+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlock_init.html b/win32/3rdparty/pthreads/manual/pthread_rwlock_init.html new file mode 100644 index 000000000..530df93d4 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlock_init.html @@ -0,0 +1,193 @@ + + + + + "PTHREAD_RWLOCK_DESTROY"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlock_destroy, pthread_rwlock_init - destroy and +initialize a read-write lock object +

+

Synopsis

+

#include <pthread.h> +

+

pthread_wrlock_t rwlock = +PTHREAD_RWLOCK_INITIALIZER;

+

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); +
int pthread_rwlock_init(pthread_rwlock_t *restrict
rwlock, +const pthread_rwlockattr_t *restrict attr); +

+

Description

+

The pthread_rwlock_destroy function shall destroy the +read-write lock object referenced by rwlock and release any +resources used by the lock. The effect of subsequent use of the lock +is undefined until the lock is reinitialized by another call to +pthread_rwlock_init. An implementation may cause +pthread_rwlock_destroy to set the object referenced by rwlock +to an invalid value. Results are undefined if pthread_rwlock_destroy +is called when any thread holds rwlock. Attempting to destroy +an uninitialized read-write lock results in undefined behavior. +

+

The pthread_rwlock_init function shall allocate any +resources required to use the read-write lock referenced by rwlock +and initializes the lock to an unlocked state with attributes +referenced by attr. If attr is NULL, the default +read-write lock attributes shall be used; the effect is the same as +passing the address of a default read-write lock attributes object. +Once initialized, the lock can be used any number of times without +being reinitialized. Results are undefined if pthread_rwlock_init +is called specifying an already initialized read-write lock. Results +are undefined if a read-write lock is used without first being +initialized. +

+

If the pthread_rwlock_init function fails, rwlock +shall not be initialized and the contents of rwlock are +undefined. +

+

Pthreads-w32 supports statically initialized rwlock +objects using PTHREAD_RWLOCK_INITIALIZER. +An application should still call pthread_rwlock_destroy at +some point to ensure that any resources consumed by the read/write +lock are released.

+

Only the object referenced by rwlock may be used for +performing synchronization. The result of referring to copies of that +object in calls to pthread_rwlock_destroy , +pthread_rwlock_rdlock , pthread_rwlock_timedrdlock , +pthread_rwlock_timedwrlock , pthread_rwlock_tryrdlock , +pthread_rwlock_trywrlock , pthread_rwlock_unlock , or +pthread_rwlock_wrlock is undefined. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

If successful, the pthread_rwlock_destroy and +pthread_rwlock_init functions shall return zero; otherwise, an +error number shall be returned to indicate the error. +

+

The [EBUSY] and [EINVAL] error checks, if implemented, act as if +they were performed immediately at the beginning of processing for +the function and caused an error return prior to modifying the state +of the read-write lock specified by rwlock. +

+

Errors

+

The pthread_rwlock_destroy function may fail if: +

+
+
EBUSY +
+ The implementation has detected an attempt to destroy the object + referenced by rwlock while it is locked. +
+ EINVAL +
+ The value specified by rwlock is invalid. +
+

+The pthread_rwlock_init function shall fail if: +

+
+
EAGAIN +
+ The system lacked the necessary resources (other than memory) to + initialize another read-write lock. +
+ ENOMEM +
+ Insufficient memory exists to initialize the read-write lock. +
+

+
+

+The pthread_rwlock_init function may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using these and related read-write lock functions may +be subject to priority inversion, as discussed in the Base +Definitions volume of IEEE Std 1003.1-2001, Section 3.285, +Priority Inversion. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_rdlock(3) +, pthread_rwlock_timedrdlock(3) +, pthread_rwlock_timedwrlock(3) +, pthread_rwlock_tryrdlock(3) +, pthread_rwlock_trywrlock(3) +, pthread_rwlock_unlock(3) +, pthread_rwlock_wrlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlock_rdlock.html b/win32/3rdparty/pthreads/manual/pthread_rwlock_rdlock.html new file mode 100644 index 000000000..3b63f255c --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlock_rdlock.html @@ -0,0 +1,168 @@ + + + + + "PTHREAD_RWLOCK_RDLOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlock_rdlock, pthread_rwlock_tryrdlock - lock a +read-write lock object for reading +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); +
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); + +

+

Description

+

The pthread_rwlock_rdlock function shall apply a read lock +to the read-write lock referenced by rwlock. The calling +thread acquires the read lock if a writer does not hold the lock and +there are no writers blocked on the lock. +

+

Pthreads-win32 does not prefer either writers or readers in +acquiring the lock – all threads enter a single prioritised FIFO +queue. While this may not be optimally efficient for some +applications, it does ensure that one type does not starve the other.

+

A thread may hold multiple concurrent read locks on rwlock +(that is, successfully call the pthread_rwlock_rdlock function +n times). If so, the application shall ensure that the thread +performs matching unlocks (that is, it calls the +pthread_rwlock_unlock(3) +function n times). +

+

The pthread_rwlock_tryrdlock function shall apply a read +lock as in the pthread_rwlock_rdlock function, with the +exception that the function shall fail if the equivalent +pthread_rwlock_rdlock call would have blocked the calling +thread. In no case shall the pthread_rwlock_tryrdlock function +ever block; it always either acquires the lock or fails and returns +immediately. +

+

Results are undefined if any of these functions are called with an +uninitialized read-write lock. +

+

Pthreads-w32 does not detect deadlock if the thread already +owns the lock for writing.

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

If successful, the pthread_rwlock_rdlock function shall +return zero; otherwise, an error number shall be returned to indicate +the error. +

+

The pthread_rwlock_tryrdlock function shall return zero if +the lock for reading on the read-write lock object referenced by +rwlock is acquired. Otherwise, an error number shall be +returned to indicate the error. +

+

Errors

+

The pthread_rwlock_tryrdlock function shall fail if: +

+
+
EBUSY +
+ The read-write lock could not be acquired for reading because a + writer holds the lock or a writer with the appropriate priority was + blocked on it. +
+

+The pthread_rwlock_rdlock and pthread_rwlock_tryrdlock +functions may fail if: +

+
+
EINVAL +
+ The value specified by rwlock does not refer to an + initialized read-write lock object. +
+ EAGAIN +
+ The read lock could not be acquired because the maximum number of + read locks for rwlock has been exceeded. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using these functions may be subject to priority +inversion, as discussed in the Base Definitions volume of +IEEE Std 1003.1-2001, Section 3.285, Priority Inversion. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlock_timedrdlock(3) +, pthread_rwlock_timedwrlock(3) +, pthread_rwlock_trywrlock(3) +, pthread_rwlock_unlock(3) +, pthread_rwlock_wrlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlock_timedrdlock.html b/win32/3rdparty/pthreads/manual/pthread_rwlock_timedrdlock.html new file mode 100644 index 000000000..1b9ca630f --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlock_timedrdlock.html @@ -0,0 +1,156 @@ + + + + + "PTHREAD_RWLOCK_TIMEDRDLOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlock_timedrdlock - lock a read-write lock for reading +

+

Synopsis

+

#include <pthread.h>
#include <time.h> +

+

int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict +rwlock, const struct timespec *restrict abs_timeout); + +

+

Description

+

The pthread_rwlock_timedrdlock function shall apply a read +lock to the read-write lock referenced by rwlock as in the +pthread_rwlock_rdlock(3) +function. However, if the lock cannot be acquired without waiting for +other threads to unlock the lock, this wait shall be terminated when +the specified timeout expires. The timeout shall expire when the +absolute time specified by abs_timeout passes, as measured by +the clock on which timeouts are based (that is, when the value of +that clock equals or exceeds abs_timeout), or if the absolute +time specified by abs_timeout has already been passed at the +time of the call. +

+

The timespec data type is defined in the <time.h> +header. Under no circumstances shall the function fail with a timeout +if the lock can be acquired immediately. The validity of the +abs_timeout parameter need not be checked if the lock can be +immediately acquired. +

+

The calling thread may deadlock if at the time the call is made it +holds a write lock on rwlock. The results are undefined if +this function is called with an uninitialized read-write lock. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

The pthread_rwlock_timedrdlock function shall return zero +if the lock for reading on the read-write lock object referenced by +rwlock is acquired. Otherwise, an error number shall be +returned to indicate the error. +

+

Errors

+

The pthread_rwlock_timedrdlock function shall fail if: +

+
+
ETIMEDOUT +
+ The lock could not be acquired before the specified timeout expired. +
+

+The pthread_rwlock_timedrdlock function may fail if: +

+
+
EAGAIN +
+ The read lock could not be acquired because the maximum number of + read locks for lock would be exceeded. +
+ EINVAL +
+ The value specified by rwlock does not refer to an + initialized read-write lock object, or the abs_timeout + nanosecond value is less than zero or greater than or equal to 1000 + million. +
+

+This function shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using this function may be subject to priority +inversion, as discussed in the Base Definitions volume of +IEEE Std 1003.1-2001, Section 3.285, Priority Inversion. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlock_rdlock(3) +, pthread_rwlock_timedwrlock(3) +, pthread_rwlock_tryrdlock(3) +, pthread_rwlock_trywrlock(3) +, pthread_rwlock_unlock(3) +, pthread_rwlock_wrlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h>, <time.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlock_timedwrlock.html b/win32/3rdparty/pthreads/manual/pthread_rwlock_timedwrlock.html new file mode 100644 index 000000000..0213bab40 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlock_timedwrlock.html @@ -0,0 +1,150 @@ + + + + + "PTHREAD_RWLOCK_TIMEDWRLOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlock_timedwrlock - lock a read-write lock for writing +

+

Synopsis

+

#include <pthread.h>
#include <time.h> +

+

int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict +rwlock, const struct timespec *restrict abs_timeout); + +

+

Description

+

The pthread_rwlock_timedwrlock function shall apply a write +lock to the read-write lock referenced by rwlock as in the +pthread_rwlock_wrlock(3) +function. However, if the lock cannot be acquired without waiting for +other threads to unlock the lock, this wait shall be terminated when +the specified timeout expires. The timeout shall expire when the +absolute time specified by abs_timeout passes, as measured by +the clock on which timeouts are based (that is, when the value of +that clock equals or exceeds abs_timeout), or if the absolute +time specified by abs_timeout has already been passed at the +time of the call. +

+

The timespec data type is defined in the <time.h> +header. Under no circumstances shall the function fail with a timeout +if the lock can be acquired immediately. The validity of the +abs_timeout parameter need not be checked if the lock can be +immediately acquired. +

+

The calling thread may deadlock if at the time the call is made it +holds the read-write lock. The results are undefined if this function +is called with an uninitialized read-write lock. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

The pthread_rwlock_timedwrlock function shall return zero +if the lock for writing on the read-write lock object referenced by +rwlock is acquired. Otherwise, an error number shall be +returned to indicate the error. +

+

Errors

+

The pthread_rwlock_timedwrlock function shall fail if: +

+
+
ETIMEDOUT +
+ The lock could not be acquired before the specified timeout expired. +
+

+The pthread_rwlock_timedwrlock function may fail if: +

+
+
EINVAL +
+ The value specified by rwlock does not refer to an initialized + read-write lock object, or the abs_timeout nanosecond value + is less than zero or greater than or equal to 1000 million. +
+

+This function shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using this function may be subject to priority +inversion, as discussed in the Base Definitions volume of +IEEE Std 1003.1-2001, Section 3.285, Priority Inversion. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlock_rdlock(3) +, pthread_rwlock_timedrdlock(3) +, pthread_rwlock_tryrdlock(3) +, pthread_rwlock_trywrlock(3) +, pthread_rwlock_unlock(3) +, pthread_rwlock_wrlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h>, <time.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlock_unlock.html b/win32/3rdparty/pthreads/manual/pthread_rwlock_unlock.html new file mode 100644 index 000000000..09725cc3e --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlock_unlock.html @@ -0,0 +1,141 @@ + + + + + "PTHREAD_RWLOCK_UNLOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlock_unlock - unlock a read-write lock object +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); + +

+

Description

+

The pthread_rwlock_unlock function shall release a lock +held on the read-write lock object referenced by rwlock. +Results are undefined if the read-write lock rwlock is not +held by the calling thread. +

+

If this function is called to release a read lock from the +read-write lock object and there are other read locks currently held +on this read-write lock object, the read-write lock object remains in +the read locked state. If this function releases the last read lock +for this read-write lock object, the read-write lock object shall be +put in the unlocked state with no owners. +

+

If this function is called to release a write lock for this +read-write lock object, the read-write lock object shall be put in +the unlocked state. +

+

Pthreads-win32 does not prefer either writers or readers in +acquiring the lock – all threads enter a single prioritised FIFO +queue. While this may not be optimally efficient for some +applications, it does ensure that one type does not starve the other.

+

Results are undefined if any of these functions are called with an +uninitialized read-write lock. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

If successful, the pthread_rwlock_unlock function shall +return zero; otherwise, an error number shall be returned to indicate +the error. +

+

Errors

+

The pthread_rwlock_unlock function may fail if: +

+
+
EINVAL +
+ The value specified by rwlock does not refer to an + initialized read-write lock object. +
+

+
+

+The pthread_rwlock_unlock function shall not return an error +code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlock_rdlock(3) +, pthread_rwlock_timedrdlock(3) +, pthread_rwlock_timedwrlock(3) +, pthread_rwlock_tryrdlock(3) +, pthread_rwlock_trywrlock(3) +, pthread_rwlock_wrlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlock_wrlock.html b/win32/3rdparty/pthreads/manual/pthread_rwlock_wrlock.html new file mode 100644 index 000000000..02b3a19ea --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlock_wrlock.html @@ -0,0 +1,153 @@ + + + + + "PTHREAD_RWLOCK_TRYWRLOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlock_trywrlock, pthread_rwlock_wrlock - lock a +read-write lock object for writing +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); +
int pthread_rwlock_wrlock(pthread_rwlock_t *
rwlock); + +

+

Description

+

The pthread_rwlock_trywrlock function shall apply a write +lock like the pthread_rwlock_wrlock function, with the +exception that the function shall fail if any thread currently holds +rwlock (for reading or writing). +

+

The pthread_rwlock_wrlock function shall apply a write lock +to the read-write lock referenced by rwlock. The calling +thread acquires the write lock if no other thread (reader or writer) +holds the read-write lock rwlock. Otherwise, the thread shall +block until it can acquire the lock. The calling thread may deadlock +if at the time the call is made it holds the read-write lock (whether +a read or write lock). +

+

Pthreads-win32 does not prefer either writers or readers in +acquiring the lock – all threads enter a single prioritised FIFO +queue. While this may not be optimally efficient for some +applications, it does ensure that one type does not starve the other.

+

Results are undefined if any of these functions are called with an +uninitialized read-write lock. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

The pthread_rwlock_trywrlock function shall return zero if +the lock for writing on the read-write lock object referenced by +rwlock is acquired. Otherwise, an error number shall be +returned to indicate the error. +

+

If successful, the pthread_rwlock_wrlock function shall +return zero; otherwise, an error number shall be returned to indicate +the error. +

+

Errors

+

The pthread_rwlock_trywrlock function shall fail if: +

+
+
EBUSY +
+ The read-write lock could not be acquired for writing because it was + already locked for reading or writing. +
+

+The pthread_rwlock_trywrlock and pthread_rwlock_wrlock +functions may fail if: +

+
+
EINVAL +
+ The value specified by rwlock does not refer to an + initialized read-write lock object. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using these functions may be subject to priority +inversion, as discussed in the Base Definitions volume of +IEEE Std 1003.1-2001, Section 3.285, Priority Inversion. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlock_rdlock(3) +, pthread_rwlock_timedrdlock(3) +, pthread_rwlock_timedwrlock(3) +, pthread_rwlock_tryrdlock(3) +, pthread_rwlock_unlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlockattr_init.html b/win32/3rdparty/pthreads/manual/pthread_rwlockattr_init.html new file mode 100644 index 000000000..67da876cc --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlockattr_init.html @@ -0,0 +1,141 @@ + + + + + "PTHREAD_RWLOCKATTR_DESTROY"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlockattr_destroy, pthread_rwlockattr_init - destroy and +initialize the read-write lock attributes object +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); +
int pthread_rwlockattr_init(pthread_rwlockattr_t *
attr); + +

+

Description

+

The pthread_rwlockattr_destroy function shall destroy a +read-write lock attributes object. A destroyed attr attributes +object can be reinitialized using pthread_rwlockattr_init ; +the results of otherwise referencing the object after it has been +destroyed are undefined. An implementation may cause +pthread_rwlockattr_destroy to set the object referenced by +attr to an invalid value. +

+

The pthread_rwlockattr_init function shall initialize a +read-write lock attributes object attr with the default value +for all of the attributes defined by the implementation. +

+

Results are undefined if pthread_rwlockattr_init is called +specifying an already initialized attr attributes object. +

+

After a read-write lock attributes object has been used to +initialize one or more read-write locks, any function affecting the +attributes object (including destruction) shall not affect any +previously initialized read-write locks. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

If successful, the pthread_rwlockattr_destroy and +pthread_rwlockattr_init functions shall return zero; +otherwise, an error number shall be returned to indicate the error. +

+

Errors

+

The pthread_rwlockattr_destroy function may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+

+The pthread_rwlockattr_init function shall fail if: +

+
+
ENOMEM +
+ Insufficient memory exists to initialize the read-write lock + attributes object. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlockattr_getpshared(3) +, pthread_rwlockattr_setpshared(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_rwlockattr_setpshared.html b/win32/3rdparty/pthreads/manual/pthread_rwlockattr_setpshared.html new file mode 100644 index 000000000..9db6f4cdc --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_rwlockattr_setpshared.html @@ -0,0 +1,160 @@ + + + + + "PTHREAD_RWLOCKATTR_GETPSHARED"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared - get +and set the process-shared attribute of the read-write lock +attributes object +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * +restrict attr, int *restrict pshared); +
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *
attr, +int pshared); +

+

Description

+

The pthread_rwlockattr_getpshared function shall obtain the +value of the process-shared attribute from the initialized +attributes object referenced by attr. The +pthread_rwlockattr_setpshared function shall set the +process-shared attribute in an initialized attributes object +referenced by attr. +

+

The process-shared attribute shall be set to +PTHREAD_PROCESS_SHARED to permit a read-write lock to be +operated upon by any thread that has access to the memory where the +read-write lock is allocated, even if the read-write lock is +allocated in memory that is shared by multiple processes. If the +process-shared attribute is PTHREAD_PROCESS_PRIVATE, +the read-write lock shall only be operated upon by threads created +within the same process as the thread that initialized the read-write +lock; if threads of differing processes attempt to operate on such a +read-write lock, the behavior is undefined. The default value of the +process-shared attribute shall be PTHREAD_PROCESS_PRIVATE. +

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that these routines are implemented but +they do not support the process shared option.

+

Additional attributes, their default values, and the names of the +associated functions to get and set those attribute values are +implementation-defined. +

+

Pthreads-w32 defines _POSIX_READER_WRITER_LOCKS in +pthread.h as 200112L to indicate that the reader/writer routines are +implemented and may be used.

+

Return Value

+

Upon successful completion, the pthread_rwlockattr_getpshared +function shall return zero and store the value of the process-shared +attribute of attr into the object referenced by the pshared +parameter. Otherwise, an error number shall be returned to indicate +the error. +

+

If successful, the pthread_rwlockattr_setpshared function +shall return zero; otherwise, an error number shall be returned to +indicate the error. +

+

Errors

+

The pthread_rwlockattr_getpshared and +pthread_rwlockattr_setpshared functions may fail if: +

+
+
EINVAL +
+ The value specified by attr is invalid. +
+

+The pthread_rwlockattr_setpshared function may fail if: +

+
+
EINVAL +
+ The new value specified for the attribute is outside the range of + legal values for that attribute. +
+ ENOTSUP +
+ The new value specified for the attribute is PTHREAD_PROCESS_SHARED. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_rwlock_destroy(3) +, pthread_rwlockattr_destroy(3) +, pthread_rwlockattr_init(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_self.html b/win32/3rdparty/pthreads/manual/pthread_self.html new file mode 100644 index 000000000..82e16eaa7 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_self.html @@ -0,0 +1,70 @@ + + + + + PTHREAD_SELF(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_self - return identifier of current thread +

+

Synopsis

+

#include <pthread.h> +

+

pthread_t pthread_self(void); +

+

Description

+

pthread_self return the thread identifier for the calling +thread. +

+

Pthreads-w32 also provides support for Win32 native +threads to interact with POSIX threads through the pthreads API. +Whereas all threads created via a call to pthread_create have a POSIX +thread ID and thread state, the library ensures that any Win32 native +threads that interact through the Pthreads API also generate a POSIX +thread ID and thread state when and if necessary. This provides full +reciprocity between Win32 and POSIX +threads. Win32 native threads that generate a POSIX thread ID and +state are treated by the library as having been created with the +PTHREAD_CREATE_DETACHED attribute.

+

Any Win32 native thread may call pthread_self directly to +return it's POSIX thread identifier. The ID and state will be +generated if it does not already exist. Win32 native threads do not +need to call pthread_self before calling Pthreads-w32 routines +unless that routine requires a pthread_t parameter.

+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_equal(3) , +pthread_join(3) , +pthread_detach(3) , +pthread_setschedparam(3) +, pthread_getschedparam(3) +. +

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_setcancelstate.html b/win32/3rdparty/pthreads/manual/pthread_setcancelstate.html new file mode 100644 index 000000000..3ce65c44d --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_setcancelstate.html @@ -0,0 +1,207 @@ + + + + + PTHREAD_CANCEL(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, +pthread_testcancel - thread cancellation +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_cancel(pthread_t thread); +

+

int pthread_setcancelstate(int state, int +*oldstate); +

+

int pthread_setcanceltype(int type, int +*oldtype); +

+

void pthread_testcancel(void); +

+

Description

+

Cancellation is the mechanism by which a thread can terminate the +execution of another thread. More precisely, a thread can send a +cancellation request to another thread. Depending on its settings, +the target thread can then either ignore the request, honor it +immediately, or defer it until it reaches a cancellation point. +

+

When a thread eventually honors a cancellation request, it +performs as if pthread_exit(PTHREAD_CANCELED) has been called +at that point: all cleanup handlers are executed in reverse order, +destructor functions for thread-specific data are called, and finally +the thread stops executing with the return value PTHREAD_CANCELED. +See pthread_exit(3) for more +information. +

+

pthread_cancel sends a cancellation request to the thread +denoted by the thread argument. +

+

pthread_setcancelstate changes the cancellation state for +the calling thread -- that is, whether cancellation requests are +ignored or not. The state argument is the new cancellation +state: either PTHREAD_CANCEL_ENABLE to enable cancellation, or +PTHREAD_CANCEL_DISABLE to disable cancellation (cancellation +requests are ignored). If oldstate is not NULL, the +previous cancellation state is stored in the location pointed to by +oldstate, and can thus be restored later by another call to +pthread_setcancelstate. +

+

pthread_setcanceltype changes the type of responses to +cancellation requests for the calling thread: asynchronous +(immediate) or deferred. The type argument is the new +cancellation type: either PTHREAD_CANCEL_ASYNCHRONOUS to +cancel the calling thread as soon as the cancellation request is +received, or PTHREAD_CANCEL_DEFERRED to keep the cancellation +request pending until the next cancellation point. If oldtype +is not NULL, the previous cancellation state is stored in the +location pointed to by oldtype, and can thus be restored later +by another call to pthread_setcanceltype. +

+

Pthreads-w32 provides two levels of support for +PTHREAD_CANCEL_ASYNCHRONOUS: full and partial. Full support +requires an additional DLL and driver be installed on the Windows +system (see the See Also section below) that allows blocked threads +to be cancelled immediately. Partial support means that the target +thread will not cancel until it resumes execution naturally. Partial +support is provided if either the DLL or the driver are not +automatically detected by the pthreads-w32 library at run-time.

+

Threads are always created by pthread_create(3) +with cancellation enabled and deferred. That is, the initial +cancellation state is PTHREAD_CANCEL_ENABLE and the initial +type is PTHREAD_CANCEL_DEFERRED. +

+

Cancellation points are those points in the program execution +where a test for pending cancellation requests is performed and +cancellation is executed if positive. The following POSIX threads +functions are cancellation points: +

+

pthread_join(3) +
pthread_cond_wait(3) +
pthread_cond_timedwait(3) +
pthread_testcancel(3) +
sem_wait(3)
sem_timedwait(3) +
sigwait(3) (not supported under +Pthreads-w32)

+

Pthreads-w32 provides two functions to enable additional +cancellation points to be created in user functions that block on +Win32 HANDLEs:

+

pthreadCancelableWait() +
pthreadCancelableTimedWait()

+

All other POSIX threads functions are guaranteed not to be +cancellation points. That is, they never perform cancellation in +deferred cancellation mode. +

+

pthread_testcancel does nothing except testing for pending +cancellation and executing it. Its purpose is to introduce explicit +checks for cancellation in long sequences of code that do not call +cancellation point functions otherwise. +

+

Return Value

+

pthread_cancel, pthread_setcancelstate and +pthread_setcanceltype return 0 on success and a non-zero error +code on error. +

+

Errors

+

pthread_cancel returns the following error code on error: +

+
+
+
ESRCH +
+ no thread could be found corresponding to that specified by the + thread ID. +
+
+

+pthread_setcancelstate returns the following error code on +error: +

+
+
+
EINVAL +
+ the state argument is not +
+
+
+PTHREAD_CANCEL_ENABLE nor PTHREAD_CANCEL_DISABLE +
+

pthread_setcanceltype returns the following error code on +error: +

+
+
+
EINVAL +
+ the type argument is not +
+
+
+PTHREAD_CANCEL_DEFERRED nor PTHREAD_CANCEL_ASYNCHRONOUS +
+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_exit(3) , +pthread_cleanup_push(3) +, pthread_cleanup_pop(3) +, Pthreads-w32 package README file 'Prerequisites' section. +

+

Bugs

+

POSIX specifies that a number of system calls (basically, all +system calls that may block, such as read(2) +, write(2) , wait(2) +, etc.) and library functions that may call these system calls (e.g. +fprintf(3) ) are cancellation +points. Pthreads-win32 is not integrated enough with the C +library to implement this, and thus none of the C library functions +is a cancellation point. +

+

A workaround for these calls is to temporarily switch to +asynchronous cancellation (assuming full asynchronous cancellation +support is installed). So, checking for cancellation during a read +system call, for instance, can be achieved as follows: +

+


+
+
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldCancelType);
+read(fd, buffer, length);
+pthread_setcanceltype(oldCancelType, NULL);
+
+
Table of Contents
+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_setcanceltype.html b/win32/3rdparty/pthreads/manual/pthread_setcanceltype.html new file mode 100644 index 000000000..935ed822c --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_setcanceltype.html @@ -0,0 +1,207 @@ + + + + + PTHREAD_CANCEL(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, +pthread_testcancel - thread cancellation +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_cancel(pthread_t thread); +

+

int pthread_setcancelstate(int state, int +*oldstate); +

+

int pthread_setcanceltype(int type, int +*oldtype); +

+

void pthread_testcancel(void); +

+

Description

+

Cancellation is the mechanism by which a thread can terminate the +execution of another thread. More precisely, a thread can send a +cancellation request to another thread. Depending on its settings, +the target thread can then either ignore the request, honor it +immediately, or defer it until it reaches a cancellation point. +

+

When a thread eventually honors a cancellation request, it +performs as if pthread_exit(PTHREAD_CANCELED) has been called +at that point: all cleanup handlers are executed in reverse order, +destructor functions for thread-specific data are called, and finally +the thread stops executing with the return value PTHREAD_CANCELED. +See pthread_exit(3) for more +information. +

+

pthread_cancel sends a cancellation request to the thread +denoted by the thread argument. +

+

pthread_setcancelstate changes the cancellation state for +the calling thread -- that is, whether cancellation requests are +ignored or not. The state argument is the new cancellation +state: either PTHREAD_CANCEL_ENABLE to enable cancellation, or +PTHREAD_CANCEL_DISABLE to disable cancellation (cancellation +requests are ignored). If oldstate is not NULL, the +previous cancellation state is stored in the location pointed to by +oldstate, and can thus be restored later by another call to +pthread_setcancelstate. +

+

pthread_setcanceltype changes the type of responses to +cancellation requests for the calling thread: asynchronous +(immediate) or deferred. The type argument is the new +cancellation type: either PTHREAD_CANCEL_ASYNCHRONOUS to +cancel the calling thread as soon as the cancellation request is +received, or PTHREAD_CANCEL_DEFERRED to keep the cancellation +request pending until the next cancellation point. If oldtype +is not NULL, the previous cancellation state is stored in the +location pointed to by oldtype, and can thus be restored later +by another call to pthread_setcanceltype. +

+

Pthreads-w32 provides two levels of support for +PTHREAD_CANCEL_ASYNCHRONOUS: full and partial. Full support +requires an additional DLL and driver be installed on the Windows +system (see the See Also section below) that allows blocked threads +to be cancelled immediately. Partial support means that the target +thread will not cancel until it resumes execution naturally. Partial +support is provided if either the DLL or the driver are not +automatically detected by the pthreads-w32 library at run-time.

+

Threads are always created by pthread_create(3) +with cancellation enabled and deferred. That is, the initial +cancellation state is PTHREAD_CANCEL_ENABLE and the initial +type is PTHREAD_CANCEL_DEFERRED. +

+

Cancellation points are those points in the program execution +where a test for pending cancellation requests is performed and +cancellation is executed if positive. The following POSIX threads +functions are cancellation points: +

+

pthread_join(3) +
pthread_cond_wait(3) +
pthread_cond_timedwait(3) +
pthread_testcancel(3) +
sem_wait(3)
sem_timedwait(3) +
sigwait(3) (not supported under +Pthreads-w32)

+

Pthreads-w32 provides two functions to enable additional +cancellation points to be created in user functions that block on +Win32 HANDLEs:

+

pthreadCancelableWait() +
pthreadCancelableTimedWait()

+

All other POSIX threads functions are guaranteed not to be +cancellation points. That is, they never perform cancellation in +deferred cancellation mode. +

+

pthread_testcancel does nothing except testing for pending +cancellation and executing it. Its purpose is to introduce explicit +checks for cancellation in long sequences of code that do not call +cancellation point functions otherwise. +

+

Return Value

+

pthread_cancel, pthread_setcancelstate and +pthread_setcanceltype return 0 on success and a non-zero error +code on error. +

+

Errors

+

pthread_cancel returns the following error code on error: +

+
+
+
ESRCH +
+ no thread could be found corresponding to that specified by the + thread ID. +
+
+

+pthread_setcancelstate returns the following error code on +error: +

+
+
+
EINVAL +
+ the state argument is not +
+
+
+PTHREAD_CANCEL_ENABLE nor PTHREAD_CANCEL_DISABLE +
+

pthread_setcanceltype returns the following error code on +error: +

+
+
+
EINVAL +
+ the type argument is not +
+
+
+PTHREAD_CANCEL_DEFERRED nor PTHREAD_CANCEL_ASYNCHRONOUS +
+

Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_exit(3) , +pthread_cleanup_push(3) +, pthread_cleanup_pop(3) +, Pthreads-w32 package README file 'Prerequisites' section. +

+

Bugs

+

POSIX specifies that a number of system calls (basically, all +system calls that may block, such as read(2) +, write(2) , wait(2) +, etc.) and library functions that may call these system calls (e.g. +fprintf(3) ) are cancellation +points. Pthreads-win32 is not integrated enough with the C +library to implement this, and thus none of the C library functions +is a cancellation point. +

+

A workaround for these calls is to temporarily switch to +asynchronous cancellation (assuming full asynchronous cancellation +support is installed). So, checking for cancellation during a read +system call, for instance, can be achieved as follows: +

+


+
+
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldCancelType);
+read(fd, buffer, length);
+pthread_setcanceltype(oldCancelType, NULL);
+
+
Table of Contents
+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_setconcurrency.html b/win32/3rdparty/pthreads/manual/pthread_setconcurrency.html new file mode 100644 index 000000000..cdd4f5840 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_setconcurrency.html @@ -0,0 +1,155 @@ + + + + + "PTHREAD_GETCONCURRENCY"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_getconcurrency, pthread_setconcurrency - get and set the +level of concurrency +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_getconcurrency(void);
int +pthread_setconcurrency(int new_level); +

+

Description

+

Unbound threads in a process may or may not be required to be +simultaneously active. By default, the threads implementation ensures +that a sufficient number of threads are active so that the process +can continue to make progress. While this conserves system resources, +it may not produce the most effective level of concurrency. +

+

The pthread_setconcurrency function allows an application +to inform the threads implementation of its desired concurrency +level, new_level. The actual level of concurrency provided by +the implementation as a result of this function call is unspecified. +

+

If new_level is zero, it causes the implementation to +maintain the concurrency level at its discretion as if +pthread_setconcurrency had never been called. +

+

The pthread_getconcurrency function shall return the value +set by a previous call to the pthread_setconcurrency function. +If the pthread_setconcurrency function was not previously +called, this function shall return zero to indicate that the +implementation is maintaining the concurrency level. +

+

A call to pthread_setconcurrency shall inform the +implementation of its desired concurrency level. The implementation +shall use this as a hint, not a requirement. +

+

If an implementation does not support multiplexing of user threads +on top of several kernel-scheduled entities, the +pthread_setconcurrency and pthread_getconcurrency +functions are provided for source code compatibility but they shall +have no effect when called. To maintain the function semantics, the +new_level parameter is saved when pthread_setconcurrency +is called so that a subsequent call to pthread_getconcurrency +shall return the same value. +

+

Pthreads-w32 provides these routines for source code +compatibility only, as described in the previous paragraph.

+

Return Value

+

If successful, the pthread_setconcurrency function shall +return zero; otherwise, an error number shall be returned to indicate +the error. +

+

The pthread_getconcurrency function shall always return the +concurrency level set by a previous call to pthread_setconcurrency +. If the pthread_setconcurrency function has never been +called, pthread_getconcurrency shall return zero. +

+

Errors

+

The pthread_setconcurrency function shall fail if: +

+
+
EINVAL +
+ The value specified by new_level is negative. +
+ EAGAIN +
+ The value specific by new_level would cause a system resource + to be exceeded. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Use of these functions changes the state of the underlying +concurrency upon which the application depends. Library developers +are advised to not use the pthread_getconcurrency and +pthread_setconcurrency functions since their use may conflict +with an applications use of these functions. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

The Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_setschedparam.html b/win32/3rdparty/pthreads/manual/pthread_setschedparam.html new file mode 100644 index 000000000..920c20bab --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_setschedparam.html @@ -0,0 +1,113 @@ + + + + + PTHREAD_SETSCHEDPARAM(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_setschedparam, pthread_getschedparam - control thread +scheduling +

+

parameters +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_setschedparam(pthread_t target_thread, +int policy, const struct sched_param *param); +

+

int pthread_getschedparam(pthread_t target_thread, +int *policy, struct sched_param *param); +

+

Description

+

pthread_setschedparam sets the scheduling parameters for +the thread target_thread as indicated by policy and +param. policy can be either SCHED_OTHER +(regular, non-real-time scheduling), SCHED_RR (real-time, +round-robin) or SCHED_FIFO (real-time, first-in first-out). +param specifies the scheduling priority for the two real-time +policies.

+

Pthreads-w32 only supports SCHED_OTHER and does not support +the real-time scheduling policies SCHED_RR and SCHED_FIFO. +

+

pthread_getschedparam retrieves the scheduling policy and +scheduling parameters for the thread target_thread and stores +them in the locations pointed to by policy and param, +respectively. +

+

Return Value

+

pthread_setschedparam and pthread_getschedparam +return 0 on success and a non-zero error code on error. +

+

Errors

+

On error, pthread_setschedparam returns the following error +codes: +

+
+
+
ENOTSUP +
+ policy is not SCHED_OTHER.
+ EINVAL +
+ One of the arguments is invalid, or the priority value specified by + param is not valid for the specified policy.
+ ESRCH +
+ The target_thread is invalid or has already terminated +
+
+

+On error, pthread_getschedparam returns the following error +codes: +

+
+
+
ESRCH +
+ the target_thread is invalid or has already terminated +
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

sched_setscheduler(2) +, sched_getscheduler(2) +, sched_getparam(2) , +pthread_attr_setschedpolicy(3) +, pthread_attr_setschedparam(3) +. +

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/pthread_spin_init.html b/win32/3rdparty/pthreads/manual/pthread_spin_init.html new file mode 100644 index 000000000..35e657be4 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_spin_init.html @@ -0,0 +1,176 @@ + + + + + "PTHREAD_SPIN_DESTROY"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_spin_destroy, pthread_spin_init - destroy or initialize a +spin lock object (ADVANCED REALTIME THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

pthread_spinlock_t lock = +PTHREAD_SPINLOCK_INITIALIZER;

+

int pthread_spin_destroy(pthread_spinlock_t *lock); +
int pthread_spin_init(pthread_spinlock_t *
lock, int +pshared); +

+

Description

+

The pthread_spin_destroy function shall destroy the spin +lock referenced by lock and release any resources used by the +lock. The effect of subsequent use of the lock is undefined until the +lock is reinitialized by another call to pthread_spin_init . +The results are undefined if pthread_spin_destroy is called +when a thread holds the lock, or if this function is called with an +uninitialized thread spin lock. +

+

The pthread_spin_init function shall allocate any resources +required to use the spin lock referenced by lock and +initialize the lock to an unlocked state. +

+

Pthreads-w32 supports single and multiple processor systems +as well as process CPU affinity masking by checking the mask when the +spin lock is initialized. If the process is using only a single +processor at the time pthread_spin_init is called then the +spin lock is initialized as a PTHREAD_MUTEX_NORMAL mutex object. A +thread that calls pthread_spin_lock(3) +will block rather than spin in this case. If the process CPU affinity +mask is altered after the spin lock has been initialised, the spin +lock is not modified, and may no longer be optimal for the number of +CPUs available.

+

Pthreads-w32 defines _POSIX_THREAD_PROCESS_SHARED in +pthread.h as -1 to indicate that these routines do not support the +PTHREAD_PROCESS_SHARED attribute. pthread_spin_init +will return the error ENOTSUP if the value of pshared +is not PTHREAD_PROCESS_PRIVATE.

+

The results are undefined if pthread_spin_init is called +specifying an already initialized spin lock. The results are +undefined if a spin lock is used without first being initialized. +

+

If the pthread_spin_init function fails, the lock is not +initialized and the contents of lock are undefined. +

+

Only the object referenced by lock may be used for +performing synchronization. +

+

The result of referring to copies of that object in calls to +pthread_spin_destroy , pthread_spin_lock(3) +, pthread_spin_trylock(3), +or pthread_spin_unlock(3) +is undefined. +

+

Pthreads-w32 supports statically initialized spin locks +using PTHREAD_SPINLOCK_INITIALIZER. An application should +still call pthread_spin_destroy at some point to ensure that +any resources consumed by the spin lock are released.

+

Return Value

+

Upon successful completion, these functions shall return zero; +otherwise, an error number shall be returned to indicate the error. +

+

Errors

+

These functions may fail if: +

+
+
EBUSY +
+ The implementation has detected an attempt to initialize or destroy + a spin lock while it is in use (for example, while being used in a + pthread_spin_lock(3) + call) by another thread. +
+ EINVAL +
+ The value specified by lock is invalid. +
+

+The pthread_spin_init function shall fail if: +

+
+
ENOTSUP +
+ The value of pshared is not PTHREAD_PROCESS_PRIVATE.
+ ENOMEM +
+ Insufficient memory exists to initialize the lock. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

The pthread_spin_destroy and pthread_spin_init +functions are part of the Spin Locks option and need not be provided +on all implementations. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_spin_lock(3) , +pthread_spin_unlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_spin_lock.html b/win32/3rdparty/pthreads/manual/pthread_spin_lock.html new file mode 100644 index 000000000..dd180ae6a --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_spin_lock.html @@ -0,0 +1,141 @@ + + + + + "PTHREAD_SPIN_LOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_spin_lock, pthread_spin_trylock - lock a spin lock object +(ADVANCED REALTIME THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_spin_lock(pthread_spinlock_t *lock); +
int pthread_spin_trylock(pthread_spinlock_t *
lock); + +

+

Description

+

The pthread_spin_lock function shall lock the spin lock +referenced by lock. The calling thread shall acquire the lock +if it is not held by another thread. Otherwise, the thread shall spin +(that is, shall not return from the pthread_spin_lock call) +until the lock becomes available. The results are undefined if the +calling thread holds the lock at the time the call is made.

+

Pthreads-w32 supports single and multiple processor systems +as well as process CPU affinity masking by checking the mask when the +spin lock is initialized. If the process is using only a single +processor at the time pthread_spin_init(3) +is called then the spin lock is initialized as a PTHREAD_MUTEX_NORMAL +mutex object. A thread that calls pthread_spin_lock will block +rather than spin in this case. If the process CPU affinity mask is +altered after the spin lock has been initialised, the spin lock is +not modified, and may no longer be optimal for the number of CPUs +available.

+

The pthread_spin_trylock function shall lock the spin lock +referenced by lock if it is not held by any thread. Otherwise, +the function shall fail. +

+

The results are undefined if any of these functions is called with +an uninitialized spin lock. +

+

Return Value

+

Upon successful completion, these functions shall return zero; +otherwise, an error number shall be returned to indicate the error. +

+

Errors

+

These functions may fail if: +

+
+
EINVAL +
+ The value specified by lock does not refer to an initialized + spin lock object. +
+

+The pthread_spin_trylock function shall fail if: +

+
+
EBUSY +
+ A thread currently holds the lock. +
+

+These functions shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Applications using this function may be subject to priority +inversion, as discussed in the Base Definitions volume of +IEEE Std 1003.1-2001, Section 3.285, Priority Inversion. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_spin_destroy(3) +, pthread_spin_unlock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_spin_unlock.html b/win32/3rdparty/pthreads/manual/pthread_spin_unlock.html new file mode 100644 index 000000000..221570058 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_spin_unlock.html @@ -0,0 +1,124 @@ + + + + + "PTHREAD_SPIN_UNLOCK"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_spin_unlock - unlock a spin lock object (ADVANCED +REALTIME THREADS) +

+

Synopsis

+

#include <pthread.h> +

+

int pthread_spin_unlock(pthread_spinlock_t *lock); + +

+

Description

+

The pthread_spin_unlock function shall release the spin +lock referenced by lock which was locked via the +pthread_spin_lock(3) or +pthread_spin_trylock(3) +functions. If there are threads spinning on the lock when +pthread_spin_unlock is called, the lock becomes available and +an unspecified spinning thread shall acquire the lock. +

+

Pthreads-w32 does not check ownership of the lock and it is +therefore possible for a thread other than the locker to unlock the +spin lock. This is not a feature that should be exploited.

+

The results are undefined if this function is called with an +uninitialized thread spin lock. +

+

Return Value

+

Upon successful completion, the pthread_spin_unlock +function shall return zero; otherwise, an error number shall be +returned to indicate the error. +

+

Errors

+

The pthread_spin_unlock function may fail if: +

+
+
EINVAL +
+ An invalid argument was specified. +
+
+
+

+This function shall not return an error code of [EINTR]. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

Pthreads-w32 does not check ownership of the lock and it is +therefore possible for a thread other than the locker to unlock the +spin lock. This is not a feature that should be exploited.

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

pthread_spin_destroy(3) +, pthread_spin_lock(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<pthread.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_timechange_handler_np.html b/win32/3rdparty/pthreads/manual/pthread_timechange_handler_np.html new file mode 100644 index 000000000..54226da7d --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_timechange_handler_np.html @@ -0,0 +1,76 @@ + + + + + PTHREAD_TIMECHANGE_HANDLER_NP manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_timechange_handler_np – +alert timed waiting condition variables to system time changes.

+

Synopsis

+

#include <pthread.h> +

+

void * pthread_timechange_handler_np(void * dummy);

+

Description

+

To improve tolerance against operator or time service initiated +system clock changes.

+

pthread_timechange_handler_np can be called by an +application when it receives a WM_TIMECHANGE message from the system. +At present it broadcasts all condition variables so that waiting +threads can wake up and re-evaluate their conditions and restart +their timed waits if required.

+

pthread_timechange_handler_np has the same return type and +argument type as a thread routine so that it may be called directly +through pthread_create(), i.e. as a separate thread. If run as a +thread, the return code must be retrieved through pthread_join().

+

Although the dummy parameter is required it is not used and +any value including NULL can be given.

+

Cancellation

+

None.

+

Return Value

+

pthread_timechange_handler_np returns 0 on success, or an +error code.

+

Errors

+

The pthread_timechange_handler_np function returns the +following error code on error: +

+
+
+
EAGAIN +
+
+

+To indicate that not all condition variables were signalled for some +reason.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_win32_attach_detach_np.html b/win32/3rdparty/pthreads/manual/pthread_win32_attach_detach_np.html new file mode 100644 index 000000000..57f0339a6 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_win32_attach_detach_np.html @@ -0,0 +1,74 @@ + + + + + PTHREAD_WIN32_ATTACH_DETACH_NP manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_win32_process_attach_np, +pthread_win32_process_detach_np, pthread_win32_thread_attach_np, +pthread_win32_thread_detach_np – exposed versions of the +pthreads-w32 DLL dllMain() switch functionality for use when +statically linking the library.

+

Synopsis

+

#include <pthread.h> +

+

BOOL pthread_win32_process_attach_np (void);

+

BOOL pthread_win32_process_detach_np (void);

+

BOOL pthread_win32_thread_attach_np (void);

+

BOOL pthread_win32_thread_detach_np (void);

+

Description

+

These functions contain the code normally run via dllMain +when the library is used as a dll but which need to be called +explicitly by an application when the library is statically linked.

+

You will need to call pthread_win32_process_attach_np +before you can call any pthread routines when statically linking. You +should call pthread_win32_process_detach_np before exiting +your application to clean up.

+

pthread_win32_thread_attach_np is currently a no-op, but +pthread_win32_thread_detach_np is needed to clean up the +implicit pthread handle that is allocated to a Win32 thread if it +calls certain pthreads routines. Call this routine when the Win32 +thread exits.

+

These functions invariably return TRUE except for +pthread_win32_process_attach_np which will return FALSE if +pthreads-w32 initialisation fails.

+

Cancellation

+

None.

+

Return Value

+

These routines return TRUE (non-zero) on success, or FALSE (0) if +they fail.

+

Errors

+

None.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/pthread_win32_test_features_np.html b/win32/3rdparty/pthreads/manual/pthread_win32_test_features_np.html new file mode 100644 index 000000000..1d8e11233 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/pthread_win32_test_features_np.html @@ -0,0 +1,68 @@ + + + + + PTHREAD_WIN32_TEST_FEATURES_NP manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

pthread_win32_test_features_np – +find out what features were detected at process attach time.

+

Synopsis

+

#include <pthread.h> +

+

BOOL pthread_win32_test_features_np(int mask);

+

Description

+

pthread_win32_test_features_np allows an application to +check which run-time auto-detected features are available within the +library.

+

The possible features are:

+

PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE

+

Return TRUE if the Win32 version of +InterlockedCompareExchange() is being used. On IA32 systems the +library can use optimised and inlinable assembler versions of +InterlockedExchange() and InterlockedCompareExchange().

+

PTW32_ALERTABLE_ASYNC_CANCEL

+

Return TRUE if the QueueUserAPCEx package +QUSEREX.DLL and the AlertDrv.sys driver was detected. This package +provides alertable (pre-emptive) asynchronous threads cancellation. +If this feature returns FALSE then the default async cancel scheme is +in use, which cannot cancel blocked threads.

+

Cancellation

+

None.

+

Return Value

+

pthread_win32_test_features_np returns TRUE (non-zero) if +the specified feature is present, and FALSE (0) otherwise.

+

Errors

+

None.

+

Author

+

Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/sched_get_priority_max.html b/win32/3rdparty/pthreads/manual/sched_get_priority_max.html new file mode 100644 index 000000000..54869029b --- /dev/null +++ b/win32/3rdparty/pthreads/manual/sched_get_priority_max.html @@ -0,0 +1,115 @@ + + + + + "SCHED_GET_PRIORITY_MAX"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

sched_get_priority_max, sched_get_priority_min - get priority +limits (REALTIME) +

+

Synopsis

+

#include <sched.h> +

+

int sched_get_priority_max(int policy);
int +sched_get_priority_min(int
policy); +

+

Description

+

The sched_get_priority_max and sched_get_priority_min +functions shall return the appropriate maximum or minimum, +respectively, for the scheduling policy specified by policy. +

+

The value of policy shall be one of the scheduling policy +values defined in <sched.h>. +

+

Return Value

+

If successful, the sched_get_priority_max and +sched_get_priority_min functions shall return the appropriate +maximum or minimum values, respectively. If unsuccessful, they shall +return a value of -1 and set errno to indicate the error. +

+

Errors

+

The sched_get_priority_max and sched_get_priority_min +functions shall fail if: +

+
+
EINVAL +
+ The value of the policy parameter does not represent a + defined scheduling policy. +
+

+The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

sched_getscheduler(3) +, sched_setscheduler(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<sched.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/manual/sched_getscheduler.html b/win32/3rdparty/pthreads/manual/sched_getscheduler.html new file mode 100644 index 000000000..0089e244f --- /dev/null +++ b/win32/3rdparty/pthreads/manual/sched_getscheduler.html @@ -0,0 +1,127 @@ + + + + + "SCHED_GETSCHEDULER"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

sched_getscheduler - get scheduling policy (REALTIME) +

+

Synopsis

+

#include <sched.h> +

+

int sched_getscheduler(pid_t pid); +

+

Description

+

The sched_getscheduler function shall return the scheduling +policy of the process specified by pid. If the value of pid +is negative, the behavior of the sched_getscheduler function +is unspecified. +

+

The values that can be returned by sched_getscheduler are +defined in the <sched.h> header. +

+

Pthreads-w32 only supports the SCHED_OTHER policy, +which is the only value that can be returned. However, checks on pid +and permissions are performed first so that the other useful side +effects of this routine are retained.

+

If a process specified by pid exists, and if the calling +process has permission, the scheduling policy shall be returned for +the process whose process ID is equal to pid. +

+

If pid is zero, the scheduling policy shall be returned for +the calling process. +

+

Return Value

+

Upon successful completion, the sched_getscheduler function +shall return the scheduling policy of the specified process. If +unsuccessful, the function shall return -1 and set errno to +indicate the error. +

+

Errors

+

The sched_getscheduler function shall fail if: +

+
+
EPERM +
+ The requesting process does not have permission to determine the + scheduling policy of the specified process. +
+ ESRCH +
+ No process can be found corresponding to that specified by pid. +
+

+The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

sched_setscheduler(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<sched.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/sched_setscheduler.html b/win32/3rdparty/pthreads/manual/sched_setscheduler.html new file mode 100644 index 000000000..c6e62ae0d --- /dev/null +++ b/win32/3rdparty/pthreads/manual/sched_setscheduler.html @@ -0,0 +1,181 @@ + + + + + "SCHED_SETSCHEDULER"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

sched_setscheduler - set scheduling policy and parameters +(REALTIME) +

+

Synopsis

+

#include <sched.h> +

+

int sched_setscheduler(pid_t pid, int policy, +const struct sched_param *param); +

+

Description

+

The sched_setscheduler function shall set the scheduling +policy and scheduling parameters of the process specified by pid +to policy and the parameters specified in the sched_param +structure pointed to by param, respectively. The value of the +sched_priority member in the sched_param structure +shall be any integer within the inclusive priority range for the +scheduling policy specified by policy. If the value of pid +is negative, the behavior of the sched_setscheduler function +is unspecified. +

+

The possible values for the policy parameter are defined in +the <sched.h> header. +

+

Pthreads-w32 only supports the SCHED_OTHER policy. +Any other value for policy will return failure with errno set +to ENOSYS. However, checks on pid and permissions are +performed first so that the other useful side effects of this routine +are retained.

+

If a process specified by pid exists, and if the calling +process has permission, the scheduling policy and scheduling +parameters shall be set for the process whose process ID is equal to +pid. +

+

If pid is zero, the scheduling policy and scheduling +parameters shall be set for the calling process. +

+

Implementations may require that the requesting process have +permission to set its own scheduling parameters or those of another +process. Additionally, implementation-defined restrictions may apply +as to the appropriate privileges required to set a process’ own +scheduling policy, or another process’ scheduling policy, to a +particular value. +

+

The sched_setscheduler function shall be considered +successful if it succeeds in setting the scheduling policy and +scheduling parameters of the process specified by pid to the +values specified by policy and the structure pointed to by +param, respectively. +

+

The effect of this function on individual threads is dependent on +the scheduling contention scope of the threads: +

+
+
* +
+ For threads with system scheduling contention scope, these functions + shall have no effect on their scheduling. +
+ * +
+ For threads with process scheduling contention scope, the threads’ + scheduling policy and associated parameters shall not be affected. + However, the scheduling of these threads with respect to threads in + other processes may be dependent on the scheduling parameters of + their process, which are governed using these functions. +
+

+This function is not atomic with respect to other threads in the +process. Threads may continue to execute while this function call is +in the process of changing the scheduling policy and associated +scheduling parameters for the underlying kernel-scheduled entities +used by the process contention scope threads. +

+

Return Value

+

Upon successful completion, the function shall return the former +scheduling policy of the specified process. If the sched_setscheduler +function fails to complete successfully, the policy and scheduling +parameters shall remain unchanged, and the function shall return a +value of -1 and set errno to indicate the error. +

+

Errors

+

The sched_setscheduler function shall fail if: +

+
+
EINVAL +
+ The value of the policy parameter is invalid, or one or more + of the parameters contained in param is outside the valid + range for the specified scheduling policy. +
+ EPERM +
+ The requesting process does not have permission to set either or + both of the scheduling parameters or the scheduling policy of the + specified process. +
+ ESRCH +
+ No process can be found corresponding to that specified by pid. +
+

+The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

sched_getscheduler(3) +, the Base Definitions volume of IEEE Std 1003.1-2001, +<sched.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+

Modified by Ross Johnson for use with Pthreads-w32.

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/sched_yield.html b/win32/3rdparty/pthreads/manual/sched_yield.html new file mode 100644 index 000000000..fa5ed04d5 --- /dev/null +++ b/win32/3rdparty/pthreads/manual/sched_yield.html @@ -0,0 +1,98 @@ + + + + + "SCHED_YIELD"(P) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

sched_yield - yield the processor +

+

Synopsis

+

#include <sched.h> +

+

int sched_yield(void); +

+

Description

+

The sched_yield function shall force the running thread to +relinquish the processor until it again becomes the head of its +thread list. It takes no arguments. +

+

Return Value

+

The sched_yield function shall return 0 if it completes +successfully; otherwise, it shall return a value of -1 and set errno +to indicate the error. +

+

Errors

+

No errors are defined. +

+

The following sections are informative. +

+

Examples

+

None. +

+

Application Usage

+

None. +

+

Rationale

+

None. +

+

Future Directions

+

None. +

+

See Also

+

The Base Definitions volume of IEEE Std 1003.1-2001, +<sched.h> +

+

Copyright

+

Portions of this text are reprinted and reproduced in electronic +form from IEEE Std 1003.1, 2003 Edition, Standard for Information +Technology -- Portable Operating System Interface (POSIX), The Open +Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the +Institute of Electrical and Electronics Engineers, Inc and The Open +Group. In the event of any discrepancy between this version and the +original IEEE and The Open Group Standard, the original IEEE and The +Open Group Standard is the referee document. The original Standard +can be obtained online at http://www.opengroup.org/unix/online.html +. +

+
+

Table of Contents

+ + + diff --git a/win32/3rdparty/pthreads/manual/sem_init.html b/win32/3rdparty/pthreads/manual/sem_init.html new file mode 100644 index 000000000..80e0580dc --- /dev/null +++ b/win32/3rdparty/pthreads/manual/sem_init.html @@ -0,0 +1,200 @@ + + + + + SEMAPHORES(3) manual page + + + + + + + +

POSIX Threads for Windows – REFERENCE - Pthreads-w32

+

Reference Index

+

Table of Contents

+

Name

+

sem_init, sem_wait, sem_trywait, sem_post, sem_getvalue, +sem_destroy - operations on semaphores +

+

Synopsis

+

#include <semaphore.h> +

+

int sem_init(sem_t *sem, int pshared, +unsigned int value); +

+

int sem_wait(sem_t * sem); +

+

int sem_timedwait(sem_t * sem, const struct +timespec *abstime); +

+

int sem_trywait(sem_t * sem); +

+

int sem_post(sem_t * sem); +

+

int sem_post_multiple(sem_t * sem, int +number); +

+

int sem_getvalue(sem_t * sem, int * sval); +

+

int sem_destroy(sem_t * sem); +

+

Description

+

Semaphores are counters for resources shared between threads. The +basic operations on semaphores are: increment the counter atomically, +and wait until the counter is non-null and decrement it atomically. +

+

sem_init initializes the semaphore object pointed to by +sem. The count associated with the semaphore is set initially +to value. The pshared argument indicates whether the +semaphore is local to the current process ( pshared is zero) +or is to be shared between several processes ( pshared is not +zero).

+

Pthreads-w32 currently does not support process-shared +semaphores, thus sem_init always returns with error EPERM +if pshared is not zero. +

+

sem_wait atomically decrements sem's count if it is +greater than 0 and returns immediately or it suspends the calling +thread until it can resume following a call to sem_post or +sem_post_multiple.

+

sem_timedwait atomically decrements sem's count if +it is greater than 0 and returns immediately, or it suspends the +calling thread. If abstime time arrives before the thread can +resume following a call to sem_post or sem_post_multiple, +then sem_timedwait returns with a return code of -1 after +having set errno to ETIMEDOUT. If the call can return +without suspending then abstime is not checked.

+

sem_trywait atomically decrements sem's count if it +is greater than 0 and returns immediately, or it returns immediately +with a return code of -1 after having set errno to EAGAIN. +sem_trywait never blocks.

+

sem_post either releases one thread if there are any +waiting on sem, or it atomically increments sem's +count.

+

sem_post_multiple either releases multiple threads if there +are any waiting on sem and/or it atomically increases sem's +count. If there are currently n waiters, where n the +largest number less than or equal to number, then n +waiters are released and sem's count is incremented by number +minus n.

+

sem_getvalue stores in the location pointed to by sval +the current count of the semaphore sem. In the Pthreads-w32 +implementation: if the value returned in sval is greater than +or equal to 0 it was the sem's count at some point during the +call to sem_getvalue. If the value returned in sval is +less than 0 then it's absolute value represents the number of threads +waiting on sem at some point during the call to sem_getvalue. +POSIX does not require an implementation of sem_getvalue +to return a value in sval that is less than 0, but if it does +then it's absolute value must represent the number of waiters.

+

sem_destroy destroys a semaphore object, freeing the +resources it might hold. No threads should be waiting on the +semaphore at the time sem_destroy is called.

+

Cancellation

+

sem_wait and sem_timedwait are cancellation points. +

+

Async-signal Safety

+

These routines are not async-cancel safe.

+

Return Value

+

All semaphore functions return 0 on success, or -1 on error in +which case they write an error code in errno. +

+

Errors

+

The sem_init function sets errno to the following +codes on error: +

+
+
+
EINVAL +
+ value exceeds the maximal counter value SEM_VALUE_MAX +
+ ENOSYS +
+
+
+pshared is not zero +
+

The sem_timedwait function sets errno to the +following error code on error: +

+
+
+
ETIMEDOUT +
+
+
+if abstime arrives before the waiting thread can resume +following a call to sem_post or sem_post_multiple. +
+

The sem_trywait function sets errno to the following +error code on error: +

+
+
+
EAGAIN +
+
+
+if the semaphore count is currently 0 +
+

The sem_post and sem_post_multiple functions set +errno to the following error code on error: +

+
+
+
ERANGE +
+ if after incrementing, the semaphore count would exceed + SEM_VALUE_MAX (the semaphore count is left unchanged in this + case) +
+
+

+The sem_destroy function sets errno to the following +error code on error: +

+
+
+
EBUSY +
+ if some threads are currently blocked waiting on the semaphore. +
+
+

+Author

+

Xavier Leroy <Xavier.Leroy@inria.fr> +

+

Modified by Ross Johnson for use with Pthreads-w32.

+

See Also

+

pthread_mutex_init(3) +, pthread_cond_init(3) , +pthread_cancel(3) . +

+
+

Table of Contents

+ + + \ No newline at end of file diff --git a/win32/3rdparty/pthreads/misc.c b/win32/3rdparty/pthreads/misc.c new file mode 100644 index 000000000..06d1d2137 --- /dev/null +++ b/win32/3rdparty/pthreads/misc.c @@ -0,0 +1,50 @@ +/* + * misc.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#include "pthread_kill.c" +#include "pthread_once.c" +#include "pthread_self.c" +#include "pthread_equal.c" +#include "pthread_setconcurrency.c" +#include "pthread_getconcurrency.c" +#include "ptw32_new.c" +#include "ptw32_calloc.c" +#include "ptw32_reuse.c" +#include "w32_CancelableWait.c" diff --git a/win32/3rdparty/pthreads/mutex.c b/win32/3rdparty/pthreads/mutex.c new file mode 100644 index 000000000..2e60dabe4 --- /dev/null +++ b/win32/3rdparty/pthreads/mutex.c @@ -0,0 +1,59 @@ +/* + * mutex.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _UWIN +# include +#endif +#ifndef NEED_FTIME +#include +#endif +#include "pthread.h" +#include "implement.h" + + +#include "ptw32_mutex_check_need_init.c" +#include "pthread_mutex_init.c" +#include "pthread_mutex_destroy.c" +#include "pthread_mutexattr_init.c" +#include "pthread_mutexattr_destroy.c" +#include "pthread_mutexattr_getpshared.c" +#include "pthread_mutexattr_setpshared.c" +#include "pthread_mutexattr_settype.c" +#include "pthread_mutexattr_gettype.c" +#include "pthread_mutex_lock.c" +#include "pthread_mutex_timedlock.c" +#include "pthread_mutex_unlock.c" +#include "pthread_mutex_trylock.c" diff --git a/win32/3rdparty/pthreads/need_errno.h b/win32/3rdparty/pthreads/need_errno.h new file mode 100644 index 000000000..2609f8d6b --- /dev/null +++ b/win32/3rdparty/pthreads/need_errno.h @@ -0,0 +1,132 @@ +/*** +* errno.h - system wide error numbers (set by system calls) +* +* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. +* +* Purpose: +* This file defines the system-wide error numbers (set by +* system calls). Conforms to the XENIX standard. Extended +* for compatibility with Uniforum standard. +* [System V] +* +* [Public] +* +****/ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#ifndef _INC_ERRNO +#define _INC_ERRNO + +#if !defined(_WIN32) && !defined(_MAC) +#error ERROR: Only Mac or Win32 targets supported! +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +/* Define _CRTIMP */ + +#ifndef _CRTIMP +#ifdef _DLL +#define _CRTIMP __declspec(dllimport) +#else /* ndef _DLL */ +#define _CRTIMP +#endif /* _DLL */ +#endif /* _CRTIMP */ + + +/* Define __cdecl for non-Microsoft compilers */ + +#if ( !defined(_MSC_VER) && !defined(__cdecl) ) +#define __cdecl +#endif + +/* Define _CRTAPI1 (for compatibility with the NT SDK) */ + +#ifndef _CRTAPI1 +#if _MSC_VER >= 800 && _M_IX86 >= 300 +#define _CRTAPI1 __cdecl +#else +#define _CRTAPI1 +#endif +#endif + + +/* declare reference to errno */ + +#if (defined(_MT) || defined(_MD) || defined(_DLL)) && !defined(_MAC) +_CRTIMP extern int * __cdecl _errno(void); +#define errno (*_errno()) +#else /* ndef _MT && ndef _MD && ndef _DLL */ +_CRTIMP extern int errno; +#endif /* _MT || _MD || _DLL */ + +/* Error Codes */ + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 36 + +/* defined differently in winsock.h on WinCE */ +#ifndef ENAMETOOLONG +#define ENAMETOOLONG 38 +#endif + +#define ENOLCK 39 +#define ENOSYS 40 + +/* defined differently in winsock.h on WinCE */ +#ifndef ENOTEMPTY +#define ENOTEMPTY 41 +#endif + +#define EILSEQ 42 + +/* + * Support EDEADLOCK for compatibiity with older MS-C versions. + */ +#define EDEADLOCK EDEADLK + +#ifdef __cplusplus +} +#endif + +#endif /* _INC_ERRNO */ diff --git a/win32/3rdparty/pthreads/nonportable.c b/win32/3rdparty/pthreads/nonportable.c new file mode 100644 index 000000000..6c2a990aa --- /dev/null +++ b/win32/3rdparty/pthreads/nonportable.c @@ -0,0 +1,46 @@ +/* + * nonportable.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +#include "pthread_mutexattr_setkind_np.c" +#include "pthread_mutexattr_getkind_np.c" +#include "pthread_getw32threadhandle_np.c" +#include "pthread_delay_np.c" +#include "pthread_num_processors_np.c" +#include "pthread_win32_attach_detach_np.c" +#include "pthread_timechange_handler_np.c" diff --git a/win32/3rdparty/pthreads/private.c b/win32/3rdparty/pthreads/private.c new file mode 100644 index 000000000..7e311b10e --- /dev/null +++ b/win32/3rdparty/pthreads/private.c @@ -0,0 +1,57 @@ +/* + * private.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* Must be first to define HAVE_INLINABLE_INTERLOCKED_CMPXCHG */ +#include "ptw32_InterlockedCompareExchange.c" + +#include "ptw32_MCS_lock.c" +#include "ptw32_is_attr.c" +#include "ptw32_processInitialize.c" +#include "ptw32_processTerminate.c" +#include "ptw32_threadStart.c" +#include "ptw32_threadDestroy.c" +#include "ptw32_tkAssocCreate.c" +#include "ptw32_tkAssocDestroy.c" +#include "ptw32_callUserDestroyRoutines.c" +#include "ptw32_semwait.c" +#include "ptw32_timespec.c" +#include "ptw32_relmillisecs.c" +#include "ptw32_throw.c" +#include "ptw32_getprocessors.c" diff --git a/win32/3rdparty/pthreads/pthread.c b/win32/3rdparty/pthreads/pthread.c new file mode 100644 index 000000000..660c25459 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread.c @@ -0,0 +1,65 @@ +/* + * pthread.c + * + * Description: + * This translation unit agregates pthreads-win32 translation units. + * It is used for inline optimisation of the library, + * maximising for speed at the expense of size. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* The following are ordered for inlining */ + +#include "private.c" +#include "attr.c" +#include "barrier.c" +#include "cancel.c" +#include "cleanup.c" +#include "condvar.c" +#include "create.c" +#include "dll.c" +#include "errno.c" +#include "exit.c" +#include "fork.c" +#include "global.c" +#include "misc.c" +#include "mutex.c" +#include "nonportable.c" +#include "rwlock.c" +#include "sched.c" +#include "semaphore.c" +#include "signal.c" +#include "spin.c" +#include "sync.c" +#include "tsd.c" diff --git a/win32/3rdparty/pthreads/pthread.dsp b/win32/3rdparty/pthreads/pthread.dsp new file mode 100644 index 000000000..112bff72a --- /dev/null +++ b/win32/3rdparty/pthreads/pthread.dsp @@ -0,0 +1,142 @@ +# Microsoft Developer Studio Project File - Name="pthread" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=pthread - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "pthread.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "pthread.mak" CFG="pthread - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "pthread - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "pthread - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "pthread - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "." +# PROP Intermediate_Dir "." +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "__CLEANUP_C" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /c +# SUBTRACT CPP /u +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x409 /i "." /d "NDEBUG" /d "PTW32_RC_MSC" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /out:".\pthreadVC2.dll" + +!ELSEIF "$(CFG)" == "pthread - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "." +# PROP Intermediate_Dir "." +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "__CLEANUP_C" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x409 /i "." /d "_DEBUG" /d "PTW32_RC_MSC" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib ws2_32.lib /nologo /dll /map /debug /machine:I386 /out:".\pthreadVC2.dll" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "pthread - Win32 Release" +# Name "pthread - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\pthread.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\implement.h +# End Source File +# Begin Source File + +SOURCE=.\pthread.h +# End Source File +# Begin Source File + +SOURCE=.\sched.h +# End Source File +# Begin Source File + +SOURCE=.\semaphore.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\version.rc + +!IF "$(CFG)" == "pthread - Win32 Release" + +# ADD BASE RSC /l 0xc09 +# ADD RSC /l 0x409 /i "." /d "PTW32_RC_MSC" + +!ELSEIF "$(CFG)" == "pthread - Win32 Debug" + +# ADD BASE RSC /l 0xc09 +# ADD RSC /l 0x409 /i "." /d "PTW32_RC_MSC" + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/win32/3rdparty/pthreads/pthread.dsw b/win32/3rdparty/pthreads/pthread.dsw new file mode 100644 index 000000000..815a67872 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "pthread"=.\pthread.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/win32/3rdparty/pthreads/pthread.h b/win32/3rdparty/pthreads/pthread.h new file mode 100644 index 000000000..f3d2dac96 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread.h @@ -0,0 +1,1368 @@ +/* This is an implementation of the threads API of POSIX 1003.1-2001. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#if !defined( PTHREAD_H ) +#define PTHREAD_H + +/* + * See the README file for an explanation of the pthreads-win32 version + * numbering scheme and how the DLL is named etc. + */ +#define PTW32_VERSION 2,8,0,0 +#define PTW32_VERSION_STRING "2, 8, 0, 0\0" + +/* There are three implementations of cancel cleanup. + * Note that pthread.h is included in both application + * compilation units and also internally for the library. + * The code here and within the library aims to work + * for all reasonable combinations of environments. + * + * The three implementations are: + * + * WIN32 SEH + * C + * C++ + * + * Please note that exiting a push/pop block via + * "return", "exit", "break", or "continue" will + * lead to different behaviour amongst applications + * depending upon whether the library was built + * using SEH, C++, or C. For example, a library built + * with SEH will call the cleanup routine, while both + * C++ and C built versions will not. + */ + +/* + * Define defaults for cleanup code. + * Note: Unless the build explicitly defines one of the following, then + * we default to standard C style cleanup. This style uses setjmp/longjmp + * in the cancelation and thread exit implementations and therefore won't + * do stack unwinding if linked to applications that have it (e.g. + * C++ apps). This is currently consistent with most/all commercial Unix + * POSIX threads implementations. + */ +#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) +# define __CLEANUP_C +#endif + +#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC)) +#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. +#endif + +/* + * Stop here if we are being included by the resource compiler. + */ +#ifndef RC_INVOKED + +#undef PTW32_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_LEVEL +#define PTW32_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_LEVEL +#define PTW32_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_LEVEL_MAX 3 + +#if !defined(PTW32_LEVEL) +#define PTW32_LEVEL PTW32_LEVEL_MAX +/* Include everything */ +#endif + +#ifdef _UWIN +# define HAVE_STRUCT_TIMESPEC 1 +# define HAVE_SIGNAL_H 1 +# undef HAVE_CONFIG_H +# pragma comment(lib, "pthread") +#endif + +/* + * ------------------------------------------------------------- + * + * + * Module: pthread.h + * + * Purpose: + * Provides an implementation of PThreads based upon the + * standard: + * + * POSIX 1003.1-2001 + * and + * The Single Unix Specification version 3 + * + * (these two are equivalent) + * + * in order to enhance code portability between Windows, + * various commercial Unix implementations, and Linux. + * + * See the ANNOUNCE file for a full list of conforming + * routines and defined constants, and a list of missing + * routines and constants not defined in this implementation. + * + * Authors: + * There have been many contributors to this library. + * The initial implementation was contributed by + * John Bossom, and several others have provided major + * sections or revisions of parts of the implementation. + * Often significant effort has been contributed to + * find and fix important bugs and other problems to + * improve the reliability of the library, which sometimes + * is not reflected in the amount of code which changed as + * result. + * As much as possible, the contributors are acknowledged + * in the ChangeLog file in the source code distribution + * where their changes are noted in detail. + * + * Contributors are listed in the CONTRIBUTORS file. + * + * As usual, all bouquets go to the contributors, and all + * brickbats go to the project maintainer. + * + * Maintainer: + * The code base for this project is coordinated and + * eventually pre-tested, packaged, and made available by + * + * Ross Johnson + * + * QA Testers: + * Ultimately, the library is tested in the real world by + * a host of competent and demanding scientists and + * engineers who report bugs and/or provide solutions + * which are then fixed or incorporated into subsequent + * versions of the library. Each time a bug is fixed, a + * test case is written to prove the fix and ensure + * that later changes to the code don't reintroduce the + * same error. The number of test cases is slowly growing + * and therefore so is the code reliability. + * + * Compliance: + * See the file ANNOUNCE for the list of implemented + * and not-implemented routines and defined options. + * Of course, these are all defined is this file as well. + * + * Web site: + * The source code and other information about this library + * are available from + * + * http://sources.redhat.com/pthreads-win32/ + * + * ------------------------------------------------------------- + */ + +/* Try to avoid including windows.h */ +#if defined(__MINGW32__) && defined(__cplusplus) +#define PTW32_INCLUDE_WINDOWS_H +#endif + +#ifdef PTW32_INCLUDE_WINDOWS_H +#include +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) +/* + * VC++6.0 or early compiler's header has no DWORD_PTR type. + */ +typedef unsigned long DWORD_PTR; +#endif +/* + * ----------------- + * autoconf switches + * ----------------- + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#ifndef NEED_FTIME +#include +#else /* NEED_FTIME */ +/* use native WIN32 time API */ +#endif /* NEED_FTIME */ + +#if HAVE_SIGNAL_H +#include +#endif /* HAVE_SIGNAL_H */ + +#include +#include + +/* + * Boolean values to make us independent of system includes. + */ +enum { + PTW32_FALSE = 0, + PTW32_TRUE = (! PTW32_FALSE) +}; + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#ifndef PTW32_CONFIG_H +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +#ifdef NEED_ERRNO +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Several systems don't define some error numbers. + */ +#ifndef ENOTSUP +# define ENOTSUP 48 /* This is the value in Solaris. */ +#endif + +#ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +#ifndef ENOSYS +# define ENOSYS 140 /* Semi-arbitrary value */ +#endif + +#ifndef EDEADLK +# ifdef EDEADLOCK +# define EDEADLK EDEADLOCK +# else +# define EDEADLK 36 /* This is the value in MSVC. */ +# endif +#endif + +#include + +/* + * To avoid including windows.h we define only those things that we + * actually need from it. + */ +#ifndef PTW32_INCLUDE_WINDOWS_H +#ifndef HANDLE +# define PTW32__HANDLE_DEF +# define HANDLE void * +#endif +#ifndef DWORD +# define PTW32__DWORD_DEF +# define DWORD unsigned long +#endif +#endif + +#ifndef HAVE_STRUCT_TIMESPEC +#define HAVE_STRUCT_TIMESPEC 1 +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC */ + +#ifndef SIG_BLOCK +#define SIG_BLOCK 0 +#endif /* SIG_BLOCK */ + +#ifndef SIG_UNBLOCK +#define SIG_UNBLOCK 1 +#endif /* SIG_UNBLOCK */ + +#ifndef SIG_SETMASK +#define SIG_SETMASK 2 +#endif /* SIG_SETMASK */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* + * ------------------------------------------------------------- + * + * POSIX 1003.1-2001 Options + * ========================= + * + * Options are normally set in , which is not provided + * with pthreads-win32. + * + * For conformance with the Single Unix Specification (version 3), all of the + * options below are defined, and have a value of either -1 (not supported) + * or 200112L (supported). + * + * These options can neither be left undefined nor have a value of 0, because + * either indicates that sysconf(), which is not implemented, may be used at + * runtime to check the status of the option. + * + * _POSIX_THREADS (== 200112L) + * If == 200112L, you can use threads + * + * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) + * If == 200112L, you can control the size of a thread's + * stack + * pthread_attr_getstacksize + * pthread_attr_setstacksize + * + * _POSIX_THREAD_ATTR_STACKADDR (== -1) + * If == 200112L, you can allocate and control a thread's + * stack. If not supported, the following functions + * will return ENOSYS, indicating they are not + * supported: + * pthread_attr_getstackaddr + * pthread_attr_setstackaddr + * + * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) + * If == 200112L, you can use realtime scheduling. + * This option indicates that the behaviour of some + * implemented functions conforms to the additional TPS + * requirements in the standard. E.g. rwlocks favour + * writers over readers when threads have equal priority. + * + * _POSIX_THREAD_PRIO_INHERIT (== -1) + * If == 200112L, you can create priority inheritance + * mutexes. + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PRIO_PROTECT (== -1) + * If == 200112L, you can create priority ceiling mutexes + * Indicates the availability of: + * pthread_mutex_getprioceiling + * pthread_mutex_setprioceiling + * pthread_mutexattr_getprioceiling + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprioceiling + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PROCESS_SHARED (== -1) + * If set, you can create mutexes and condition + * variables that can be shared with another + * process.If set, indicates the availability + * of: + * pthread_mutexattr_getpshared + * pthread_mutexattr_setpshared + * pthread_condattr_getpshared + * pthread_condattr_setpshared + * + * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) + * If == 200112L you can use the special *_r library + * functions that provide thread-safe behaviour + * + * _POSIX_READER_WRITER_LOCKS (== 200112L) + * If == 200112L, you can use read/write locks + * + * _POSIX_SPIN_LOCKS (== 200112L) + * If == 200112L, you can use spin locks + * + * _POSIX_BARRIERS (== 200112L) + * If == 200112L, you can use barriers + * + * + These functions provide both 'inherit' and/or + * 'protect' protocol, based upon these macro + * settings. + * + * ------------------------------------------------------------- + */ + +/* + * POSIX Options + */ +#undef _POSIX_THREADS +#define _POSIX_THREADS 200112L + +#undef _POSIX_READER_WRITER_LOCKS +#define _POSIX_READER_WRITER_LOCKS 200112L + +#undef _POSIX_SPIN_LOCKS +#define _POSIX_SPIN_LOCKS 200112L + +#undef _POSIX_BARRIERS +#define _POSIX_BARRIERS 200112L + +#undef _POSIX_THREAD_SAFE_FUNCTIONS +#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L + +#undef _POSIX_THREAD_ATTR_STACKSIZE +#define _POSIX_THREAD_ATTR_STACKSIZE 200112L + +/* + * The following options are not supported + */ +#undef _POSIX_THREAD_ATTR_STACKADDR +#define _POSIX_THREAD_ATTR_STACKADDR -1 + +#undef _POSIX_THREAD_PRIO_INHERIT +#define _POSIX_THREAD_PRIO_INHERIT -1 + +#undef _POSIX_THREAD_PRIO_PROTECT +#define _POSIX_THREAD_PRIO_PROTECT -1 + +/* TPS is not fully supported. */ +#undef _POSIX_THREAD_PRIORITY_SCHEDULING +#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 + +#undef _POSIX_THREAD_PROCESS_SHARED +#define _POSIX_THREAD_PROCESS_SHARED -1 + + +/* + * POSIX 1003.1-2001 Limits + * =========================== + * + * These limits are normally set in , which is not provided with + * pthreads-win32. + * + * PTHREAD_DESTRUCTOR_ITERATIONS + * Maximum number of attempts to destroy + * a thread's thread-specific data on + * termination (must be at least 4) + * + * PTHREAD_KEYS_MAX + * Maximum number of thread-specific data keys + * available per process (must be at least 128) + * + * PTHREAD_STACK_MIN + * Minimum supported stack size for a thread + * + * PTHREAD_THREADS_MAX + * Maximum number of threads supported per + * process (must be at least 64). + * + * SEM_NSEMS_MAX + * The maximum number of semaphores a process can have. + * (must be at least 256) + * + * SEM_VALUE_MAX + * The maximum value a semaphore can have. + * (must be at least 32767) + * + */ +#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS +#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 + +#undef PTHREAD_DESTRUCTOR_ITERATIONS +#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS + +#undef _POSIX_THREAD_KEYS_MAX +#define _POSIX_THREAD_KEYS_MAX 128 + +#undef PTHREAD_KEYS_MAX +#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX + +#undef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 0 + +#undef _POSIX_THREAD_THREADS_MAX +#define _POSIX_THREAD_THREADS_MAX 64 + + /* Arbitrary value */ +#undef PTHREAD_THREADS_MAX +#define PTHREAD_THREADS_MAX 2019 + +#undef _POSIX_SEM_NSEMS_MAX +#define _POSIX_SEM_NSEMS_MAX 256 + + /* Arbitrary value */ +#undef SEM_NSEMS_MAX +#define SEM_NSEMS_MAX 1024 + +#undef _POSIX_SEM_VALUE_MAX +#define _POSIX_SEM_VALUE_MAX 32767 + +#undef SEM_VALUE_MAX +#define SEM_VALUE_MAX INT_MAX + + +#if __GNUC__ && ! defined (__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the DLL code, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the DLL, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#ifndef PTW32_STATIC_LIB +# ifdef PTW32_BUILD +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * The Open Watcom C/C++ compiler uses a non-standard calling convention + * that passes function args in registers unless __cdecl is explicitly specified + * in exposed function prototypes. + * + * We force all calls to cdecl even though this could slow Watcom code down + * slightly. If you know that the Watcom compiler will be used to build both + * the DLL and application, then you can probably define this as a null string. + * Remember that pthread.h (this file) is used for both the DLL and application builds. + */ +#define PTW32_CDECL __cdecl + +#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX +# include +#else +/* + * Generic handle type - intended to extend uniqueness beyond + * that available with a simple pointer. It should scale for either + * IA-32 or IA-64. + */ +typedef struct { + void * p; /* Pointer to actual object */ + unsigned int x; /* Extra information - reuse count etc */ +} ptw32_handle_t; + +typedef ptw32_handle_t pthread_t; +typedef struct pthread_attr_t_ * pthread_attr_t; +typedef struct pthread_once_t_ pthread_once_t; +typedef struct pthread_key_t_ * pthread_key_t; +typedef struct pthread_mutex_t_ * pthread_mutex_t; +typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; +typedef struct pthread_cond_t_ * pthread_cond_t; +typedef struct pthread_condattr_t_ * pthread_condattr_t; +#endif +typedef struct pthread_rwlock_t_ * pthread_rwlock_t; +typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; +typedef struct pthread_spinlock_t_ * pthread_spinlock_t; +typedef struct pthread_barrier_t_ * pthread_barrier_t; +typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; + +/* + * ==================== + * ==================== + * POSIX Threads + * ==================== + * ==================== + */ + +enum { +/* + * pthread_attr_{get,set}detachstate + */ + PTHREAD_CREATE_JOINABLE = 0, /* Default */ + PTHREAD_CREATE_DETACHED = 1, + +/* + * pthread_attr_{get,set}inheritsched + */ + PTHREAD_INHERIT_SCHED = 0, + PTHREAD_EXPLICIT_SCHED = 1, /* Default */ + +/* + * pthread_{get,set}scope + */ + PTHREAD_SCOPE_PROCESS = 0, + PTHREAD_SCOPE_SYSTEM = 1, /* Default */ + +/* + * pthread_setcancelstate paramters + */ + PTHREAD_CANCEL_ENABLE = 0, /* Default */ + PTHREAD_CANCEL_DISABLE = 1, + +/* + * pthread_setcanceltype parameters + */ + PTHREAD_CANCEL_ASYNCHRONOUS = 0, + PTHREAD_CANCEL_DEFERRED = 1, /* Default */ + +/* + * pthread_mutexattr_{get,set}pshared + * pthread_condattr_{get,set}pshared + */ + PTHREAD_PROCESS_PRIVATE = 0, + PTHREAD_PROCESS_SHARED = 1, + +/* + * pthread_barrier_wait + */ + PTHREAD_BARRIER_SERIAL_THREAD = -1 +}; + +/* + * ==================== + * ==================== + * Cancelation + * ==================== + * ==================== + */ +#define PTHREAD_CANCELED ((void *) -1) + + +/* + * ==================== + * ==================== + * Once Key + * ==================== + * ==================== + */ +#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} + +struct pthread_once_t_ +{ + int done; /* indicates if user function has been executed */ + void * lock; + int reserved1; + int reserved2; +}; + + +/* + * ==================== + * ==================== + * Object initialisers + * ==================== + * ==================== + */ +#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1) +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t) -2) +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t) -3) + +/* + * Compatibility with LinuxThreads + */ +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER + +#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1) + +#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1) + +#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1) + + +/* + * Mutex types. + */ +enum +{ + /* Compatibility with LinuxThreads */ + PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, + /* For compatibility with POSIX */ + PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL +}; + + +typedef struct ptw32_cleanup_t ptw32_cleanup_t; + +#if defined(_MSC_VER) +/* Disable MSVC 'anachronism used' warning */ +#pragma warning( disable : 4229 ) +#endif + +typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); + +#if defined(_MSC_VER) +#pragma warning( default : 4229 ) +#endif + +struct ptw32_cleanup_t +{ + ptw32_cleanup_callback_t routine; + void *arg; + struct ptw32_cleanup_t *prev; +}; + +#ifdef __CLEANUP_SEH + /* + * WIN32 SEH version of cancel cleanup. + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ + _cleanup.arg = (_arg); \ + __try \ + { \ + +#define pthread_cleanup_pop( _execute ) \ + } \ + __finally \ + { \ + if( _execute || AbnormalTermination()) \ + { \ + (*(_cleanup.routine))( _cleanup.arg ); \ + } \ + } \ + } + +#else /* __CLEANUP_SEH */ + +#ifdef __CLEANUP_C + + /* + * C implementation of PThreads cancel cleanup + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ + +#define pthread_cleanup_pop( _execute ) \ + (void) ptw32_pop_cleanup( _execute ); \ + } + +#else /* __CLEANUP_C */ + +#ifdef __CLEANUP_CXX + + /* + * C++ version of cancel cleanup. + * - John E. Bossom. + */ + + class PThreadCleanup { + /* + * PThreadCleanup + * + * Purpose + * This class is a C++ helper class that is + * used to implement pthread_cleanup_push/ + * pthread_cleanup_pop. + * The destructor of this class automatically + * pops the pushed cleanup routine regardless + * of how the code exits the scope + * (i.e. such as by an exception) + */ + ptw32_cleanup_callback_t cleanUpRout; + void * obj; + int executeIt; + + public: + PThreadCleanup() : + cleanUpRout( 0 ), + obj( 0 ), + executeIt( 0 ) + /* + * No cleanup performed + */ + { + } + + PThreadCleanup( + ptw32_cleanup_callback_t routine, + void * arg ) : + cleanUpRout( routine ), + obj( arg ), + executeIt( 1 ) + /* + * Registers a cleanup routine for 'arg' + */ + { + } + + ~PThreadCleanup() + { + if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) + { + (void) (*cleanUpRout)( obj ); + } + } + + void execute( int exec ) + { + executeIt = exec; + } + }; + + /* + * C++ implementation of PThreads cancel cleanup; + * This implementation takes advantage of a helper + * class who's destructor automatically calls the + * cleanup routine if we exit our scope weirdly + */ +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ + (void *) (_arg) ); + +#define pthread_cleanup_pop( _execute ) \ + cleanup.execute( _execute ); \ + } + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __CLEANUP_CXX */ + +#endif /* __CLEANUP_C */ + +#endif /* __CLEANUP_SEH */ + +/* + * =============== + * =============== + * Methods + * =============== + * =============== + */ + +/* + * PThread Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, + int *detachstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, + void **stackaddr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, + size_t * stacksize); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, + int detachstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, + void *stackaddr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, + size_t stacksize); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, + int); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (pthread_attr_t *, + int *); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, + int inheritsched); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(pthread_attr_t * attr, + int * inheritsched); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, + int); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, + int *); + +/* + * PThread Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void *(*start) (void *), + void *arg); + +PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); + +PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, + pthread_t t2); + +PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); + +PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, + void **value_ptr); + +PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); + +PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); + +PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, + int *oldstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, + int *oldtype); + +PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); + +PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, + void (*init_routine) (void)); + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); + +PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, + void (*routine) (void *), + void *arg); +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Thread Specific Data Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, + void (*destructor) (void *)); + +PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); + +PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, + const void *value); + +PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); + + +/* + * Mutex Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t + * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, + int pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind); + +/* + * Barrier Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t + * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, + int pshared); + +/* + * Mutex Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, + const pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t *mutex, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); + +/* + * Spinlock Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); + +/* + * Barrier Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, + unsigned int count); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); + +/* + * Condition Variable Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, + int pshared); + +/* + * Condition Variable Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, + const pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); + +/* + * Scheduling + */ +PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, + int policy, + const struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, + int *policy, + struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); + +PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); + +/* + * Read-Write Lock Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, + const pthread_rwlockattr_t *attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, + int pshared); + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 + +/* + * Signal Functions. Should be defined in but MSVC and MinGW32 + * already have signal.h that don't define these. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); + +/* + * Non-portable functions + */ + +/* + * Compatibility with Linux. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, + int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, + int *kind); + +/* + * Possibly supported by other POSIX threads implementations + */ +PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); +PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); + +/* + * Useful if an application wants to statically link + * the lib rather than load the DLL at run-time. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); + +/* + * Features that are auto-detected at load/run time. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); +enum ptw32_features { + PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ + PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ +}; + +/* + * Register a system time change with the library. + * Causes the library to perform various functions + * in response to the change. Should be called whenever + * the application's top level window receives a + * WM_TIMECHANGE message. It can be passed directly to + * pthread_create() as a new thread if desired. + */ +PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); + +#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX + +/* + * Returns the Win32 HANDLE for the POSIX thread. + */ +PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); + + +/* + * Protected Methods + * + * This function blocks until the given WIN32 handle + * is signaled or pthread_cancel had been called. + * This function allows the caller to hook into the + * PThreads cancel mechanism. It is implemented using + * + * WaitForMultipleObjects + * + * on 'waitHandle' and a manually reset WIN32 Event + * used to implement pthread_cancel. The 'timeout' + * argument to TimedWait is simply passed to + * WaitForMultipleObjects. + */ +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, + DWORD timeout); + +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Thread-Safe C Runtime Library Mappings. + */ +#ifndef _UWIN +# if defined(NEED_ERRNO) + PTW32_DLLPORT int * PTW32_CDECL _errno( void ); +# else +# ifndef errno +# if (defined(_MT) || defined(_DLL)) + __declspec(dllimport) extern int * __cdecl _errno(void); +# define errno (*_errno()) +# endif +# endif +# endif +#endif + +/* + * WIN32 C runtime library had been made thread-safe + * without affecting the user interface. Provide + * mappings from the UNIX thread-safe versions to + * the standard C runtime library calls. + * Only provide function mappings for functions that + * actually exist on WIN32. + */ + +#if !defined(__MINGW32__) +#define strtok_r( _s, _sep, _lasts ) \ + ( *(_lasts) = strtok( (_s), (_sep) ) ) +#endif /* !__MINGW32__ */ + +#define asctime_r( _tm, _buf ) \ + ( strcpy( (_buf), asctime( (_tm) ) ), \ + (_buf) ) + +#define ctime_r( _clock, _buf ) \ + ( strcpy( (_buf), ctime( (_clock) ) ), \ + (_buf) ) + +#define gmtime_r( _clock, _result ) \ + ( *(_result) = *gmtime( (_clock) ), \ + (_result) ) + +#define localtime_r( _clock, _result ) \ + ( *(_result) = *localtime( (_clock) ), \ + (_result) ) + +#define rand_r( _seed ) \ + ( _seed == _seed? rand() : rand() ) + + +/* + * Some compiler environments don't define some things. + */ +#if defined(__BORLANDC__) +# define _ftime ftime +# define _timeb timeb +#endif + +#ifdef __cplusplus + +/* + * Internal exceptions + */ +class ptw32_exception {}; +class ptw32_exception_cancel : public ptw32_exception {}; +class ptw32_exception_exit : public ptw32_exception {}; + +#endif + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX + +/* FIXME: This is only required if the library was built using SEH */ +/* + * Get internal SEH tag + */ +PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); + +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +#ifndef PTW32_BUILD + +#ifdef __CLEANUP_SEH + +/* + * Redefine the SEH __except keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#define __except( E ) \ + __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ + ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) + +#endif /* __CLEANUP_SEH */ + +#ifdef __CLEANUP_CXX + +/* + * Redefine the C++ catch keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#ifdef _MSC_VER + /* + * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' + * if you want Pthread-Win32 cancelation and pthread_exit to work. + */ + +#ifndef PtW32NoCatchWarn + +#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") +#pragma message("------------------------------------------------------------------") +#pragma message("When compiling applications with MSVC++ and C++ exception handling:") +#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") +#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") +#pragma message(" cancelation and pthread_exit to work. For example:") +#pragma message("") +#pragma message(" #ifdef PtW32CatchAll") +#pragma message(" PtW32CatchAll") +#pragma message(" #else") +#pragma message(" catch(...)") +#pragma message(" #endif") +#pragma message(" {") +#pragma message(" /* Catchall block processing */") +#pragma message(" }") +#pragma message("------------------------------------------------------------------") + +#endif + +#define PtW32CatchAll \ + catch( ptw32_exception & ) { throw; } \ + catch( ... ) + +#else /* _MSC_VER */ + +#define catch( E ) \ + catch( ptw32_exception & ) { throw; } \ + catch( E ) + +#endif /* _MSC_VER */ + +#endif /* __CLEANUP_CXX */ + +#endif /* ! PTW32_BUILD */ + +#ifdef __cplusplus +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#ifdef PTW32__HANDLE_DEF +# undef HANDLE +#endif +#ifdef PTW32__DWORD_DEF +# undef DWORD +#endif + +#undef PTW32_LEVEL +#undef PTW32_LEVEL_MAX + +#endif /* ! RC_INVOKED */ + +#endif /* PTHREAD_H */ diff --git a/win32/3rdparty/pthreads/pthread_attr_destroy.c b/win32/3rdparty/pthreads/pthread_attr_destroy.c new file mode 100644 index 000000000..8b3e04c53 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_destroy.c @@ -0,0 +1,79 @@ +/* + * pthread_attr_destroy.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_attr_destroy (pthread_attr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Destroys a thread attributes object. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * + * DESCRIPTION + * Destroys a thread attributes object. + * + * NOTES: + * 1) Does not affect threads created with 'attr'. + * + * RESULTS + * 0 successfully destroyed attr, + * EINVAL 'attr' is invalid. + * + * ------------------------------------------------------ + */ +{ + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + /* + * Set the attribute object to a specific invalid value. + */ + (*attr)->valid = 0; + free (*attr); + *attr = NULL; + + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getdetachstate.c b/win32/3rdparty/pthreads/pthread_attr_getdetachstate.c new file mode 100644 index 000000000..978f28849 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getdetachstate.c @@ -0,0 +1,87 @@ +/* + * pthread_attr_getdetachstate.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_attr_getdetachstate (const pthread_attr_t * attr, int *detachstate) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function determines whether threads created with + * 'attr' will run detached. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * detachstate + * pointer to an integer into which is returned one + * of: + * + * PTHREAD_CREATE_JOINABLE + * Thread ID is valid, must be joined + * + * PTHREAD_CREATE_DETACHED + * Thread ID is invalid, cannot be joined, + * canceled, or modified + * + * + * DESCRIPTION + * This function determines whether threads created with + * 'attr' will run detached. + * + * NOTES: + * 1) You cannot join or cancel detached threads. + * + * RESULTS + * 0 successfully retrieved detach state, + * EINVAL 'attr' is invalid + * + * ------------------------------------------------------ + */ +{ + if (ptw32_is_attr (attr) != 0 || detachstate == NULL) + { + *detachstate = PTHREAD_CREATE_DETACHED; + return EINVAL; + } + + *detachstate = (*attr)->detachstate; + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getinheritsched.c b/win32/3rdparty/pthreads/pthread_attr_getinheritsched.c new file mode 100644 index 000000000..5085077a6 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getinheritsched.c @@ -0,0 +1,51 @@ +/* + * pthread_attr_getinheritsched.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_attr_getinheritsched (pthread_attr_t * attr, int *inheritsched) +{ + if (ptw32_is_attr (attr) != 0 || inheritsched == NULL) + { + return EINVAL; + } + + *inheritsched = (*attr)->inheritsched; + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getschedparam.c b/win32/3rdparty/pthreads/pthread_attr_getschedparam.c new file mode 100644 index 000000000..ab89b2241 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getschedparam.c @@ -0,0 +1,52 @@ +/* + * pthread_attr_getschedparam.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_attr_getschedparam (const pthread_attr_t * attr, + struct sched_param *param) +{ + if (ptw32_is_attr (attr) != 0 || param == NULL) + { + return EINVAL; + } + + memcpy (param, &(*attr)->param, sizeof (*param)); + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getschedpolicy.c b/win32/3rdparty/pthreads/pthread_attr_getschedpolicy.c new file mode 100644 index 000000000..04adbd5c6 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getschedpolicy.c @@ -0,0 +1,61 @@ +/* + * pthread_attr_getschedpolicy.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_attr_getschedpolicy (pthread_attr_t * attr, int *policy) +{ + if (ptw32_is_attr (attr) != 0 || policy == NULL) + { + return EINVAL; + } + + /* + * Validate the policy arg. + * Check that a policy constant wasn't passed rather than &policy. + */ + if (policy <= (int *) SCHED_MAX) + { + return EINVAL; + } + + *policy = SCHED_OTHER; + + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getscope.c b/win32/3rdparty/pthreads/pthread_attr_getscope.c new file mode 100644 index 000000000..3c863821e --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getscope.c @@ -0,0 +1,54 @@ +/* + * pthread_attr_getscope.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +pthread_attr_getscope (const pthread_attr_t * attr, int *contentionscope) +{ +#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING + *contentionscope = (*attr)->contentionscope; + return 0; +#else + return ENOSYS; +#endif +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getstackaddr.c b/win32/3rdparty/pthreads/pthread_attr_getstackaddr.c new file mode 100644 index 000000000..9b5595928 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getstackaddr.c @@ -0,0 +1,97 @@ +/* + * pthread_attr_getstackaddr.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +pthread_attr_getstackaddr (const pthread_attr_t * attr, void **stackaddr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function determines the address of the stack + * on which threads created with 'attr' will run. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * stackaddr + * pointer into which is returned the stack address. + * + * + * DESCRIPTION + * This function determines the address of the stack + * on which threads created with 'attr' will run. + * + * NOTES: + * 1) Function supported only if this macro is + * defined: + * + * _POSIX_THREAD_ATTR_STACKADDR + * + * 2) Create only one thread for each stack + * address.. + * + * RESULTS + * 0 successfully retreived stack address, + * EINVAL 'attr' is invalid + * ENOSYS function not supported + * + * ------------------------------------------------------ + */ +{ +#if defined( _POSIX_THREAD_ATTR_STACKADDR ) + + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + *stackaddr = (*attr)->stackaddr; + return 0; + +#else + + return ENOSYS; + +#endif /* _POSIX_THREAD_ATTR_STACKADDR */ +} diff --git a/win32/3rdparty/pthreads/pthread_attr_getstacksize.c b/win32/3rdparty/pthreads/pthread_attr_getstacksize.c new file mode 100644 index 000000000..da8db636c --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_getstacksize.c @@ -0,0 +1,100 @@ +/* + * pthread_attr_getstacksize.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +pthread_attr_getstacksize (const pthread_attr_t * attr, size_t * stacksize) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function determines the size of the stack on + * which threads created with 'attr' will run. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * stacksize + * pointer to size_t into which is returned the + * stack size, in bytes. + * + * + * DESCRIPTION + * This function determines the size of the stack on + * which threads created with 'attr' will run. + * + * NOTES: + * 1) Function supported only if this macro is + * defined: + * + * _POSIX_THREAD_ATTR_STACKSIZE + * + * 2) Use on newly created attributes object to + * find the default stack size. + * + * RESULTS + * 0 successfully retrieved stack size, + * EINVAL 'attr' is invalid + * ENOSYS function not supported + * + * ------------------------------------------------------ + */ +{ +#ifdef _POSIX_THREAD_ATTR_STACKSIZE + + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + /* Everything is okay. */ + *stacksize = (*attr)->stacksize; + return 0; + +#else + + return ENOSYS; + +#endif /* _POSIX_THREAD_ATTR_STACKSIZE */ + +} diff --git a/win32/3rdparty/pthreads/pthread_attr_init.c b/win32/3rdparty/pthreads/pthread_attr_init.c new file mode 100644 index 000000000..6c10bd3e7 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_init.c @@ -0,0 +1,117 @@ +/* + * pthread_attr_init.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_attr_init (pthread_attr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Initializes a thread attributes object with default + * attributes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * + * DESCRIPTION + * Initializes a thread attributes object with default + * attributes. + * + * NOTES: + * 1) Used to define thread attributes + * + * RESULTS + * 0 successfully initialized attr, + * ENOMEM insufficient memory for attr. + * + * ------------------------------------------------------ + */ +{ + pthread_attr_t attr_result; + + if (attr == NULL) + { + /* This is disallowed. */ + return EINVAL; + } + + attr_result = (pthread_attr_t) malloc (sizeof (*attr_result)); + + if (attr_result == NULL) + { + return ENOMEM; + } + +#ifdef _POSIX_THREAD_ATTR_STACKSIZE + /* + * Default to zero size. Unless changed explicitly this + * will allow Win32 to set the size to that of the + * main thread. + */ + attr_result->stacksize = 0; +#endif + +#ifdef _POSIX_THREAD_ATTR_STACKADDR + /* FIXME: Set this to something sensible when we support it. */ + attr_result->stackaddr = NULL; +#endif + + attr_result->detachstate = PTHREAD_CREATE_JOINABLE; + +#if HAVE_SIGSET_T + memset (&(attr_result->sigmask), 0, sizeof (sigset_t)); +#endif /* HAVE_SIGSET_T */ + + /* + * Win32 sets new threads to THREAD_PRIORITY_NORMAL and + * not to that of the parent thread. We choose to default to + * this arrangement. + */ + attr_result->param.sched_priority = THREAD_PRIORITY_NORMAL; + attr_result->inheritsched = PTHREAD_EXPLICIT_SCHED; + attr_result->contentionscope = PTHREAD_SCOPE_SYSTEM; + + attr_result->valid = PTW32_ATTR_VALID; + + *attr = attr_result; + + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setdetachstate.c b/win32/3rdparty/pthreads/pthread_attr_setdetachstate.c new file mode 100644 index 000000000..784642a80 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setdetachstate.c @@ -0,0 +1,91 @@ +/* + * pthread_attr_setdetachstate.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_attr_setdetachstate (pthread_attr_t * attr, int detachstate) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function specifies whether threads created with + * 'attr' will run detached. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * detachstate + * an integer containing one of: + * + * PTHREAD_CREATE_JOINABLE + * Thread ID is valid, must be joined + * + * PTHREAD_CREATE_DETACHED + * Thread ID is invalid, cannot be joined, + * canceled, or modified + * + * + * DESCRIPTION + * This function specifies whether threads created with + * 'attr' will run detached. + * + * NOTES: + * 1) You cannot join or cancel detached threads. + * + * RESULTS + * 0 successfully set detach state, + * EINVAL 'attr' or 'detachstate' is invalid + * + * ------------------------------------------------------ + */ +{ + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + if (detachstate != PTHREAD_CREATE_JOINABLE && + detachstate != PTHREAD_CREATE_DETACHED) + { + return EINVAL; + } + + (*attr)->detachstate = detachstate; + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setinheritsched.c b/win32/3rdparty/pthreads/pthread_attr_setinheritsched.c new file mode 100644 index 000000000..e0a407a3b --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setinheritsched.c @@ -0,0 +1,57 @@ +/* + * pthread_attr_setinheritsched.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_attr_setinheritsched (pthread_attr_t * attr, int inheritsched) +{ + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + if (PTHREAD_INHERIT_SCHED != inheritsched + && PTHREAD_EXPLICIT_SCHED != inheritsched) + { + return EINVAL; + } + + (*attr)->inheritsched = inheritsched; + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setschedparam.c b/win32/3rdparty/pthreads/pthread_attr_setschedparam.c new file mode 100644 index 000000000..f246bfae7 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setschedparam.c @@ -0,0 +1,63 @@ +/* + * pthread_attr_setschedparam.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_attr_setschedparam (pthread_attr_t * attr, + const struct sched_param *param) +{ + int priority; + + if (ptw32_is_attr (attr) != 0 || param == NULL) + { + return EINVAL; + } + + priority = param->sched_priority; + + /* Validate priority level. */ + if (priority < sched_get_priority_min (SCHED_OTHER) || + priority > sched_get_priority_max (SCHED_OTHER)) + { + return EINVAL; + } + + memcpy (&(*attr)->param, param, sizeof (*param)); + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setschedpolicy.c b/win32/3rdparty/pthreads/pthread_attr_setschedpolicy.c new file mode 100644 index 000000000..45ff16597 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setschedpolicy.c @@ -0,0 +1,55 @@ +/* + * pthread_attr_setschedpolicy.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_attr_setschedpolicy (pthread_attr_t * attr, int policy) +{ + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + if (policy != SCHED_OTHER) + { + return ENOTSUP; + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setscope.c b/win32/3rdparty/pthreads/pthread_attr_setscope.c new file mode 100644 index 000000000..9cef423b2 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setscope.c @@ -0,0 +1,62 @@ +/* + * pthread_attr_setscope.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +pthread_attr_setscope (pthread_attr_t * attr, int contentionscope) +{ +#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING + switch (contentionscope) + { + case PTHREAD_SCOPE_SYSTEM: + (*attr)->contentionscope = contentionscope; + return 0; + case PTHREAD_SCOPE_PROCESS: + return ENOTSUP; + default: + return EINVAL; + } +#else + return ENOSYS; +#endif +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setstackaddr.c b/win32/3rdparty/pthreads/pthread_attr_setstackaddr.c new file mode 100644 index 000000000..96a832097 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setstackaddr.c @@ -0,0 +1,97 @@ +/* + * pthread_attr_setstackaddr.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_attr_setstackaddr (pthread_attr_t * attr, void *stackaddr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Threads created with 'attr' will run on the stack + * starting at 'stackaddr'. + * Stack must be at least PTHREAD_STACK_MIN bytes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * stacksize + * stack size, in bytes. + * + * + * DESCRIPTION + * Threads created with 'attr' will run on the stack + * starting at 'stackaddr'. + * Stack must be at least PTHREAD_STACK_MIN bytes. + * + * NOTES: + * 1) Function supported only if this macro is + * defined: + * + * _POSIX_THREAD_ATTR_STACKADDR + * + * 2) Create only one thread for each stack + * address.. + * + * 3) Ensure that stackaddr is aligned. + * + * RESULTS + * 0 successfully set stack address, + * EINVAL 'attr' is invalid + * ENOSYS function not supported + * + * ------------------------------------------------------ + */ +{ +#if defined( _POSIX_THREAD_ATTR_STACKADDR ) + + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + (*attr)->stackaddr = stackaddr; + return 0; + +#else + + return ENOSYS; + +#endif /* _POSIX_THREAD_ATTR_STACKADDR */ +} diff --git a/win32/3rdparty/pthreads/pthread_attr_setstacksize.c b/win32/3rdparty/pthreads/pthread_attr_setstacksize.c new file mode 100644 index 000000000..9df46afc4 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_attr_setstacksize.c @@ -0,0 +1,110 @@ +/* + * pthread_attr_setstacksize.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_attr_setstacksize (pthread_attr_t * attr, size_t stacksize) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function specifies the size of the stack on + * which threads created with 'attr' will run. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_attr_t + * + * stacksize + * stack size, in bytes. + * + * + * DESCRIPTION + * This function specifies the size of the stack on + * which threads created with 'attr' will run. + * + * NOTES: + * 1) Function supported only if this macro is + * defined: + * + * _POSIX_THREAD_ATTR_STACKSIZE + * + * 2) Find the default first (using + * pthread_attr_getstacksize), then increase + * by multiplying. + * + * 3) Only use if thread needs more than the + * default. + * + * RESULTS + * 0 successfully set stack size, + * EINVAL 'attr' is invalid or stacksize too + * small or too big. + * ENOSYS function not supported + * + * ------------------------------------------------------ + */ +{ +#ifdef _POSIX_THREAD_ATTR_STACKSIZE + +#if PTHREAD_STACK_MIN > 0 + + /* Verify that the stack size is within range. */ + if (stacksize < PTHREAD_STACK_MIN) + { + return EINVAL; + } + +#endif + + if (ptw32_is_attr (attr) != 0) + { + return EINVAL; + } + + /* Everything is okay. */ + (*attr)->stacksize = stacksize; + return 0; + +#else + + return ENOSYS; + +#endif /* _POSIX_THREAD_ATTR_STACKSIZE */ + +} diff --git a/win32/3rdparty/pthreads/pthread_barrier_destroy.c b/win32/3rdparty/pthreads/pthread_barrier_destroy.c new file mode 100644 index 000000000..9302ba797 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrier_destroy.c @@ -0,0 +1,67 @@ +/* + * pthread_barrier_destroy.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrier_destroy (pthread_barrier_t * barrier) +{ + int result = 0; + pthread_barrier_t b; + + if (barrier == NULL || *barrier == (pthread_barrier_t) PTW32_OBJECT_INVALID) + { + return EINVAL; + } + + b = *barrier; + *barrier = NULL; + + if (0 == (result = sem_destroy (&(b->semBarrierBreeched[0])))) + { + if (0 == (result = sem_destroy (&(b->semBarrierBreeched[1])))) + { + (void) free (b); + return 0; + } + (void) sem_init (&(b->semBarrierBreeched[0]), b->pshared, 0); + } + + *barrier = b; + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_barrier_init.c b/win32/3rdparty/pthreads/pthread_barrier_init.c new file mode 100644 index 000000000..dc1b50c6f --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrier_init.c @@ -0,0 +1,81 @@ +/* + * pthread_barrier_init.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, unsigned int count) +{ + pthread_barrier_t b; + + if (barrier == NULL || count == 0) + { + return EINVAL; + } + + if (NULL != (b = (pthread_barrier_t) calloc (1, sizeof (*b)))) + { + b->pshared = (attr != NULL && *attr != NULL + ? (*attr)->pshared : PTHREAD_PROCESS_PRIVATE); + + b->nCurrentBarrierHeight = b->nInitialBarrierHeight = count; + b->iStep = 0; + + /* + * Two semaphores are used in the same way as two stepping + * stones might be used in crossing a stream. Once all + * threads are safely on one stone, the other stone can + * be moved ahead, and the threads can start moving to it. + * If some threads decide to eat their lunch before moving + * then the other threads have to wait. + */ + if (0 == sem_init (&(b->semBarrierBreeched[0]), b->pshared, 0)) + { + if (0 == sem_init (&(b->semBarrierBreeched[1]), b->pshared, 0)) + { + *barrier = b; + return 0; + } + (void) sem_destroy (&(b->semBarrierBreeched[0])); + } + (void) free (b); + } + + return ENOMEM; +} diff --git a/win32/3rdparty/pthreads/pthread_barrier_wait.c b/win32/3rdparty/pthreads/pthread_barrier_wait.c new file mode 100644 index 000000000..01ae29766 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrier_wait.c @@ -0,0 +1,99 @@ +/* + * pthread_barrier_wait.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrier_wait (pthread_barrier_t * barrier) +{ + int result; + int step; + pthread_barrier_t b; + + if (barrier == NULL || *barrier == (pthread_barrier_t) PTW32_OBJECT_INVALID) + { + return EINVAL; + } + + b = *barrier; + step = b->iStep; + + if (0 == InterlockedDecrement ((long *) &(b->nCurrentBarrierHeight))) + { + /* Must be done before posting the semaphore. */ + b->nCurrentBarrierHeight = b->nInitialBarrierHeight; + + /* + * There is no race condition between the semaphore wait and post + * because we are using two alternating semas and all threads have + * entered barrier_wait and checked nCurrentBarrierHeight before this + * barrier's sema can be posted. Any threads that have not quite + * entered sem_wait below when the multiple_post has completed + * will nevertheless continue through the semaphore (barrier) + * and will not be left stranded. + */ + result = (b->nInitialBarrierHeight > 1 + ? sem_post_multiple (&(b->semBarrierBreeched[step]), + b->nInitialBarrierHeight - 1) : 0); + } + else + { + /* + * Use the non-cancelable version of sem_wait(). + */ + result = ptw32_semwait (&(b->semBarrierBreeched[step])); + } + + /* + * The first thread across will be the PTHREAD_BARRIER_SERIAL_THREAD. + * This also sets up the alternate semaphore as the next barrier. + */ + if (0 == result) + { + result = ((PTW32_INTERLOCKED_LONG) step == + PTW32_INTERLOCKED_COMPARE_EXCHANGE ((PTW32_INTERLOCKED_LPLONG) + & (b->iStep), + (PTW32_INTERLOCKED_LONG) + (1L - step), + (PTW32_INTERLOCKED_LONG) + step) ? + PTHREAD_BARRIER_SERIAL_THREAD : 0); + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_barrierattr_destroy.c b/win32/3rdparty/pthreads/pthread_barrierattr_destroy.c new file mode 100644 index 000000000..5ab662e3f --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrierattr_destroy.c @@ -0,0 +1,83 @@ +/* + * pthread_barrier_attr_destroy.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrierattr_destroy (pthread_barrierattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Destroys a barrier attributes object. The object can + * no longer be used. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_barrierattr_t + * + * + * DESCRIPTION + * Destroys a barrier attributes object. The object can + * no longer be used. + * + * NOTES: + * 1) Does not affect barrieres created using 'attr' + * + * RESULTS + * 0 successfully released attr, + * EINVAL 'attr' is invalid. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + + if (attr == NULL || *attr == NULL) + { + result = EINVAL; + } + else + { + pthread_barrierattr_t ba = *attr; + + *attr = NULL; + free (ba); + } + + return (result); +} /* pthread_barrierattr_destroy */ diff --git a/win32/3rdparty/pthreads/pthread_barrierattr_getpshared.c b/win32/3rdparty/pthreads/pthread_barrierattr_getpshared.c new file mode 100644 index 000000000..44c467e2b --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrierattr_getpshared.c @@ -0,0 +1,95 @@ +/* + * pthread_barrier_attr_getpshared.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrierattr_getpshared (const pthread_barrierattr_t * attr, + int *pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Determine whether barriers created with 'attr' can be + * shared between processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_barrierattr_t + * + * pshared + * will be set to one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * + * DESCRIPTION + * Mutexes creatd with 'attr' can be shared between + * processes if pthread_barrier_t variable is allocated + * in memory shared by these processes. + * NOTES: + * 1) pshared barriers MUST be allocated in shared + * memory. + * 2) The following macro is defined if shared barriers + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully retrieved attribute, + * EINVAL 'attr' is invalid, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && (pshared != NULL)) + { + *pshared = (*attr)->pshared; + result = 0; + } + else + { + result = EINVAL; + } + + return (result); +} /* pthread_barrierattr_getpshared */ diff --git a/win32/3rdparty/pthreads/pthread_barrierattr_init.c b/win32/3rdparty/pthreads/pthread_barrierattr_init.c new file mode 100644 index 000000000..342f8b0c6 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrierattr_init.c @@ -0,0 +1,85 @@ +/* + * pthread_barrier_attr_init.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrierattr_init (pthread_barrierattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Initializes a barrier attributes object with default + * attributes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_barrierattr_t + * + * + * DESCRIPTION + * Initializes a barrier attributes object with default + * attributes. + * + * NOTES: + * 1) Used to define barrier types + * + * RESULTS + * 0 successfully initialized attr, + * ENOMEM insufficient memory for attr. + * + * ------------------------------------------------------ + */ +{ + pthread_barrierattr_t ba; + int result = 0; + + ba = (pthread_barrierattr_t) calloc (1, sizeof (*ba)); + + if (ba == NULL) + { + result = ENOMEM; + } + else + { + ba->pshared = PTHREAD_PROCESS_PRIVATE; + } + + *attr = ba; + + return (result); +} /* pthread_barrierattr_init */ diff --git a/win32/3rdparty/pthreads/pthread_barrierattr_setpshared.c b/win32/3rdparty/pthreads/pthread_barrierattr_setpshared.c new file mode 100644 index 000000000..08c6fde30 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_barrierattr_setpshared.c @@ -0,0 +1,119 @@ +/* + * pthread_barrier_attr_setpshared.c + * + * Description: + * This translation unit implements barrier primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, int pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Barriers created with 'attr' can be shared between + * processes if pthread_barrier_t variable is allocated + * in memory shared by these processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_barrierattr_t + * + * pshared + * must be one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * DESCRIPTION + * Mutexes creatd with 'attr' can be shared between + * processes if pthread_barrier_t variable is allocated + * in memory shared by these processes. + * + * NOTES: + * 1) pshared barriers MUST be allocated in shared + * memory. + * + * 2) The following macro is defined if shared barriers + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully set attribute, + * EINVAL 'attr' or pshared is invalid, + * ENOSYS PTHREAD_PROCESS_SHARED not supported, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && + ((pshared == PTHREAD_PROCESS_SHARED) || + (pshared == PTHREAD_PROCESS_PRIVATE))) + { + if (pshared == PTHREAD_PROCESS_SHARED) + { + +#if !defined( _POSIX_THREAD_PROCESS_SHARED ) + + result = ENOSYS; + pshared = PTHREAD_PROCESS_PRIVATE; + +#else + + result = 0; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + + } + else + { + result = 0; + } + + (*attr)->pshared = pshared; + } + else + { + result = EINVAL; + } + + return (result); + +} /* pthread_barrierattr_setpshared */ diff --git a/win32/3rdparty/pthreads/pthread_cancel.c b/win32/3rdparty/pthreads/pthread_cancel.c new file mode 100644 index 000000000..1118977ee --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_cancel.c @@ -0,0 +1,223 @@ +/* + * pthread_cancel.c + * + * Description: + * POSIX thread functions related to thread cancellation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +#if defined(_M_IX86) || defined(_X86_) +#define PTW32_PROGCTR(Context) ((Context).Eip) +#endif + +#if defined (_M_IA64) +#define PTW32_PROGCTR(Context) ((Context).StIIP) +#endif + +#if defined(_MIPS_) +#define PTW32_PROGCTR(Context) ((Context).Fir) +#endif + +#if defined(_ALPHA_) +#define PTW32_PROGCTR(Context) ((Context).Fir) +#endif + +#if defined(_PPC_) +#define PTW32_PROGCTR(Context) ((Context).Iar) +#endif + +#if defined(_AMD64_) +#define PTW32_PROGCTR(Context) ((Context).Rip) +#endif + +#if !defined(PTW32_PROGCTR) +#error Module contains CPU-specific code; modify and recompile. +#endif + +static void +ptw32_cancel_self (void) +{ + ptw32_throw (PTW32_EPS_CANCEL); + + /* Never reached */ +} + +static void CALLBACK +ptw32_cancel_callback (DWORD unused) +{ + ptw32_throw (PTW32_EPS_CANCEL); + + /* Never reached */ +} + +/* + * ptw32_RegisterCancelation() - + * Must have args of same type as QueueUserAPCEx because this function + * is a substitute for QueueUserAPCEx if it's not available. + */ +DWORD +ptw32_RegisterCancelation (PAPCFUNC unused1, HANDLE threadH, DWORD unused2) +{ + CONTEXT context; + + context.ContextFlags = CONTEXT_CONTROL; + GetThreadContext (threadH, &context); + PTW32_PROGCTR (context) = (DWORD_PTR) ptw32_cancel_self; + SetThreadContext (threadH, &context); + return 0; +} + +int +pthread_cancel (pthread_t thread) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function requests cancellation of 'thread'. + * + * PARAMETERS + * thread + * reference to an instance of pthread_t + * + * + * DESCRIPTION + * This function requests cancellation of 'thread'. + * NOTE: cancellation is asynchronous; use pthread_join to + * wait for termination of 'thread' if necessary. + * + * RESULTS + * 0 successfully requested cancellation, + * ESRCH no thread found corresponding to 'thread', + * ENOMEM implicit self thread create failed. + * ------------------------------------------------------ + */ +{ + int result; + int cancel_self; + pthread_t self; + ptw32_thread_t * tp; + + result = pthread_kill (thread, 0); + + if (0 != result) + { + return result; + } + + if ((self = pthread_self ()).p == NULL) + { + return ENOMEM; + }; + + /* + * FIXME!! + * + * Can a thread cancel itself? + * + * The standard doesn't + * specify an error to be returned if the target + * thread is itself. + * + * If it may, then we need to ensure that a thread can't + * deadlock itself trying to cancel itself asyncronously + * (pthread_cancel is required to be an async-cancel + * safe function). + */ + cancel_self = pthread_equal (thread, self); + + tp = (ptw32_thread_t *) thread.p; + + /* + * Lock for async-cancel safety. + */ + (void) pthread_mutex_lock (&tp->cancelLock); + + if (tp->cancelType == PTHREAD_CANCEL_ASYNCHRONOUS + && tp->cancelState == PTHREAD_CANCEL_ENABLE + && tp->state < PThreadStateCanceling) + { + if (cancel_self) + { + tp->state = PThreadStateCanceling; + tp->cancelState = PTHREAD_CANCEL_DISABLE; + + (void) pthread_mutex_unlock (&tp->cancelLock); + ptw32_throw (PTW32_EPS_CANCEL); + + /* Never reached */ + } + else + { + HANDLE threadH = tp->threadH; + + SuspendThread (threadH); + + if (WaitForSingleObject (threadH, 0) == WAIT_TIMEOUT) + { + tp->state = PThreadStateCanceling; + tp->cancelState = PTHREAD_CANCEL_DISABLE; + /* + * If alertdrv and QueueUserAPCEx is available then the following + * will result in a call to QueueUserAPCEx with the args given, otherwise + * this will result in a call to ptw32_RegisterCancelation and only + * the threadH arg will be used. + */ + ptw32_register_cancelation (ptw32_cancel_callback, threadH, 0); + (void) pthread_mutex_unlock (&tp->cancelLock); + ResumeThread (threadH); + } + } + } + else + { + /* + * Set for deferred cancellation. + */ + if (tp->state < PThreadStateCancelPending) + { + tp->state = PThreadStateCancelPending; + if (!SetEvent (tp->cancelEvent)) + { + result = ESRCH; + } + } + else if (tp->state >= PThreadStateCanceling) + { + result = ESRCH; + } + + (void) pthread_mutex_unlock (&tp->cancelLock); + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_cond_destroy.c b/win32/3rdparty/pthreads/pthread_cond_destroy.c new file mode 100644 index 000000000..3d29ffc40 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_cond_destroy.c @@ -0,0 +1,244 @@ +/* + * pthread_cond_destroy.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +int +pthread_cond_destroy (pthread_cond_t * cond) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function destroys a condition variable + * + * + * PARAMETERS + * cond + * pointer to an instance of pthread_cond_t + * + * + * DESCRIPTION + * This function destroys a condition variable. + * + * NOTES: + * 1) A condition variable can be destroyed + * immediately after all the threads that + * are blocked on it are awakened. e.g. + * + * struct list { + * pthread_mutex_t lm; + * ... + * } + * + * struct elt { + * key k; + * int busy; + * pthread_cond_t notbusy; + * ... + * } + * + * + * struct elt * + * list_find(struct list *lp, key k) + * { + * struct elt *ep; + * + * pthread_mutex_lock(&lp->lm); + * while ((ep = find_elt(l,k) != NULL) && ep->busy) + * pthread_cond_wait(&ep->notbusy, &lp->lm); + * if (ep != NULL) + * ep->busy = 1; + * pthread_mutex_unlock(&lp->lm); + * return(ep); + * } + * + * delete_elt(struct list *lp, struct elt *ep) + * { + * pthread_mutex_lock(&lp->lm); + * assert(ep->busy); + * ... remove ep from list ... + * ep->busy = 0; + * (A) pthread_cond_broadcast(&ep->notbusy); + * pthread_mutex_unlock(&lp->lm); + * (B) pthread_cond_destroy(&rp->notbusy); + * free(ep); + * } + * + * In this example, the condition variable + * and its list element may be freed (line B) + * immediately after all threads waiting for + * it are awakened (line A), since the mutex + * and the code ensure that no other thread + * can touch the element to be deleted. + * + * RESULTS + * 0 successfully released condition variable, + * EINVAL 'cond' is invalid, + * EBUSY 'cond' is in use, + * + * ------------------------------------------------------ + */ +{ + pthread_cond_t cv; + int result = 0, result1 = 0, result2 = 0; + + /* + * Assuming any race condition here is harmless. + */ + if (cond == NULL || *cond == NULL) + { + return EINVAL; + } + + if (*cond != PTHREAD_COND_INITIALIZER) + { + EnterCriticalSection (&ptw32_cond_list_lock); + + cv = *cond; + + /* + * Close the gate; this will synchronize this thread with + * all already signaled waiters to let them retract their + * waiter status - SEE NOTE 1 ABOVE!!! + */ + if (sem_wait (&(cv->semBlockLock)) != 0) + { + return errno; + } + + /* + * !TRY! lock mtxUnblockLock; try will detect busy condition + * and will not cause a deadlock with respect to concurrent + * signal/broadcast. + */ + if ((result = pthread_mutex_trylock (&(cv->mtxUnblockLock))) != 0) + { + (void) sem_post (&(cv->semBlockLock)); + return result; + } + + /* + * Check whether cv is still busy (still has waiters) + */ + if (cv->nWaitersBlocked > cv->nWaitersGone) + { + if (sem_post (&(cv->semBlockLock)) != 0) + { + result = errno; + } + result1 = pthread_mutex_unlock (&(cv->mtxUnblockLock)); + result2 = EBUSY; + } + else + { + /* + * Now it is safe to destroy + */ + *cond = NULL; + + if (sem_destroy (&(cv->semBlockLock)) != 0) + { + result = errno; + } + if (sem_destroy (&(cv->semBlockQueue)) != 0) + { + result1 = errno; + } + if ((result2 = pthread_mutex_unlock (&(cv->mtxUnblockLock))) == 0) + { + result2 = pthread_mutex_destroy (&(cv->mtxUnblockLock)); + } + + /* Unlink the CV from the list */ + + if (ptw32_cond_list_head == cv) + { + ptw32_cond_list_head = cv->next; + } + else + { + cv->prev->next = cv->next; + } + + if (ptw32_cond_list_tail == cv) + { + ptw32_cond_list_tail = cv->prev; + } + else + { + cv->next->prev = cv->prev; + } + + (void) free (cv); + } + + LeaveCriticalSection (&ptw32_cond_list_lock); + } + else + { + /* + * See notes in ptw32_cond_check_need_init() above also. + */ + EnterCriticalSection (&ptw32_cond_test_init_lock); + + /* + * Check again. + */ + if (*cond == PTHREAD_COND_INITIALIZER) + { + /* + * This is all we need to do to destroy a statically + * initialised cond that has not yet been used (initialised). + * If we get to here, another thread waiting to initialise + * this cond will get an EINVAL. That's OK. + */ + *cond = NULL; + } + else + { + /* + * The cv has been initialised while we were waiting + * so assume it's in use. + */ + result = EBUSY; + } + + LeaveCriticalSection (&ptw32_cond_test_init_lock); + } + + return ((result != 0) ? result : ((result1 != 0) ? result1 : result2)); +} diff --git a/win32/3rdparty/pthreads/pthread_cond_init.c b/win32/3rdparty/pthreads/pthread_cond_init.c new file mode 100644 index 000000000..d2de232f4 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_cond_init.c @@ -0,0 +1,165 @@ +/* + * pthread_cond_init.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function initializes a condition variable. + * + * PARAMETERS + * cond + * pointer to an instance of pthread_cond_t + * + * attr + * specifies optional creation attributes. + * + * + * DESCRIPTION + * This function initializes a condition variable. + * + * RESULTS + * 0 successfully created condition variable, + * EINVAL 'attr' is invalid, + * EAGAIN insufficient resources (other than + * memory, + * ENOMEM insufficient memory, + * EBUSY 'cond' is already initialized, + * + * ------------------------------------------------------ + */ +{ + int result; + pthread_cond_t cv = NULL; + + if (cond == NULL) + { + return EINVAL; + } + + if ((attr != NULL && *attr != NULL) && + ((*attr)->pshared == PTHREAD_PROCESS_SHARED)) + { + /* + * Creating condition variable that can be shared between + * processes. + */ + result = ENOSYS; + goto DONE; + } + + cv = (pthread_cond_t) calloc (1, sizeof (*cv)); + + if (cv == NULL) + { + result = ENOMEM; + goto DONE; + } + + cv->nWaitersBlocked = 0; + cv->nWaitersToUnblock = 0; + cv->nWaitersGone = 0; + + if (sem_init (&(cv->semBlockLock), 0, 1) != 0) + { + result = errno; + goto FAIL0; + } + + if (sem_init (&(cv->semBlockQueue), 0, 0) != 0) + { + result = errno; + goto FAIL1; + } + + if ((result = pthread_mutex_init (&(cv->mtxUnblockLock), 0)) != 0) + { + goto FAIL2; + } + + result = 0; + + goto DONE; + + /* + * ------------- + * Failed... + * ------------- + */ +FAIL2: + (void) sem_destroy (&(cv->semBlockQueue)); + +FAIL1: + (void) sem_destroy (&(cv->semBlockLock)); + +FAIL0: + (void) free (cv); + cv = NULL; + +DONE: + if (0 == result) + { + EnterCriticalSection (&ptw32_cond_list_lock); + + cv->next = NULL; + cv->prev = ptw32_cond_list_tail; + + if (ptw32_cond_list_tail != NULL) + { + ptw32_cond_list_tail->next = cv; + } + + ptw32_cond_list_tail = cv; + + if (ptw32_cond_list_head == NULL) + { + ptw32_cond_list_head = cv; + } + + LeaveCriticalSection (&ptw32_cond_list_lock); + } + + *cond = cv; + + return result; + +} /* pthread_cond_init */ diff --git a/win32/3rdparty/pthreads/pthread_cond_signal.c b/win32/3rdparty/pthreads/pthread_cond_signal.c new file mode 100644 index 000000000..2b4f6d4d4 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_cond_signal.c @@ -0,0 +1,231 @@ +/* + * pthread_cond_signal.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * ------------------------------------------------------------- + * Algorithm: + * See the comments at the top of pthread_cond_wait.c. + */ + +#include "pthread.h" +#include "implement.h" + +static INLINE int +ptw32_cond_unblock (pthread_cond_t * cond, int unblockAll) + /* + * Notes. + * + * Does not use the external mutex for synchronisation, + * therefore semBlockLock is needed. + * mtxUnblockLock is for LEVEL-2 synch. LEVEL-2 is the + * state where the external mutex is not necessarily locked by + * any thread, ie. between cond_wait unlocking and re-acquiring + * the lock after having been signaled or a timeout or + * cancellation. + * + * Uses the following CV elements: + * nWaitersBlocked + * nWaitersToUnblock + * nWaitersGone + * mtxUnblockLock + * semBlockLock + * semBlockQueue + */ +{ + int result; + pthread_cond_t cv; + int nSignalsToIssue; + + if (cond == NULL || *cond == NULL) + { + return EINVAL; + } + + cv = *cond; + + /* + * No-op if the CV is static and hasn't been initialised yet. + * Assuming that any race condition is harmless. + */ + if (cv == PTHREAD_COND_INITIALIZER) + { + return 0; + } + + if ((result = pthread_mutex_lock (&(cv->mtxUnblockLock))) != 0) + { + return result; + } + + if (0 != cv->nWaitersToUnblock) + { + if (0 == cv->nWaitersBlocked) + { + return pthread_mutex_unlock (&(cv->mtxUnblockLock)); + } + if (unblockAll) + { + cv->nWaitersToUnblock += (nSignalsToIssue = cv->nWaitersBlocked); + cv->nWaitersBlocked = 0; + } + else + { + nSignalsToIssue = 1; + cv->nWaitersToUnblock++; + cv->nWaitersBlocked--; + } + } + else if (cv->nWaitersBlocked > cv->nWaitersGone) + { + /* Use the non-cancellable version of sem_wait() */ + if (ptw32_semwait (&(cv->semBlockLock)) != 0) + { + result = errno; + (void) pthread_mutex_unlock (&(cv->mtxUnblockLock)); + return result; + } + if (0 != cv->nWaitersGone) + { + cv->nWaitersBlocked -= cv->nWaitersGone; + cv->nWaitersGone = 0; + } + if (unblockAll) + { + nSignalsToIssue = cv->nWaitersToUnblock = cv->nWaitersBlocked; + cv->nWaitersBlocked = 0; + } + else + { + nSignalsToIssue = cv->nWaitersToUnblock = 1; + cv->nWaitersBlocked--; + } + } + else + { + return pthread_mutex_unlock (&(cv->mtxUnblockLock)); + } + + if ((result = pthread_mutex_unlock (&(cv->mtxUnblockLock))) == 0) + { + if (sem_post_multiple (&(cv->semBlockQueue), nSignalsToIssue) != 0) + { + result = errno; + } + } + + return result; + +} /* ptw32_cond_unblock */ + +int +pthread_cond_signal (pthread_cond_t * cond) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function signals a condition variable, waking + * one waiting thread. + * If SCHED_FIFO or SCHED_RR policy threads are waiting + * the highest priority waiter is awakened; otherwise, + * an unspecified waiter is awakened. + * + * PARAMETERS + * cond + * pointer to an instance of pthread_cond_t + * + * + * DESCRIPTION + * This function signals a condition variable, waking + * one waiting thread. + * If SCHED_FIFO or SCHED_RR policy threads are waiting + * the highest priority waiter is awakened; otherwise, + * an unspecified waiter is awakened. + * + * NOTES: + * + * 1) Use when any waiter can respond and only one need + * respond (all waiters being equal). + * + * RESULTS + * 0 successfully signaled condition, + * EINVAL 'cond' is invalid, + * + * ------------------------------------------------------ + */ +{ + /* + * The '0'(FALSE) unblockAll arg means unblock ONE waiter. + */ + return (ptw32_cond_unblock (cond, 0)); + +} /* pthread_cond_signal */ + +int +pthread_cond_broadcast (pthread_cond_t * cond) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function broadcasts the condition variable, + * waking all current waiters. + * + * PARAMETERS + * cond + * pointer to an instance of pthread_cond_t + * + * + * DESCRIPTION + * This function signals a condition variable, waking + * all waiting threads. + * + * NOTES: + * + * 1) Use when more than one waiter may respond to + * predicate change or if any waiting thread may + * not be able to respond + * + * RESULTS + * 0 successfully signalled condition to all + * waiting threads, + * EINVAL 'cond' is invalid + * ENOSPC a required resource has been exhausted, + * + * ------------------------------------------------------ + */ +{ + /* + * The TRUE unblockAll arg means unblock ALL waiters. + */ + return (ptw32_cond_unblock (cond, PTW32_TRUE)); + +} /* pthread_cond_broadcast */ diff --git a/win32/3rdparty/pthreads/pthread_cond_wait.c b/win32/3rdparty/pthreads/pthread_cond_wait.c new file mode 100644 index 000000000..5511c5844 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_cond_wait.c @@ -0,0 +1,567 @@ +/* + * pthread_cond_wait.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * ------------------------------------------------------------- + * Algorithm: + * The algorithm used in this implementation is that developed by + * Alexander Terekhov in colaboration with Louis Thomas. The bulk + * of the discussion is recorded in the file README.CV, which contains + * several generations of both colaborators original algorithms. The final + * algorithm used here is the one referred to as + * + * Algorithm 8a / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ALL + * + * presented below in pseudo-code as it appeared: + * + * + * given: + * semBlockLock - bin.semaphore + * semBlockQueue - semaphore + * mtxExternal - mutex or CS + * mtxUnblockLock - mutex or CS + * nWaitersGone - int + * nWaitersBlocked - int + * nWaitersToUnblock - int + * + * wait( timeout ) { + * + * [auto: register int result ] // error checking omitted + * [auto: register int nSignalsWasLeft ] + * [auto: register int nWaitersWasGone ] + * + * sem_wait( semBlockLock ); + * nWaitersBlocked++; + * sem_post( semBlockLock ); + * + * unlock( mtxExternal ); + * bTimedOut = sem_wait( semBlockQueue,timeout ); + * + * lock( mtxUnblockLock ); + * if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { + * if ( bTimeout ) { // timeout (or canceled) + * if ( 0 != nWaitersBlocked ) { + * nWaitersBlocked--; + * } + * else { + * nWaitersGone++; // count spurious wakeups. + * } + * } + * if ( 0 == --nWaitersToUnblock ) { + * if ( 0 != nWaitersBlocked ) { + * sem_post( semBlockLock ); // open the gate. + * nSignalsWasLeft = 0; // do not open the gate + * // below again. + * } + * else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { + * nWaitersGone = 0; + * } + * } + * } + * else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or + * // spurious semaphore :-) + * sem_wait( semBlockLock ); + * nWaitersBlocked -= nWaitersGone; // something is going on here + * // - test of timeouts? :-) + * sem_post( semBlockLock ); + * nWaitersGone = 0; + * } + * unlock( mtxUnblockLock ); + * + * if ( 1 == nSignalsWasLeft ) { + * if ( 0 != nWaitersWasGone ) { + * // sem_adjust( semBlockQueue,-nWaitersWasGone ); + * while ( nWaitersWasGone-- ) { + * sem_wait( semBlockQueue ); // better now than spurious later + * } + * } sem_post( semBlockLock ); // open the gate + * } + * + * lock( mtxExternal ); + * + * return ( bTimedOut ) ? ETIMEOUT : 0; + * } + * + * signal(bAll) { + * + * [auto: register int result ] + * [auto: register int nSignalsToIssue] + * + * lock( mtxUnblockLock ); + * + * if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + * if ( 0 == nWaitersBlocked ) { // NO-OP + * return unlock( mtxUnblockLock ); + * } + * if (bAll) { + * nWaitersToUnblock += nSignalsToIssue=nWaitersBlocked; + * nWaitersBlocked = 0; + * } + * else { + * nSignalsToIssue = 1; + * nWaitersToUnblock++; + * nWaitersBlocked--; + * } + * } + * else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + * sem_wait( semBlockLock ); // close the gate + * if ( 0 != nWaitersGone ) { + * nWaitersBlocked -= nWaitersGone; + * nWaitersGone = 0; + * } + * if (bAll) { + * nSignalsToIssue = nWaitersToUnblock = nWaitersBlocked; + * nWaitersBlocked = 0; + * } + * else { + * nSignalsToIssue = nWaitersToUnblock = 1; + * nWaitersBlocked--; + * } + * } + * else { // NO-OP + * return unlock( mtxUnblockLock ); + * } + * + * unlock( mtxUnblockLock ); + * sem_post( semBlockQueue,nSignalsToIssue ); + * return result; + * } + * ------------------------------------------------------------- + * + * Algorithm 9 / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ALL + * + * presented below in pseudo-code; basically 8a... + * ...BUT W/O "spurious wakes" prevention: + * + * + * given: + * semBlockLock - bin.semaphore + * semBlockQueue - semaphore + * mtxExternal - mutex or CS + * mtxUnblockLock - mutex or CS + * nWaitersGone - int + * nWaitersBlocked - int + * nWaitersToUnblock - int + * + * wait( timeout ) { + * + * [auto: register int result ] // error checking omitted + * [auto: register int nSignalsWasLeft ] + * + * sem_wait( semBlockLock ); + * ++nWaitersBlocked; + * sem_post( semBlockLock ); + * + * unlock( mtxExternal ); + * bTimedOut = sem_wait( semBlockQueue,timeout ); + * + * lock( mtxUnblockLock ); + * if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { + * --nWaitersToUnblock; + * } + * else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or + * // spurious semaphore :-) + * sem_wait( semBlockLock ); + * nWaitersBlocked -= nWaitersGone; // something is going on here + * // - test of timeouts? :-) + * sem_post( semBlockLock ); + * nWaitersGone = 0; + * } + * unlock( mtxUnblockLock ); + * + * if ( 1 == nSignalsWasLeft ) { + * sem_post( semBlockLock ); // open the gate + * } + * + * lock( mtxExternal ); + * + * return ( bTimedOut ) ? ETIMEOUT : 0; + * } + * + * signal(bAll) { + * + * [auto: register int result ] + * [auto: register int nSignalsToIssue] + * + * lock( mtxUnblockLock ); + * + * if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! + * if ( 0 == nWaitersBlocked ) { // NO-OP + * return unlock( mtxUnblockLock ); + * } + * if (bAll) { + * nWaitersToUnblock += nSignalsToIssue=nWaitersBlocked; + * nWaitersBlocked = 0; + * } + * else { + * nSignalsToIssue = 1; + * ++nWaitersToUnblock; + * --nWaitersBlocked; + * } + * } + * else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! + * sem_wait( semBlockLock ); // close the gate + * if ( 0 != nWaitersGone ) { + * nWaitersBlocked -= nWaitersGone; + * nWaitersGone = 0; + * } + * if (bAll) { + * nSignalsToIssue = nWaitersToUnblock = nWaitersBlocked; + * nWaitersBlocked = 0; + * } + * else { + * nSignalsToIssue = nWaitersToUnblock = 1; + * --nWaitersBlocked; + * } + * } + * else { // NO-OP + * return unlock( mtxUnblockLock ); + * } + * + * unlock( mtxUnblockLock ); + * sem_post( semBlockQueue,nSignalsToIssue ); + * return result; + * } + * ------------------------------------------------------------- + * + */ + +#include "pthread.h" +#include "implement.h" + +/* + * Arguments for cond_wait_cleanup, since we can only pass a + * single void * to it. + */ +typedef struct +{ + pthread_mutex_t *mutexPtr; + pthread_cond_t cv; + int *resultPtr; +} ptw32_cond_wait_cleanup_args_t; + +static void PTW32_CDECL +ptw32_cond_wait_cleanup (void *args) +{ + ptw32_cond_wait_cleanup_args_t *cleanup_args = + (ptw32_cond_wait_cleanup_args_t *) args; + pthread_cond_t cv = cleanup_args->cv; + int *resultPtr = cleanup_args->resultPtr; + int nSignalsWasLeft; + int result; + + /* + * Whether we got here as a result of signal/broadcast or because of + * timeout on wait or thread cancellation we indicate that we are no + * longer waiting. The waiter is responsible for adjusting waiters + * (to)unblock(ed) counts (protected by unblock lock). + */ + if ((result = pthread_mutex_lock (&(cv->mtxUnblockLock))) != 0) + { + *resultPtr = result; + return; + } + + if (0 != (nSignalsWasLeft = cv->nWaitersToUnblock)) + { + --(cv->nWaitersToUnblock); + } + else if (INT_MAX / 2 == ++(cv->nWaitersGone)) + { + /* Use the non-cancellable version of sem_wait() */ + if (ptw32_semwait (&(cv->semBlockLock)) != 0) + { + *resultPtr = errno; + /* + * This is a fatal error for this CV, + * so we deliberately don't unlock + * cv->mtxUnblockLock before returning. + */ + return; + } + cv->nWaitersBlocked -= cv->nWaitersGone; + if (sem_post (&(cv->semBlockLock)) != 0) + { + *resultPtr = errno; + /* + * This is a fatal error for this CV, + * so we deliberately don't unlock + * cv->mtxUnblockLock before returning. + */ + return; + } + cv->nWaitersGone = 0; + } + + if ((result = pthread_mutex_unlock (&(cv->mtxUnblockLock))) != 0) + { + *resultPtr = result; + return; + } + + if (1 == nSignalsWasLeft) + { + if (sem_post (&(cv->semBlockLock)) != 0) + { + *resultPtr = errno; + return; + } + } + + /* + * XSH: Upon successful return, the mutex has been locked and is owned + * by the calling thread. + */ + if ((result = pthread_mutex_lock (cleanup_args->mutexPtr)) != 0) + { + *resultPtr = result; + } +} /* ptw32_cond_wait_cleanup */ + +static INLINE int +ptw32_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, const struct timespec *abstime) +{ + int result = 0; + pthread_cond_t cv; + ptw32_cond_wait_cleanup_args_t cleanup_args; + + if (cond == NULL || *cond == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static condition variable. We check + * again inside the guarded section of ptw32_cond_check_need_init() + * to avoid race conditions. + */ + if (*cond == PTHREAD_COND_INITIALIZER) + { + result = ptw32_cond_check_need_init (cond); + } + + if (result != 0 && result != EBUSY) + { + return result; + } + + cv = *cond; + + /* Thread can be cancelled in sem_wait() but this is OK */ + if (sem_wait (&(cv->semBlockLock)) != 0) + { + return errno; + } + + ++(cv->nWaitersBlocked); + + if (sem_post (&(cv->semBlockLock)) != 0) + { + return errno; + } + + /* + * Setup this waiter cleanup handler + */ + cleanup_args.mutexPtr = mutex; + cleanup_args.cv = cv; + cleanup_args.resultPtr = &result; + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) &cleanup_args); + + /* + * Now we can release 'mutex' and... + */ + if ((result = pthread_mutex_unlock (mutex)) == 0) + { + + /* + * ...wait to be awakened by + * pthread_cond_signal, or + * pthread_cond_broadcast, or + * timeout, or + * thread cancellation + * + * Note: + * + * sem_timedwait is a cancellation point, + * hence providing the mechanism for making + * pthread_cond_wait a cancellation point. + * We use the cleanup mechanism to ensure we + * re-lock the mutex and adjust (to)unblock(ed) waiters + * counts if we are cancelled, timed out or signalled. + */ + if (sem_timedwait (&(cv->semBlockQueue), abstime) != 0) + { + result = errno; + } + } + + /* + * Always cleanup + */ + pthread_cleanup_pop (1); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + /* + * "result" can be modified by the cleanup handler. + */ + return result; + +} /* ptw32_cond_timedwait */ + + +int +pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function waits on a condition variable until + * awakened by a signal or broadcast. + * + * Caller MUST be holding the mutex lock; the + * lock is released and the caller is blocked waiting + * on 'cond'. When 'cond' is signaled, the mutex + * is re-acquired before returning to the caller. + * + * PARAMETERS + * cond + * pointer to an instance of pthread_cond_t + * + * mutex + * pointer to an instance of pthread_mutex_t + * + * + * DESCRIPTION + * This function waits on a condition variable until + * awakened by a signal or broadcast. + * + * NOTES: + * + * 1) The function must be called with 'mutex' LOCKED + * by the calling thread, or undefined behaviour + * will result. + * + * 2) This routine atomically releases 'mutex' and causes + * the calling thread to block on the condition variable. + * The blocked thread may be awakened by + * pthread_cond_signal or + * pthread_cond_broadcast. + * + * Upon successful completion, the 'mutex' has been locked and + * is owned by the calling thread. + * + * + * RESULTS + * 0 caught condition; mutex released, + * EINVAL 'cond' or 'mutex' is invalid, + * EINVAL different mutexes for concurrent waits, + * EINVAL mutex is not held by the calling thread, + * + * ------------------------------------------------------ + */ +{ + /* + * The NULL abstime arg means INFINITE waiting. + */ + return (ptw32_cond_timedwait (cond, mutex, NULL)); + +} /* pthread_cond_wait */ + + +int +pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function waits on a condition variable either until + * awakened by a signal or broadcast; or until the time + * specified by abstime passes. + * + * PARAMETERS + * cond + * pointer to an instance of pthread_cond_t + * + * mutex + * pointer to an instance of pthread_mutex_t + * + * abstime + * pointer to an instance of (const struct timespec) + * + * + * DESCRIPTION + * This function waits on a condition variable either until + * awakened by a signal or broadcast; or until the time + * specified by abstime passes. + * + * NOTES: + * 1) The function must be called with 'mutex' LOCKED + * by the calling thread, or undefined behaviour + * will result. + * + * 2) This routine atomically releases 'mutex' and causes + * the calling thread to block on the condition variable. + * The blocked thread may be awakened by + * pthread_cond_signal or + * pthread_cond_broadcast. + * + * + * RESULTS + * 0 caught condition; mutex released, + * EINVAL 'cond', 'mutex', or abstime is invalid, + * EINVAL different mutexes for concurrent waits, + * EINVAL mutex is not held by the calling thread, + * ETIMEDOUT abstime ellapsed before cond was signaled. + * + * ------------------------------------------------------ + */ +{ + if (abstime == NULL) + { + return EINVAL; + } + + return (ptw32_cond_timedwait (cond, mutex, abstime)); + +} /* pthread_cond_timedwait */ diff --git a/win32/3rdparty/pthreads/pthread_condattr_destroy.c b/win32/3rdparty/pthreads/pthread_condattr_destroy.c new file mode 100644 index 000000000..58a14828f --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_condattr_destroy.c @@ -0,0 +1,86 @@ +/* + * condvar_attr_destroy.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_condattr_destroy (pthread_condattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Destroys a condition variable attributes object. + * The object can no longer be used. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_condattr_t + * + * + * DESCRIPTION + * Destroys a condition variable attributes object. + * The object can no longer be used. + * + * NOTES: + * 1) Does not affect condition variables created + * using 'attr' + * + * RESULTS + * 0 successfully released attr, + * EINVAL 'attr' is invalid. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + + if (attr == NULL || *attr == NULL) + { + result = EINVAL; + } + else + { + (void) free (*attr); + + *attr = NULL; + result = 0; + } + + return result; + +} /* pthread_condattr_destroy */ diff --git a/win32/3rdparty/pthreads/pthread_condattr_getpshared.c b/win32/3rdparty/pthreads/pthread_condattr_getpshared.c new file mode 100644 index 000000000..a0ac6d882 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_condattr_getpshared.c @@ -0,0 +1,97 @@ +/* + * pthread_condattr_getpshared.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_condattr_getpshared (const pthread_condattr_t * attr, int *pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Determine whether condition variables created with 'attr' + * can be shared between processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_condattr_t + * + * pshared + * will be set to one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * + * DESCRIPTION + * Condition Variables created with 'attr' can be shared + * between processes if pthread_cond_t variable is allocated + * in memory shared by these processes. + * NOTES: + * 1) pshared condition variables MUST be allocated in + * shared memory. + * + * 2) The following macro is defined if shared mutexes + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully retrieved attribute, + * EINVAL 'attr' or 'pshared' is invalid, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && (pshared != NULL)) + { + *pshared = (*attr)->pshared; + result = 0; + } + else + { + result = EINVAL; + } + + return result; + +} /* pthread_condattr_getpshared */ diff --git a/win32/3rdparty/pthreads/pthread_condattr_init.c b/win32/3rdparty/pthreads/pthread_condattr_init.c new file mode 100644 index 000000000..5987878e0 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_condattr_init.c @@ -0,0 +1,87 @@ +/* + * pthread_condattr_init.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_condattr_init (pthread_condattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Initializes a condition variable attributes object + * with default attributes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_condattr_t + * + * + * DESCRIPTION + * Initializes a condition variable attributes object + * with default attributes. + * + * NOTES: + * 1) Use to define condition variable types + * 2) It is up to the application to ensure + * that it doesn't re-init an attribute + * without destroying it first. Otherwise + * a memory leak is created. + * + * RESULTS + * 0 successfully initialized attr, + * ENOMEM insufficient memory for attr. + * + * ------------------------------------------------------ + */ +{ + pthread_condattr_t attr_result; + int result = 0; + + attr_result = (pthread_condattr_t) calloc (1, sizeof (*attr_result)); + + if (attr_result == NULL) + { + result = ENOMEM; + } + + *attr = attr_result; + + return result; + +} /* pthread_condattr_init */ diff --git a/win32/3rdparty/pthreads/pthread_condattr_setpshared.c b/win32/3rdparty/pthreads/pthread_condattr_setpshared.c new file mode 100644 index 000000000..954fb3829 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_condattr_setpshared.c @@ -0,0 +1,117 @@ +/* + * pthread_condattr_setpshared.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_condattr_setpshared (pthread_condattr_t * attr, int pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Mutexes created with 'attr' can be shared between + * processes if pthread_mutex_t variable is allocated + * in memory shared by these processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_mutexattr_t + * + * pshared + * must be one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * DESCRIPTION + * Mutexes creatd with 'attr' can be shared between + * processes if pthread_mutex_t variable is allocated + * in memory shared by these processes. + * + * NOTES: + * 1) pshared mutexes MUST be allocated in shared + * memory. + * + * 2) The following macro is defined if shared mutexes + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully set attribute, + * EINVAL 'attr' or pshared is invalid, + * ENOSYS PTHREAD_PROCESS_SHARED not supported, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) + && ((pshared == PTHREAD_PROCESS_SHARED) + || (pshared == PTHREAD_PROCESS_PRIVATE))) + { + if (pshared == PTHREAD_PROCESS_SHARED) + { + +#if !defined( _POSIX_THREAD_PROCESS_SHARED ) + result = ENOSYS; + pshared = PTHREAD_PROCESS_PRIVATE; +#else + result = 0; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + + } + else + { + result = 0; + } + + (*attr)->pshared = pshared; + } + else + { + result = EINVAL; + } + + return result; + +} /* pthread_condattr_setpshared */ diff --git a/win32/3rdparty/pthreads/pthread_delay_np.c b/win32/3rdparty/pthreads/pthread_delay_np.c new file mode 100644 index 000000000..7fe9ae016 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_delay_np.c @@ -0,0 +1,171 @@ +/* + * pthreads_delay_np.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * pthread_delay_np + * + * DESCRIPTION + * + * This routine causes a thread to delay execution for a specific period of time. + * This period ends at the current time plus the specified interval. The routine + * will not return before the end of the period is reached, but may return an + * arbitrary amount of time after the period has gone by. This can be due to + * system load, thread priorities, and system timer granularity. + * + * Specifying an interval of zero (0) seconds and zero (0) nanoseconds is + * allowed and can be used to force the thread to give up the processor or to + * deliver a pending cancelation request. + * + * The timespec structure contains the following two fields: + * + * tv_sec is an integer number of seconds. + * tv_nsec is an integer number of nanoseconds. + * + * Return Values + * + * If an error condition occurs, this routine returns an integer value indicating + * the type of error. Possible return values are as follows: + * + * 0 + * Successful completion. + * [EINVAL] + * The value specified by interval is invalid. + * + * Example + * + * The following code segment would wait for 5 and 1/2 seconds + * + * struct timespec tsWait; + * int intRC; + * + * tsWait.tv_sec = 5; + * tsWait.tv_nsec = 500000000L; + * intRC = pthread_delay_np(&tsWait); + */ +int +pthread_delay_np (struct timespec *interval) +{ + DWORD wait_time; + DWORD secs_in_millisecs; + DWORD millisecs; + DWORD status; + pthread_t self; + ptw32_thread_t * sp; + + if (interval == NULL) + { + return EINVAL; + } + + if (interval->tv_sec == 0L && interval->tv_nsec == 0L) + { + pthread_testcancel (); + Sleep (0); + pthread_testcancel (); + return (0); + } + + /* convert secs to millisecs */ + secs_in_millisecs = interval->tv_sec * 1000L; + + /* convert nanosecs to millisecs (rounding up) */ + millisecs = (interval->tv_nsec + 999999L) / 1000000L; + +#if defined(__WATCOMC__) +#pragma disable_message (124) +#endif + + /* + * Most compilers will issue a warning 'comparison always 0' + * because the variable type is unsigned, but we need to keep this + * for some reason I can't recall now. + */ + if (0 > (wait_time = secs_in_millisecs + millisecs)) + { + return EINVAL; + } + +#if defined(__WATCOMC__) +#pragma enable_message (124) +#endif + + if (NULL == (self = pthread_self ()).p) + { + return ENOMEM; + } + + sp = (ptw32_thread_t *) self.p; + + if (sp->cancelState == PTHREAD_CANCEL_ENABLE) + { + /* + * Async cancelation won't catch us until wait_time is up. + * Deferred cancelation will cancel us immediately. + */ + if (WAIT_OBJECT_0 == + (status = WaitForSingleObject (sp->cancelEvent, wait_time))) + { + /* + * Canceling! + */ + (void) pthread_mutex_lock (&sp->cancelLock); + if (sp->state < PThreadStateCanceling) + { + sp->state = PThreadStateCanceling; + sp->cancelState = PTHREAD_CANCEL_DISABLE; + (void) pthread_mutex_unlock (&sp->cancelLock); + + ptw32_throw (PTW32_EPS_CANCEL); + } + + (void) pthread_mutex_unlock (&sp->cancelLock); + return ESRCH; + } + else if (status != WAIT_TIMEOUT) + { + return EINVAL; + } + } + else + { + Sleep (wait_time); + } + + return (0); +} diff --git a/win32/3rdparty/pthreads/pthread_detach.c b/win32/3rdparty/pthreads/pthread_detach.c new file mode 100644 index 000000000..00fb6adfb --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_detach.c @@ -0,0 +1,139 @@ +/* + * pthread_detach.c + * + * Description: + * This translation unit implements functions related to thread + * synchronisation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * Not needed yet, but defining it should indicate clashes with build target + * environment that should be fixed. + */ +#include + + +int +pthread_detach (pthread_t thread) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function detaches the given thread. + * + * PARAMETERS + * thread + * an instance of a pthread_t + * + * + * DESCRIPTION + * This function detaches the given thread. You may use it to + * detach the main thread or to detach a joinable thread. + * NOTE: detached threads cannot be joined; + * storage is freed immediately on termination. + * + * RESULTS + * 0 successfully detached the thread, + * EINVAL thread is not a joinable thread, + * ENOSPC a required resource has been exhausted, + * ESRCH no thread could be found for 'thread', + * + * ------------------------------------------------------ + */ +{ + int result; + BOOL destroyIt = PTW32_FALSE; + ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; + + EnterCriticalSection (&ptw32_thread_reuse_lock); + + if (NULL == tp + || thread.x != tp->ptHandle.x) + { + result = ESRCH; + } + else if (PTHREAD_CREATE_DETACHED == tp->detachState) + { + result = EINVAL; + } + else + { + /* + * Joinable ptw32_thread_t structs are not scavenged until + * a join or detach is done. The thread may have exited already, + * but all of the state and locks etc are still there. + */ + result = 0; + + if (pthread_mutex_lock (&tp->cancelLock) == 0) + { + if (tp->state != PThreadStateLast) + { + tp->detachState = PTHREAD_CREATE_DETACHED; + } + else if (tp->detachState != PTHREAD_CREATE_DETACHED) + { + /* + * Thread is joinable and has exited or is exiting. + */ + destroyIt = PTW32_TRUE; + } + (void) pthread_mutex_unlock (&tp->cancelLock); + } + else + { + /* cancelLock shouldn't fail, but if it does ... */ + result = ESRCH; + } + } + + LeaveCriticalSection (&ptw32_thread_reuse_lock); + + if (result == 0) + { + /* Thread is joinable */ + + if (destroyIt) + { + /* The thread has exited or is exiting but has not been joined or + * detached. Need to wait in case it's still exiting. + */ + (void) WaitForSingleObject(tp->threadH, INFINITE); + ptw32_threadDestroy (thread); + } + } + + return (result); + +} /* pthread_detach */ diff --git a/win32/3rdparty/pthreads/pthread_equal.c b/win32/3rdparty/pthreads/pthread_equal.c new file mode 100644 index 000000000..f96372edb --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_equal.c @@ -0,0 +1,76 @@ +/* + * pthread_equal.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_equal (pthread_t t1, pthread_t t2) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function returns nonzero if t1 and t2 are equal, else + * returns nonzero + * + * PARAMETERS + * t1, + * t2 + * thread IDs + * + * + * DESCRIPTION + * This function returns nonzero if t1 and t2 are equal, else + * returns zero. + * + * RESULTS + * non-zero if t1 and t2 refer to the same thread, + * 0 t1 and t2 do not refer to the same thread + * + * ------------------------------------------------------ + */ +{ + int result; + + /* + * We also accept NULL == NULL - treating NULL as a thread + * for this special case, because there is no error that we can return. + */ + result = ( t1.p == t2.p && t1.x == t2.x ); + + return (result); + +} /* pthread_equal */ diff --git a/win32/3rdparty/pthreads/pthread_exit.c b/win32/3rdparty/pthreads/pthread_exit.c new file mode 100644 index 000000000..a4903129b --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_exit.c @@ -0,0 +1,106 @@ +/* + * pthread_exit.c + * + * Description: + * This translation unit implements routines associated with exiting from + * a thread. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#ifndef _UWIN +//# include +#endif + +void +pthread_exit (void *value_ptr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function terminates the calling thread, returning + * the value 'value_ptr' to any joining thread. + * + * PARAMETERS + * value_ptr + * a generic data value (i.e. not the address of a value) + * + * + * DESCRIPTION + * This function terminates the calling thread, returning + * the value 'value_ptr' to any joining thread. + * NOTE: thread should be joinable. + * + * RESULTS + * N/A + * + * ------------------------------------------------------ + */ +{ + ptw32_thread_t * sp; + + /* + * Don't use pthread_self() to avoid creating an implicit POSIX thread handle + * unnecessarily. + */ + sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); + +#ifdef _UWIN + if (--pthread_count <= 0) + exit ((int) value_ptr); +#endif + + if (NULL == sp) + { + /* + * A POSIX thread handle was never created. I.e. this is a + * Win32 thread that has never called a pthreads-win32 routine that + * required a POSIX handle. + * + * Implicit POSIX handles are cleaned up in ptw32_throw() now. + */ + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + _endthreadex ((unsigned) value_ptr); +#else + _endthread (); +#endif + + /* Never reached */ + } + + sp->exitStatus = value_ptr; + + ptw32_throw (PTW32_EPS_EXIT); + + /* Never reached. */ + +} diff --git a/win32/3rdparty/pthreads/pthread_getconcurrency.c b/win32/3rdparty/pthreads/pthread_getconcurrency.c new file mode 100644 index 000000000..cf9e9c85c --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_getconcurrency.c @@ -0,0 +1,45 @@ +/* + * pthread_getconcurrency.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_getconcurrency (void) +{ + return ptw32_concurrency; +} diff --git a/win32/3rdparty/pthreads/pthread_getschedparam.c b/win32/3rdparty/pthreads/pthread_getschedparam.c new file mode 100644 index 000000000..0afcfb74a --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_getschedparam.c @@ -0,0 +1,75 @@ +/* + * sched_getschedparam.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_getschedparam (pthread_t thread, int *policy, + struct sched_param *param) +{ + int result; + + /* Validate the thread id. */ + result = pthread_kill (thread, 0); + if (0 != result) + { + return result; + } + + /* + * Validate the policy and param args. + * Check that a policy constant wasn't passed rather than &policy. + */ + if (policy <= (int *) SCHED_MAX || param == NULL) + { + return EINVAL; + } + + /* Fill out the policy. */ + *policy = SCHED_OTHER; + + /* + * This function must return the priority value set by + * the most recent pthread_setschedparam() or pthread_create() + * for the target thread. It must not return the actual thread + * priority as altered by any system priority adjustments etc. + */ + param->sched_priority = ((ptw32_thread_t *)thread.p)->sched_priority; + + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_getspecific.c b/win32/3rdparty/pthreads/pthread_getspecific.c new file mode 100644 index 000000000..b05ff410a --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_getspecific.c @@ -0,0 +1,84 @@ +/* + * pthread_getspecific.c + * + * Description: + * POSIX thread functions which implement thread-specific data (TSD). + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +void * +pthread_getspecific (pthread_key_t key) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function returns the current value of key in the + * calling thread. If no value has been set for 'key' in + * the thread, NULL is returned. + * + * PARAMETERS + * key + * an instance of pthread_key_t + * + * + * DESCRIPTION + * This function returns the current value of key in the + * calling thread. If no value has been set for 'key' in + * the thread, NULL is returned. + * + * RESULTS + * key value or NULL on failure + * + * ------------------------------------------------------ + */ +{ + void * ptr; + + if (key == NULL) + { + ptr = NULL; + } + else + { + int lasterror = GetLastError (); + int lastWSAerror = WSAGetLastError (); + + ptr = TlsGetValue (key->key); + + SetLastError (lasterror); + WSASetLastError (lastWSAerror); + } + + return ptr; +} diff --git a/win32/3rdparty/pthreads/pthread_getw32threadhandle_np.c b/win32/3rdparty/pthreads/pthread_getw32threadhandle_np.c new file mode 100644 index 000000000..9d22def3b --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_getw32threadhandle_np.c @@ -0,0 +1,53 @@ +/* + * pthread_getw32threadhandle_np.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * pthread_getw32threadhandle_np() + * + * Returns the win32 thread handle that the POSIX + * thread "thread" is running as. + * + * Applications can use the win32 handle to set + * win32 specific attributes of the thread. + */ +HANDLE +pthread_getw32threadhandle_np (pthread_t thread) +{ + return ((ptw32_thread_t *)thread.p)->threadH; +} diff --git a/win32/3rdparty/pthreads/pthread_join.c b/win32/3rdparty/pthreads/pthread_join.c new file mode 100644 index 000000000..8237b6cf7 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_join.c @@ -0,0 +1,154 @@ +/* + * pthread_join.c + * + * Description: + * This translation unit implements functions related to thread + * synchronisation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * Not needed yet, but defining it should indicate clashes with build target + * environment that should be fixed. + */ +#include + + +int +pthread_join (pthread_t thread, void **value_ptr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function waits for 'thread' to terminate and + * returns the thread's exit value if 'value_ptr' is not + * NULL. This also detaches the thread on successful + * completion. + * + * PARAMETERS + * thread + * an instance of pthread_t + * + * value_ptr + * pointer to an instance of pointer to void + * + * + * DESCRIPTION + * This function waits for 'thread' to terminate and + * returns the thread's exit value if 'value_ptr' is not + * NULL. This also detaches the thread on successful + * completion. + * NOTE: detached threads cannot be joined or canceled + * + * RESULTS + * 0 'thread' has completed + * EINVAL thread is not a joinable thread, + * ESRCH no thread could be found with ID 'thread', + * ENOENT thread couldn't find it's own valid handle, + * EDEADLK attempt to join thread with self + * + * ------------------------------------------------------ + */ +{ + int result; + pthread_t self; + ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; + + EnterCriticalSection (&ptw32_thread_reuse_lock); + + if (NULL == tp + || thread.x != tp->ptHandle.x) + { + result = ESRCH; + } + else if (PTHREAD_CREATE_DETACHED == tp->detachState) + { + result = EINVAL; + } + else + { + result = 0; + } + + LeaveCriticalSection (&ptw32_thread_reuse_lock); + + if (result == 0) + { + /* + * The target thread is joinable and can't be reused before we join it. + */ + self = pthread_self(); + + if (NULL == self.p) + { + result = ENOENT; + } + else if (pthread_equal (self, thread)) + { + result = EDEADLK; + } + else + { + /* + * Pthread_join is a cancelation point. + * If we are canceled then our target thread must not be + * detached (destroyed). This is guarranteed because + * pthreadCancelableWait will not return if we + * are canceled. + */ + result = pthreadCancelableWait (tp->threadH); + + if (0 == result) + { + if (value_ptr != NULL) + { + *value_ptr = tp->exitStatus; + } + + /* + * The result of making multiple simultaneous calls to + * pthread_join() or pthread_detach() specifying the same + * target is undefined. + */ + result = pthread_detach (thread); + } + else + { + result = ESRCH; + } + } + } + + return (result); + +} /* pthread_join */ diff --git a/win32/3rdparty/pthreads/pthread_key_create.c b/win32/3rdparty/pthreads/pthread_key_create.c new file mode 100644 index 000000000..5e278c2ca --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_key_create.c @@ -0,0 +1,108 @@ +/* + * pthread_key_create.c + * + * Description: + * POSIX thread functions which implement thread-specific data (TSD). + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +/* TLS_OUT_OF_INDEXES not defined on WinCE */ +#ifndef TLS_OUT_OF_INDEXES +#define TLS_OUT_OF_INDEXES 0xffffffff +#endif + +int +pthread_key_create (pthread_key_t * key, void (*destructor) (void *)) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function creates a thread-specific data key visible + * to all threads. All existing and new threads have a value + * NULL for key until set using pthread_setspecific. When any + * thread with a non-NULL value for key terminates, 'destructor' + * is called with key's current value for that thread. + * + * PARAMETERS + * key + * pointer to an instance of pthread_key_t + * + * + * DESCRIPTION + * This function creates a thread-specific data key visible + * to all threads. All existing and new threads have a value + * NULL for key until set using pthread_setspecific. When any + * thread with a non-NULL value for key terminates, 'destructor' + * is called with key's current value for that thread. + * + * RESULTS + * 0 successfully created semaphore, + * EAGAIN insufficient resources or PTHREAD_KEYS_MAX + * exceeded, + * ENOMEM insufficient memory to create the key, + * + * ------------------------------------------------------ + */ +{ + int result = 0; + pthread_key_t newkey; + + if ((newkey = (pthread_key_t) calloc (1, sizeof (*newkey))) == NULL) + { + result = ENOMEM; + } + else if ((newkey->key = TlsAlloc ()) == TLS_OUT_OF_INDEXES) + { + result = EAGAIN; + + free (newkey); + newkey = NULL; + } + else if (destructor != NULL) + { + /* + * Have to manage associations between thread and key; + * Therefore, need a lock that allows multiple threads + * to gain exclusive access to the key->threads list. + * + * The mutex will only be created when it is first locked. + */ + newkey->keyLock = PTHREAD_MUTEX_INITIALIZER; + newkey->destructor = destructor; + } + + *key = newkey; + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_key_delete.c b/win32/3rdparty/pthreads/pthread_key_delete.c new file mode 100644 index 000000000..7da9b2fb6 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_key_delete.c @@ -0,0 +1,133 @@ +/* + * pthread_key_delete.c + * + * Description: + * POSIX thread functions which implement thread-specific data (TSD). + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_key_delete (pthread_key_t key) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function deletes a thread-specific data key. This + * does not change the value of the thread specific data key + * for any thread and does not run the key's destructor + * in any thread so it should be used with caution. + * + * PARAMETERS + * key + * pointer to an instance of pthread_key_t + * + * + * DESCRIPTION + * This function deletes a thread-specific data key. This + * does not change the value of the thread specific data key + * for any thread and does not run the key's destructor + * in any thread so it should be used with caution. + * + * RESULTS + * 0 successfully deleted the key, + * EINVAL key is invalid, + * + * ------------------------------------------------------ + */ +{ + int result = 0; + + if (key != NULL) + { + if (key->threads != NULL && + key->destructor != NULL && + pthread_mutex_lock (&(key->keyLock)) == 0) + { + ThreadKeyAssoc *assoc; + /* + * Run through all Thread<-->Key associations + * for this key. + * + * While we hold at least one of the locks guarding + * the assoc, we know that the assoc pointed to by + * key->threads is valid. + */ + while ((assoc = (ThreadKeyAssoc *) key->threads) != NULL) + { + ptw32_thread_t * thread = assoc->thread; + + if (assoc == NULL) + { + /* Finished */ + break; + } + + if (pthread_mutex_lock (&(thread->threadLock)) == 0) + { + /* + * Since we are starting at the head of the key's threads + * chain, this will also point key->threads at the next assoc. + * While we hold key->keyLock, no other thread can insert + * a new assoc via pthread_setspecific. + */ + ptw32_tkAssocDestroy (assoc); + (void) pthread_mutex_unlock (&(thread->threadLock)); + } + else + { + /* Thread or lock is no longer valid? */ + ptw32_tkAssocDestroy (assoc); + } + } + pthread_mutex_unlock (&(key->keyLock)); + } + + TlsFree (key->key); + if (key->destructor != NULL) + { + /* A thread could be holding the keyLock */ + while (EBUSY == pthread_mutex_destroy (&(key->keyLock))) + { + Sleep(1); // Ugly. + } + } + +#if defined( _DEBUG ) + memset ((char *) key, 0, sizeof (*key)); +#endif + free (key); + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_kill.c b/win32/3rdparty/pthreads/pthread_kill.c new file mode 100644 index 000000000..7de3fe2aa --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_kill.c @@ -0,0 +1,102 @@ +/* + * pthread_kill.c + * + * Description: + * This translation unit implements the pthread_kill routine. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * Not needed yet, but defining it should indicate clashes with build target + * environment that should be fixed. + */ +#include + +int +pthread_kill (pthread_t thread, int sig) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function requests that a signal be delivered to the + * specified thread. If sig is zero, error checking is + * performed but no signal is actually sent such that this + * function can be used to check for a valid thread ID. + * + * PARAMETERS + * thread reference to an instances of pthread_t + * sig signal. Currently only a value of 0 is supported. + * + * + * DESCRIPTION + * This function requests that a signal be delivered to the + * specified thread. If sig is zero, error checking is + * performed but no signal is actually sent such that this + * function can be used to check for a valid thread ID. + * + * RESULTS + * ESRCH the thread is not a valid thread ID, + * EINVAL the value of the signal is invalid + * or unsupported. + * 0 the signal was successfully sent. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + ptw32_thread_t * tp; + + EnterCriticalSection (&ptw32_thread_reuse_lock); + + tp = (ptw32_thread_t *) thread.p; + + if (NULL == tp + || thread.x != tp->ptHandle.x + || NULL == tp->threadH) + { + result = ESRCH; + } + + LeaveCriticalSection (&ptw32_thread_reuse_lock); + + if (0 == result && 0 != sig) + { + /* + * Currently does not support any signals. + */ + result = EINVAL; + } + + return result; + +} /* pthread_kill */ diff --git a/win32/3rdparty/pthreads/pthread_mutex_destroy.c b/win32/3rdparty/pthreads/pthread_mutex_destroy.c new file mode 100644 index 000000000..95509b3df --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutex_destroy.c @@ -0,0 +1,146 @@ +/* + * pthread_mutex_destroy.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutex_destroy (pthread_mutex_t * mutex) +{ + int result = 0; + pthread_mutex_t mx; + + /* + * Let the system deal with invalid pointers. + */ + + /* + * Check to see if we have something to delete. + */ + if (*mutex < PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + mx = *mutex; + + result = pthread_mutex_trylock (&mx); + + /* + * If trylock succeeded and the mutex is not recursively locked it + * can be destroyed. + */ + if (result == 0) + { + if (mx->kind != PTHREAD_MUTEX_RECURSIVE || 1 == mx->recursive_count) + { + /* + * FIXME!!! + * The mutex isn't held by another thread but we could still + * be too late invalidating the mutex below since another thread + * may already have entered mutex_lock and the check for a valid + * *mutex != NULL. + * + * Note that this would be an unusual situation because it is not + * common that mutexes are destroyed while they are still in + * use by other threads. + */ + *mutex = NULL; + + result = pthread_mutex_unlock (&mx); + + if (result == 0) + { + if (!CloseHandle (mx->event)) + { + *mutex = mx; + result = EINVAL; + } + else + { + free (mx); + } + } + else + { + /* + * Restore the mutex before we return the error. + */ + *mutex = mx; + } + } + else /* mx->recursive_count > 1 */ + { + /* + * The mutex must be recursive and already locked by us (this thread). + */ + mx->recursive_count--; /* Undo effect of pthread_mutex_trylock() above */ + result = EBUSY; + } + } + } + else + { + /* + * See notes in ptw32_mutex_check_need_init() above also. + */ + EnterCriticalSection (&ptw32_mutex_test_init_lock); + + /* + * Check again. + */ + if (*mutex >= PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + /* + * This is all we need to do to destroy a statically + * initialised mutex that has not yet been used (initialised). + * If we get to here, another thread + * waiting to initialise this mutex will get an EINVAL. + */ + *mutex = NULL; + } + else + { + /* + * The mutex has been initialised while we were waiting + * so assume it's in use. + */ + result = EBUSY; + } + + LeaveCriticalSection (&ptw32_mutex_test_init_lock); + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_mutex_init.c b/win32/3rdparty/pthreads/pthread_mutex_init.c new file mode 100644 index 000000000..cff8e5054 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutex_init.c @@ -0,0 +1,104 @@ +/* + * pthread_mutex_init.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr) +{ + int result = 0; + pthread_mutex_t mx; + + if (mutex == NULL) + { + return EINVAL; + } + + if (attr != NULL + && *attr != NULL && (*attr)->pshared == PTHREAD_PROCESS_SHARED) + { + /* + * Creating mutex that can be shared between + * processes. + */ +#if _POSIX_THREAD_PROCESS_SHARED >= 0 + + /* + * Not implemented yet. + */ + +#error ERROR [__FILE__, line __LINE__]: Process shared mutexes are not supported yet. + +#else + + return ENOSYS; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + + } + + mx = (pthread_mutex_t) calloc (1, sizeof (*mx)); + + if (mx == NULL) + { + result = ENOMEM; + } + else + { + mx->lock_idx = 0; + mx->recursive_count = 0; + mx->kind = (attr == NULL || *attr == NULL + ? PTHREAD_MUTEX_DEFAULT : (*attr)->kind); + mx->ownerThread.p = NULL; + + mx->event = CreateEvent (NULL, PTW32_FALSE, /* manual reset = No */ + PTW32_FALSE, /* initial state = not signaled */ + NULL); /* event name */ + + if (0 == mx->event) + { + result = ENOSPC; + free (mx); + mx = NULL; + } + } + + *mutex = mx; + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_mutex_lock.c b/win32/3rdparty/pthreads/pthread_mutex_lock.c new file mode 100644 index 000000000..4ca5c252f --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutex_lock.c @@ -0,0 +1,139 @@ +/* + * pthread_mutex_lock.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _UWIN +//# include +#endif +#include "pthread.h" +#include "implement.h" + +int +pthread_mutex_lock (pthread_mutex_t * mutex) +{ + int result = 0; + pthread_mutex_t mx; + + /* + * Let the system deal with invalid pointers. + */ + if (*mutex == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static mutex. We check + * again inside the guarded section of ptw32_mutex_check_need_init() + * to avoid race conditions. + */ + if (*mutex >= PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + if ((result = ptw32_mutex_check_need_init (mutex)) != 0) + { + return (result); + } + } + + mx = *mutex; + + if (mx->kind == PTHREAD_MUTEX_NORMAL) + { + if ((LONG) PTW32_INTERLOCKED_EXCHANGE( + (LPLONG) &mx->lock_idx, + (LONG) 1) != 0) + { + while ((LONG) PTW32_INTERLOCKED_EXCHANGE( + (LPLONG) &mx->lock_idx, + (LONG) -1) != 0) + { + if (WAIT_OBJECT_0 != WaitForSingleObject (mx->event, INFINITE)) + { + result = EINVAL; + break; + } + } + } + } + else + { + pthread_t self = pthread_self(); + + if ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) 0) == 0) + { + mx->recursive_count = 1; + mx->ownerThread = self; + } + else + { + if (pthread_equal (mx->ownerThread, self)) + { + if (mx->kind == PTHREAD_MUTEX_RECURSIVE) + { + mx->recursive_count++; + } + else + { + result = EDEADLK; + } + } + else + { + while ((LONG) PTW32_INTERLOCKED_EXCHANGE( + (LPLONG) &mx->lock_idx, + (LONG) -1) != 0) + { + if (WAIT_OBJECT_0 != WaitForSingleObject (mx->event, INFINITE)) + { + result = EINVAL; + break; + } + } + + if (0 == result) + { + mx->recursive_count = 1; + mx->ownerThread = self; + } + } + } + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_mutex_timedlock.c b/win32/3rdparty/pthreads/pthread_mutex_timedlock.c new file mode 100644 index 000000000..a2385522d --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutex_timedlock.c @@ -0,0 +1,196 @@ +/* + * pthread_mutex_timedlock.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +static INLINE int +ptw32_timed_eventwait (HANDLE event, const struct timespec *abstime) + /* + * ------------------------------------------------------ + * DESCRIPTION + * This function waits on an event until signaled or until + * abstime passes. + * If abstime has passed when this routine is called then + * it returns a result to indicate this. + * + * If 'abstime' is a NULL pointer then this function will + * block until it can successfully decrease the value or + * until interrupted by a signal. + * + * This routine is not a cancelation point. + * + * RESULTS + * 0 successfully signaled, + * ETIMEDOUT abstime passed + * EINVAL 'event' is not a valid event, + * + * ------------------------------------------------------ + */ +{ + + DWORD milliseconds; + DWORD status; + + if (event == NULL) + { + return EINVAL; + } + else + { + if (abstime == NULL) + { + milliseconds = INFINITE; + } + else + { + /* + * Calculate timeout as milliseconds from current system time. + */ + milliseconds = ptw32_relmillisecs (abstime); + } + + status = WaitForSingleObject (event, milliseconds); + + if (status == WAIT_OBJECT_0) + { + return 0; + } + else if (status == WAIT_TIMEOUT) + { + return ETIMEDOUT; + } + else + { + return EINVAL; + } + } + + return 0; + +} /* ptw32_timed_semwait */ + + +int +pthread_mutex_timedlock (pthread_mutex_t * mutex, + const struct timespec *abstime) +{ + int result; + pthread_mutex_t mx; + + /* + * Let the system deal with invalid pointers. + */ + + /* + * We do a quick check to see if we need to do more work + * to initialise a static mutex. We check + * again inside the guarded section of ptw32_mutex_check_need_init() + * to avoid race conditions. + */ + if (*mutex >= PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + if ((result = ptw32_mutex_check_need_init (mutex)) != 0) + { + return (result); + } + } + + mx = *mutex; + + if (mx->kind == PTHREAD_MUTEX_NORMAL) + { + if ((LONG) PTW32_INTERLOCKED_EXCHANGE( + (LPLONG) &mx->lock_idx, + (LONG) 1) != 0) + { + while ((LONG) PTW32_INTERLOCKED_EXCHANGE( + (LPLONG) &mx->lock_idx, + (LONG) -1) != 0) + { + if (0 != (result = ptw32_timed_eventwait (mx->event, abstime))) + { + return result; + } + } + } + } + else + { + pthread_t self = pthread_self(); + + if ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) 0) == 0) + { + mx->recursive_count = 1; + mx->ownerThread = self; + } + else + { + if (pthread_equal (mx->ownerThread, self)) + { + if (mx->kind == PTHREAD_MUTEX_RECURSIVE) + { + mx->recursive_count++; + } + else + { + return EDEADLK; + } + } + else + { + while ((LONG) PTW32_INTERLOCKED_EXCHANGE( + (LPLONG) &mx->lock_idx, + (LONG) -1) != 0) + { + if (0 != (result = ptw32_timed_eventwait (mx->event, abstime))) + { + return result; + } + } + + mx->recursive_count = 1; + mx->ownerThread = self; + } + } + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/pthread_mutex_trylock.c b/win32/3rdparty/pthreads/pthread_mutex_trylock.c new file mode 100644 index 000000000..50e8bc65c --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutex_trylock.c @@ -0,0 +1,92 @@ +/* + * pthread_mutex_trylock.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutex_trylock (pthread_mutex_t * mutex) +{ + int result = 0; + pthread_mutex_t mx; + + /* + * Let the system deal with invalid pointers. + */ + + /* + * We do a quick check to see if we need to do more work + * to initialise a static mutex. We check + * again inside the guarded section of ptw32_mutex_check_need_init() + * to avoid race conditions. + */ + if (*mutex >= PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + if ((result = ptw32_mutex_check_need_init (mutex)) != 0) + { + return (result); + } + } + + mx = *mutex; + + if (0 == (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE ( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) 0)) + { + if (mx->kind != PTHREAD_MUTEX_NORMAL) + { + mx->recursive_count = 1; + mx->ownerThread = pthread_self (); + } + } + else + { + if (mx->kind == PTHREAD_MUTEX_RECURSIVE && + pthread_equal (mx->ownerThread, pthread_self ())) + { + mx->recursive_count++; + } + else + { + result = EBUSY; + } + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_mutex_unlock.c b/win32/3rdparty/pthreads/pthread_mutex_unlock.c new file mode 100644 index 000000000..9ebe4e378 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutex_unlock.c @@ -0,0 +1,119 @@ +/* + * pthread_mutex_unlock.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutex_unlock (pthread_mutex_t * mutex) +{ + int result = 0; + pthread_mutex_t mx; + + /* + * Let the system deal with invalid pointers. + */ + + mx = *mutex; + + /* + * If the thread calling us holds the mutex then there is no + * race condition. If another thread holds the + * lock then we shouldn't be in here. + */ + if (mx < PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + if (mx->kind == PTHREAD_MUTEX_NORMAL) + { + LONG idx; + + idx = (LONG) PTW32_INTERLOCKED_EXCHANGE ((LPLONG) &mx->lock_idx, + (LONG) 0); + if (idx != 0) + { + if (idx < 0) + { + /* + * Someone may be waiting on that mutex. + */ + if (SetEvent (mx->event) == 0) + { + result = EINVAL; + } + } + } + else + { + /* + * Was not locked (so can't be owned by us). + */ + result = EPERM; + } + } + else + { + if (pthread_equal (mx->ownerThread, pthread_self ())) + { + if (mx->kind != PTHREAD_MUTEX_RECURSIVE + || 0 == --mx->recursive_count) + { + mx->ownerThread.p = NULL; + + if ((LONG) PTW32_INTERLOCKED_EXCHANGE ((LPLONG) &mx->lock_idx, + (LONG) 0) < 0) + { + /* Someone may be waiting on that mutex */ + if (SetEvent (mx->event) == 0) + { + result = EINVAL; + } + } + } + } + else + { + result = EPERM; + } + } + } + else + { + result = EINVAL; + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_destroy.c b/win32/3rdparty/pthreads/pthread_mutexattr_destroy.c new file mode 100644 index 000000000..9d424bfa2 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_destroy.c @@ -0,0 +1,83 @@ +/* + * pthread_mutexattr_destroy.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutexattr_destroy (pthread_mutexattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Destroys a mutex attributes object. The object can + * no longer be used. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_mutexattr_t + * + * + * DESCRIPTION + * Destroys a mutex attributes object. The object can + * no longer be used. + * + * NOTES: + * 1) Does not affect mutexes created using 'attr' + * + * RESULTS + * 0 successfully released attr, + * EINVAL 'attr' is invalid. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + + if (attr == NULL || *attr == NULL) + { + result = EINVAL; + } + else + { + pthread_mutexattr_t ma = *attr; + + *attr = NULL; + free (ma); + } + + return (result); +} /* pthread_mutexattr_destroy */ diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_getkind_np.c b/win32/3rdparty/pthreads/pthread_mutexattr_getkind_np.c new file mode 100644 index 000000000..2d82ec6bc --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_getkind_np.c @@ -0,0 +1,44 @@ +/* + * pthread_mutexattr_getkind_np.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +int +pthread_mutexattr_getkind_np (pthread_mutexattr_t * attr, int *kind) +{ + return pthread_mutexattr_gettype (attr, kind); +} diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_getpshared.c b/win32/3rdparty/pthreads/pthread_mutexattr_getpshared.c new file mode 100644 index 000000000..42f9589c5 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_getpshared.c @@ -0,0 +1,95 @@ +/* + * pthread_mutexattr_getpshared.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, int *pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Determine whether mutexes created with 'attr' can be + * shared between processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_mutexattr_t + * + * pshared + * will be set to one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * + * DESCRIPTION + * Mutexes creatd with 'attr' can be shared between + * processes if pthread_mutex_t variable is allocated + * in memory shared by these processes. + * NOTES: + * 1) pshared mutexes MUST be allocated in shared + * memory. + * 2) The following macro is defined if shared mutexes + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully retrieved attribute, + * EINVAL 'attr' is invalid, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && (pshared != NULL)) + { + *pshared = (*attr)->pshared; + result = 0; + } + else + { + result = EINVAL; + } + + return (result); + +} /* pthread_mutexattr_getpshared */ diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_gettype.c b/win32/3rdparty/pthreads/pthread_mutexattr_gettype.c new file mode 100644 index 000000000..b60ca30bf --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_gettype.c @@ -0,0 +1,56 @@ +/* + * pthread_mutexattr_gettype.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind) +{ + int result = 0; + + if (attr != NULL && *attr != NULL && kind != NULL) + { + *kind = (*attr)->kind; + } + else + { + result = EINVAL; + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_init.c b/win32/3rdparty/pthreads/pthread_mutexattr_init.c new file mode 100644 index 000000000..d2797ff24 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_init.c @@ -0,0 +1,86 @@ +/* + * pthread_mutexattr_init.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutexattr_init (pthread_mutexattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Initializes a mutex attributes object with default + * attributes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_mutexattr_t + * + * + * DESCRIPTION + * Initializes a mutex attributes object with default + * attributes. + * + * NOTES: + * 1) Used to define mutex types + * + * RESULTS + * 0 successfully initialized attr, + * ENOMEM insufficient memory for attr. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + pthread_mutexattr_t ma; + + ma = (pthread_mutexattr_t) calloc (1, sizeof (*ma)); + + if (ma == NULL) + { + result = ENOMEM; + } + else + { + ma->pshared = PTHREAD_PROCESS_PRIVATE; + ma->kind = PTHREAD_MUTEX_DEFAULT; + } + + *attr = ma; + + return (result); +} /* pthread_mutexattr_init */ diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_setkind_np.c b/win32/3rdparty/pthreads/pthread_mutexattr_setkind_np.c new file mode 100644 index 000000000..faa936658 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_setkind_np.c @@ -0,0 +1,44 @@ +/* + * pthread_mutexattr_setkind_np.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +int +pthread_mutexattr_setkind_np (pthread_mutexattr_t * attr, int kind) +{ + return pthread_mutexattr_settype (attr, kind); +} diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_setpshared.c b/win32/3rdparty/pthreads/pthread_mutexattr_setpshared.c new file mode 100644 index 000000000..cfa6f7199 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_setpshared.c @@ -0,0 +1,119 @@ +/* + * pthread_mutexattr_setpshared.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Mutexes created with 'attr' can be shared between + * processes if pthread_mutex_t variable is allocated + * in memory shared by these processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_mutexattr_t + * + * pshared + * must be one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * DESCRIPTION + * Mutexes creatd with 'attr' can be shared between + * processes if pthread_mutex_t variable is allocated + * in memory shared by these processes. + * + * NOTES: + * 1) pshared mutexes MUST be allocated in shared + * memory. + * + * 2) The following macro is defined if shared mutexes + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully set attribute, + * EINVAL 'attr' or pshared is invalid, + * ENOSYS PTHREAD_PROCESS_SHARED not supported, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && + ((pshared == PTHREAD_PROCESS_SHARED) || + (pshared == PTHREAD_PROCESS_PRIVATE))) + { + if (pshared == PTHREAD_PROCESS_SHARED) + { + +#if !defined( _POSIX_THREAD_PROCESS_SHARED ) + + result = ENOSYS; + pshared = PTHREAD_PROCESS_PRIVATE; + +#else + + result = 0; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + + } + else + { + result = 0; + } + + (*attr)->pshared = pshared; + } + else + { + result = EINVAL; + } + + return (result); + +} /* pthread_mutexattr_setpshared */ diff --git a/win32/3rdparty/pthreads/pthread_mutexattr_settype.c b/win32/3rdparty/pthreads/pthread_mutexattr_settype.c new file mode 100644 index 000000000..8365daf65 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_mutexattr_settype.c @@ -0,0 +1,143 @@ +/* + * pthread_mutexattr_settype.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind) + /* + * ------------------------------------------------------ + * + * DOCPUBLIC + * The pthread_mutexattr_settype() and + * pthread_mutexattr_gettype() functions respectively set and + * get the mutex type attribute. This attribute is set in the + * type parameter to these functions. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_mutexattr_t + * + * type + * must be one of: + * + * PTHREAD_MUTEX_DEFAULT + * + * PTHREAD_MUTEX_NORMAL + * + * PTHREAD_MUTEX_ERRORCHECK + * + * PTHREAD_MUTEX_RECURSIVE + * + * DESCRIPTION + * The pthread_mutexattr_settype() and + * pthread_mutexattr_gettype() functions respectively set and + * get the mutex type attribute. This attribute is set in the + * type parameter to these functions. The default value of the + * type attribute is PTHREAD_MUTEX_DEFAULT. + * + * The type of mutex is contained in the type attribute of the + * mutex attributes. Valid mutex types include: + * + * PTHREAD_MUTEX_NORMAL + * This type of mutex does not detect deadlock. A + * thread attempting to relock this mutex without + * first unlocking it will deadlock. Attempting to + * unlock a mutex locked by a different thread + * results in undefined behavior. Attempting to + * unlock an unlocked mutex results in undefined + * behavior. + * + * PTHREAD_MUTEX_ERRORCHECK + * This type of mutex provides error checking. A + * thread attempting to relock this mutex without + * first unlocking it will return with an error. A + * thread attempting to unlock a mutex which another + * thread has locked will return with an error. A + * thread attempting to unlock an unlocked mutex will + * return with an error. + * + * PTHREAD_MUTEX_DEFAULT + * Same as PTHREAD_MUTEX_NORMAL. + * + * PTHREAD_MUTEX_RECURSIVE + * A thread attempting to relock this mutex without + * first unlocking it will succeed in locking the + * mutex. The relocking deadlock which can occur with + * mutexes of type PTHREAD_MUTEX_NORMAL cannot occur + * with this type of mutex. Multiple locks of this + * mutex require the same number of unlocks to + * release the mutex before another thread can + * acquire the mutex. A thread attempting to unlock a + * mutex which another thread has locked will return + * with an error. A thread attempting to unlock an + * unlocked mutex will return with an error. This + * type of mutex is only supported for mutexes whose + * process shared attribute is + * PTHREAD_PROCESS_PRIVATE. + * + * RESULTS + * 0 successfully set attribute, + * EINVAL 'attr' or 'type' is invalid, + * + * ------------------------------------------------------ + */ +{ + int result = 0; + + if ((attr != NULL && *attr != NULL)) + { + switch (kind) + { + case PTHREAD_MUTEX_FAST_NP: + case PTHREAD_MUTEX_RECURSIVE_NP: + case PTHREAD_MUTEX_ERRORCHECK_NP: + (*attr)->kind = kind; + break; + default: + result = EINVAL; + break; + } + } + else + { + result = EINVAL; + } + + return (result); +} /* pthread_mutexattr_settype */ diff --git a/win32/3rdparty/pthreads/pthread_num_processors_np.c b/win32/3rdparty/pthreads/pthread_num_processors_np.c new file mode 100644 index 000000000..3067d117d --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_num_processors_np.c @@ -0,0 +1,56 @@ +/* + * pthread_num_processors_np.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * pthread_num_processors_np() + * + * Get the number of CPUs available to the process. + */ +int +pthread_num_processors_np (void) +{ + int count; + + if (ptw32_getprocessors (&count) != 0) + { + count = 1; + } + + return (count); +} diff --git a/win32/3rdparty/pthreads/pthread_once.c b/win32/3rdparty/pthreads/pthread_once.c new file mode 100644 index 000000000..96d45f297 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_once.c @@ -0,0 +1,86 @@ +/* + * pthread_once.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +static void PTW32_CDECL +ptw32_once_on_init_cancel (void * arg) +{ + /* when the initting thread is cancelled we have to release the lock */ + ptw32_mcs_local_node_t *node = (ptw32_mcs_local_node_t *)arg; + ptw32_mcs_lock_release(node); +} + +int +pthread_once (pthread_once_t * once_control, void (*init_routine) (void)) +{ + if (once_control == NULL || init_routine == NULL) + { + return EINVAL; + } + + if (!InterlockedExchangeAdd((LPLONG)&once_control->done, 0)) /* MBR fence */ + { + ptw32_mcs_local_node_t node; + + ptw32_mcs_lock_acquire((ptw32_mcs_lock_t *)&once_control->lock, &node); + + if (!once_control->done) + { + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + + pthread_cleanup_push(ptw32_once_on_init_cancel, (void *)&node); + (*init_routine)(); + pthread_cleanup_pop(0); + +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + once_control->done = PTW32_TRUE; + } + + ptw32_mcs_lock_release(&node); + } + + return 0; + +} /* pthread_once */ diff --git a/win32/3rdparty/pthreads/pthread_rwlock_destroy.c b/win32/3rdparty/pthreads/pthread_rwlock_destroy.c new file mode 100644 index 000000000..5a747ede0 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_destroy.c @@ -0,0 +1,143 @@ +/* + * pthread_rwlock_destroy.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_destroy (pthread_rwlock_t * rwlock) +{ + pthread_rwlock_t rwl; + int result = 0, result1 = 0, result2 = 0; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + if (*rwlock != PTHREAD_RWLOCK_INITIALIZER) + { + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = pthread_mutex_lock (&(rwl->mtxExclusiveAccess))) != 0) + { + return result; + } + + if ((result = + pthread_mutex_lock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + /* + * Check whether any threads own/wait for the lock (wait for ex.access); + * report "BUSY" if so. + */ + if (rwl->nExclusiveAccessCount > 0 + || rwl->nSharedAccessCount > rwl->nCompletedSharedAccessCount) + { + result = pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted)); + result1 = pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + result2 = EBUSY; + } + else + { + rwl->nMagic = 0; + + if ((result = + pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + pthread_mutex_unlock (&rwl->mtxExclusiveAccess); + return result; + } + + if ((result = + pthread_mutex_unlock (&(rwl->mtxExclusiveAccess))) != 0) + { + return result; + } + + *rwlock = NULL; /* Invalidate rwlock before anything else */ + result = pthread_cond_destroy (&(rwl->cndSharedAccessCompleted)); + result1 = pthread_mutex_destroy (&(rwl->mtxSharedAccessCompleted)); + result2 = pthread_mutex_destroy (&(rwl->mtxExclusiveAccess)); + (void) free (rwl); + } + } + else + { + /* + * See notes in ptw32_rwlock_check_need_init() above also. + */ + EnterCriticalSection (&ptw32_rwlock_test_init_lock); + + /* + * Check again. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + /* + * This is all we need to do to destroy a statically + * initialised rwlock that has not yet been used (initialised). + * If we get to here, another thread + * waiting to initialise this rwlock will get an EINVAL. + */ + *rwlock = NULL; + } + else + { + /* + * The rwlock has been initialised while we were waiting + * so assume it's in use. + */ + result = EBUSY; + } + + LeaveCriticalSection (&ptw32_rwlock_test_init_lock); + } + + return ((result != 0) ? result : ((result1 != 0) ? result1 : result2)); +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_init.c b/win32/3rdparty/pthreads/pthread_rwlock_init.c new file mode 100644 index 000000000..3e3f448c0 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_init.c @@ -0,0 +1,110 @@ +/* + * pthread_rwlock_init.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_init (pthread_rwlock_t * rwlock, + const pthread_rwlockattr_t * attr) +{ + int result; + pthread_rwlock_t rwl = 0; + + if (rwlock == NULL) + { + return EINVAL; + } + + if (attr != NULL && *attr != NULL) + { + result = EINVAL; /* Not supported */ + goto DONE; + } + + rwl = (pthread_rwlock_t) calloc (1, sizeof (*rwl)); + + if (rwl == NULL) + { + result = ENOMEM; + goto DONE; + } + + rwl->nSharedAccessCount = 0; + rwl->nExclusiveAccessCount = 0; + rwl->nCompletedSharedAccessCount = 0; + + result = pthread_mutex_init (&rwl->mtxExclusiveAccess, NULL); + if (result != 0) + { + goto FAIL0; + } + + result = pthread_mutex_init (&rwl->mtxSharedAccessCompleted, NULL); + if (result != 0) + { + goto FAIL1; + } + + result = pthread_cond_init (&rwl->cndSharedAccessCompleted, NULL); + if (result != 0) + { + goto FAIL2; + } + + rwl->nMagic = PTW32_RWLOCK_MAGIC; + + result = 0; + goto DONE; + +FAIL2: + (void) pthread_mutex_destroy (&(rwl->mtxSharedAccessCompleted)); + +FAIL1: + (void) pthread_mutex_destroy (&(rwl->mtxExclusiveAccess)); + +FAIL0: + (void) free (rwl); + rwl = NULL; + +DONE: + *rwlock = rwl; + + return result; +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_rdlock.c b/win32/3rdparty/pthreads/pthread_rwlock_rdlock.c new file mode 100644 index 000000000..dba63ddfb --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_rdlock.c @@ -0,0 +1,103 @@ +/* + * pthread_rwlock_rdlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_rdlock (pthread_rwlock_t * rwlock) +{ + int result; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static rwlock. We check + * again inside the guarded section of ptw32_rwlock_check_need_init() + * to avoid race conditions. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = ptw32_rwlock_check_need_init (rwlock); + + if (result != 0 && result != EBUSY) + { + return result; + } + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = pthread_mutex_lock (&(rwl->mtxExclusiveAccess))) != 0) + { + return result; + } + + if (++rwl->nSharedAccessCount == INT_MAX) + { + if ((result = + pthread_mutex_lock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + rwl->nSharedAccessCount -= rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + + if ((result = + pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + } + + return (pthread_mutex_unlock (&(rwl->mtxExclusiveAccess))); +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_timedrdlock.c b/win32/3rdparty/pthreads/pthread_rwlock_timedrdlock.c new file mode 100644 index 000000000..93489502e --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_timedrdlock.c @@ -0,0 +1,110 @@ +/* + * pthread_rwlock_timedrdlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_timedrdlock (pthread_rwlock_t * rwlock, + const struct timespec *abstime) +{ + int result; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static rwlock. We check + * again inside the guarded section of ptw32_rwlock_check_need_init() + * to avoid race conditions. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = ptw32_rwlock_check_need_init (rwlock); + + if (result != 0 && result != EBUSY) + { + return result; + } + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = + pthread_mutex_timedlock (&(rwl->mtxExclusiveAccess), abstime)) != 0) + { + return result; + } + + if (++rwl->nSharedAccessCount == INT_MAX) + { + if ((result = + pthread_mutex_timedlock (&(rwl->mtxSharedAccessCompleted), + abstime)) != 0) + { + if (result == ETIMEDOUT) + { + ++rwl->nCompletedSharedAccessCount; + } + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + rwl->nSharedAccessCount -= rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + + if ((result = + pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + } + + return (pthread_mutex_unlock (&(rwl->mtxExclusiveAccess))); +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_timedwrlock.c b/win32/3rdparty/pthreads/pthread_rwlock_timedwrlock.c new file mode 100644 index 000000000..e7d1be257 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_timedwrlock.c @@ -0,0 +1,140 @@ +/* + * pthread_rwlock_timedwrlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_timedwrlock (pthread_rwlock_t * rwlock, + const struct timespec *abstime) +{ + int result; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static rwlock. We check + * again inside the guarded section of ptw32_rwlock_check_need_init() + * to avoid race conditions. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = ptw32_rwlock_check_need_init (rwlock); + + if (result != 0 && result != EBUSY) + { + return result; + } + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = + pthread_mutex_timedlock (&(rwl->mtxExclusiveAccess), abstime)) != 0) + { + return result; + } + + if ((result = + pthread_mutex_timedlock (&(rwl->mtxSharedAccessCompleted), + abstime)) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + if (rwl->nExclusiveAccessCount == 0) + { + if (rwl->nCompletedSharedAccessCount > 0) + { + rwl->nSharedAccessCount -= rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + } + + if (rwl->nSharedAccessCount > 0) + { + rwl->nCompletedSharedAccessCount = -rwl->nSharedAccessCount; + + /* + * This routine may be a cancelation point + * according to POSIX 1003.1j section 18.1.2. + */ +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push (ptw32_rwlock_cancelwrwait, (void *) rwl); + + do + { + result = + pthread_cond_timedwait (&(rwl->cndSharedAccessCompleted), + &(rwl->mtxSharedAccessCompleted), + abstime); + } + while (result == 0 && rwl->nCompletedSharedAccessCount < 0); + + pthread_cleanup_pop ((result != 0) ? 1 : 0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + if (result == 0) + { + rwl->nSharedAccessCount = 0; + } + } + } + + if (result == 0) + { + rwl->nExclusiveAccessCount++; + } + + return result; +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_tryrdlock.c b/win32/3rdparty/pthreads/pthread_rwlock_tryrdlock.c new file mode 100644 index 000000000..308900d14 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_tryrdlock.c @@ -0,0 +1,103 @@ +/* + * pthread_rwlock_tryrdlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_tryrdlock (pthread_rwlock_t * rwlock) +{ + int result; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static rwlock. We check + * again inside the guarded section of ptw32_rwlock_check_need_init() + * to avoid race conditions. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = ptw32_rwlock_check_need_init (rwlock); + + if (result != 0 && result != EBUSY) + { + return result; + } + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = pthread_mutex_trylock (&(rwl->mtxExclusiveAccess))) != 0) + { + return result; + } + + if (++rwl->nSharedAccessCount == INT_MAX) + { + if ((result = + pthread_mutex_lock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + rwl->nSharedAccessCount -= rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + + if ((result = + pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + } + + return (pthread_mutex_unlock (&rwl->mtxExclusiveAccess)); +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_trywrlock.c b/win32/3rdparty/pthreads/pthread_rwlock_trywrlock.c new file mode 100644 index 000000000..8ba8b5dad --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_trywrlock.c @@ -0,0 +1,123 @@ +/* + * pthread_rwlock_trywrlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_trywrlock (pthread_rwlock_t * rwlock) +{ + int result, result1; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static rwlock. We check + * again inside the guarded section of ptw32_rwlock_check_need_init() + * to avoid race conditions. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = ptw32_rwlock_check_need_init (rwlock); + + if (result != 0 && result != EBUSY) + { + return result; + } + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = pthread_mutex_trylock (&(rwl->mtxExclusiveAccess))) != 0) + { + return result; + } + + if ((result = + pthread_mutex_trylock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + result1 = pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return ((result1 != 0) ? result1 : result); + } + + if (rwl->nExclusiveAccessCount == 0) + { + if (rwl->nCompletedSharedAccessCount > 0) + { + rwl->nSharedAccessCount -= rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + } + + if (rwl->nSharedAccessCount > 0) + { + if ((result = + pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + if ((result = + pthread_mutex_unlock (&(rwl->mtxExclusiveAccess))) == 0) + { + result = EBUSY; + } + } + else + { + rwl->nExclusiveAccessCount = 1; + } + } + else + { + result = EBUSY; + } + + return result; +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_unlock.c b/win32/3rdparty/pthreads/pthread_rwlock_unlock.c new file mode 100644 index 000000000..776c996fe --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_unlock.c @@ -0,0 +1,94 @@ +/* + * pthread_rwlock_unlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_unlock (pthread_rwlock_t * rwlock) +{ + int result, result1; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return (EINVAL); + } + + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + /* + * Assume any race condition here is harmless. + */ + return 0; + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if (rwl->nExclusiveAccessCount == 0) + { + if ((result = + pthread_mutex_lock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + return result; + } + + if (++rwl->nCompletedSharedAccessCount == 0) + { + result = pthread_cond_signal (&(rwl->cndSharedAccessCompleted)); + } + + result1 = pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted)); + } + else + { + rwl->nExclusiveAccessCount--; + + result = pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted)); + result1 = pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + + } + + return ((result != 0) ? result : result1); +} diff --git a/win32/3rdparty/pthreads/pthread_rwlock_wrlock.c b/win32/3rdparty/pthreads/pthread_rwlock_wrlock.c new file mode 100644 index 000000000..a09704044 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlock_wrlock.c @@ -0,0 +1,134 @@ +/* + * pthread_rwlock_wrlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlock_wrlock (pthread_rwlock_t * rwlock) +{ + int result; + pthread_rwlock_t rwl; + + if (rwlock == NULL || *rwlock == NULL) + { + return EINVAL; + } + + /* + * We do a quick check to see if we need to do more work + * to initialise a static rwlock. We check + * again inside the guarded section of ptw32_rwlock_check_need_init() + * to avoid race conditions. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = ptw32_rwlock_check_need_init (rwlock); + + if (result != 0 && result != EBUSY) + { + return result; + } + } + + rwl = *rwlock; + + if (rwl->nMagic != PTW32_RWLOCK_MAGIC) + { + return EINVAL; + } + + if ((result = pthread_mutex_lock (&(rwl->mtxExclusiveAccess))) != 0) + { + return result; + } + + if ((result = pthread_mutex_lock (&(rwl->mtxSharedAccessCompleted))) != 0) + { + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); + return result; + } + + if (rwl->nExclusiveAccessCount == 0) + { + if (rwl->nCompletedSharedAccessCount > 0) + { + rwl->nSharedAccessCount -= rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + } + + if (rwl->nSharedAccessCount > 0) + { + rwl->nCompletedSharedAccessCount = -rwl->nSharedAccessCount; + + /* + * This routine may be a cancelation point + * according to POSIX 1003.1j section 18.1.2. + */ +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push (ptw32_rwlock_cancelwrwait, (void *) rwl); + + do + { + result = pthread_cond_wait (&(rwl->cndSharedAccessCompleted), + &(rwl->mtxSharedAccessCompleted)); + } + while (result == 0 && rwl->nCompletedSharedAccessCount < 0); + + pthread_cleanup_pop ((result != 0) ? 1 : 0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + if (result == 0) + { + rwl->nSharedAccessCount = 0; + } + } + } + + if (result == 0) + { + rwl->nExclusiveAccessCount++; + } + + return result; +} diff --git a/win32/3rdparty/pthreads/pthread_rwlockattr_destroy.c b/win32/3rdparty/pthreads/pthread_rwlockattr_destroy.c new file mode 100644 index 000000000..0fcbe8405 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlockattr_destroy.c @@ -0,0 +1,85 @@ +/* + * pthread_rwlockattr_destroy.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Destroys a rwlock attributes object. The object can + * no longer be used. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_rwlockattr_t + * + * + * DESCRIPTION + * Destroys a rwlock attributes object. The object can + * no longer be used. + * + * NOTES: + * 1) Does not affect rwlockss created using 'attr' + * + * RESULTS + * 0 successfully released attr, + * EINVAL 'attr' is invalid. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + + if (attr == NULL || *attr == NULL) + { + result = EINVAL; + } + else + { + pthread_rwlockattr_t rwa = *attr; + + *attr = NULL; + free (rwa); + } + + return (result); +} /* pthread_rwlockattr_destroy */ diff --git a/win32/3rdparty/pthreads/pthread_rwlockattr_getpshared.c b/win32/3rdparty/pthreads/pthread_rwlockattr_getpshared.c new file mode 100644 index 000000000..abfe63f25 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlockattr_getpshared.c @@ -0,0 +1,98 @@ +/* + * pthread_rwlockattr_getpshared.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, + int *pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Determine whether rwlocks created with 'attr' can be + * shared between processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_rwlockattr_t + * + * pshared + * will be set to one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * + * DESCRIPTION + * Rwlocks creatd with 'attr' can be shared between + * processes if pthread_rwlock_t variable is allocated + * in memory shared by these processes. + * NOTES: + * 1) pshared rwlocks MUST be allocated in shared + * memory. + * 2) The following macro is defined if shared rwlocks + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully retrieved attribute, + * EINVAL 'attr' is invalid, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && (pshared != NULL)) + { + *pshared = (*attr)->pshared; + result = 0; + } + else + { + result = EINVAL; + } + + return (result); + +} /* pthread_rwlockattr_getpshared */ diff --git a/win32/3rdparty/pthreads/pthread_rwlockattr_init.c b/win32/3rdparty/pthreads/pthread_rwlockattr_init.c new file mode 100644 index 000000000..feb8e9407 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlockattr_init.c @@ -0,0 +1,84 @@ +/* + * pthread_rwlockattr_init.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlockattr_init (pthread_rwlockattr_t * attr) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Initializes a rwlock attributes object with default + * attributes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_rwlockattr_t + * + * + * DESCRIPTION + * Initializes a rwlock attributes object with default + * attributes. + * + * RESULTS + * 0 successfully initialized attr, + * ENOMEM insufficient memory for attr. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + pthread_rwlockattr_t rwa; + + rwa = (pthread_rwlockattr_t) calloc (1, sizeof (*rwa)); + + if (rwa == NULL) + { + result = ENOMEM; + } + else + { + rwa->pshared = PTHREAD_PROCESS_PRIVATE; + } + + *attr = rwa; + + return (result); +} /* pthread_rwlockattr_init */ diff --git a/win32/3rdparty/pthreads/pthread_rwlockattr_setpshared.c b/win32/3rdparty/pthreads/pthread_rwlockattr_setpshared.c new file mode 100644 index 000000000..316532cb2 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_rwlockattr_setpshared.c @@ -0,0 +1,121 @@ +/* + * pthread_rwlockattr_setpshared.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pthread.h" +#include "implement.h" + +int +pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, int pshared) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Rwlocks created with 'attr' can be shared between + * processes if pthread_rwlock_t variable is allocated + * in memory shared by these processes. + * + * PARAMETERS + * attr + * pointer to an instance of pthread_rwlockattr_t + * + * pshared + * must be one of: + * + * PTHREAD_PROCESS_SHARED + * May be shared if in shared memory + * + * PTHREAD_PROCESS_PRIVATE + * Cannot be shared. + * + * DESCRIPTION + * Rwlocks creatd with 'attr' can be shared between + * processes if pthread_rwlock_t variable is allocated + * in memory shared by these processes. + * + * NOTES: + * 1) pshared rwlocks MUST be allocated in shared + * memory. + * + * 2) The following macro is defined if shared rwlocks + * are supported: + * _POSIX_THREAD_PROCESS_SHARED + * + * RESULTS + * 0 successfully set attribute, + * EINVAL 'attr' or pshared is invalid, + * ENOSYS PTHREAD_PROCESS_SHARED not supported, + * + * ------------------------------------------------------ + */ +{ + int result; + + if ((attr != NULL && *attr != NULL) && + ((pshared == PTHREAD_PROCESS_SHARED) || + (pshared == PTHREAD_PROCESS_PRIVATE))) + { + if (pshared == PTHREAD_PROCESS_SHARED) + { + +#if !defined( _POSIX_THREAD_PROCESS_SHARED ) + + result = ENOSYS; + pshared = PTHREAD_PROCESS_PRIVATE; + +#else + + result = 0; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + + } + else + { + result = 0; + } + + (*attr)->pshared = pshared; + } + else + { + result = EINVAL; + } + + return (result); + +} /* pthread_rwlockattr_setpshared */ diff --git a/win32/3rdparty/pthreads/pthread_self.c b/win32/3rdparty/pthreads/pthread_self.c new file mode 100644 index 000000000..d72a0971d --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_self.c @@ -0,0 +1,138 @@ +/* + * pthread_self.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +pthread_t +pthread_self (void) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function returns a reference to the current running + * thread. + * + * PARAMETERS + * N/A + * + * + * DESCRIPTION + * This function returns a reference to the current running + * thread. + * + * RESULTS + * pthread_t reference to the current thread + * + * ------------------------------------------------------ + */ +{ + pthread_t self; + pthread_t nil = {NULL, 0}; + ptw32_thread_t * sp; + +#ifdef _UWIN + if (!ptw32_selfThreadKey) + return nil; +#endif + + sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); + + if (sp != NULL) + { + self = sp->ptHandle; + } + else + { + /* + * Need to create an implicit 'self' for the currently + * executing thread. + */ + self = ptw32_new (); + sp = (ptw32_thread_t *) self.p; + + if (sp != NULL) + { + /* + * This is a non-POSIX thread which has chosen to call + * a POSIX threads function for some reason. We assume that + * it isn't joinable, but we do assume that it's + * (deferred) cancelable. + */ + sp->implicit = 1; + sp->detachState = PTHREAD_CREATE_DETACHED; + sp->thread = GetCurrentThreadId (); + +#ifdef NEED_DUPLICATEHANDLE + /* + * DuplicateHandle does not exist on WinCE. + * + * NOTE: + * GetCurrentThread only returns a pseudo-handle + * which is only valid in the current thread context. + * Therefore, you should not pass the handle to + * other threads for whatever purpose. + */ + sp->threadH = GetCurrentThread (); +#else + if (!DuplicateHandle (GetCurrentProcess (), + GetCurrentThread (), + GetCurrentProcess (), + &sp->threadH, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + /* + * Should not do this, but we have no alternative if + * we can't get a Win32 thread handle. + * Thread structs are never freed. + */ + ptw32_threadReusePush (self); + return nil; + } +#endif + + /* + * No need to explicitly serialise access to sched_priority + * because the new handle is not yet public. + */ + sp->sched_priority = GetThreadPriority (sp->threadH); + + pthread_setspecific (ptw32_selfThreadKey, (void *) sp); + } + } + + return (self); + +} /* pthread_self */ diff --git a/win32/3rdparty/pthreads/pthread_setcancelstate.c b/win32/3rdparty/pthreads/pthread_setcancelstate.c new file mode 100644 index 000000000..002cfe5e4 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_setcancelstate.c @@ -0,0 +1,124 @@ +/* + * pthread_setcancelstate.c + * + * Description: + * POSIX thread functions related to thread cancellation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_setcancelstate (int state, int *oldstate) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function atomically sets the calling thread's + * cancelability state to 'state' and returns the previous + * cancelability state at the location referenced by + * 'oldstate' + * + * PARAMETERS + * state, + * oldstate + * PTHREAD_CANCEL_ENABLE + * cancellation is enabled, + * + * PTHREAD_CANCEL_DISABLE + * cancellation is disabled + * + * + * DESCRIPTION + * This function atomically sets the calling thread's + * cancelability state to 'state' and returns the previous + * cancelability state at the location referenced by + * 'oldstate'. + * + * NOTES: + * 1) Use to disable cancellation around 'atomic' code that + * includes cancellation points + * + * COMPATIBILITY ADDITIONS + * If 'oldstate' is NULL then the previous state is not returned + * but the function still succeeds. (Solaris) + * + * RESULTS + * 0 successfully set cancelability type, + * EINVAL 'state' is invalid + * + * ------------------------------------------------------ + */ +{ + int result = 0; + pthread_t self = pthread_self (); + ptw32_thread_t * sp = (ptw32_thread_t *) self.p; + + if (sp == NULL + || (state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE)) + { + return EINVAL; + } + + /* + * Lock for async-cancel safety. + */ + (void) pthread_mutex_lock (&sp->cancelLock); + + if (oldstate != NULL) + { + *oldstate = sp->cancelState; + } + + sp->cancelState = state; + + /* + * Check if there is a pending asynchronous cancel + */ + if (state == PTHREAD_CANCEL_ENABLE + && sp->cancelType == PTHREAD_CANCEL_ASYNCHRONOUS + && WaitForSingleObject (sp->cancelEvent, 0) == WAIT_OBJECT_0) + { + sp->state = PThreadStateCanceling; + sp->cancelState = PTHREAD_CANCEL_DISABLE; + ResetEvent (sp->cancelEvent); + (void) pthread_mutex_unlock (&sp->cancelLock); + ptw32_throw (PTW32_EPS_CANCEL); + + /* Never reached */ + } + + (void) pthread_mutex_unlock (&sp->cancelLock); + + return (result); + +} /* pthread_setcancelstate */ diff --git a/win32/3rdparty/pthreads/pthread_setcanceltype.c b/win32/3rdparty/pthreads/pthread_setcanceltype.c new file mode 100644 index 000000000..3fb3f0e49 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_setcanceltype.c @@ -0,0 +1,125 @@ +/* + * pthread_setcanceltype.c + * + * Description: + * POSIX thread functions related to thread cancellation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_setcanceltype (int type, int *oldtype) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function atomically sets the calling thread's + * cancelability type to 'type' and returns the previous + * cancelability type at the location referenced by + * 'oldtype' + * + * PARAMETERS + * type, + * oldtype + * PTHREAD_CANCEL_DEFERRED + * only deferred cancelation is allowed, + * + * PTHREAD_CANCEL_ASYNCHRONOUS + * Asynchronous cancellation is allowed + * + * + * DESCRIPTION + * This function atomically sets the calling thread's + * cancelability type to 'type' and returns the previous + * cancelability type at the location referenced by + * 'oldtype' + * + * NOTES: + * 1) Use with caution; most code is not safe for use + * with asynchronous cancelability. + * + * COMPATIBILITY ADDITIONS + * If 'oldtype' is NULL then the previous type is not returned + * but the function still succeeds. (Solaris) + * + * RESULTS + * 0 successfully set cancelability type, + * EINVAL 'type' is invalid + * + * ------------------------------------------------------ + */ +{ + int result = 0; + pthread_t self = pthread_self (); + ptw32_thread_t * sp = (ptw32_thread_t *) self.p; + + if (sp == NULL + || (type != PTHREAD_CANCEL_DEFERRED + && type != PTHREAD_CANCEL_ASYNCHRONOUS)) + { + return EINVAL; + } + + /* + * Lock for async-cancel safety. + */ + (void) pthread_mutex_lock (&sp->cancelLock); + + if (oldtype != NULL) + { + *oldtype = sp->cancelType; + } + + sp->cancelType = type; + + /* + * Check if there is a pending asynchronous cancel + */ + if (sp->cancelState == PTHREAD_CANCEL_ENABLE + && type == PTHREAD_CANCEL_ASYNCHRONOUS + && WaitForSingleObject (sp->cancelEvent, 0) == WAIT_OBJECT_0) + { + sp->state = PThreadStateCanceling; + sp->cancelState = PTHREAD_CANCEL_DISABLE; + ResetEvent (sp->cancelEvent); + (void) pthread_mutex_unlock (&sp->cancelLock); + ptw32_throw (PTW32_EPS_CANCEL); + + /* Never reached */ + } + + (void) pthread_mutex_unlock (&sp->cancelLock); + + return (result); + +} /* pthread_setcanceltype */ diff --git a/win32/3rdparty/pthreads/pthread_setconcurrency.c b/win32/3rdparty/pthreads/pthread_setconcurrency.c new file mode 100644 index 000000000..f62346f8e --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_setconcurrency.c @@ -0,0 +1,53 @@ +/* + * pthread_setconcurrency.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_setconcurrency (int level) +{ + if (level < 0) + { + return EINVAL; + } + else + { + ptw32_concurrency = level; + return 0; + } +} diff --git a/win32/3rdparty/pthreads/pthread_setschedparam.c b/win32/3rdparty/pthreads/pthread_setschedparam.c new file mode 100644 index 000000000..a122eaca6 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_setschedparam.c @@ -0,0 +1,125 @@ +/* + * sched_setschedparam.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +pthread_setschedparam (pthread_t thread, int policy, + const struct sched_param *param) +{ + int result; + + /* Validate the thread id. */ + result = pthread_kill (thread, 0); + if (0 != result) + { + return result; + } + + /* Validate the scheduling policy. */ + if (policy < SCHED_MIN || policy > SCHED_MAX) + { + return EINVAL; + } + + /* Ensure the policy is SCHED_OTHER. */ + if (policy != SCHED_OTHER) + { + return ENOTSUP; + } + + return (ptw32_setthreadpriority (thread, policy, param->sched_priority)); +} + + +int +ptw32_setthreadpriority (pthread_t thread, int policy, int priority) +{ + int prio; + int result; + ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; + + prio = priority; + + /* Validate priority level. */ + if (prio < sched_get_priority_min (policy) || + prio > sched_get_priority_max (policy)) + { + return EINVAL; + } + +#if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL) +/* WinCE */ +#else +/* Everything else */ + + if (THREAD_PRIORITY_IDLE < prio && THREAD_PRIORITY_LOWEST > prio) + { + prio = THREAD_PRIORITY_LOWEST; + } + else if (THREAD_PRIORITY_TIME_CRITICAL > prio + && THREAD_PRIORITY_HIGHEST < prio) + { + prio = THREAD_PRIORITY_HIGHEST; + } + +#endif + + result = pthread_mutex_lock (&tp->threadLock); + + if (0 == result) + { + /* If this fails, the current priority is unchanged. */ + if (0 == SetThreadPriority (tp->threadH, prio)) + { + result = EINVAL; + } + else + { + /* + * Must record the thread's sched_priority as given, + * not as finally adjusted. + */ + tp->sched_priority = priority; + } + + (void) pthread_mutex_unlock (&tp->threadLock); + } + + return result; +} diff --git a/win32/3rdparty/pthreads/pthread_setspecific.c b/win32/3rdparty/pthreads/pthread_setspecific.c new file mode 100644 index 000000000..f06b69616 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_setspecific.c @@ -0,0 +1,168 @@ +/* + * pthread_setspecific.c + * + * Description: + * POSIX thread functions which implement thread-specific data (TSD). + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_setspecific (pthread_key_t key, const void *value) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function sets the value of the thread specific + * key in the calling thread. + * + * PARAMETERS + * key + * an instance of pthread_key_t + * value + * the value to set key to + * + * + * DESCRIPTION + * This function sets the value of the thread specific + * key in the calling thread. + * + * RESULTS + * 0 successfully set value + * EAGAIN could not set value + * ENOENT SERIOUS!! + * + * ------------------------------------------------------ + */ +{ + pthread_t self; + int result = 0; + + if (key != ptw32_selfThreadKey) + { + /* + * Using pthread_self will implicitly create + * an instance of pthread_t for the current + * thread if one wasn't explicitly created + */ + self = pthread_self (); + if (self.p == NULL) + { + return ENOENT; + } + } + else + { + /* + * Resolve catch-22 of registering thread with selfThread + * key + */ + ptw32_thread_t * sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); + + if (sp == NULL) + { + if (value == NULL) + { + return ENOENT; + } + self = *((pthread_t *) value); + } + else + { + self = sp->ptHandle; + } + } + + result = 0; + + if (key != NULL) + { + if (self.p != NULL && key->destructor != NULL && value != NULL) + { + /* + * Only require associations if we have to + * call user destroy routine. + * Don't need to locate an existing association + * when setting data to NULL for WIN32 since the + * data is stored with the operating system; not + * on the association; setting assoc to NULL short + * circuits the search. + */ + ThreadKeyAssoc *assoc; + + if (pthread_mutex_lock(&(key->keyLock)) == 0) + { + ptw32_thread_t * sp = (ptw32_thread_t *) self.p; + + (void) pthread_mutex_lock(&(sp->threadLock)); + + assoc = (ThreadKeyAssoc *) sp->keys; + /* + * Locate existing association + */ + while (assoc != NULL) + { + if (assoc->key == key) + { + /* + * Association already exists + */ + break; + } + assoc = assoc->nextKey; + } + + /* + * create an association if not found + */ + if (assoc == NULL) + { + result = ptw32_tkAssocCreate (sp, key); + } + + (void) pthread_mutex_unlock(&(sp->threadLock)); + } + (void) pthread_mutex_unlock(&(key->keyLock)); + } + + if (result == 0) + { + if (!TlsSetValue (key->key, (LPVOID) value)) + { + result = EAGAIN; + } + } + } + + return (result); +} /* pthread_setspecific */ diff --git a/win32/3rdparty/pthreads/pthread_spin_destroy.c b/win32/3rdparty/pthreads/pthread_spin_destroy.c new file mode 100644 index 000000000..8fe22674d --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_spin_destroy.c @@ -0,0 +1,112 @@ +/* + * pthread_spin_destroy.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_spin_destroy (pthread_spinlock_t * lock) +{ + register pthread_spinlock_t s; + int result = 0; + + if (lock == NULL || *lock == NULL) + { + return EINVAL; + } + + if ((s = *lock) != PTHREAD_SPINLOCK_INITIALIZER) + { + if (s->interlock == PTW32_SPIN_USE_MUTEX) + { + result = pthread_mutex_destroy (&(s->u.mutex)); + } + else if ((PTW32_INTERLOCKED_LONG) PTW32_SPIN_UNLOCKED != + PTW32_INTERLOCKED_COMPARE_EXCHANGE ((PTW32_INTERLOCKED_LPLONG) + & (s->interlock), + (PTW32_INTERLOCKED_LONG) + PTW32_OBJECT_INVALID, + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_UNLOCKED)) + { + result = EINVAL; + } + + if (0 == result) + { + /* + * We are relying on the application to ensure that all other threads + * have finished with the spinlock before destroying it. + */ + *lock = NULL; + (void) free (s); + } + } + else + { + /* + * See notes in ptw32_spinlock_check_need_init() above also. + */ + EnterCriticalSection (&ptw32_spinlock_test_init_lock); + + /* + * Check again. + */ + if (*lock == PTHREAD_SPINLOCK_INITIALIZER) + { + /* + * This is all we need to do to destroy a statically + * initialised spinlock that has not yet been used (initialised). + * If we get to here, another thread + * waiting to initialise this mutex will get an EINVAL. + */ + *lock = NULL; + } + else + { + /* + * The spinlock has been initialised while we were waiting + * so assume it's in use. + */ + result = EBUSY; + } + + LeaveCriticalSection (&ptw32_spinlock_test_init_lock); + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_spin_init.c b/win32/3rdparty/pthreads/pthread_spin_init.c new file mode 100644 index 000000000..553af7eac --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_spin_init.c @@ -0,0 +1,123 @@ +/* + * pthread_spin_init.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_spin_init (pthread_spinlock_t * lock, int pshared) +{ + pthread_spinlock_t s; + int cpus = 0; + int result = 0; + + if (lock == NULL) + { + return EINVAL; + } + + if (0 != ptw32_getprocessors (&cpus)) + { + cpus = 1; + } + + if (cpus > 1) + { + if (pshared == PTHREAD_PROCESS_SHARED) + { + /* + * Creating spinlock that can be shared between + * processes. + */ +#if _POSIX_THREAD_PROCESS_SHARED >= 0 + + /* + * Not implemented yet. + */ + +#error ERROR [__FILE__, line __LINE__]: Process shared spin locks are not supported yet. + +#else + + return ENOSYS; + +#endif /* _POSIX_THREAD_PROCESS_SHARED */ + + } + } + + s = (pthread_spinlock_t) calloc (1, sizeof (*s)); + + if (s == NULL) + { + return ENOMEM; + } + + if (cpus > 1) + { + s->u.cpus = cpus; + s->interlock = PTW32_SPIN_UNLOCKED; + } + else + { + pthread_mutexattr_t ma; + result = pthread_mutexattr_init (&ma); + + if (0 == result) + { + ma->pshared = pshared; + result = pthread_mutex_init (&(s->u.mutex), &ma); + if (0 == result) + { + s->interlock = PTW32_SPIN_USE_MUTEX; + } + } + (void) pthread_mutexattr_destroy (&ma); + } + + if (0 == result) + { + *lock = s; + } + else + { + (void) free (s); + *lock = NULL; + } + + return (result); +} diff --git a/win32/3rdparty/pthreads/pthread_spin_lock.c b/win32/3rdparty/pthreads/pthread_spin_lock.c new file mode 100644 index 000000000..90b3abee4 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_spin_lock.c @@ -0,0 +1,83 @@ +/* + * pthread_spin_lock.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_spin_lock (pthread_spinlock_t * lock) +{ + register pthread_spinlock_t s; + + if (NULL == lock || NULL == *lock) + { + return (EINVAL); + } + + if (*lock == PTHREAD_SPINLOCK_INITIALIZER) + { + int result; + + if ((result = ptw32_spinlock_check_need_init (lock)) != 0) + { + return (result); + } + } + + s = *lock; + + while ((PTW32_INTERLOCKED_LONG) PTW32_SPIN_LOCKED == + PTW32_INTERLOCKED_COMPARE_EXCHANGE ((PTW32_INTERLOCKED_LPLONG) & + (s->interlock), + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_LOCKED, + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_UNLOCKED)) + { + } + + if (s->interlock == PTW32_SPIN_LOCKED) + { + return 0; + } + else if (s->interlock == PTW32_SPIN_USE_MUTEX) + { + return pthread_mutex_lock (&(s->u.mutex)); + } + + return EINVAL; +} diff --git a/win32/3rdparty/pthreads/pthread_spin_trylock.c b/win32/3rdparty/pthreads/pthread_spin_trylock.c new file mode 100644 index 000000000..c601a191f --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_spin_trylock.c @@ -0,0 +1,80 @@ +/* + * pthread_spin_trylock.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_spin_trylock (pthread_spinlock_t * lock) +{ + register pthread_spinlock_t s; + + if (NULL == lock || NULL == *lock) + { + return (EINVAL); + } + + if (*lock == PTHREAD_SPINLOCK_INITIALIZER) + { + int result; + + if ((result = ptw32_spinlock_check_need_init (lock)) != 0) + { + return (result); + } + } + + s = *lock; + + switch ((long) + PTW32_INTERLOCKED_COMPARE_EXCHANGE ((PTW32_INTERLOCKED_LPLONG) & + (s->interlock), + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_LOCKED, + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_UNLOCKED)) + { + case PTW32_SPIN_UNLOCKED: + return 0; + case PTW32_SPIN_LOCKED: + return EBUSY; + case PTW32_SPIN_USE_MUTEX: + return pthread_mutex_trylock (&(s->u.mutex)); + } + + return EINVAL; +} diff --git a/win32/3rdparty/pthreads/pthread_spin_unlock.c b/win32/3rdparty/pthreads/pthread_spin_unlock.c new file mode 100644 index 000000000..67bc2c218 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_spin_unlock.c @@ -0,0 +1,75 @@ +/* + * pthread_spin_unlock.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +pthread_spin_unlock (pthread_spinlock_t * lock) +{ + register pthread_spinlock_t s; + + if (NULL == lock || NULL == *lock) + { + return (EINVAL); + } + + s = *lock; + + if (s == PTHREAD_SPINLOCK_INITIALIZER) + { + return EPERM; + } + + switch ((long) + PTW32_INTERLOCKED_COMPARE_EXCHANGE ((PTW32_INTERLOCKED_LPLONG) & + (s->interlock), + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_UNLOCKED, + (PTW32_INTERLOCKED_LONG) + PTW32_SPIN_LOCKED)) + { + case PTW32_SPIN_LOCKED: + return 0; + case PTW32_SPIN_UNLOCKED: + return EPERM; + case PTW32_SPIN_USE_MUTEX: + return pthread_mutex_unlock (&(s->u.mutex)); + } + + return EINVAL; +} diff --git a/win32/3rdparty/pthreads/pthread_testcancel.c b/win32/3rdparty/pthreads/pthread_testcancel.c new file mode 100644 index 000000000..ad7cdb994 --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_testcancel.c @@ -0,0 +1,102 @@ +/* + * pthread_testcancel.c + * + * Description: + * POSIX thread functions related to thread cancellation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +void +pthread_testcancel (void) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function creates a deferred cancellation point + * in the calling thread. The call has no effect if the + * current cancelability state is + * PTHREAD_CANCEL_DISABLE + * + * PARAMETERS + * N/A + * + * + * DESCRIPTION + * This function creates a deferred cancellation point + * in the calling thread. The call has no effect if the + * current cancelability state is + * PTHREAD_CANCEL_DISABLE + * + * NOTES: + * 1) Cancellation is asynchronous. Use pthread_join + * to wait for termination of thread if necessary + * + * RESULTS + * N/A + * + * ------------------------------------------------------ + */ +{ + pthread_t self = pthread_self (); + ptw32_thread_t * sp = (ptw32_thread_t *) self.p; + + if (sp == NULL) + { + return; + } + + /* + * Pthread_cancel() will have set sp->state to PThreadStateCancelPending + * and set an event, so no need to enter kernel space if + * sp->state != PThreadStateCancelPending - that only slows us down. + */ + if (sp->state != PThreadStateCancelPending) + { + return; + } + + (void) pthread_mutex_lock (&sp->cancelLock); + + if (sp->cancelState != PTHREAD_CANCEL_DISABLE) + { + ResetEvent(sp->cancelEvent); + sp->state = PThreadStateCanceling; + (void) pthread_mutex_unlock (&sp->cancelLock); + sp->cancelState = PTHREAD_CANCEL_DISABLE; + (void) pthread_mutex_unlock (&sp->cancelLock); + ptw32_throw (PTW32_EPS_CANCEL); + } + + (void) pthread_mutex_unlock (&sp->cancelLock); +} /* pthread_testcancel */ diff --git a/win32/3rdparty/pthreads/pthread_timechange_handler_np.c b/win32/3rdparty/pthreads/pthread_timechange_handler_np.c new file mode 100644 index 000000000..7d8170a3f --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_timechange_handler_np.c @@ -0,0 +1,107 @@ +/* + * pthread_timechange_handler_np.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * Notes on handling system time adjustments (especially negative ones). + * --------------------------------------------------------------------- + * + * This solution was suggested by Alexander Terekhov, but any errors + * in the implementation are mine - [Ross Johnson] + * + * 1) The problem: threads doing a timedwait on a CV may expect to timeout + * at a specific absolute time according to a system timer. If the + * system clock is adjusted backwards then those threads sleep longer than + * expected. Also, pthreads-win32 converts absolute times to intervals in + * order to make use of the underlying Win32, and so waiting threads may + * awake before their proper abstimes. + * + * 2) We aren't able to distinquish between threads on timed or untimed waits, + * so we wake them all at the time of the adjustment so that they can + * re-evaluate their conditions and re-compute their timeouts. + * + * 3) We rely on correctly written applications for this to work. Specifically, + * they must be able to deal properly with spurious wakeups. That is, + * they must re-test their condition upon wakeup and wait again if + * the condition is not satisfied. + */ + +void * +pthread_timechange_handler_np (void *arg) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * Broadcasts all CVs to force re-evaluation and + * new timeouts if required. + * + * PARAMETERS + * NONE + * + * + * DESCRIPTION + * Broadcasts all CVs to force re-evaluation and + * new timeouts if required. + * + * This routine may be passed directly to pthread_create() + * as a new thread in order to run asynchronously. + * + * + * RESULTS + * 0 successfully broadcast all CVs + * EAGAIN Not all CVs were broadcast + * + * ------------------------------------------------------ + */ +{ + int result = 0; + pthread_cond_t cv; + + EnterCriticalSection (&ptw32_cond_list_lock); + + cv = ptw32_cond_list_head; + + while (cv != NULL && 0 == result) + { + result = pthread_cond_broadcast (&cv); + cv = cv->next; + } + + LeaveCriticalSection (&ptw32_cond_list_lock); + + return (void *) (result != 0 ? EAGAIN : 0); +} diff --git a/win32/3rdparty/pthreads/pthread_win32_attach_detach_np.c b/win32/3rdparty/pthreads/pthread_win32_attach_detach_np.c new file mode 100644 index 000000000..2f0bc373a --- /dev/null +++ b/win32/3rdparty/pthreads/pthread_win32_attach_detach_np.c @@ -0,0 +1,303 @@ +/* + * pthread_win32_attach_detach_np.c + * + * Description: + * This translation unit implements non-portable thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * Handle to kernel32.dll + */ +static HINSTANCE ptw32_h_kernel32; + +/* + * Handle to quserex.dll + */ +static HINSTANCE ptw32_h_quserex; + +BOOL +pthread_win32_process_attach_np () +{ + BOOL result = TRUE; + DWORD_PTR vProcessCPUs; + DWORD_PTR vSystemCPUs; + + result = ptw32_processInitialize (); + +#ifdef _UWIN + pthread_count++; +#endif + + ptw32_features = 0; + + +#if defined(NEED_PROCESS_AFFINITY_MASK) + + ptw32_smp_system = PTW32_FALSE; + +#else + + if (GetProcessAffinityMask (GetCurrentProcess (), + &vProcessCPUs, &vSystemCPUs)) + { + int CPUs = 0; + DWORD_PTR bit; + + for (bit = 1; bit != 0; bit <<= 1) + { + if (vSystemCPUs & bit) + { + CPUs++; + } + } + ptw32_smp_system = (CPUs > 1); + } + else + { + ptw32_smp_system = PTW32_FALSE; + } + +#endif + +#ifdef WINCE + + /* + * Load COREDLL and try to get address of InterlockedCompareExchange + */ + ptw32_h_kernel32 = LoadLibrary (TEXT ("COREDLL.DLL")); + +#else + + /* + * Load KERNEL32 and try to get address of InterlockedCompareExchange + */ + ptw32_h_kernel32 = LoadLibrary (TEXT ("KERNEL32.DLL")); + +#endif + + ptw32_interlocked_compare_exchange = + (PTW32_INTERLOCKED_LONG (WINAPI *) + (PTW32_INTERLOCKED_LPLONG, PTW32_INTERLOCKED_LONG, + PTW32_INTERLOCKED_LONG)) +#if defined(NEED_UNICODE_CONSTS) + GetProcAddress (ptw32_h_kernel32, + (const TCHAR *) TEXT ("InterlockedCompareExchange")); +#else + GetProcAddress (ptw32_h_kernel32, (LPCSTR) "InterlockedCompareExchange"); +#endif + + if (ptw32_interlocked_compare_exchange == NULL) + { + ptw32_interlocked_compare_exchange = ptw32_InterlockedCompareExchange; + + /* + * If InterlockedCompareExchange is not being used, then free + * the kernel32.dll handle now, rather than leaving it until + * DLL_PROCESS_DETACH. + * + * Note: this is not a pedantic exercise in freeing unused + * resources! It is a work-around for a bug in Windows 95 + * (see microsoft knowledge base article, Q187684) which + * does Bad Things when FreeLibrary is called within + * the DLL_PROCESS_DETACH code, in certain situations. + * Since w95 just happens to be a platform which does not + * provide InterlockedCompareExchange, the bug will be + * effortlessly avoided. + */ + (void) FreeLibrary (ptw32_h_kernel32); + ptw32_h_kernel32 = 0; + } + else + { + ptw32_features |= PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE; + } + + /* + * Load QUSEREX.DLL and try to get address of QueueUserAPCEx + */ + ptw32_h_quserex = LoadLibrary (TEXT ("QUSEREX.DLL")); + + if (ptw32_h_quserex != NULL) + { + ptw32_register_cancelation = (DWORD (*)(PAPCFUNC, HANDLE, DWORD)) +#if defined(NEED_UNICODE_CONSTS) + GetProcAddress (ptw32_h_quserex, + (const TCHAR *) TEXT ("QueueUserAPCEx")); +#else + GetProcAddress (ptw32_h_quserex, (LPCSTR) "QueueUserAPCEx"); +#endif + } + + if (NULL == ptw32_register_cancelation) + { + ptw32_register_cancelation = ptw32_RegisterCancelation; + + if (ptw32_h_quserex != NULL) + { + (void) FreeLibrary (ptw32_h_quserex); + } + ptw32_h_quserex = 0; + } + else + { + /* Initialise QueueUserAPCEx */ + BOOL (*queue_user_apc_ex_init) (VOID); + + queue_user_apc_ex_init = (BOOL (*)(VOID)) +#if defined(NEED_UNICODE_CONSTS) + GetProcAddress (ptw32_h_quserex, + (const TCHAR *) TEXT ("QueueUserAPCEx_Init")); +#else + GetProcAddress (ptw32_h_quserex, (LPCSTR) "QueueUserAPCEx_Init"); +#endif + + if (queue_user_apc_ex_init == NULL || !queue_user_apc_ex_init ()) + { + ptw32_register_cancelation = ptw32_RegisterCancelation; + + (void) FreeLibrary (ptw32_h_quserex); + ptw32_h_quserex = 0; + } + } + + if (ptw32_h_quserex) + { + ptw32_features |= PTW32_ALERTABLE_ASYNC_CANCEL; + } + + return result; +} + + +BOOL +pthread_win32_process_detach_np () +{ + if (ptw32_processInitialized) + { + ptw32_thread_t * sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); + + if (sp != NULL) + { + /* + * Detached threads have their resources automatically + * cleaned up upon exit (others must be 'joined'). + */ + if (sp->detachState == PTHREAD_CREATE_DETACHED) + { + ptw32_threadDestroy (sp->ptHandle); + TlsSetValue (ptw32_selfThreadKey->key, NULL); + } + } + + /* + * The DLL is being unmapped from the process's address space + */ + ptw32_processTerminate (); + + if (ptw32_h_quserex) + { + /* Close QueueUserAPCEx */ + BOOL (*queue_user_apc_ex_fini) (VOID); + + queue_user_apc_ex_fini = (BOOL (*)(VOID)) +#if defined(NEED_UNICODE_CONSTS) + GetProcAddress (ptw32_h_quserex, + (const TCHAR *) TEXT ("QueueUserAPCEx_Fini")); +#else + GetProcAddress (ptw32_h_quserex, (LPCSTR) "QueueUserAPCEx_Fini"); +#endif + + if (queue_user_apc_ex_fini != NULL) + { + (void) queue_user_apc_ex_fini (); + } + (void) FreeLibrary (ptw32_h_quserex); + } + + if (ptw32_h_kernel32) + { + (void) FreeLibrary (ptw32_h_kernel32); + } + } + + return TRUE; +} + +BOOL +pthread_win32_thread_attach_np () +{ + return TRUE; +} + +BOOL +pthread_win32_thread_detach_np () +{ + if (ptw32_processInitialized) + { + /* + * Don't use pthread_self() - to avoid creating an implicit POSIX thread handle + * unnecessarily. + */ + ptw32_thread_t * sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); + + if (sp != NULL) // otherwise Win32 thread with no implicit POSIX handle. + { + ptw32_callUserDestroyRoutines (sp->ptHandle); + + (void) pthread_mutex_lock (&sp->cancelLock); + sp->state = PThreadStateLast; + /* + * If the thread is joinable at this point then it MUST be joined + * or detached explicitly by the application. + */ + (void) pthread_mutex_unlock (&sp->cancelLock); + + if (sp->detachState == PTHREAD_CREATE_DETACHED) + { + ptw32_threadDestroy (sp->ptHandle); + + TlsSetValue (ptw32_selfThreadKey->key, NULL); + } + } + } + + return TRUE; +} + +BOOL +pthread_win32_test_features_np (int feature_mask) +{ + return ((ptw32_features & feature_mask) == feature_mask); +} diff --git a/win32/3rdparty/pthreads/ptw32_InterlockedCompareExchange.c b/win32/3rdparty/pthreads/ptw32_InterlockedCompareExchange.c new file mode 100644 index 000000000..0094635f6 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_InterlockedCompareExchange.c @@ -0,0 +1,303 @@ +/* + * ptw32_InterlockedCompareExchange.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +/* + * ptw32_InterlockedCompareExchange -- + * + * Originally needed because W9x doesn't support InterlockedCompareExchange. + * We now use this version wherever possible so we can inline it. + */ + +PTW32_INTERLOCKED_LONG WINAPI +ptw32_InterlockedCompareExchange (PTW32_INTERLOCKED_LPLONG location, + PTW32_INTERLOCKED_LONG value, + PTW32_INTERLOCKED_LONG comparand) +{ + +#if defined(__WATCOMC__) +/* Don't report that result is not assigned a value before being referenced */ +#pragma disable_message (200) +#endif + + PTW32_INTERLOCKED_LONG result; + + /* + * Using the LOCK prefix on uni-processor machines is significantly slower + * and it is not necessary. The overhead of the conditional below is + * negligible in comparison. Since an optimised DLL will inline this + * routine, this will be faster than calling the system supplied + * Interlocked routine, which appears to avoid the LOCK prefix on + * uniprocessor systems. So one DLL works for all systems. + */ + if (ptw32_smp_system) + +/* *INDENT-OFF* */ + +#if defined(_M_IX86) || defined(_X86_) + +#if defined(_MSC_VER) || defined(__WATCOMC__) || (defined(__BORLANDC__) && defined(HAVE_TASM32)) +#define HAVE_INLINABLE_INTERLOCKED_CMPXCHG + { + _asm { + PUSH ecx + PUSH edx + MOV ecx,dword ptr [location] + MOV edx,dword ptr [value] + MOV eax,dword ptr [comparand] + LOCK CMPXCHG dword ptr [ecx],edx + MOV dword ptr [result], eax + POP edx + POP ecx + } + } + else + { + _asm { + PUSH ecx + PUSH edx + MOV ecx,dword ptr [location] + MOV edx,dword ptr [value] + MOV eax,dword ptr [comparand] + CMPXCHG dword ptr [ecx],edx + MOV dword ptr [result], eax + POP edx + POP ecx + } + } + +#elif defined(__GNUC__) +#define HAVE_INLINABLE_INTERLOCKED_CMPXCHG + + { + __asm__ __volatile__ + ( + "lock\n\t" + "cmpxchgl %2,%1" /* if (EAX == [location]) */ + /* [location] = value */ + /* else */ + /* EAX = [location] */ + :"=a" (result) + :"m" (*location), "r" (value), "a" (comparand)); + } + else + { + __asm__ __volatile__ + ( + "cmpxchgl %2,%1" /* if (EAX == [location]) */ + /* [location] = value */ + /* else */ + /* EAX = [location] */ + :"=a" (result) + :"m" (*location), "r" (value), "a" (comparand)); + } + +#endif + +#else + + /* + * If execution gets to here then we're running on a currently + * unsupported processor or compiler. + */ + + result = 0; + +#endif + +/* *INDENT-ON* */ + + return result; + +#if defined(__WATCOMC__) +#pragma enable_message (200) +#endif + +} + +/* + * ptw32_InterlockedExchange -- + * + * We now use this version wherever possible so we can inline it. + */ + +LONG WINAPI +ptw32_InterlockedExchange (LPLONG location, + LONG value) +{ + +#if defined(__WATCOMC__) +/* Don't report that result is not assigned a value before being referenced */ +#pragma disable_message (200) +#endif + + LONG result; + + /* + * The XCHG instruction always locks the bus with or without the + * LOCKED prefix. This makes it significantly slower than CMPXCHG on + * uni-processor machines. The Windows InterlockedExchange function + * is nearly 3 times faster than the XCHG instruction, so this routine + * is not yet very useful for speeding up pthreads. + */ + if (ptw32_smp_system) + +/* *INDENT-OFF* */ + +#if defined(_M_IX86) || defined(_X86_) + +#if defined(_MSC_VER) || defined(__WATCOMC__) || (defined(__BORLANDC__) && defined(HAVE_TASM32)) +#define HAVE_INLINABLE_INTERLOCKED_XCHG + + { + _asm { + PUSH ecx + MOV ecx,dword ptr [location] + MOV eax,dword ptr [value] + XCHG dword ptr [ecx],eax + MOV dword ptr [result], eax + POP ecx + } + } + else + { + /* + * Faster version of XCHG for uni-processor systems because + * it doesn't lock the bus. If an interrupt or context switch + * occurs between the MOV and the CMPXCHG then the value in + * 'location' may have changed, in which case we will loop + * back to do the MOV again. + * + * FIXME! Need memory barriers for the MOV+CMPXCHG combo? + * + * Tests show that this routine has almost identical timing + * to Win32's InterlockedExchange(), which is much faster than + * using the inlined 'xchg' instruction above, so it's probably + * doing something similar to this (on UP systems). + * + * Can we do without the PUSH/POP instructions? + */ + _asm { + PUSH ecx + PUSH edx + MOV ecx,dword ptr [location] + MOV edx,dword ptr [value] +L1: MOV eax,dword ptr [ecx] + CMPXCHG dword ptr [ecx],edx + JNZ L1 + MOV dword ptr [result], eax + POP edx + POP ecx + } + } + +#elif defined(__GNUC__) +#define HAVE_INLINABLE_INTERLOCKED_XCHG + + { + __asm__ __volatile__ + ( + "xchgl %2,%1" + :"=r" (result) + :"m" (*location), "0" (value)); + } + else + { + /* + * Faster version of XCHG for uni-processor systems because + * it doesn't lock the bus. If an interrupt or context switch + * occurs between the movl and the cmpxchgl then the value in + * 'location' may have changed, in which case we will loop + * back to do the movl again. + * + * FIXME! Need memory barriers for the MOV+CMPXCHG combo? + * + * Tests show that this routine has almost identical timing + * to Win32's InterlockedExchange(), which is much faster than + * using the an inlined 'xchg' instruction, so it's probably + * doing something similar to this (on UP systems). + */ + __asm__ __volatile__ + ( + "0:\n\t" + "movl %1,%%eax\n\t" + "cmpxchgl %2,%1\n\t" + "jnz 0b" + :"=&a" (result) + :"m" (*location), "r" (value)); + } + +#endif + +#else + + /* + * If execution gets to here then we're running on a currently + * unsupported processor or compiler. + */ + + result = 0; + +#endif + +/* *INDENT-ON* */ + + return result; + +#if defined(__WATCOMC__) +#pragma enable_message (200) +#endif + +} + + +#if 1 + +#if defined(PTW32_BUILD_INLINED) && defined(HAVE_INLINABLE_INTERLOCKED_CMPXCHG) +#undef PTW32_INTERLOCKED_COMPARE_EXCHANGE +#define PTW32_INTERLOCKED_COMPARE_EXCHANGE ptw32_InterlockedCompareExchange +#endif + +#if defined(PTW32_BUILD_INLINED) && defined(HAVE_INLINABLE_INTERLOCKED_XCHG) +#undef PTW32_INTERLOCKED_EXCHANGE +#define PTW32_INTERLOCKED_EXCHANGE ptw32_InterlockedExchange +#endif + +#endif diff --git a/win32/3rdparty/pthreads/ptw32_MCS_lock.c b/win32/3rdparty/pthreads/ptw32_MCS_lock.c new file mode 100644 index 000000000..1a143ea14 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_MCS_lock.c @@ -0,0 +1,210 @@ +/* + * ptw32_MCS_lock.c + * + * Description: + * This translation unit implements queue-based locks. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +/* + * About MCS locks: + * + * MCS locks are queue-based locks, where the queue nodes are local to the + * thread. The 'lock' is nothing more than a global pointer that points to + * the last node in the queue, or is NULL if the queue is empty. + * + * Originally designed for use as spin locks requiring no kernel resources + * for synchronisation or blocking, the implementation below has adapted + * the MCS spin lock for use as a general mutex that will suspend threads + * when there is lock contention. + * + * Because the queue nodes are thread-local, most of the memory read/write + * operations required to add or remove nodes from the queue do not trigger + * cache-coherence updates. + * + * Like 'named' mutexes, MCS locks consume system resources transiently - + * they are able to acquire and free resources automatically - but MCS + * locks do not require any unique 'name' to identify the lock to all + * threads using it. + * + * Usage of MCS locks: + * + * - you need a global ptw32_mcs_lock_t instance initialised to 0 or NULL. + * - you need a local thread-scope ptw32_mcs_local_node_t instance, which + * may serve several different locks but you need at least one node for + * every lock held concurrently by a thread. + * + * E.g.: + * + * ptw32_mcs_lock_t lock1 = 0; + * ptw32_mcs_lock_t lock2 = 0; + * + * void *mythread(void *arg) + * { + * ptw32_mcs_local_node_t node; + * + * ptw32_mcs_acquire (&lock1, &node); + * ptw32_mcs_release (&node); + * + * ptw32_mcs_acquire (&lock2, &node); + * ptw32_mcs_release (&node); + * { + * ptw32_mcs_local_node_t nodex; + * + * ptw32_mcs_acquire (&lock1, &node); + * ptw32_mcs_acquire (&lock2, &nodex); + * + * ptw32_mcs_release (&nodex); + * ptw32_mcs_release (&node); + * } + * return (void *)0; + * } + */ + +#include "implement.h" +#include "pthread.h" + +/* + * ptw32_mcs_flag_set -- notify another thread about an event. + * + * Set event if an event handle has been stored in the flag, and + * set flag to -1 otherwise. Note that -1 cannot be a valid handle value. + */ +INLINE void +ptw32_mcs_flag_set (LONG * flag) +{ + HANDLE e = (HANDLE)PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG)flag, + (PTW32_INTERLOCKED_LONG)-1, + (PTW32_INTERLOCKED_LONG)0); + if ((HANDLE)0 != e) + { + /* another thread has already stored an event handle in the flag */ + SetEvent(e); + } +} + +/* + * ptw32_mcs_flag_set -- wait for notification from another. + * + * Store an event handle in the flag and wait on it if the flag has not been + * set, and proceed without creating an event otherwise. + */ +INLINE void +ptw32_mcs_flag_wait (LONG * flag) +{ + if (0 == InterlockedExchangeAdd((LPLONG)flag, 0)) /* MBR fence */ + { + /* the flag is not set. create event. */ + + HANDLE e = CreateEvent(NULL, PTW32_FALSE, PTW32_FALSE, NULL); + + if (0 == PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG)flag, + (PTW32_INTERLOCKED_LONG)e, + (PTW32_INTERLOCKED_LONG)0)) + { + /* stored handle in the flag. wait on it now. */ + WaitForSingleObject(e, INFINITE); + } + + CloseHandle(e); + } +} + +/* + * ptw32_mcs_lock_acquire -- acquire an MCS lock. + * + * See: + * J. M. Mellor-Crummey and M. L. Scott. + * Algorithms for Scalable Synchronization on Shared-Memory Multiprocessors. + * ACM Transactions on Computer Systems, 9(1):21-65, Feb. 1991. + */ +INLINE void +ptw32_mcs_lock_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * node) +{ + ptw32_mcs_local_node_t *pred; + + node->lock = lock; + node->nextFlag = 0; + node->readyFlag = 0; + node->next = 0; /* initially, no successor */ + + /* queue for the lock */ + pred = (ptw32_mcs_local_node_t *)PTW32_INTERLOCKED_EXCHANGE((LPLONG)lock, + (LONG)node); + + if (0 != pred) + { + /* the lock was not free. link behind predecessor. */ + pred->next = node; + ptw32_mcs_flag_set(&pred->nextFlag); + ptw32_mcs_flag_wait(&node->readyFlag); + } +} + +/* + * ptw32_mcs_lock_release -- release an MCS lock. + * + * See: + * J. M. Mellor-Crummey and M. L. Scott. + * Algorithms for Scalable Synchronization on Shared-Memory Multiprocessors. + * ACM Transactions on Computer Systems, 9(1):21-65, Feb. 1991. + */ +INLINE void +ptw32_mcs_lock_release (ptw32_mcs_local_node_t * node) +{ + ptw32_mcs_lock_t *lock = node->lock; + ptw32_mcs_local_node_t *next = (ptw32_mcs_local_node_t *) + InterlockedExchangeAdd((LPLONG)&node->next, 0); /* MBR fence */ + + if (0 == next) + { + /* no known successor */ + + if (node == (ptw32_mcs_local_node_t *) + PTW32_INTERLOCKED_COMPARE_EXCHANGE((PTW32_INTERLOCKED_LPLONG)lock, + (PTW32_INTERLOCKED_LONG)0, + (PTW32_INTERLOCKED_LONG)node)) + { + /* no successor, lock is free now */ + return; + } + + /* wait for successor */ + ptw32_mcs_flag_wait(&node->nextFlag); + next = (ptw32_mcs_local_node_t *) + InterlockedExchangeAdd((LPLONG)&node->next, 0); /* MBR fence */ + } + + /* pass the lock */ + ptw32_mcs_flag_set(&next->readyFlag); +} diff --git a/win32/3rdparty/pthreads/ptw32_callUserDestroyRoutines.c b/win32/3rdparty/pthreads/ptw32_callUserDestroyRoutines.c new file mode 100644 index 000000000..a583f188d --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_callUserDestroyRoutines.c @@ -0,0 +1,220 @@ +/* + * ptw32_callUserDestroyRoutines.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +#ifdef __cplusplus +# if ! defined (_MSC_VER) && ! (defined(__GNUC__) && __GNUC__ < 3) && ! defined(__WATCOMC__) +using + std::terminate; +# endif +#endif + +void +ptw32_callUserDestroyRoutines (pthread_t thread) + /* + * ------------------------------------------------------------------- + * DOCPRIVATE + * + * This the routine runs through all thread keys and calls + * the destroy routines on the user's data for the current thread. + * It simulates the behaviour of POSIX Threads. + * + * PARAMETERS + * thread + * an instance of pthread_t + * + * RETURNS + * N/A + * ------------------------------------------------------------------- + */ +{ + ThreadKeyAssoc * assoc; + + if (thread.p != NULL) + { + int assocsRemaining; + int iterations = 0; + ptw32_thread_t * sp = (ptw32_thread_t *) thread.p; + + /* + * Run through all Thread<-->Key associations + * for the current thread. + * + * Do this process at most PTHREAD_DESTRUCTOR_ITERATIONS times. + */ + do + { + assocsRemaining = 0; + iterations++; + + (void) pthread_mutex_lock(&(sp->threadLock)); + /* + * The pointer to the next assoc is stored in the thread struct so that + * the assoc destructor in pthread_key_delete can adjust it + * if it deletes this assoc. This can happen if we fail to acquire + * both locks below, and are forced to release all of our locks, + * leaving open the opportunity for pthread_key_delete to get in + * before us. + */ + sp->nextAssoc = sp->keys; + (void) pthread_mutex_unlock(&(sp->threadLock)); + + for (;;) + { + void * value; + pthread_key_t k; + void (*destructor) (void *); + + /* + * First we need to serialise with pthread_key_delete by locking + * both assoc guards, but in the reverse order to our convention, + * so we must be careful to avoid deadlock. + */ + (void) pthread_mutex_lock(&(sp->threadLock)); + + if ((assoc = (ThreadKeyAssoc *)sp->nextAssoc) == NULL) + { + /* Finished */ + pthread_mutex_unlock(&(sp->threadLock)); + break; + } + else + { + /* + * assoc->key must be valid because assoc can't change or be + * removed from our chain while we hold at least one lock. If + * the assoc was on our key chain then the key has not been + * deleted yet. + * + * Now try to acquire the second lock without deadlocking. + * If we fail, we need to relinquish the first lock and the + * processor and then try to acquire them all again. + */ + if (pthread_mutex_trylock(&(assoc->key->keyLock)) == EBUSY) + { + pthread_mutex_unlock(&(sp->threadLock)); + Sleep(1); // Ugly but necessary to avoid priority effects. + /* + * Go around again. + * If pthread_key_delete has removed this assoc in the meantime, + * sp->nextAssoc will point to a new assoc. + */ + continue; + } + } + + /* We now hold both locks */ + + sp->nextAssoc = assoc->nextKey; + + /* + * Key still active; pthread_key_delete + * will block on these same mutexes before + * it can release actual key; therefore, + * key is valid and we can call the destroy + * routine; + */ + k = assoc->key; + destructor = k->destructor; + value = TlsGetValue(k->key); + TlsSetValue (k->key, NULL); + + // Every assoc->key exists and has a destructor + if (value != NULL && iterations <= PTHREAD_DESTRUCTOR_ITERATIONS) + { + /* + * Unlock both locks before the destructor runs. + * POSIX says pthread_key_delete can be run from destructors, + * and that probably includes with this key as target. + * pthread_setspecific can also be run from destructors and + * also needs to be able to access the assocs. + */ + (void) pthread_mutex_unlock(&(sp->threadLock)); + (void) pthread_mutex_unlock(&(k->keyLock)); + + assocsRemaining++; + +#ifdef __cplusplus + + try + { + /* + * Run the caller's cleanup routine. + */ + destructor (value); + } + catch (...) + { + /* + * A system unexpected exception has occurred + * running the user's destructor. + * We get control back within this block in case + * the application has set up it's own terminate + * handler. Since we are leaving the thread we + * should not get any internal pthreads + * exceptions. + */ + terminate (); + } + +#else /* __cplusplus */ + + /* + * Run the caller's cleanup routine. + */ + destructor (value); + +#endif /* __cplusplus */ + + } + else + { + /* + * Remove association from both the key and thread chains + * and reclaim it's memory resources. + */ + ptw32_tkAssocDestroy (assoc); + (void) pthread_mutex_unlock(&(sp->threadLock)); + (void) pthread_mutex_unlock(&(k->keyLock)); + } + } + } + while (assocsRemaining); + } +} /* ptw32_callUserDestroyRoutines */ diff --git a/win32/3rdparty/pthreads/ptw32_calloc.c b/win32/3rdparty/pthreads/ptw32_calloc.c new file mode 100644 index 000000000..eea7c7482 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_calloc.c @@ -0,0 +1,56 @@ +/* + * ptw32_calloc.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#ifdef NEED_CALLOC +void * +ptw32_calloc (size_t n, size_t s) +{ + unsigned int m = n * s; + void *p; + + p = malloc (m); + if (p == NULL) + return NULL; + + memset (p, 0, m); + + return p; +} +#endif diff --git a/win32/3rdparty/pthreads/ptw32_cond_check_need_init.c b/win32/3rdparty/pthreads/ptw32_cond_check_need_init.c new file mode 100644 index 000000000..31359ad3f --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_cond_check_need_init.c @@ -0,0 +1,94 @@ +/* + * ptw32_cond_check_need_init.c + * + * Description: + * This translation unit implements condition variables and their primitives. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +INLINE int +ptw32_cond_check_need_init (pthread_cond_t * cond) +{ + int result = 0; + + /* + * The following guarded test is specifically for statically + * initialised condition variables (via PTHREAD_OBJECT_INITIALIZER). + * + * Note that by not providing this synchronisation we risk + * introducing race conditions into applications which are + * correctly written. + * + * Approach + * -------- + * We know that static condition variables will not be PROCESS_SHARED + * so we can serialise access to internal state using + * Win32 Critical Sections rather than Win32 Mutexes. + * + * If using a single global lock slows applications down too much, + * multiple global locks could be created and hashed on some random + * value associated with each mutex, the pointer perhaps. At a guess, + * a good value for the optimal number of global locks might be + * the number of processors + 1. + * + */ + EnterCriticalSection (&ptw32_cond_test_init_lock); + + /* + * We got here possibly under race + * conditions. Check again inside the critical section. + * If a static cv has been destroyed, the application can + * re-initialise it only by calling pthread_cond_init() + * explicitly. + */ + if (*cond == PTHREAD_COND_INITIALIZER) + { + result = pthread_cond_init (cond, NULL); + } + else if (*cond == NULL) + { + /* + * The cv has been destroyed while we were waiting to + * initialise it, so the operation that caused the + * auto-initialisation should fail. + */ + result = EINVAL; + } + + LeaveCriticalSection (&ptw32_cond_test_init_lock); + + return result; +} diff --git a/win32/3rdparty/pthreads/ptw32_getprocessors.c b/win32/3rdparty/pthreads/ptw32_getprocessors.c new file mode 100644 index 000000000..e60c3143f --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_getprocessors.c @@ -0,0 +1,91 @@ +/* + * ptw32_getprocessors.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +/* + * ptw32_getprocessors() + * + * Get the number of CPUs available to the process. + * + * If the available number of CPUs is 1 then pthread_spin_lock() + * will block rather than spin if the lock is already owned. + * + * pthread_spin_init() calls this routine when initialising + * a spinlock. If the number of available processors changes + * (after a call to SetProcessAffinityMask()) then only + * newly initialised spinlocks will notice. + */ +int +ptw32_getprocessors (int *count) +{ + DWORD_PTR vProcessCPUs; + DWORD_PTR vSystemCPUs; + int result = 0; + +#if defined(NEED_PROCESS_AFFINITY_MASK) + + *count = 1; + +#else + + if (GetProcessAffinityMask (GetCurrentProcess (), + &vProcessCPUs, &vSystemCPUs)) + { + DWORD_PTR bit; + int CPUs = 0; + + for (bit = 1; bit != 0; bit <<= 1) + { + if (vProcessCPUs & bit) + { + CPUs++; + } + } + *count = CPUs; + } + else + { + result = EAGAIN; + } + +#endif + + return (result); +} diff --git a/win32/3rdparty/pthreads/ptw32_is_attr.c b/win32/3rdparty/pthreads/ptw32_is_attr.c new file mode 100644 index 000000000..36395f81f --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_is_attr.c @@ -0,0 +1,47 @@ +/* + * ptw32_is_attr.c + * + * Description: + * This translation unit implements operations on thread attribute objects. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +int +ptw32_is_attr (const pthread_attr_t * attr) +{ + /* Return 0 if the attr object is valid, non-zero otherwise. */ + + return (attr == NULL || + *attr == NULL || (*attr)->valid != PTW32_ATTR_VALID); +} diff --git a/win32/3rdparty/pthreads/ptw32_mutex_check_need_init.c b/win32/3rdparty/pthreads/ptw32_mutex_check_need_init.c new file mode 100644 index 000000000..35ec366bd --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_mutex_check_need_init.c @@ -0,0 +1,112 @@ +/* + * ptw32_mutex_check_need_init.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +static struct pthread_mutexattr_t_ ptw32_recursive_mutexattr_s = + {PTHREAD_PROCESS_PRIVATE, PTHREAD_MUTEX_RECURSIVE}; +static struct pthread_mutexattr_t_ ptw32_errorcheck_mutexattr_s = + {PTHREAD_PROCESS_PRIVATE, PTHREAD_MUTEX_ERRORCHECK}; +static pthread_mutexattr_t ptw32_recursive_mutexattr = &ptw32_recursive_mutexattr_s; +static pthread_mutexattr_t ptw32_errorcheck_mutexattr = &ptw32_errorcheck_mutexattr_s; + + +INLINE int +ptw32_mutex_check_need_init (pthread_mutex_t * mutex) +{ + register int result = 0; + register pthread_mutex_t mtx; + + /* + * The following guarded test is specifically for statically + * initialised mutexes (via PTHREAD_MUTEX_INITIALIZER). + * + * Note that by not providing this synchronisation we risk + * introducing race conditions into applications which are + * correctly written. + * + * Approach + * -------- + * We know that static mutexes will not be PROCESS_SHARED + * so we can serialise access to internal state using + * Win32 Critical Sections rather than Win32 Mutexes. + * + * If using a single global lock slows applications down too much, + * multiple global locks could be created and hashed on some random + * value associated with each mutex, the pointer perhaps. At a guess, + * a good value for the optimal number of global locks might be + * the number of processors + 1. + * + */ + EnterCriticalSection (&ptw32_mutex_test_init_lock); + + /* + * We got here possibly under race + * conditions. Check again inside the critical section + * and only initialise if the mutex is valid (not been destroyed). + * If a static mutex has been destroyed, the application can + * re-initialise it only by calling pthread_mutex_init() + * explicitly. + */ + mtx = *mutex; + + if (mtx == PTHREAD_MUTEX_INITIALIZER) + { + result = pthread_mutex_init (mutex, NULL); + } + else if (mtx == PTHREAD_RECURSIVE_MUTEX_INITIALIZER) + { + result = pthread_mutex_init (mutex, &ptw32_recursive_mutexattr); + } + else if (mtx == PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) + { + result = pthread_mutex_init (mutex, &ptw32_errorcheck_mutexattr); + } + else if (mtx == NULL) + { + /* + * The mutex has been destroyed while we were waiting to + * initialise it, so the operation that caused the + * auto-initialisation should fail. + */ + result = EINVAL; + } + + LeaveCriticalSection (&ptw32_mutex_test_init_lock); + + return (result); +} diff --git a/win32/3rdparty/pthreads/ptw32_new.c b/win32/3rdparty/pthreads/ptw32_new.c new file mode 100644 index 000000000..281256741 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_new.c @@ -0,0 +1,91 @@ +/* + * ptw32_new.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +pthread_t +ptw32_new (void) +{ + pthread_t t; + pthread_t nil = {NULL, 0}; + ptw32_thread_t * tp; + + /* + * If there's a reusable pthread_t then use it. + */ + t = ptw32_threadReusePop (); + + if (NULL != t.p) + { + tp = (ptw32_thread_t *) t.p; + } + else + { + /* No reuse threads available */ + tp = (ptw32_thread_t *) calloc (1, sizeof(ptw32_thread_t)); + + if (tp == NULL) + { + return nil; + } + + /* ptHandle.p needs to point to it's parent ptw32_thread_t. */ + t.p = tp->ptHandle.p = tp; + t.x = tp->ptHandle.x = 0; + } + + /* Set default state. */ + tp->sched_priority = THREAD_PRIORITY_NORMAL; + tp->detachState = PTHREAD_CREATE_JOINABLE; + tp->cancelState = PTHREAD_CANCEL_ENABLE; + tp->cancelType = PTHREAD_CANCEL_DEFERRED; + tp->cancelLock = PTHREAD_MUTEX_INITIALIZER; + tp->threadLock = PTHREAD_MUTEX_INITIALIZER; + tp->cancelEvent = CreateEvent (0, (int) PTW32_TRUE, /* manualReset */ + (int) PTW32_FALSE, /* setSignaled */ + NULL); + + if (tp->cancelEvent == NULL) + { + ptw32_threadReusePush (tp->ptHandle); + return nil; + } + + return t; + +} diff --git a/win32/3rdparty/pthreads/ptw32_processInitialize.c b/win32/3rdparty/pthreads/ptw32_processInitialize.c new file mode 100644 index 000000000..d13b0226f --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_processInitialize.c @@ -0,0 +1,102 @@ +/* + * ptw32_processInitialize.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +ptw32_processInitialize (void) + /* + * ------------------------------------------------------ + * DOCPRIVATE + * This function performs process wide initialization for + * the pthread library. + * + * PARAMETERS + * N/A + * + * DESCRIPTION + * This function performs process wide initialization for + * the pthread library. + * If successful, this routine sets the global variable + * ptw32_processInitialized to TRUE. + * + * RESULTS + * TRUE if successful, + * FALSE otherwise + * + * ------------------------------------------------------ + */ +{ + if (ptw32_processInitialized) + { + /* + * Ignore if already initialized. this is useful for + * programs that uses a non-dll pthread + * library. Such programs must call ptw32_processInitialize() explicitly, + * since this initialization routine is automatically called only when + * the dll is loaded. + */ + return PTW32_TRUE; + } + + ptw32_processInitialized = PTW32_TRUE; + + /* + * Initialize Keys + */ + if ((pthread_key_create (&ptw32_selfThreadKey, NULL) != 0) || + (pthread_key_create (&ptw32_cleanupKey, NULL) != 0)) + { + + ptw32_processTerminate (); + } + + /* + * Set up the global locks. + */ + InitializeCriticalSection (&ptw32_thread_reuse_lock); + InitializeCriticalSection (&ptw32_mutex_test_init_lock); + InitializeCriticalSection (&ptw32_cond_list_lock); + InitializeCriticalSection (&ptw32_cond_test_init_lock); + InitializeCriticalSection (&ptw32_rwlock_test_init_lock); + InitializeCriticalSection (&ptw32_spinlock_test_init_lock); + + return (ptw32_processInitialized); + +} /* processInitialize */ diff --git a/win32/3rdparty/pthreads/ptw32_processTerminate.c b/win32/3rdparty/pthreads/ptw32_processTerminate.c new file mode 100644 index 000000000..d2dfa7a24 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_processTerminate.c @@ -0,0 +1,114 @@ +/* + * ptw32_processTerminate.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +void +ptw32_processTerminate (void) + /* + * ------------------------------------------------------ + * DOCPRIVATE + * This function performs process wide termination for + * the pthread library. + * + * PARAMETERS + * N/A + * + * DESCRIPTION + * This function performs process wide termination for + * the pthread library. + * This routine sets the global variable + * ptw32_processInitialized to FALSE + * + * RESULTS + * N/A + * + * ------------------------------------------------------ + */ +{ + if (ptw32_processInitialized) + { + ptw32_thread_t * tp, * tpNext; + + if (ptw32_selfThreadKey != NULL) + { + /* + * Release ptw32_selfThreadKey + */ + pthread_key_delete (ptw32_selfThreadKey); + + ptw32_selfThreadKey = NULL; + } + + if (ptw32_cleanupKey != NULL) + { + /* + * Release ptw32_cleanupKey + */ + pthread_key_delete (ptw32_cleanupKey); + + ptw32_cleanupKey = NULL; + } + + EnterCriticalSection (&ptw32_thread_reuse_lock); + + tp = ptw32_threadReuseTop; + while (tp != PTW32_THREAD_REUSE_EMPTY) + { + tpNext = tp->prevReuse; + free (tp); + tp = tpNext; + } + + LeaveCriticalSection (&ptw32_thread_reuse_lock); + + /* + * Destroy the global locks and other objects. + */ + DeleteCriticalSection (&ptw32_spinlock_test_init_lock); + DeleteCriticalSection (&ptw32_rwlock_test_init_lock); + DeleteCriticalSection (&ptw32_cond_test_init_lock); + DeleteCriticalSection (&ptw32_cond_list_lock); + DeleteCriticalSection (&ptw32_mutex_test_init_lock); + DeleteCriticalSection (&ptw32_thread_reuse_lock); + + ptw32_processInitialized = PTW32_FALSE; + } + +} /* processTerminate */ diff --git a/win32/3rdparty/pthreads/ptw32_relmillisecs.c b/win32/3rdparty/pthreads/ptw32_relmillisecs.c new file mode 100644 index 000000000..f3e7b769f --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_relmillisecs.c @@ -0,0 +1,120 @@ +/* + * ptw32_relmillisecs.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _UWIN +//#include +#endif +#include "pthread.h" +#include "implement.h" +#ifndef NEED_FTIME +#include +#endif + + +INLINE DWORD +ptw32_relmillisecs (const struct timespec * abstime) +{ + const int64_t NANOSEC_PER_MILLISEC = 1000000; + const int64_t MILLISEC_PER_SEC = 1000; + DWORD milliseconds; + int64_t tmpAbsMilliseconds; + int64_t tmpCurrMilliseconds; +#ifdef NEED_FTIME + struct timespec currSysTime; + FILETIME ft; + SYSTEMTIME st; +#else /* ! NEED_FTIME */ + struct _timeb currSysTime; +#endif /* NEED_FTIME */ + + + /* + * Calculate timeout as milliseconds from current system time. + */ + + /* + * subtract current system time from abstime in a way that checks + * that abstime is never in the past, or is never equivalent to the + * defined INFINITE value (0xFFFFFFFF). + * + * Assume all integers are unsigned, i.e. cannot test if less than 0. + */ + tmpAbsMilliseconds = (int64_t)abstime->tv_sec * MILLISEC_PER_SEC; + tmpAbsMilliseconds += ((int64_t)abstime->tv_nsec + (NANOSEC_PER_MILLISEC/2)) / NANOSEC_PER_MILLISEC; + + /* get current system time */ + +#ifdef NEED_FTIME + + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + /* + * GetSystemTimeAsFileTime(&ft); would be faster, + * but it does not exist on WinCE + */ + + ptw32_filetime_to_timespec(&ft, &currSysTime); + + tmpCurrMilliseconds = (int64_t)currSysTime.tv_sec * MILLISEC_PER_SEC; + tmpCurrMilliseconds += ((int64_t)currSysTime.tv_nsec + (NANOSEC_PER_MILLISEC/2)) + / NANOSEC_PER_MILLISEC; + +#else /* ! NEED_FTIME */ + + _ftime(&currSysTime); + + tmpCurrMilliseconds = (int64_t) currSysTime.time * MILLISEC_PER_SEC; + tmpCurrMilliseconds += (int64_t) currSysTime.millitm; + +#endif /* NEED_FTIME */ + + if (tmpAbsMilliseconds > tmpCurrMilliseconds) + { + milliseconds = (DWORD) (tmpAbsMilliseconds - tmpCurrMilliseconds); + if (milliseconds == INFINITE) + { + /* Timeouts must be finite */ + milliseconds--; + } + } + else + { + /* The abstime given is in the past */ + milliseconds = 0; + } + + return milliseconds; +} diff --git a/win32/3rdparty/pthreads/ptw32_reuse.c b/win32/3rdparty/pthreads/ptw32_reuse.c new file mode 100644 index 000000000..0e8698496 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_reuse.c @@ -0,0 +1,147 @@ +/* + * ptw32_threadReuse.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +/* + * How it works: + * A pthread_t is a struct (2x32 bit scalar types on IA-32, 2x64 bit on IA-64) + * which is normally passed/returned by value to/from pthreads routines. + * Applications are therefore storing a copy of the struct as it is at that + * time. + * + * The original pthread_t struct plus all copies of it contain the address of + * the thread state struct ptw32_thread_t_ (p), plus a reuse counter (x). Each + * ptw32_thread_t contains the original copy of it's pthread_t. + * Once malloced, a ptw32_thread_t_ struct is not freed until the process exits. + * + * The thread reuse stack is a simple LILO stack managed through a singly + * linked list element in the ptw32_thread_t. + * + * Each time a thread is destroyed, the ptw32_thread_t address is pushed onto the + * reuse stack after it's ptHandle's reuse counter has been incremented. + * + * The following can now be said from this: + * - two pthread_t's are identical if their ptw32_thread_t reference pointers + * are equal and their reuse counters are equal. That is, + * + * equal = (a.p == b.p && a.x == b.x) + * + * - a pthread_t copy refers to a destroyed thread if the reuse counter in + * the copy is not equal to the reuse counter in the original. + * + * threadDestroyed = (copy.x != ((ptw32_thread_t *)copy.p)->ptHandle.x) + * + */ + +/* + * Pop a clean pthread_t struct off the reuse stack. + */ +pthread_t +ptw32_threadReusePop (void) +{ + pthread_t t = {NULL, 0}; + + EnterCriticalSection (&ptw32_thread_reuse_lock); + + if (PTW32_THREAD_REUSE_EMPTY != ptw32_threadReuseTop) + { + ptw32_thread_t * tp; + + tp = ptw32_threadReuseTop; + + ptw32_threadReuseTop = tp->prevReuse; + + if (PTW32_THREAD_REUSE_EMPTY == ptw32_threadReuseTop) + { + ptw32_threadReuseBottom = PTW32_THREAD_REUSE_EMPTY; + } + + tp->prevReuse = NULL; + + t = tp->ptHandle; + } + + LeaveCriticalSection (&ptw32_thread_reuse_lock); + + return t; + +} + +/* + * Push a clean pthread_t struct onto the reuse stack. + * Must be re-initialised when reused. + * All object elements (mutexes, events etc) must have been either + * detroyed before this, or never initialised. + */ +void +ptw32_threadReusePush (pthread_t thread) +{ + ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; + pthread_t t; + + EnterCriticalSection (&ptw32_thread_reuse_lock); + + t = tp->ptHandle; + memset(tp, 0, sizeof(ptw32_thread_t)); + + /* Must restore the original POSIX handle that we just wiped. */ + tp->ptHandle = t; + + /* Bump the reuse counter now */ +#ifdef PTW32_THREAD_ID_REUSE_INCREMENT + tp->ptHandle.x += PTW32_THREAD_ID_REUSE_INCREMENT; +#else + tp->ptHandle.x++; +#endif + + tp->prevReuse = PTW32_THREAD_REUSE_EMPTY; + + if (PTW32_THREAD_REUSE_EMPTY != ptw32_threadReuseBottom) + { + ptw32_threadReuseBottom->prevReuse = tp; + } + else + { + ptw32_threadReuseTop = tp; + } + + ptw32_threadReuseBottom = tp; + + LeaveCriticalSection (&ptw32_thread_reuse_lock); +} diff --git a/win32/3rdparty/pthreads/ptw32_rwlock_cancelwrwait.c b/win32/3rdparty/pthreads/ptw32_rwlock_cancelwrwait.c new file mode 100644 index 000000000..a057bd1d7 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_rwlock_cancelwrwait.c @@ -0,0 +1,50 @@ +/* + * ptw32_rwlock_cancelwrwait.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +void +ptw32_rwlock_cancelwrwait (void *arg) +{ + pthread_rwlock_t rwl = (pthread_rwlock_t) arg; + + rwl->nSharedAccessCount = -rwl->nCompletedSharedAccessCount; + rwl->nCompletedSharedAccessCount = 0; + + (void) pthread_mutex_unlock (&(rwl->mtxSharedAccessCompleted)); + (void) pthread_mutex_unlock (&(rwl->mtxExclusiveAccess)); +} diff --git a/win32/3rdparty/pthreads/ptw32_rwlock_check_need_init.c b/win32/3rdparty/pthreads/ptw32_rwlock_check_need_init.c new file mode 100644 index 000000000..ea2561eef --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_rwlock_check_need_init.c @@ -0,0 +1,93 @@ +/* + * pthread_rwlock_check_need_init.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +INLINE int +ptw32_rwlock_check_need_init (pthread_rwlock_t * rwlock) +{ + int result = 0; + + /* + * The following guarded test is specifically for statically + * initialised rwlocks (via PTHREAD_RWLOCK_INITIALIZER). + * + * Note that by not providing this synchronisation we risk + * introducing race conditions into applications which are + * correctly written. + * + * Approach + * -------- + * We know that static rwlocks will not be PROCESS_SHARED + * so we can serialise access to internal state using + * Win32 Critical Sections rather than Win32 Mutexes. + * + * If using a single global lock slows applications down too much, + * multiple global locks could be created and hashed on some random + * value associated with each mutex, the pointer perhaps. At a guess, + * a good value for the optimal number of global locks might be + * the number of processors + 1. + * + */ + EnterCriticalSection (&ptw32_rwlock_test_init_lock); + + /* + * We got here possibly under race + * conditions. Check again inside the critical section + * and only initialise if the rwlock is valid (not been destroyed). + * If a static rwlock has been destroyed, the application can + * re-initialise it only by calling pthread_rwlock_init() + * explicitly. + */ + if (*rwlock == PTHREAD_RWLOCK_INITIALIZER) + { + result = pthread_rwlock_init (rwlock, NULL); + } + else if (*rwlock == NULL) + { + /* + * The rwlock has been destroyed while we were waiting to + * initialise it, so the operation that caused the + * auto-initialisation should fail. + */ + result = EINVAL; + } + + LeaveCriticalSection (&ptw32_rwlock_test_init_lock); + + return result; +} diff --git a/win32/3rdparty/pthreads/ptw32_semwait.c b/win32/3rdparty/pthreads/ptw32_semwait.c new file mode 100644 index 000000000..8b23d11d6 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_semwait.c @@ -0,0 +1,118 @@ +/* + * ptw32_semwait.c + * + * Description: + * This translation unit implements mutual exclusion (mutex) primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _UWIN +//# include +#endif +#include "pthread.h" +#include "implement.h" + + +int +ptw32_semwait (sem_t * sem) + /* + * ------------------------------------------------------ + * DESCRIPTION + * This function waits on a POSIX semaphore. If the + * semaphore value is greater than zero, it decreases + * its value by one. If the semaphore value is zero, then + * the calling thread (or process) is blocked until it can + * successfully decrease the value. + * + * Unlike sem_wait(), this routine is non-cancelable. + * + * RESULTS + * 0 successfully decreased semaphore, + * -1 failed, error in errno. + * ERRNO + * EINVAL 'sem' is not a valid semaphore, + * ENOSYS semaphores are not supported, + * EINTR the function was interrupted by a signal, + * EDEADLK a deadlock condition was detected. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = *sem; + + if (s == NULL) + { + result = EINVAL; + } + else + { + if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + int v = --s->value; + + (void) pthread_mutex_unlock (&s->lock); + + if (v < 0) + { + /* Must wait */ + if (WaitForSingleObject (s->sem, INFINITE) == WAIT_OBJECT_0) + { +#ifdef NEED_SEM + if (pthread_mutex_lock (&s->lock) == 0) + { + if (s->leftToUnblock > 0) + { + --s->leftToUnblock; + SetEvent(s->sem); + } + (void) pthread_mutex_unlock (&s->lock); + } +#endif + return 0; + } + } + else + { + return 0; + } + } + } + + if (result != 0) + { + errno = result; + return -1; + } + + return 0; + +} /* ptw32_semwait */ diff --git a/win32/3rdparty/pthreads/ptw32_spinlock_check_need_init.c b/win32/3rdparty/pthreads/ptw32_spinlock_check_need_init.c new file mode 100644 index 000000000..bf45bc397 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_spinlock_check_need_init.c @@ -0,0 +1,81 @@ +/* + * ptw32_spinlock_check_need_init.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +INLINE int +ptw32_spinlock_check_need_init (pthread_spinlock_t * lock) +{ + int result = 0; + + /* + * The following guarded test is specifically for statically + * initialised spinlocks (via PTHREAD_SPINLOCK_INITIALIZER). + * + * Note that by not providing this synchronisation we risk + * introducing race conditions into applications which are + * correctly written. + */ + EnterCriticalSection (&ptw32_spinlock_test_init_lock); + + /* + * We got here possibly under race + * conditions. Check again inside the critical section + * and only initialise if the spinlock is valid (not been destroyed). + * If a static spinlock has been destroyed, the application can + * re-initialise it only by calling pthread_spin_init() + * explicitly. + */ + if (*lock == PTHREAD_SPINLOCK_INITIALIZER) + { + result = pthread_spin_init (lock, PTHREAD_PROCESS_PRIVATE); + } + else if (*lock == NULL) + { + /* + * The spinlock has been destroyed while we were waiting to + * initialise it, so the operation that caused the + * auto-initialisation should fail. + */ + result = EINVAL; + } + + LeaveCriticalSection (&ptw32_spinlock_test_init_lock); + + return (result); +} diff --git a/win32/3rdparty/pthreads/ptw32_threadDestroy.c b/win32/3rdparty/pthreads/ptw32_threadDestroy.c new file mode 100644 index 000000000..eb9abfc61 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_threadDestroy.c @@ -0,0 +1,82 @@ +/* + * ptw32_threadDestroy.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +void +ptw32_threadDestroy (pthread_t thread) +{ + ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; + ptw32_thread_t threadCopy; + + if (tp != NULL) + { + /* + * Copy thread state so that the thread can be atomically NULLed. + */ + memcpy (&threadCopy, tp, sizeof (threadCopy)); + + /* + * Thread ID structs are never freed. They're NULLed and reused. + * This also sets the thread to PThreadStateInitial (invalid). + */ + ptw32_threadReusePush (thread); + + /* Now work on the copy. */ + if (threadCopy.cancelEvent != NULL) + { + CloseHandle (threadCopy.cancelEvent); + } + + (void) pthread_mutex_destroy(&threadCopy.cancelLock); + (void) pthread_mutex_destroy(&threadCopy.threadLock); + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + /* + * See documentation for endthread vs endthreadex. + */ + if (threadCopy.threadH != 0) + { + CloseHandle (threadCopy.threadH); + } +#endif + + } +} /* ptw32_threadDestroy */ + diff --git a/win32/3rdparty/pthreads/ptw32_threadStart.c b/win32/3rdparty/pthreads/ptw32_threadStart.c new file mode 100644 index 000000000..5c0fe0e85 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_threadStart.c @@ -0,0 +1,360 @@ +/* + * ptw32_threadStart.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +#ifdef __CLEANUP_SEH + +static DWORD +ExceptionFilter (EXCEPTION_POINTERS * ep, DWORD * ei) +{ + switch (ep->ExceptionRecord->ExceptionCode) + { + case EXCEPTION_PTW32_SERVICES: + { + DWORD param; + DWORD numParams = ep->ExceptionRecord->NumberParameters; + + numParams = (numParams > 3) ? 3 : numParams; + + for (param = 0; param < numParams; param++) + { + ei[param] = ep->ExceptionRecord->ExceptionInformation[param]; + } + + return EXCEPTION_EXECUTE_HANDLER; + break; + } + default: + { + /* + * A system unexpected exception has occurred running the user's + * routine. We need to cleanup before letting the exception + * out of thread scope. + */ + pthread_t self = pthread_self (); + + (void) pthread_mutex_destroy (&((ptw32_thread_t *)self.p)->cancelLock); + ptw32_callUserDestroyRoutines (self); + + return EXCEPTION_CONTINUE_SEARCH; + break; + } + } +} + +#elif defined(__CLEANUP_CXX) + +#if defined(_MSC_VER) +# include +#elif defined(__WATCOMC__) +# include +# include +typedef terminate_handler + terminate_function; +#else +# if defined(__GNUC__) && __GNUC__ < 3 +# include +# else +# include +using + std::terminate_handler; +using + std::terminate; +using + std::set_terminate; +# endif +typedef terminate_handler + terminate_function; +#endif + +static terminate_function + ptw32_oldTerminate; + +void +ptw32_terminate () +{ + set_terminate (ptw32_oldTerminate); + (void) pthread_win32_thread_detach_np (); + terminate (); +} + +#endif + +#if ! defined (__MINGW32__) || (defined (__MSVCRT__) && ! defined (__DMC__)) +unsigned + __stdcall +#else +void +#endif +ptw32_threadStart (void *vthreadParms) +{ + ThreadParms * threadParms = (ThreadParms *) vthreadParms; + pthread_t self; + ptw32_thread_t * sp; + void *(*start) (void *); + void * arg; + +#ifdef __CLEANUP_SEH + DWORD + ei[] = { 0, 0, 0 }; +#endif + +#ifdef __CLEANUP_C + int setjmp_rc; +#endif + + void * status = (void *) 0; + + self = threadParms->tid; + sp = (ptw32_thread_t *) self.p; + start = threadParms->start; + arg = threadParms->arg; + + free (threadParms); + +#if defined (__MINGW32__) && ! defined (__MSVCRT__) + /* + * beginthread does not return the thread id and is running + * before it returns us the thread handle, and so we do it here. + */ + sp->thread = GetCurrentThreadId (); + /* + * Here we're using cancelLock as a general-purpose lock + * to make the new thread wait until the creating thread + * has the new handle. + */ + if (pthread_mutex_lock (&sp->cancelLock) == 0) + { + (void) pthread_mutex_unlock (&sp->cancelLock); + } +#endif + + pthread_setspecific (ptw32_selfThreadKey, sp); + + sp->state = PThreadStateRunning; + +#ifdef __CLEANUP_SEH + + __try + { + /* + * Run the caller's routine; + */ + status = sp->exitStatus = (*start) (arg); + +#ifdef _UWIN + if (--pthread_count <= 0) + exit (0); +#endif + + } + __except (ExceptionFilter (GetExceptionInformation (), ei)) + { + switch (ei[0]) + { + case PTW32_EPS_CANCEL: + status = sp->exitStatus = PTHREAD_CANCELED; +#ifdef _UWIN + if (--pthread_count <= 0) + exit (0); +#endif + break; + case PTW32_EPS_EXIT: + status = sp->exitStatus; + break; + default: + status = sp->exitStatus = PTHREAD_CANCELED; + break; + } + } + +#else /* __CLEANUP_SEH */ + +#ifdef __CLEANUP_C + + setjmp_rc = setjmp (sp->start_mark); + + if (0 == setjmp_rc) + { + + /* + * Run the caller's routine; + */ + status = sp->exitStatus = (*start) (arg); + } + else + { + switch (setjmp_rc) + { + case PTW32_EPS_CANCEL: + status = sp->exitStatus = PTHREAD_CANCELED; + break; + case PTW32_EPS_EXIT: + status = sp->exitStatus; + break; + default: + status = sp->exitStatus = PTHREAD_CANCELED; + break; + } + } + +#else /* __CLEANUP_C */ + +#ifdef __CLEANUP_CXX + + ptw32_oldTerminate = set_terminate (&ptw32_terminate); + + try + { + /* + * Run the caller's routine in a nested try block so that we + * can run the user's terminate function, which may call + * pthread_exit() or be canceled. + */ + try + { + status = sp->exitStatus = (*start) (arg); + } + catch (ptw32_exception &) + { + /* + * Pass these through to the outer block. + */ + throw; + } + catch (...) + { + /* + * We want to run the user's terminate function if supplied. + * That function may call pthread_exit() or be canceled, which will + * be handled by the outer try block. + * + * ptw32_terminate() will be called if there is no user + * supplied function. + */ + + terminate_function + term_func = set_terminate (0); + set_terminate (term_func); + + if (term_func != 0) + { + term_func (); + } + + throw; + } + } + catch (ptw32_exception_cancel &) + { + /* + * Thread was canceled. + */ + status = sp->exitStatus = PTHREAD_CANCELED; + } + catch (ptw32_exception_exit &) + { + /* + * Thread was exited via pthread_exit(). + */ + status = sp->exitStatus; + } + catch (...) + { + /* + * A system unexpected exception has occurred running the user's + * terminate routine. We get control back within this block - cleanup + * and release the exception out of thread scope. + */ + status = sp->exitStatus = PTHREAD_CANCELED; + (void) pthread_mutex_lock (&sp->cancelLock); + sp->state = PThreadStateException; + (void) pthread_mutex_unlock (&sp->cancelLock); + (void) pthread_win32_thread_detach_np (); + (void) set_terminate (ptw32_oldTerminate); + throw; + + /* + * Never reached. + */ + } + + (void) set_terminate (ptw32_oldTerminate); + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __CLEANUP_CXX */ +#endif /* __CLEANUP_C */ +#endif /* __CLEANUP_SEH */ + +#if defined(PTW32_STATIC_LIB) + /* + * We need to cleanup the pthread now if we have + * been statically linked, in which case the cleanup + * in dllMain won't get done. Joinable threads will + * only be partially cleaned up and must be fully cleaned + * up by pthread_join() or pthread_detach(). + * + * Note: if this library has been statically linked, + * implicitly created pthreads (those created + * for Win32 threads which have called pthreads routines) + * must be cleaned up explicitly by the application + * (by calling pthread_win32_thread_detach_np()). + * For the dll, dllMain will do the cleanup automatically. + */ + (void) pthread_win32_thread_detach_np (); +#endif + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + _endthreadex ((unsigned) status); +#else + _endthread (); +#endif + + /* + * Never reached. + */ + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + return (unsigned) status; +#endif + +} /* ptw32_threadStart */ diff --git a/win32/3rdparty/pthreads/ptw32_throw.c b/win32/3rdparty/pthreads/ptw32_throw.c new file mode 100644 index 000000000..493f4e4dc --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_throw.c @@ -0,0 +1,167 @@ +/* + * ptw32_throw.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + +/* + * ptw32_throw + * + * All canceled and explicitly exited POSIX threads go through + * here. This routine knows how to exit both POSIX initiated threads and + * 'implicit' POSIX threads for each of the possible language modes (C, + * C++, and SEH). + */ +void +ptw32_throw (DWORD exception) +{ + /* + * Don't use pthread_self() to avoid creating an implicit POSIX thread handle + * unnecessarily. + */ + ptw32_thread_t * sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); + +#ifdef __CLEANUP_SEH + DWORD exceptionInformation[3]; +#endif + + if (exception != PTW32_EPS_CANCEL && exception != PTW32_EPS_EXIT) + { + /* Should never enter here */ + exit (1); + } + + if (NULL == sp || sp->implicit) + { + /* + * We're inside a non-POSIX initialised Win32 thread + * so there is no point to jump or throw back to. Just do an + * explicit thread exit here after cleaning up POSIX + * residue (i.e. cleanup handlers, POSIX thread handle etc). + */ + unsigned exitCode = 0; + + switch (exception) + { + case PTW32_EPS_CANCEL: + exitCode = (unsigned) PTHREAD_CANCELED; + break; + case PTW32_EPS_EXIT: + exitCode = (unsigned) sp->exitStatus;; + break; + } + +#if defined(PTW32_STATIC_LIB) + + pthread_win32_thread_detach_np (); + +#endif + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + _endthreadex (exitCode); +#else + _endthread (); +#endif + + } + +#ifdef __CLEANUP_SEH + + + exceptionInformation[0] = (DWORD) (exception); + exceptionInformation[1] = (DWORD) (0); + exceptionInformation[2] = (DWORD) (0); + + RaiseException (EXCEPTION_PTW32_SERVICES, 0, 3, exceptionInformation); + +#else /* __CLEANUP_SEH */ + +#ifdef __CLEANUP_C + + ptw32_pop_cleanup_all (1); + longjmp (sp->start_mark, exception); + +#else /* __CLEANUP_C */ + +#ifdef __CLEANUP_CXX + + switch (exception) + { + case PTW32_EPS_CANCEL: + throw ptw32_exception_cancel (); + break; + case PTW32_EPS_EXIT: + throw ptw32_exception_exit (); + break; + } + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __CLEANUP_CXX */ + +#endif /* __CLEANUP_C */ + +#endif /* __CLEANUP_SEH */ + + /* Never reached */ +} + + +void +ptw32_pop_cleanup_all (int execute) +{ + while (NULL != ptw32_pop_cleanup (execute)) + { + } +} + + +DWORD +ptw32_get_exception_services_code (void) +{ +#ifdef __CLEANUP_SEH + + return EXCEPTION_PTW32_SERVICES; + +#else + + return (DWORD) NULL; + +#endif +} diff --git a/win32/3rdparty/pthreads/ptw32_timespec.c b/win32/3rdparty/pthreads/ptw32_timespec.c new file mode 100644 index 000000000..6a2cb565a --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_timespec.c @@ -0,0 +1,83 @@ +/* + * ptw32_timespec.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#ifdef NEED_FTIME + +/* + * time between jan 1, 1601 and jan 1, 1970 in units of 100 nanoseconds + */ +#define PTW32_TIMESPEC_TO_FILETIME_OFFSET \ + ( ((LONGLONG) 27111902 << 32) + (LONGLONG) 3577643008 ) + +INLINE void +ptw32_timespec_to_filetime (const struct timespec *ts, FILETIME * ft) + /* + * ------------------------------------------------------------------- + * converts struct timespec + * where the time is expressed in seconds and nanoseconds from Jan 1, 1970. + * into FILETIME (as set by GetSystemTimeAsFileTime), where the time is + * expressed in 100 nanoseconds from Jan 1, 1601, + * ------------------------------------------------------------------- + */ +{ + *(LONGLONG *) ft = ts->tv_sec * 10000000 + + (ts->tv_nsec + 50) / 100 + PTW32_TIMESPEC_TO_FILETIME_OFFSET; +} + +INLINE void +ptw32_filetime_to_timespec (const FILETIME * ft, struct timespec *ts) + /* + * ------------------------------------------------------------------- + * converts FILETIME (as set by GetSystemTimeAsFileTime), where the time is + * expressed in 100 nanoseconds from Jan 1, 1601, + * into struct timespec + * where the time is expressed in seconds and nanoseconds from Jan 1, 1970. + * ------------------------------------------------------------------- + */ +{ + ts->tv_sec = + (int) ((*(LONGLONG *) ft - PTW32_TIMESPEC_TO_FILETIME_OFFSET) / 10000000); + ts->tv_nsec = + (int) ((*(LONGLONG *) ft - PTW32_TIMESPEC_TO_FILETIME_OFFSET - + ((LONGLONG) ts->tv_sec * (LONGLONG) 10000000)) * 100); +} + +#endif /* NEED_FTIME */ diff --git a/win32/3rdparty/pthreads/ptw32_tkAssocCreate.c b/win32/3rdparty/pthreads/ptw32_tkAssocCreate.c new file mode 100644 index 000000000..5ba24bbf7 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_tkAssocCreate.c @@ -0,0 +1,118 @@ +/* + * ptw32_tkAssocCreate.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +int +ptw32_tkAssocCreate (ptw32_thread_t * sp, pthread_key_t key) + /* + * ------------------------------------------------------------------- + * This routine creates an association that + * is unique for the given (thread,key) combination.The association + * is referenced by both the thread and the key. + * This association allows us to determine what keys the + * current thread references and what threads a given key + * references. + * See the detailed description + * at the beginning of this file for further details. + * + * Notes: + * 1) New associations are pushed to the beginning of the + * chain so that the internal ptw32_selfThreadKey association + * is always last, thus allowing selfThreadExit to + * be implicitly called last by pthread_exit. + * 2) + * + * Parameters: + * thread + * current running thread. + * key + * key on which to create an association. + * Returns: + * 0 - if successful, + * ENOMEM - not enough memory to create assoc or other object + * EINVAL - an internal error occurred + * ENOSYS - an internal error occurred + * ------------------------------------------------------------------- + */ +{ + ThreadKeyAssoc *assoc; + + /* + * Have to create an association and add it + * to both the key and the thread. + * + * Both key->keyLock and thread->threadLock are locked on + * entry to this routine. + */ + assoc = (ThreadKeyAssoc *) calloc (1, sizeof (*assoc)); + + if (assoc == NULL) + { + return ENOMEM; + } + + assoc->thread = sp; + assoc->key = key; + + /* + * Register assoc with key + */ + assoc->prevThread = NULL; + assoc->nextThread = (ThreadKeyAssoc *) key->threads; + if (assoc->nextThread != NULL) + { + assoc->nextThread->prevThread = assoc; + } + key->threads = (void *) assoc; + + /* + * Register assoc with thread + */ + assoc->prevKey = NULL; + assoc->nextKey = (ThreadKeyAssoc *) sp->keys; + if (assoc->nextKey != NULL) + { + assoc->nextKey->prevKey = assoc; + } + sp->keys = (void *) assoc; + + return (0); + +} /* ptw32_tkAssocCreate */ diff --git a/win32/3rdparty/pthreads/ptw32_tkAssocDestroy.c b/win32/3rdparty/pthreads/ptw32_tkAssocDestroy.c new file mode 100644 index 000000000..a7842ea87 --- /dev/null +++ b/win32/3rdparty/pthreads/ptw32_tkAssocDestroy.c @@ -0,0 +1,114 @@ +/* + * ptw32_tkAssocDestroy.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +void +ptw32_tkAssocDestroy (ThreadKeyAssoc * assoc) + /* + * ------------------------------------------------------------------- + * This routine releases all resources for the given ThreadKeyAssoc + * once it is no longer being referenced + * ie) either the key or thread has stopped referencing it. + * + * Parameters: + * assoc + * an instance of ThreadKeyAssoc. + * Returns: + * N/A + * ------------------------------------------------------------------- + */ +{ + + /* + * Both key->keyLock and thread->threadLock are locked on + * entry to this routine. + */ + if (assoc != NULL) + { + ThreadKeyAssoc * prev, * next; + + /* Remove assoc from thread's keys chain */ + prev = assoc->prevKey; + next = assoc->nextKey; + if (prev != NULL) + { + prev->nextKey = next; + } + if (next != NULL) + { + next->prevKey = prev; + } + + if (assoc->thread->keys == assoc) + { + /* We're at the head of the thread's keys chain */ + assoc->thread->keys = next; + } + if (assoc->thread->nextAssoc == assoc) + { + /* + * Thread is exiting and we're deleting the assoc to be processed next. + * Hand thread the assoc after this one. + */ + assoc->thread->nextAssoc = next; + } + + /* Remove assoc from key's threads chain */ + prev = assoc->prevThread; + next = assoc->nextThread; + if (prev != NULL) + { + prev->nextThread = next; + } + if (next != NULL) + { + next->prevThread = prev; + } + + if (assoc->key->threads == assoc) + { + /* We're at the head of the key's threads chain */ + assoc->key->threads = next; + } + + free (assoc); + } + +} /* ptw32_tkAssocDestroy */ diff --git a/win32/3rdparty/pthreads/rwlock.c b/win32/3rdparty/pthreads/rwlock.c new file mode 100644 index 000000000..4a3cd2594 --- /dev/null +++ b/win32/3rdparty/pthreads/rwlock.c @@ -0,0 +1,51 @@ +/* + * rwlock.c + * + * Description: + * This translation unit implements read/write lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "ptw32_rwlock_check_need_init.c" +#include "ptw32_rwlock_cancelwrwait.c" +#include "pthread_rwlock_init.c" +#include "pthread_rwlock_destroy.c" +#include "pthread_rwlockattr_init.c" +#include "pthread_rwlockattr_destroy.c" +#include "pthread_rwlockattr_getpshared.c" +#include "pthread_rwlockattr_setpshared.c" +#include "pthread_rwlock_rdlock.c" +#include "pthread_rwlock_timedrdlock.c" +#include "pthread_rwlock_wrlock.c" +#include "pthread_rwlock_timedwrlock.c" +#include "pthread_rwlock_unlock.c" +#include "pthread_rwlock_tryrdlock.c" +#include "pthread_rwlock_trywrlock.c" diff --git a/win32/3rdparty/pthreads/sched.c b/win32/3rdparty/pthreads/sched.c new file mode 100644 index 000000000..ed30ea7b2 --- /dev/null +++ b/win32/3rdparty/pthreads/sched.c @@ -0,0 +1,53 @@ +/* + * sched.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +#include "pthread_attr_setschedpolicy.c" +#include "pthread_attr_getschedpolicy.c" +#include "pthread_attr_setschedparam.c" +#include "pthread_attr_getschedparam.c" +#include "pthread_attr_setinheritsched.c" +#include "pthread_attr_getinheritsched.c" +#include "pthread_setschedparam.c" +#include "pthread_getschedparam.c" +#include "sched_get_priority_max.c" +#include "sched_get_priority_min.c" +#include "sched_setscheduler.c" +#include "sched_getscheduler.c" +#include "sched_yield.c" diff --git a/win32/3rdparty/pthreads/sched.h b/win32/3rdparty/pthreads/sched.h new file mode 100644 index 000000000..dfb8e934a --- /dev/null +++ b/win32/3rdparty/pthreads/sched.h @@ -0,0 +1,178 @@ +/* + * Module: sched.h + * + * Purpose: + * Provides an implementation of POSIX realtime extensions + * as defined in + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#ifndef _SCHED_H +#define _SCHED_H + +#undef PTW32_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_LEVEL +#define PTW32_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_LEVEL +#define PTW32_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_LEVEL_MAX 3 + +#if !defined(PTW32_LEVEL) +#define PTW32_LEVEL PTW32_LEVEL_MAX +/* Include everything */ +#endif + + +#if __GNUC__ && ! defined (__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the DLL code, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the DLL, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#ifndef PTW32_STATIC_LIB +# ifdef PTW32_BUILD +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#ifndef PTW32_CONFIG_H +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +#ifdef NEED_ERRNO +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +#if defined(__MINGW32__) || defined(_UWIN) +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +/* For pid_t */ +# include +/* Required by Unix 98 */ +# include +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ +#else +typedef int pid_t; +#endif + +/* Thread scheduling policies */ + +enum { + SCHED_OTHER = 0, + SCHED_FIFO, + SCHED_RR, + SCHED_MIN = SCHED_OTHER, + SCHED_MAX = SCHED_RR +}; + +struct sched_param { + int sched_priority; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PTW32_DLLPORT int __cdecl sched_yield (void); + +PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy); + +PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy); + +PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy); + +PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid); + +/* + * Note that this macro returns ENOTSUP rather than + * ENOSYS as might be expected. However, returning ENOSYS + * should mean that sched_get_priority_{min,max} are + * not implemented as well as sched_rr_get_interval. + * This is not the case, since we just don't support + * round-robin scheduling. Therefore I have chosen to + * return the same value as sched_setscheduler when + * SCHED_RR is passed to it. + */ +#define sched_rr_get_interval(_pid, _interval) \ + ( errno = ENOTSUP, (int) -1 ) + + +#ifdef __cplusplus +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#undef PTW32_LEVEL +#undef PTW32_LEVEL_MAX + +#endif /* !_SCHED_H */ + diff --git a/win32/3rdparty/pthreads/sched_get_priority_max.c b/win32/3rdparty/pthreads/sched_get_priority_max.c new file mode 100644 index 000000000..cabf2320a --- /dev/null +++ b/win32/3rdparty/pthreads/sched_get_priority_max.c @@ -0,0 +1,134 @@ +/* + * sched_get_priority_max.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +/* + * On Windows98, THREAD_PRIORITY_LOWEST is (-2) and + * THREAD_PRIORITY_HIGHEST is 2, and everything works just fine. + * + * On WinCE 3.0, it so happen that THREAD_PRIORITY_LOWEST is 5 + * and THREAD_PRIORITY_HIGHEST is 1 (yes, I know, it is funny: + * highest priority use smaller numbers) and the following happens: + * + * sched_get_priority_min() returns 5 + * sched_get_priority_max() returns 1 + * + * The following table shows the base priority levels for combinations + * of priority class and priority value in Win32. + * + * Process Priority Class Thread Priority Level + * ----------------------------------------------------------------- + * 1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 7 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 11 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 17 REALTIME_PRIORITY_CLASS -7 + * 18 REALTIME_PRIORITY_CLASS -6 + * 19 REALTIME_PRIORITY_CLASS -5 + * 20 REALTIME_PRIORITY_CLASS -4 + * 21 REALTIME_PRIORITY_CLASS -3 + * 22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 27 REALTIME_PRIORITY_CLASS 3 + * 28 REALTIME_PRIORITY_CLASS 4 + * 29 REALTIME_PRIORITY_CLASS 5 + * 30 REALTIME_PRIORITY_CLASS 6 + * 31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * + * Windows NT: Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported. + */ + + +int +sched_get_priority_max (int policy) +{ + if (policy < SCHED_MIN || policy > SCHED_MAX) + { + errno = EINVAL; + return -1; + } + +#if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL) + /* WinCE? */ + return PTW32_MAX (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_TIME_CRITICAL); +#else + /* This is independent of scheduling policy in Win32. */ + return PTW32_MAX (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_TIME_CRITICAL); +#endif +} diff --git a/win32/3rdparty/pthreads/sched_get_priority_min.c b/win32/3rdparty/pthreads/sched_get_priority_min.c new file mode 100644 index 000000000..9c4f8591e --- /dev/null +++ b/win32/3rdparty/pthreads/sched_get_priority_min.c @@ -0,0 +1,135 @@ +/* + * sched_get_priority_min.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +/* + * On Windows98, THREAD_PRIORITY_LOWEST is (-2) and + * THREAD_PRIORITY_HIGHEST is 2, and everything works just fine. + * + * On WinCE 3.0, it so happen that THREAD_PRIORITY_LOWEST is 5 + * and THREAD_PRIORITY_HIGHEST is 1 (yes, I know, it is funny: + * highest priority use smaller numbers) and the following happens: + * + * sched_get_priority_min() returns 5 + * sched_get_priority_max() returns 1 + * + * The following table shows the base priority levels for combinations + * of priority class and priority value in Win32. + * + * Process Priority Class Thread Priority Level + * ----------------------------------------------------------------- + * 1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 7 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 11 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * 16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE + * 17 REALTIME_PRIORITY_CLASS -7 + * 18 REALTIME_PRIORITY_CLASS -6 + * 19 REALTIME_PRIORITY_CLASS -5 + * 20 REALTIME_PRIORITY_CLASS -4 + * 21 REALTIME_PRIORITY_CLASS -3 + * 22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST + * 23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL + * 24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL + * 25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL + * 26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST + * 27 REALTIME_PRIORITY_CLASS 3 + * 28 REALTIME_PRIORITY_CLASS 4 + * 29 REALTIME_PRIORITY_CLASS 5 + * 30 REALTIME_PRIORITY_CLASS 6 + * 31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL + * + * Windows NT: Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported. + * + */ + + +int +sched_get_priority_min (int policy) +{ + if (policy < SCHED_MIN || policy > SCHED_MAX) + { + errno = EINVAL; + return -1; + } + +#if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL) + /* WinCE? */ + return PTW32_MIN (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_TIME_CRITICAL); +#else + /* This is independent of scheduling policy in Win32. */ + return PTW32_MIN (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_TIME_CRITICAL); +#endif +} diff --git a/win32/3rdparty/pthreads/sched_getscheduler.c b/win32/3rdparty/pthreads/sched_getscheduler.c new file mode 100644 index 000000000..9bc819e47 --- /dev/null +++ b/win32/3rdparty/pthreads/sched_getscheduler.c @@ -0,0 +1,69 @@ +/* + * sched_getscheduler.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +sched_getscheduler (pid_t pid) +{ + /* + * Win32 only has one policy which we call SCHED_OTHER. + * However, we try to provide other valid side-effects + * such as EPERM and ESRCH errors. + */ + if (0 != pid) + { + int selfPid = (int) GetCurrentProcessId (); + + if (pid != selfPid) + { + HANDLE h = + OpenProcess (PROCESS_QUERY_INFORMATION, PTW32_FALSE, (DWORD) pid); + + if (NULL == h) + { + errno = + (GetLastError () == + (0xFF & ERROR_ACCESS_DENIED)) ? EPERM : ESRCH; + return -1; + } + } + } + + return SCHED_OTHER; +} diff --git a/win32/3rdparty/pthreads/sched_setscheduler.c b/win32/3rdparty/pthreads/sched_setscheduler.c new file mode 100644 index 000000000..4e060c7e5 --- /dev/null +++ b/win32/3rdparty/pthreads/sched_setscheduler.c @@ -0,0 +1,81 @@ +/* + * sched_setscheduler.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +sched_setscheduler (pid_t pid, int policy) +{ + /* + * Win32 only has one policy which we call SCHED_OTHER. + * However, we try to provide other valid side-effects + * such as EPERM and ESRCH errors. Choosing to check + * for a valid policy last allows us to get the most value out + * of this function. + */ + if (0 != pid) + { + int selfPid = (int) GetCurrentProcessId (); + + if (pid != selfPid) + { + HANDLE h = + OpenProcess (PROCESS_SET_INFORMATION, PTW32_FALSE, (DWORD) pid); + + if (NULL == h) + { + errno = + (GetLastError () == + (0xFF & ERROR_ACCESS_DENIED)) ? EPERM : ESRCH; + return -1; + } + } + } + + if (SCHED_OTHER != policy) + { + errno = ENOSYS; + return -1; + } + + /* + * Don't set anything because there is nothing to set. + * Just return the current (the only possible) value. + */ + return SCHED_OTHER; +} diff --git a/win32/3rdparty/pthreads/sched_yield.c b/win32/3rdparty/pthreads/sched_yield.c new file mode 100644 index 000000000..6ac5ed926 --- /dev/null +++ b/win32/3rdparty/pthreads/sched_yield.c @@ -0,0 +1,71 @@ +/* + * sched_yield.c + * + * Description: + * POSIX thread functions that deal with thread scheduling. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" +#include "sched.h" + +int +sched_yield (void) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function indicates that the calling thread is + * willing to give up some time slices to other threads. + * + * PARAMETERS + * N/A + * + * + * DESCRIPTION + * This function indicates that the calling thread is + * willing to give up some time slices to other threads. + * NOTE: Since this is part of POSIX 1003.1b + * (realtime extensions), it is defined as returning + * -1 if an error occurs and sets errno to the actual + * error. + * + * RESULTS + * 0 successfully created semaphore, + * ENOSYS sched_yield not supported, + * + * ------------------------------------------------------ + */ +{ + Sleep (0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/sem_close.c b/win32/3rdparty/pthreads/sem_close.c new file mode 100644 index 000000000..2f95c8785 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_close.c @@ -0,0 +1,58 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_close.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +sem_close (sem_t * sem) +{ + errno = ENOSYS; + return -1; +} /* sem_close */ diff --git a/win32/3rdparty/pthreads/sem_destroy.c b/win32/3rdparty/pthreads/sem_destroy.c new file mode 100644 index 000000000..6c98e80b9 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_destroy.c @@ -0,0 +1,144 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_destroy.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +int +sem_destroy (sem_t * sem) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function destroys an unnamed semaphore. + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * DESCRIPTION + * This function destroys an unnamed semaphore. + * + * RESULTS + * 0 successfully destroyed semaphore, + * -1 failed, error in errno + * ERRNO + * EINVAL 'sem' is not a valid semaphore, + * ENOSYS semaphores are not supported, + * EBUSY threads (or processes) are currently + * blocked on 'sem' + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = NULL; + + if (sem == NULL || *sem == NULL) + { + result = EINVAL; + } + else + { + s = *sem; + + if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + if (s->value < 0) + { + (void) pthread_mutex_unlock (&s->lock); + result = EBUSY; + } + else + { + /* There are no threads currently blocked on this semaphore. */ + + if (!CloseHandle (s->sem)) + { + (void) pthread_mutex_unlock (&s->lock); + result = EINVAL; + } + else + { + /* + * Invalidate the semaphore handle when we have the lock. + * Other sema operations should test this after acquiring the lock + * to check that the sema is still valid, i.e. before performing any + * operations. This may only be necessary before the sema op routine + * returns so that the routine can return EINVAL - e.g. if setting + * s->value to SEM_VALUE_MAX below does force a fall-through. + */ + *sem = NULL; + + /* Prevent anyone else actually waiting on or posting this sema. + */ + s->value = SEM_VALUE_MAX; + + (void) pthread_mutex_unlock (&s->lock); + + do + { + /* Give other threads a chance to run and exit any sema op + * routines. Due to the SEM_VALUE_MAX value, if sem_post or + * sem_wait were blocked by us they should fall through. + */ + Sleep(0); + } + while (pthread_mutex_destroy (&s->lock) == EBUSY); + } + } + } + } + + if (result != 0) + { + errno = result; + return -1; + } + + free (s); + + return 0; + +} /* sem_destroy */ diff --git a/win32/3rdparty/pthreads/sem_getvalue.c b/win32/3rdparty/pthreads/sem_getvalue.c new file mode 100644 index 000000000..baafb02cf --- /dev/null +++ b/win32/3rdparty/pthreads/sem_getvalue.c @@ -0,0 +1,110 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_getvalue.c + * + * Purpose: + * Semaphores aren't actually part of PThreads. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1-2001 + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +int +sem_getvalue (sem_t * sem, int *sval) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function stores the current count value of the + * semaphore. + * RESULTS + * + * Return value + * + * 0 sval has been set. + * -1 failed, error in errno + * + * in global errno + * + * EINVAL 'sem' is not a valid semaphore, + * ENOSYS this function is not supported, + * + * + * PARAMETERS + * + * sem pointer to an instance of sem_t + * + * sval pointer to int. + * + * DESCRIPTION + * This function stores the current count value of the semaphore + * pointed to by sem in the int pointed to by sval. + */ +{ + if (sem == NULL || *sem == NULL || sval == NULL) + { + errno = EINVAL; + return -1; + } + else + { + long value; + register sem_t s = *sem; + int result = 0; + + if ((result = pthread_mutex_lock(&s->lock)) == 0) + { + /* See sem_destroy.c + */ + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + errno = EINVAL; + return -1; + } + + value = s->value; + (void) pthread_mutex_unlock(&s->lock); + *sval = value; + } + + return result; + } + +} /* sem_getvalue */ diff --git a/win32/3rdparty/pthreads/sem_init.c b/win32/3rdparty/pthreads/sem_init.c new file mode 100644 index 000000000..02acd90f1 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_init.c @@ -0,0 +1,169 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_init.c + * + * Purpose: + * Semaphores aren't actually part of PThreads. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1-2001 + * + * ------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + +int +sem_init (sem_t * sem, int pshared, unsigned int value) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function initializes a semaphore. The + * initial value of the semaphore is 'value' + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * pshared + * if zero, this semaphore may only be shared between + * threads in the same process. + * if nonzero, the semaphore can be shared between + * processes + * + * value + * initial value of the semaphore counter + * + * DESCRIPTION + * This function initializes a semaphore. The + * initial value of the semaphore is set to 'value'. + * + * RESULTS + * 0 successfully created semaphore, + * -1 failed, error in errno + * ERRNO + * EINVAL 'sem' is not a valid semaphore, or + * 'value' >= SEM_VALUE_MAX + * ENOMEM out of memory, + * ENOSPC a required resource has been exhausted, + * ENOSYS semaphores are not supported, + * EPERM the process lacks appropriate privilege + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = NULL; + + if (pshared != 0) + { + /* + * Creating a semaphore that can be shared between + * processes + */ + result = EPERM; + } + else if (value > (unsigned int)SEM_VALUE_MAX) + { + result = EINVAL; + } + else + { + s = (sem_t) calloc (1, sizeof (*s)); + + if (NULL == s) + { + result = ENOMEM; + } + else + { + + s->value = value; + if (pthread_mutex_init(&s->lock, NULL) == 0) + { + +#ifdef NEED_SEM + + s->sem = CreateEvent (NULL, + PTW32_FALSE, /* auto (not manual) reset */ + PTW32_FALSE, /* initial state is unset */ + NULL); + + if (0 == s->sem) + { + free (s); + (void) pthread_mutex_destroy(&s->lock); + result = ENOSPC; + } + else + { + s->leftToUnblock = 0; + } + +#else /* NEED_SEM */ + + if ((s->sem = CreateSemaphore (NULL, /* Always NULL */ + (long) 0, /* Force threads to wait */ + (long) SEM_VALUE_MAX, /* Maximum value */ + NULL)) == 0) /* Name */ + { + (void) pthread_mutex_destroy(&s->lock); + result = ENOSPC; + } + +#endif /* NEED_SEM */ + + } + else + { + result = ENOSPC; + } + + if (result != 0) + { + free(s); + } + } + } + + if (result != 0) + { + errno = result; + return -1; + } + + *sem = s; + + return 0; + +} /* sem_init */ diff --git a/win32/3rdparty/pthreads/sem_open.c b/win32/3rdparty/pthreads/sem_open.c new file mode 100644 index 000000000..bf48c831c --- /dev/null +++ b/win32/3rdparty/pthreads/sem_open.c @@ -0,0 +1,58 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_open.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +sem_open (const char *name, int oflag, mode_t mode, unsigned int value) +{ + errno = ENOSYS; + return -1; +} /* sem_open */ diff --git a/win32/3rdparty/pthreads/sem_post.c b/win32/3rdparty/pthreads/sem_post.c new file mode 100644 index 000000000..c7a7a3cf9 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_post.c @@ -0,0 +1,128 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_post.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +int +sem_post (sem_t * sem) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function posts a wakeup to a semaphore. + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * DESCRIPTION + * This function posts a wakeup to a semaphore. If there + * are waiting threads (or processes), one is awakened; + * otherwise, the semaphore value is incremented by one. + * + * RESULTS + * 0 successfully posted semaphore, + * -1 failed, error in errno + * ERRNO + * EINVAL 'sem' is not a valid semaphore, + * ENOSYS semaphores are not supported, + * ERANGE semaphore count is too big + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = *sem; + + if (s == NULL) + { + result = EINVAL; + } + else if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + /* See sem_destroy.c + */ + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + result = EINVAL; + return -1; + } + + if (s->value < SEM_VALUE_MAX) + { +#ifdef NEED_SEM + if (++s->value <= 0 + && !SetEvent(s->sem)) + { + s->value--; + result = EINVAL; + } +#else + if (++s->value <= 0 + && !ReleaseSemaphore (s->sem, 1, NULL)) + { + s->value--; + result = EINVAL; + } +#endif /* NEED_SEM */ + } + else + { + result = ERANGE; + } + + (void) pthread_mutex_unlock (&s->lock); + } + + if (result != 0) + { + errno = result; + return -1; + } + + return 0; + +} /* sem_post */ diff --git a/win32/3rdparty/pthreads/sem_post_multiple.c b/win32/3rdparty/pthreads/sem_post_multiple.c new file mode 100644 index 000000000..3d1e4ef28 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_post_multiple.c @@ -0,0 +1,142 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_post_multiple.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +int +sem_post_multiple (sem_t * sem, int count) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function posts multiple wakeups to a semaphore. + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * count + * counter, must be greater than zero. + * + * DESCRIPTION + * This function posts multiple wakeups to a semaphore. If there + * are waiting threads (or processes), n <= count are awakened; + * the semaphore value is incremented by count - n. + * + * RESULTS + * 0 successfully posted semaphore, + * -1 failed, error in errno + * ERRNO + * EINVAL 'sem' is not a valid semaphore + * or count is less than or equal to zero. + * ERANGE semaphore count is too big + * + * ------------------------------------------------------ + */ +{ + int result = 0; + long waiters; + sem_t s = *sem; + + if (s == NULL || count <= 0) + { + result = EINVAL; + } + else if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + /* See sem_destroy.c + */ + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + result = EINVAL; + return -1; + } + + if (s->value <= (SEM_VALUE_MAX - count)) + { + waiters = -s->value; + s->value += count; + if (waiters > 0) + { +#ifdef NEED_SEM + if (SetEvent(s->sem)) + { + waiters--; + s->leftToUnblock += count - 1; + if (s->leftToUnblock > waiters) + { + s->leftToUnblock = waiters; + } + } +#else + if (ReleaseSemaphore (s->sem, (waiters<=count)?waiters:count, 0)) + { + /* No action */ + } +#endif + else + { + s->value -= count; + result = EINVAL; + } + } + } + else + { + result = ERANGE; + } + (void) pthread_mutex_unlock (&s->lock); + } + + if (result != 0) + { + errno = result; + return -1; + } + + return 0; + +} /* sem_post_multiple */ diff --git a/win32/3rdparty/pthreads/sem_timedwait.c b/win32/3rdparty/pthreads/sem_timedwait.c new file mode 100644 index 000000000..52146b478 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_timedwait.c @@ -0,0 +1,238 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_timedwait.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +typedef struct { + sem_t sem; + int * resultPtr; +} sem_timedwait_cleanup_args_t; + + +static void PTW32_CDECL +ptw32_sem_timedwait_cleanup (void * args) +{ + sem_timedwait_cleanup_args_t * a = (sem_timedwait_cleanup_args_t *)args; + sem_t s = a->sem; + + if (pthread_mutex_lock (&s->lock) == 0) + { + /* + * We either timed out or were cancelled. + * If someone has posted between then and now we try to take the semaphore. + * Otherwise the semaphore count may be wrong after we + * return. In the case of a cancellation, it is as if we + * were cancelled just before we return (after taking the semaphore) + * which is ok. + */ + if (WaitForSingleObject(s->sem, 0) == WAIT_OBJECT_0) + { + /* We got the semaphore on the second attempt */ + *(a->resultPtr) = 0; + } + else + { + /* Indicate we're no longer waiting */ + s->value++; +#ifdef NEED_SEM + if (s->value > 0) + { + s->leftToUnblock = 0; + } +#else + /* + * Don't release the W32 sema, it doesn't need adjustment + * because it doesn't record the number of waiters. + */ +#endif + } + (void) pthread_mutex_unlock (&s->lock); + } +} + + +int +sem_timedwait (sem_t * sem, const struct timespec *abstime) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function waits on a semaphore possibly until + * 'abstime' time. + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * abstime + * pointer to an instance of struct timespec + * + * DESCRIPTION + * This function waits on a semaphore. If the + * semaphore value is greater than zero, it decreases + * its value by one. If the semaphore value is zero, then + * the calling thread (or process) is blocked until it can + * successfully decrease the value or until interrupted by + * a signal. + * + * If 'abstime' is a NULL pointer then this function will + * block until it can successfully decrease the value or + * until interrupted by a signal. + * + * RESULTS + * 0 successfully decreased semaphore, + * -1 failed, error in errno + * ERRNO + * EINVAL 'sem' is not a valid semaphore, + * ENOSYS semaphores are not supported, + * EINTR the function was interrupted by a signal, + * EDEADLK a deadlock condition was detected. + * ETIMEDOUT abstime elapsed before success. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = *sem; + + pthread_testcancel(); + + if (sem == NULL) + { + result = EINVAL; + } + else + { + DWORD milliseconds; + + if (abstime == NULL) + { + milliseconds = INFINITE; + } + else + { + /* + * Calculate timeout as milliseconds from current system time. + */ + milliseconds = ptw32_relmillisecs (abstime); + } + + if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + int v; + + /* See sem_destroy.c + */ + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + errno = EINVAL; + return -1; + } + + v = --s->value; + (void) pthread_mutex_unlock (&s->lock); + + if (v < 0) + { +#ifdef NEED_SEM + int timedout; +#endif + sem_timedwait_cleanup_args_t cleanup_args; + + cleanup_args.sem = s; + cleanup_args.resultPtr = &result; + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + /* Must wait */ + pthread_cleanup_push(ptw32_sem_timedwait_cleanup, (void *) &cleanup_args); +#ifdef NEED_SEM + timedout = +#endif + result = pthreadCancelableTimedWait (s->sem, milliseconds); + pthread_cleanup_pop(result); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + +#ifdef NEED_SEM + + if (!timedout && pthread_mutex_lock (&s->lock) == 0) + { + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + errno = EINVAL; + return -1; + } + + if (s->leftToUnblock > 0) + { + --s->leftToUnblock; + SetEvent(s->sem); + } + (void) pthread_mutex_unlock (&s->lock); + } + +#endif /* NEED_SEM */ + + } + } + + } + + if (result != 0) + { + + errno = result; + return -1; + + } + + return 0; + +} /* sem_timedwait */ diff --git a/win32/3rdparty/pthreads/sem_trywait.c b/win32/3rdparty/pthreads/sem_trywait.c new file mode 100644 index 000000000..63614ba2b --- /dev/null +++ b/win32/3rdparty/pthreads/sem_trywait.c @@ -0,0 +1,117 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_trywait.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +int +sem_trywait (sem_t * sem) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function tries to wait on a semaphore. + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * DESCRIPTION + * This function tries to wait on a semaphore. If the + * semaphore value is greater than zero, it decreases + * its value by one. If the semaphore value is zero, then + * this function returns immediately with the error EAGAIN + * + * RESULTS + * 0 successfully decreased semaphore, + * -1 failed, error in errno + * ERRNO + * EAGAIN the semaphore was already locked, + * EINVAL 'sem' is not a valid semaphore, + * ENOTSUP sem_trywait is not supported, + * EINTR the function was interrupted by a signal, + * EDEADLK a deadlock condition was detected. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = *sem; + + if (s == NULL) + { + result = EINVAL; + } + else if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + /* See sem_destroy.c + */ + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + errno = EINVAL; + return -1; + } + + if (s->value > 0) + { + s->value--; + } + else + { + result = EAGAIN; + } + + (void) pthread_mutex_unlock (&s->lock); + } + + if (result != 0) + { + errno = result; + return -1; + } + + return 0; + +} /* sem_trywait */ diff --git a/win32/3rdparty/pthreads/sem_unlink.c b/win32/3rdparty/pthreads/sem_unlink.c new file mode 100644 index 000000000..a6c6f81b0 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_unlink.c @@ -0,0 +1,58 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_unlink.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + +/* ignore warning "unreferenced formal parameter" */ +#ifdef _MSC_VER +#pragma warning( disable : 4100 ) +#endif + +int +sem_unlink (const char *name) +{ + errno = ENOSYS; + return -1; +} /* sem_unlink */ diff --git a/win32/3rdparty/pthreads/sem_wait.c b/win32/3rdparty/pthreads/sem_wait.c new file mode 100644 index 000000000..d39d2b4b6 --- /dev/null +++ b/win32/3rdparty/pthreads/sem_wait.c @@ -0,0 +1,187 @@ +/* + * ------------------------------------------------------------- + * + * Module: sem_wait.c + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +static void PTW32_CDECL +ptw32_sem_wait_cleanup(void * sem) +{ + sem_t s = (sem_t) sem; + + if (pthread_mutex_lock (&s->lock) == 0) + { + /* + * If sema is destroyed do nothing, otherwise:- + * If the sema is posted between us being cancelled and us locking + * the sema again above then we need to consume that post but cancel + * anyway. If we don't get the semaphore we indicate that we're no + * longer waiting. + */ + if (*((sem_t *)sem) != NULL && !(WaitForSingleObject(s->sem, 0) == WAIT_OBJECT_0)) + { + ++s->value; +#ifdef NEED_SEM + if (s->value > 0) + { + s->leftToUnblock = 0; + } +#else + /* + * Don't release the W32 sema, it doesn't need adjustment + * because it doesn't record the number of waiters. + */ +#endif /* NEED_SEM */ + } + (void) pthread_mutex_unlock (&s->lock); + } +} + +int +sem_wait (sem_t * sem) + /* + * ------------------------------------------------------ + * DOCPUBLIC + * This function waits on a semaphore. + * + * PARAMETERS + * sem + * pointer to an instance of sem_t + * + * DESCRIPTION + * This function waits on a semaphore. If the + * semaphore value is greater than zero, it decreases + * its value by one. If the semaphore value is zero, then + * the calling thread (or process) is blocked until it can + * successfully decrease the value or until interrupted by + * a signal. + * + * RESULTS + * 0 successfully decreased semaphore, + * -1 failed, error in errno + * ERRNO + * EINVAL 'sem' is not a valid semaphore, + * ENOSYS semaphores are not supported, + * EINTR the function was interrupted by a signal, + * EDEADLK a deadlock condition was detected. + * + * ------------------------------------------------------ + */ +{ + int result = 0; + sem_t s = *sem; + + pthread_testcancel(); + + if (s == NULL) + { + result = EINVAL; + } + else + { + if ((result = pthread_mutex_lock (&s->lock)) == 0) + { + int v; + + /* See sem_destroy.c + */ + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + errno = EINVAL; + return -1; + } + + v = --s->value; + (void) pthread_mutex_unlock (&s->lock); + + if (v < 0) + { +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + /* Must wait */ + pthread_cleanup_push(ptw32_sem_wait_cleanup, (void *) s); + result = pthreadCancelableWait (s->sem); + /* Cleanup if we're canceled or on any other error */ + pthread_cleanup_pop(result); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + } +#ifdef NEED_SEM + + if (!result && pthread_mutex_lock (&s->lock) == 0) + { + if (*sem == NULL) + { + (void) pthread_mutex_unlock (&s->lock); + errno = EINVAL; + return -1; + } + + if (s->leftToUnblock > 0) + { + --s->leftToUnblock; + SetEvent(s->sem); + } + (void) pthread_mutex_unlock (&s->lock); + } + +#endif /* NEED_SEM */ + + } + + } + + if (result != 0) + { + errno = result; + return -1; + } + + return 0; + +} /* sem_wait */ diff --git a/win32/3rdparty/pthreads/semaphore.c b/win32/3rdparty/pthreads/semaphore.c new file mode 100644 index 000000000..6b2b10e85 --- /dev/null +++ b/win32/3rdparty/pthreads/semaphore.c @@ -0,0 +1,69 @@ +/* + * ------------------------------------------------------------- + * + * Module: semaphore.c + * + * Purpose: + * Concatenated version of separate modules to allow + * inlining optimisation, which it is assumed can only + * be effective within a single module. + * + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * ------------------------------------------------------------- + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef NEED_FTIME +# include +#endif + +#include + +#include "pthread.h" +#include "semaphore.h" +#include "implement.h" + + +#include "sem_init.c" +#include "sem_destroy.c" +#include "sem_trywait.c" +#include "sem_wait.c" +#include "sem_timedwait.c" +#include "sem_post.c" +#include "sem_post_multiple.c" +#include "sem_getvalue.c" +#include "sem_open.c" +#include "sem_close.c" +#include "sem_unlink.c" diff --git a/win32/3rdparty/pthreads/semaphore.h b/win32/3rdparty/pthreads/semaphore.h new file mode 100644 index 000000000..a3330a638 --- /dev/null +++ b/win32/3rdparty/pthreads/semaphore.h @@ -0,0 +1,166 @@ +/* + * Module: semaphore.h + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#if !defined( SEMAPHORE_H ) +#define SEMAPHORE_H + +#undef PTW32_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_LEVEL +#define PTW32_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_LEVEL +#define PTW32_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_LEVEL_MAX 3 + +#if !defined(PTW32_LEVEL) +#define PTW32_LEVEL PTW32_LEVEL_MAX +/* Include everything */ +#endif + +#if __GNUC__ && ! defined (__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the DLL code, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the DLL, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#ifndef PTW32_STATIC_LIB +# ifdef PTW32_BUILD +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#ifndef PTW32_CONFIG_H +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +#ifdef NEED_ERRNO +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +#define _POSIX_SEMAPHORES + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#ifndef HAVE_MODE_T +typedef unsigned int mode_t; +#endif + + +typedef struct sem_t_ * sem_t; + +PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, + int pshared, + unsigned int value); + +PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, + const struct timespec * abstime); + +PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, + int count); + +PTW32_DLLPORT int __cdecl sem_open (const char * name, + int oflag, + mode_t mode, + unsigned int value); + +PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_unlink (const char * name); + +PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, + int * sval); + +#ifdef __cplusplus +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#undef PTW32_LEVEL +#undef PTW32_LEVEL_MAX + +#endif /* !SEMAPHORE_H */ diff --git a/win32/3rdparty/pthreads/signal.c b/win32/3rdparty/pthreads/signal.c new file mode 100644 index 000000000..8f56c48b5 --- /dev/null +++ b/win32/3rdparty/pthreads/signal.c @@ -0,0 +1,179 @@ +/* + * signal.c + * + * Description: + * Thread-aware signal functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +/* + * Possible future strategy for implementing pthread_kill() + * ======================================================== + * + * Win32 does not implement signals. + * Signals are simply software interrupts. + * pthread_kill() asks the system to deliver a specified + * signal (interrupt) to a specified thread in the same + * process. + * Signals are always asynchronous (no deferred signals). + * Pthread-win32 has an async cancelation mechanism. + * A similar system can be written to deliver signals + * within the same process (on ix86 processors at least). + * + * Each thread maintains information about which + * signals it will respond to. Handler routines + * are set on a per-process basis - not per-thread. + * When signalled, a thread will check it's sigmask + * and, if the signal is not being ignored, call the + * handler routine associated with the signal. The + * thread must then (except for some signals) return to + * the point where it was interrupted. + * + * Ideally the system itself would check the target thread's + * mask before possibly needlessly bothering the thread + * itself. This could be done by pthread_kill(), that is, + * in the signaling thread since it has access to + * all pthread_t structures. It could also retrieve + * the handler routine address to minimise the target + * threads response overhead. This may also simplify + * serialisation of the access to the per-thread signal + * structures. + * + * pthread_kill() eventually calls a routine similar to + * ptw32_cancel_thread() which manipulates the target + * threads processor context to cause the thread to + * run the handler launcher routine. pthread_kill() must + * save the target threads current context so that the + * handler launcher routine can restore the context after + * the signal handler has returned. Some handlers will not + * return, eg. the default SIGKILL handler may simply + * call pthread_exit(). + * + * The current context is saved in the target threads + * pthread_t structure. + */ + +#include "pthread.h" +#include "implement.h" + +#if HAVE_SIGSET_T + +static void +ptw32_signal_thread () +{ +} + +static void +ptw32_signal_callhandler () +{ +} + +int +pthread_sigmask (int how, sigset_t const *set, sigset_t * oset) +{ + pthread_t thread = pthread_self (); + + if (thread.p == NULL) + { + return ENOENT; + } + + /* Validate the `how' argument. */ + if (set != NULL) + { + switch (how) + { + case SIG_BLOCK: + break; + case SIG_UNBLOCK: + break; + case SIG_SETMASK: + break; + default: + /* Invalid `how' argument. */ + return EINVAL; + } + } + + /* Copy the old mask before modifying it. */ + if (oset != NULL) + { + memcpy (oset, &(thread.p->sigmask), sizeof (sigset_t)); + } + + if (set != NULL) + { + unsigned int i; + + /* FIXME: this code assumes that sigmask is an even multiple of + the size of a long integer. */ + + unsigned long *src = (unsigned long const *) set; + unsigned long *dest = (unsigned long *) &(thread.p->sigmask); + + switch (how) + { + case SIG_BLOCK: + for (i = 0; i < (sizeof (sigset_t) / sizeof (unsigned long)); i++) + { + /* OR the bit field longword-wise. */ + *dest++ |= *src++; + } + break; + case SIG_UNBLOCK: + for (i = 0; i < (sizeof (sigset_t) / sizeof (unsigned long)); i++) + { + /* XOR the bitfield longword-wise. */ + *dest++ ^= *src++; + } + case SIG_SETMASK: + /* Replace the whole sigmask. */ + memcpy (&(thread.p->sigmask), set, sizeof (sigset_t)); + break; + } + } + + return 0; +} + +int +sigwait (const sigset_t * set, int *sig) +{ + /* This routine is a cancellation point */ + pthread_test_cancel(); +} + +int +sigaction (int signum, const struct sigaction *act, struct sigaction *oldact) +{ +} + +#endif /* HAVE_SIGSET_T */ diff --git a/win32/3rdparty/pthreads/spin.c b/win32/3rdparty/pthreads/spin.c new file mode 100644 index 000000000..41b5aa525 --- /dev/null +++ b/win32/3rdparty/pthreads/spin.c @@ -0,0 +1,46 @@ +/* + * spin.c + * + * Description: + * This translation unit implements spin lock primitives. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#include "ptw32_spinlock_check_need_init.c" +#include "pthread_spin_init.c" +#include "pthread_spin_destroy.c" +#include "pthread_spin_lock.c" +#include "pthread_spin_unlock.c" +#include "pthread_spin_trylock.c" diff --git a/win32/3rdparty/pthreads/sync.c b/win32/3rdparty/pthreads/sync.c new file mode 100644 index 000000000..5e56fa9a1 --- /dev/null +++ b/win32/3rdparty/pthreads/sync.c @@ -0,0 +1,43 @@ +/* + * sync.c + * + * Description: + * This translation unit implements functions related to thread + * synchronisation. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#include "pthread_detach.c" +#include "pthread_join.c" diff --git a/win32/3rdparty/pthreads/tests/Bmakefile b/win32/3rdparty/pthreads/tests/Bmakefile new file mode 100644 index 000000000..9a2c2b4bb --- /dev/null +++ b/win32/3rdparty/pthreads/tests/Bmakefile @@ -0,0 +1,350 @@ +# Makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +# Pthreads-win32 - POSIX Threads Library for Win32 +# Copyright(C) 1998 John E. Bossom +# Copyright(C) 1999,2005 Pthreads-win32 contributors +# +# Contact Email: rpj@callisto.canberra.edu.au +# +# The current list of contributors is contained +# in the file CONTRIBUTORS included with the source +# code distribution. The list can also be seen at the +# following World Wide Web location: +# http://sources.redhat.com/pthreads-win32/contributors.html +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library in the file COPYING.LIB; +# if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +DLL_VER = 2 + +CP = copy +RM = erase +CAT = type +MKDIR = mkdir +TOUCH = echo Passed > +ECHO = @echo + +QAPC = ..\QueueUserAPCEx\User\quserex.dll + +CPHDR = pthread.h semaphore.h sched.h + +OPTIM = -O2 + +XXLIBS = cw32mti.lib ws2_32.lib + +# C++ Exceptions +BCEFLAGS = -P -DPtW32NoCatchWarn -D__CLEANUP_CXX +BCELIB = pthreadBCE$(DLL_VER).lib +BCEDLL = pthreadBCE$(DLL_VER).dll +# C cleanup code +BCFLAGS = -D__CLEANUP_C +BCLIB = pthreadBC$(DLL_VER).lib +BCDLL = pthreadBC$(DLL_VER).dll +# C++ Exceptions in application - using VC version of pthreads dll +BCXFLAGS = -D__CLEANUP_C + +# Defaults +CPLIB = $(BCLIB) +CPDLL = $(BCDLL) + +CFLAGS= -q $(OPTIM) /D_WIN32_WINNT=0x400 -w -tWC -tWM -4 -w-aus -w-asc -w-par +LFLAGS= +INCLUDES=-I. +BUILD_DIR=.. + +COPYFILES = $(CPHDR) $(CPLIB) $(CPDLL) $(QAPC) + +EHFLAGS = + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +PASSES= loadfree.pass \ + errno1.pass \ + self1.pass mutex5.pass \ + mutex1.pass mutex1n.pass mutex1e.pass mutex1r.pass \ + semaphore1.pass semaphore2.pass semaphore3.pass \ + mutex2.pass mutex3.pass \ + mutex2r.pass mutex2e.pass mutex3r.pass mutex3e.pass \ + condvar1.pass condvar1_1.pass condvar1_2.pass condvar2.pass condvar2_1.pass \ + exit1.pass create1.pass create2.pass reuse1.pass reuse2.pass equal1.pass \ + kill1.pass valid1.pass valid2.pass \ + exit2.pass exit3.pass exit4.pass exit5.pass \ + join0.pass join1.pass detach1.pass join2.pass join3.pass \ + mutex4.pass mutex6.pass mutex6n.pass mutex6e.pass mutex6r.pass \ + mutex6s.pass mutex6es.pass mutex6rs.pass \ + mutex7.pass mutex7n.pass mutex7e.pass mutex7r.pass \ + mutex8.pass mutex8n.pass mutex8e.pass mutex8r.pass \ + count1.pass \ + once1.pass once2.pass once3.pass once4.pass \ + self2.pass \ + cancel1.pass cancel2.pass \ + semaphore4.pass semaphore4t.pass semaphore5.pass \ + barrier1.pass barrier2.pass barrier3.pass barrier4.pass barrier5.pass \ + tsd1.pass tsd2.pass delay1.pass delay2.pass eyal1.pass \ + condvar3.pass condvar3_1.pass condvar3_2.pass condvar3_3.pass \ + condvar4.pass condvar5.pass condvar6.pass \ + condvar7.pass condvar8.pass condvar9.pass \ + rwlock1.pass rwlock2.pass rwlock3.pass rwlock4.pass \ + rwlock5.pass rwlock6.pass rwlock7.pass rwlock8.pass \ + rwlock2_t.pass rwlock3_t.pass rwlock4_t.pass rwlock5_t.pass rwlock6_t.pass rwlock6_t2.pass \ + context1.pass \ + cancel3.pass cancel4.pass cancel5.pass cancel6a.pass cancel6d.pass \ + cancel7.pass cancel8.pass \ + cleanup0.pass cleanup1.pass cleanup2.pass cleanup3.pass \ + priority1.pass priority2.pass inherit1.pass \ + spin1.pass spin2.pass spin3.pass spin4.pass \ + exception1.pass exception2.pass exception3.pass \ + cancel9.pass create3.pass stress1.pass + +BENCHRESULTS = \ + benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench + +help: + @ $(ECHO) Run one of the following command lines: + @ $(ECHO) make clean BC (to test using BC dll with VC (no EH) applications) + @ $(ECHO) make clean BCX (to test using BC dll with VC++ (EH) applications) + @ $(ECHO) make clean BCE (to test using the BCE dll with VC++ EH applications) + @ $(ECHO) make clean BC-bench (to benchtest using BC dll with C bench app) + @ $(ECHO) make clean BCX-bench (to benchtest using BC dll with C++ bench app) + @ $(ECHO) make clean BCE-bench (to benchtest using BCE dll with C++ bench app) + +all: + @ make clean BC + @ make clean BCX + @ make clean BCE + @ make clean BC-bench + +# This allows an individual test application to be made using the default lib. +# e.g. make clean test cancel3.exe +test: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) + +tests: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) sizes.pass $(PASSES) + @ $(ECHO) ALL TESTS PASSED! Congratulations! + +benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(BENCHRESULTS) + @ $(ECHO) ALL BENCH TESTS DONE. + +sizes.pass: sizes.exe + @ $(ECHO) ... Running $(TEST) test: $*.exe + @ .\$*.exe > SIZES.$(TEST) + @ $(CAT) SIZES.$(TEST) + @ $(ECHO) ...... Passed + @ $(TOUCH) $*.pass + +BCE: + @ make -f Bmakefile TEST="$@" CPLIB="$(BCELIB)" CPDLL="$(BCEDLL)" EHFLAGS="$(BCEFLAGS)" tests + +BC: + @ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCFLAGS)" tests + +BCX: + @ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCXFLAGS)" tests + +BCE-bench: + @ make -f Bmakefile TEST="$@" CPLIB="$(BCELIB)" CPDLL="$(BCEDLL)" EHFLAGS="$(BCEFLAGS)" XXLIBS="benchlib.o" benchtests + +BC-bench: + @ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCFLAGS)" XXLIBS="benchlib.o" benchtests + +BCX-bench: + @ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCXFLAGS)" XXLIBS="benchlib.o" benchtests + +.exe.pass: + @ $(ECHO) ... Running $(TEST) test: $< + @ .\$< + @ $(ECHO) ...... Passed + @ $(TOUCH) $@ + +.exe.bench: + @ $(ECHO) ... Running $(TEST) benchtest: $< + @ .\$< + @ $(ECHO) ...... Done + @ $(TOUCH) $@ + +.c.exe: + @ $(ECHO) $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< -e$@ $(LFLAGS) $(CPLIB) $(XXLIBS) + @ $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< -e$@ $(LFLAGS) $(CPLIB) $(XXLIBS) + +.c.o: + @ $(ECHO) $(CC) $(EHFLAGS) -c $(CFLAGS) $(INCLUDES) $< -o$@ + @ $(CC) $(EHFLAGS) $(CFLAGS) -c $(INCLUDES) $< -o$@ + + +.c.i: + @ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< + +$(COPYFILES): + @ $(ECHO) Copying $@ + @ $(CP) $(BUILD_DIR)\$@ . + +pthread.dll: $(CPDLL) + @ $(CP) $(CPDLL) pthread.dll + @ $(CP) $(CPLIB) pthread.lib + +clean: + - $(RM) *.dll + - $(RM) *.lib + - $(RM) pthread.h + - $(RM) semaphore.h + - $(RM) sched.h + - $(RM) *.e + - $(RM) *.i + - $(RM) *.obj + - $(RM) *.tds + - $(RM) *.pdb + - $(RM) *.o + - $(RM) *.asm + - $(RM) *.exe + - $(RM) *.pass + - $(RM) *.bench + - $(RM) *.log + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: +barrier1.pass: semaphore4.pass +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cancel9.pass: cancel8.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +create3.pass: +delay1.pass: +delay2.pass: delay1.pass +detach1.pass: join0.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass: +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock8.pass: rwlock7.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +semaphore5.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +stress1.pass: +tsd1.pass: barrier5.pass join1.pass +tsd2.pass: tsd1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass diff --git a/win32/3rdparty/pthreads/tests/ChangeLog b/win32/3rdparty/pthreads/tests/ChangeLog new file mode 100644 index 000000000..6b2c74250 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/ChangeLog @@ -0,0 +1,894 @@ +2005-06-12 Ross Johnson + + * stress1.c (millisecondsFromNow): Remove limit 0 <= millisecs < 1000; + now works for -INT_MAX <= millisecs <= INT_MAX; not needed for + stress1.c but should be general anyway. + +2005-05-18 Ross Johnson + + * reuse2.c (main): Must use a read with memory barrier semantics + when polling 'done' to force the cache into coherence on MP systems. + +2005-05-15 Ross Johnson + + * detach1.c: New test. + * join1.c: Reduce sleep times. + * join0.c: Remove MSVCRT conditional compile - join should always + return the thread exit code. + * join1.c: Likewise. + * join2.c: Likewise. + * join3.c: Likewise. + +2005-04-18 Ross Johnson + + * condvar3.c: Remove locks from around signalling calls - should not + be required for normal operation and only serve to mask deficiencies; + ensure that CV destruction is not premature after removing guards. + * condvar3_1.c: Likewise. + * condvar3_2.c: Likewise. + * condvar3_3.c: Likewise. + * condvar4.c: Likewise. + * condvar5.c: Likewise. + * condvar6.c: Likewise. + * condvar7.c: Likewise. + * condvar8.c: Likewise. + * condvar9.c: Likewise. + +2005-04-11 Ross Johnson + + * once4.c: New test; tries to test priority adjustments + in pthread_once(); set priority class to realtime so that + any failures can be seen. + +2005-04-06 Ross Johnson + + * cleanup0.c: Fix unguarded global variable accesses. + * cleanup1.c: Likewise. + * cleanup2.c: Likewise. + * cleanup3.c: Likewise. + * once2.c: Likewise. + * once3.c: Likewise. + +2005-04-01 Ross Johnson + + * GNUmakefile: Add target to test linking static link library. + * Makefile: Likewise. + * self1.c: Run process attach/detach routines when static linked. + +2005-03-16 Ross Johnson + + * mutex5.c: Prevent optimiser from removing asserts. + +2005-03-12 Ross Johnson + + * once3.c: New test. + +2005-03-08 Ross Johnson + + * once2.c: New test. + +2004-11-19 Ross Johnson + + * Bmakefile: New makefile for Borland. + * Makefile (DLL_VER): Added. + * GNUmakefile (DLL_VER): Added. + * Wmakefile (DLL_VER): Added. + +2004-10-29 Ross Johnson + + * semaphore4.c: New test. + * semaphore4t.c: New test. + * Debug.dsp (et al): Created MSVC Workspace project to aid debugging. + * All: Many tests have been modified to work with the new pthread + ID type; some other corrections were made after some library + functions were semantically strengthened. For example, + pthread_cond_destroy() no longer destroys a busy CV, which + required minor redesigns of some tests, including some where + the mutex associated with the CV was not locked during + signaling and broadcasting. + +2004-10-23 Ross Johnson + + * condvar3.c: Fixed mutex operations that were incorrectly + placed in relation to their condition variable operations. + The error became evident after sem_destroy() was rewritten + and conditions for destroing the semaphore were tightened. + As a result, pthread_cond_destroy() was not able to + destroy the cv queueing sempahore. + * condvar3_1.c: Likewise. + * condvar3_2.c: Likewise. + * condvar4.c: Likewise. + * condvar5.c: Likewise. + * condvar6.c: Likewise. + * condvar7.c: Likewise. + * condvar8.c: Likewise. + * condvar9.c: Likewise. + +2004-10-19 Ross Johnson + + * semaphore3.c: New test. + +2004-10-14 Ross Johnson + + * rwlock7.c (main): Tidy up statistics reporting; randomise + update accesses. + * rwlock8.c: New test. + +2004-09-08 Alexandre Girao + + * cancel7.c (main): Win98 wants a valid (non-NULL) location + for the last arg of _beginthreadex(). + * cancel8.c (main): Likewise. + * exit4.c (main): Likewise. + * exit5.c (main): Likewise. + +2004-08-26 Ross Johnson + + * create3.c: New test. + +2004-06-21 Ross Johnson + + * mutex2r.c: New test. + * mutex2e.c: New test. + * mutex3r.c: New test. + * mutex3e.c: New test. + * mutex6s.c: New test. + * mutex6rs.c: New test. + * mutex6es.c: New test. + +2004-05-21 Ross Johnson + + * join3.c: New test. + +2004-05-16 Ross Johnson + + * condvar2.c (WIN32_WINNT): Define to avoid redefinition warning + from inclusion of implement.h. + * convar2_1.c: Likewise. + * condvar3_1.c: Likewise. + * condvar3_2.c: Likewise. + * context1.c: Likewise. + * sizes.c: Likewise. + * Makefile: Don't define _WIN32_WINNT on compiler command line. + * GNUmakefile: Likewise. + * priority1.c (main): Add column to output for actual win32 + priority. + +2004-05-16 Ross Johnson + + * cancel9.c: New test. + * cancel3.c: Remove inappropriate conditional compilation; + GNU C version of test suite no longer quietly skips this test. + * cancel5.c: Likewise. + * GNUmakefile: Can now build individual test app using default + C version of library using 'make clean testname.c'. + * Makefile: Likewise for VC using 'nmake clean test testname.c'. + +2003-10-14 Ross Johnson + + * Wmakefile: New makefile for Watcom testing. + +2003-09-18 Ross Johnson + + * benchtest.h: Move old mutex code into benchlib.c. + * benchlib.c: New statically linked module to ensure that + bench apps don't inline the code and therefore have an unfair + advantage over the pthreads lib routines. Made little or no + difference. + * benchtest1.c: Minor change to avoid compiler warnings. + * benchtest5.c: Likewise. + * benchtest2.c: Fix misinformation in output report. + * README.BENCH: Add comments on results. + +2003-09-14 Ross Johnson + + * priority1.c: Reworked to comply with modified priority + management and provide additional output. + * priority2.c: Likewise. + * inherit1.c: Likewise. + +2003-09-03 Ross Johnson + + * exit4.c: New test. + * exit5.c: New test. + * cancel7.c: New test. + * cancel8.c: New test. + +2003-08-13 Ross Johnson + + * reuse1.c: New test. + * reuse1.c: New test. + * valid1.c: New test. + * valid2.c: New test. + * kill1.c: New test. + * create2.c: Now included in test regime. + +2003-07-19 Ross Johnson + + * eyal1.c (waste_time): Make threads do more work to ensure that + all threads get to do some work. + * semaphore1.c: Make it clear that certain errors are expected. + * exception2.c (non_MSVC code sections): Change to include + C++ standard include file, i.e. change to . + * exception3.c (non_MSVC code sections): Likewise; qualify std:: + namespace entities where necessary. + * GNUmakefile: modified to work in the MsysDTK (newer MinGW) + environment; define CC as gcc or g++ as appropriate because + using gcc -x c++ doesn't link with required c++ libs by default, + but g++ does. + +2002-12-11 Ross Johnson + + * mutex7e.c: Assert EBUSY return instead of EDEADLK. + +2002-06-03 Ross Johnson + + * semaphore2.c: New test. + +2002-03-02 Ross Johnson + + * Makefile (CFLAGS): Changed /MT to /MD to link with + the correct library MSVCRT.LIB. Otherwise errno doesn't + work. + +2002-02-28 Ross Johnson + + * exception3.c: Correct recent change. + + * semaphore1.c: New test. + + * Makefile: Add rule to generate pre-processor output. + +2002-02-28 Ross Johnson + + * exception3.c (terminateFunction): For MSVC++, call + exit() rather than pthread_exit(). Add comments to explain + why. + * Notes from the MSVC++ manual: + * 1) A term_func() should call exit(), otherwise + * abort() will be called on return to the caller. + * abort() raises SIGABRT. The default signal handler + * for all signals terminates the calling program with + * exit code 3. + * 2) A term_func() must not throw an exception. Therefore + * term_func() should not call pthread_exit() if an + * an exception-using version of pthreads-win32 library + * is being used (i.e. either pthreadVCE or pthreadVSE). + + +2002-02-23 Ross Johnson + + * rwlock2_t.c: New test. + * rwlock3_t.c: New test. + * rwlock4_t.c: New test. + * rwlock5_t.c: New test. + * rwlock6_t.c: New test. + * rwlock6_t2.c: New test. + * rwlock6.c (main): Swap thread and result variables + to correspond to actual thread functions. + * rwlock1.c: Change test description comment to correspond + to the actual test. + + * condvar1_2.c: Loop over the test many times in the hope + of detecting any intermittent deadlocks. This is to + test a fixed problem in pthread_cond_destroy.c. + + * spin4.c: Remove unused variable. + +2002-02-17 Ross Johnson + + * condvar1_1.c: New test. + * condvar1_2.c: New test. + +2002-02-07 Ross Johnson + + * delay1.c: New test. + * delay2.c: New test. + * exit4.c: New test. + +2002-02-02 Ross Johnson + + * mutex8: New test. + * mutex8n: New test. + * mutex8e: New test. + * mutex8r: New test. + * cancel6a: New test. + * cancel6d: New test. + * cleanup0.c: Add pragmas for inline optimisation control. + * cleanup1.c: Add pragmas for inline optimisation control. + * cleanup2.c: Add pragmas for inline optimisation control. + * cleanup3.c: Add pragmas for inline optimisation control. + * condvar7.c: Add pragmas for inline optimisation control. + * condvar8.c: Add pragmas for inline optimisation control. + * condvar9.c: Add pragmas for inline optimisation control. + +2002-01-30 Ross Johnson + + * cleanup1.c (): Must be declared __cdecl when compiled + as C++ AND testing the standard C library version. + +2002-01-16 Ross Johnson + + * spin4.c (main): Fix renamed function call. + +2002-01-14 Ross Johnson + + * exception3.c (main): Shorten wait time. + +2002-01-09 Ross Johnson + + * mutex7.c: New test. + * mutex7n.c: New test. + * mutex7e.c: New test. + * mutex7r.c: New test. + * mutex6.c: Modified to avoid leaving the locked mutex + around on exit. + +2001-10-25 Ross Johnson + + * condvar2.c: Remove reference to cv->nWaitersUnblocked. + * condvar2_1.c: Likewise; lower NUMTHREADS from 60 to 30. + * condvar3_1.c: Likewise. + * condvar3_2.c: Likewise. + * count1.c: lower NUMTHREADS from 60 to 30. + * inherit1.c: Determine valid priority values and then + assert values returned by POSIX routines are the same. + * priority1.c: Likewise. + * priority2.c: Likewise. + +2001-07-12 Ross Johnson + + * barrier5.c: Assert that precisely one thread receives + PTHREAD_BARRIER_SERIAL_THREAD at each barrier. + +2001-07-09 Ross Johnson + + * barrier3.c: Fixed. + * barrier4.c: Fixed. + * barrier5.c: New; proves that all threads in the group + reaching the barrier wait and then resume together. Repeats the test + using groups of 1 to 16 threads. Each group of threads must negotiate + a large number of barriers (10000). + * spin4.c: Fixed. + * test.h (error_string): Modified the success (0) value. + +2001-07-07 Ross Johnson + + * spin3.c: Changed test and fixed. + * spin4.c: Fixed. + * barrier3.c: Fixed. + * barrier4.c: Fixed. + +2001-07-05 Ross Johnson + + * spin1.c: New; testing spinlocks. + * spin2.c: New; testing spinlocks. + * spin3.c: New; testing spinlocks. + * spin4.c: New; testing spinlocks. + * barrier1.c: New; testing barriers. + * barrier2.c: New; testing barriers. + * barrier3.c: New; testing barriers. + * barrier4.c: New; testing barriers. + * GNUmakefile: Add new tests. + * Makefile: Add new tests. + +2001-07-01 Ross Johnson + + * benchtest3.c: New; timing mutexes. + * benchtest4.c: New; time mutexes. + * condvar3_1.c: Fixed bug - Alexander Terekhov + * condvar3_3.c: New test. + +2001-06-25 Ross Johnson + + * priority1.c: New test. + * priority2.c: New test. + * inherit1.c: New test. + * benchtest1.c: New; timing mutexes. + * benchtest2.c: New; timing mutexes. + * mutex4.c: Modified to test all mutex types. + +2001-06-8 Ross Johnson + + * mutex5.c: Insert inert change to quell compiler warnings. + * condvar3_2.c: Remove unused variable. + +2001-06-3 Ross Johnson + + * condvar2_1.c: New test. + * condvar3_1.c: New test. + * condvar3_2.c: New test. + +2001-05-30 Ross Johnson + + * mutex1n.c: New test. + * mutex1e.c: New test. + * mutex1r.c: New test. + * mutex4.c: Now locks and unlocks a mutex. + * mutex5.c: New test. + * mutex6.c: New test. + * mutex6n.c: New test. + * mutex6e.c: New test. + * mutex6r.c: New test. + * Makefile: Added new tests; reorganised. + * GNUmakefile: Likewise. + * rwlock6.c: Fix to properly prove read-while-write locking + and single writer locking. + +2001-05-29 Ross Johnson + + * Makefile: Reorganisation. + * GNUmakefile: Likewise. + - Thomas Pfaff + + * exception1.c: Add stdio.h include to define fprintf and stderr + in non-exception C version of main(). + * exception2.c: Likewise. + * exception3.c: Likewise. + + * Makefile (rwlock7): Add new test. + * GNUmakefile (rwlock7): Add new test. + * rwlock7.c: New test. + * rwlock6.c: Changed to test that writer has priority. + + * eyal1.c (main): Unlock each mutex_start lock before destroying + it. + +2000-12-29 Ross Johnson + + * GNUmakefile: Add mutex4 test; ensure libpthreadw32.a is + removed for "clean" target. + * Makefile: Add mutex4 test. + + * exception3.c: Remove SEH code; automatically pass the test + under SEH (which is an N/A environment). + + * mutex4.c: New test. + + * eyal1.c (do_work_unit): Add a dummy "if" to force the + optimiser to retain code; reduce thread work loads. + + * condvar8.c (main): Add an additional "assert" for debugging; + increase pthread_cond_signal timeout. + +2000-12-28 Ross Johnson + + * eyal1.c: Increase thread work loads. + * exception2.c: New test. + * exception3.c: New test. + * Makefile: Add new tests exception2.c and exception3.c. + * GNUmakefile: Likewise. + +2000-12-11 Ross Johnson + + * cleanup3.c: Remove unused variable. + * cleanup2.c: Likewise. + * exception1.c: Throw an exception rather than use + a deliberate zero divide so that catch(...) will + handle it under Mingw32. Mingw32 now builds the + library correctly to pass all tests - see Thomas + Pfaff's detailed instructions re needed changes + to Mingw32 in the Pthreads-Win32 FAQ. + +2000-09-08 Ross Johnson + + * cancel5.c: New; tests calling pthread_cancel() + from the main thread without first creating a + POSIX thread struct for the non-POSIX main thread + - this forces pthread_cancel() to create one via + pthread_self(). + * Makefile (cancel5): Add new test. + * GNUmakefile (cancel5): Likewise. + +2000-08-17 Ross Johnson + + * create2.c: New; Test that pthread_t contains + the W32 HANDLE before it calls the thread routine + proper. + +2000-08-13 Ross Johnson + + * condvar3.c: Minor change to eliminate compiler + warning. + + * condvar4.c: ditto. + + * condvar5.c: ditto. + + * condvar6.c: ditto. + + * condvar7.c: ditto. + + * condvar8.c: ditto. + + * condvar9.c: ditto. + + * exit1.c: Function needed return statement. + + * cleanup1.c: Remove unnecessary printf arg. + + * cleanup2.c: Fix cast. + + * rwlock6.c: Fix casts. + + * exception1.c (PtW32CatchAll): Had the wrong name; + fix casts. + + * cancel3.c: Remove unused waitLock variable. + + * GNUmakefile: Change library/dll naming; add new tests; + general minor changes. + + * Makefile: Change library/dll naming; add targets for + testing each of the two VC++ EH scheme versions; + default target now issues help message; compile warnings + now interpreted as errors to stop the make; add new + tests; restructure to remove prerequisites needed + otherwise. + + * README: Updated. + + +2000-08-10 Ross Johnson + + * eyal1.c (main): Change implicit cast to explicit + cast when passing "print_server" function pointer; + G++ no longer allows implicit func parameter casts. + + * cleanup1.c: Remove unused "waitLock". + (main): Fix implicit parameter cast. + + * cancel2.c (main): Fix implicit parameter cast. + + * cancel4.c (main): Fix implicit parameter cast. + + * cancel3.c (main): Fix implicit parameter cast. + + * GNUmakefile: Renamed from Makefile; Add missing + cancel1 and cancel2 test targets. + + * Makefile: Converted for use with MS nmake. + +2000-08-06 Ross Johnson + + * ccl.bat: Add /nologo to remove extraneous output. + + * exception1.c (exceptionedThread): Init 'dummy'; + put expression into if condition to prevent optimising away; + remove unused variable. + + * cancel4.c (mythread): Cast return value to avoid warnings. + + * cancel2.c (mythread): Missing #endif. + + * condvar9.c (mythread): Cast return value to avoid warnings. + + * condvar8.c (mythread): Cast return value to avoid warnings. + + * condvar7.c (mythread): Cast return value to avoid warnings. + + * cleanup3.c (mythread): Cast return value to avoid warnings. + + * cleanup2.c (mythread): Cast return value to avoid warnings. + + * cleanup1.c (mythread): Cast return value to avoid warnings. + + * condvar5.c (mythread): Cast return value to avoid warnings. + + * condvar3.c (mythread): Cast return value to avoid warnings. + + * condvar6.c (mythread): Cast return value to avoid warnings. + + * condvar4.c (mythread): Cast return value to avoid warnings. + +2000-08-05 Ross Johnson + + * cancel2.c: Use PtW32CatchAll macro if defined. + + * exception1.c: Use PtW32CatchAll macro if defined. + +2000-08-02 Ross Johnson + + * tsd1.c: Fix typecasts of &result [g++ is now very fussy]. + + * test.h (assert): Return 0's explicitly to allay + g++ errors. + + * join2.c: Add explicit typecasts. + + * join1.c: Add explicit typecasts. + + * join0.c: Add explicit typecasts. + + * eyal1.c: Add explicit typecasts. + + * count1.c (main): Add type cast to remove g++ parse warning + [gcc-2.95.2 seems to have tightened up on this]. + + * Makefile (GLANG): Use c++ explicitly. + Remove MSVC sections (was commented out). + Add target to generate cpp output. + +2000-07-25 Ross Johnson + + * runtest.bat: modified to work under W98. + + * runall.bat: Add new tests; modified to work under W98. + It was ok under NT. + + * Makefile: Add new tests. + + * exception1.c: New; Test passing exceptions back to the + application and retaining library internal exceptions. + + * join0.c: New; Test a single join. + +2000-01-06 Ross Johnson + + * cleanup1.c: New; Test cleanup handler executes (when thread is + canceled). + + * cleanup2.c: New; Test cleanup handler executes (when thread is + not canceled). + + * cleanup3.c: New; Test cleanup handler does not execute + (when thread is not canceled). + +2000-01-04 Ross Johnson + + * cancel4.c: New; Test cancelation does not occur in deferred + cancelation threads with no cancelation points. + + * cancel3.c: New; Test asynchronous cancelation. + + * context1.c: New; Test context switching method for async + cancelation. + +1999-11-23 Ross Johnson + + * test.h: Add header includes; include local header versions rather + than system versions; rearrange the assert macro defines. + +1999-11-07 Ross Johnson + + * loadfree.c: New. Test loading and freeing the library (DLL). + +1999-10-30 Ross Johnson + + * cancel1.c: New. Test pthread_setcancelstate and + pthread_setcanceltype functions. + * eyal1.c (waste_time): Change calculation to avoid FP exception + on Aplhas + - Rich Peters + +Oct 14 1999 Ross Johnson + + * condvar7.c: New. Test broadcast after waiting thread is canceled. + * condvar8.c: New. Test multiple broadcasts. + * condvar9.c: New. Test multiple broadcasts with thread + cancelation. + +Sep 16 1999 Ross Johnson + + * rwlock6.c: New test. + +Sep 15 1999 Ross Johnson + + * rwlock1.c: New test. + * rwlock2.c: New test. + * rwlock3.c: New test. + * rwlock4.c: New test. + * rwlock5.c: New test. + +Aug 22 1999 Ross Johnson + + * runall.bat (join2): Add test. + +Aug 19 1999 Ross Johnson + + * join2.c: New test. + +Wed Aug 12 1999 Ross Johnson + + * Makefile (LIBS): Add -L. + +Mon May 31 10:25:01 1999 Ross Johnson + + * Makefile (GLANG): Add GCC language option. + +Sat May 29 23:29:04 1999 Ross Johnson + + * runall.bat (condvar5): Add new test. + + * runall.bat (condvar6): Add new test. + + * Makefile (condvar5) : Add new test. + + * Makefile (condvar6) : Add new test. + + * condvar5.c: New test for pthread_cond_broadcast(). + + * condvar6.c: New test for pthread_cond_broadcast(). + +Sun Apr 4 12:04:28 1999 Ross Johnson + + * tsd1.c (mythread): Change Sleep(0) to sched_yield(). + (sched.h): Include. + + * condvar3.c (mythread): Remove redundant Sleep(). + + * runtest.bat: Re-organised to make more informative. + +Fri Mar 19 1999 Ross Johnson + + * *.bat: redirect unwanted output to nul: + + * runall.bat: new. + + * cancel1.c: new. Not part of suite yet. + +Mon Mar 15 00:17:55 1999 Ross Johnson + + * mutex1.c: only test mutex init and destroy; add assertions. + + * count1.c: raise number of spawned threads to 60 (appears to + be the limit under Win98). + +Sun Mar 14 21:31:02 1999 Ross Johnson + + * test.h (assert): add assertion trace option. + Use: + "#define ASSERT_TRACE 1" to turn it on, + "#define ASSERT_TRACE 0" to turn it off (default). + + * condvar3.c (main): add more assertions. + + * condvar4.c (main): add more assertions. + + * condvar1.c (main): add more assertions. + +Fri Mar 12 08:34:15 1999 Ross Johnson + + * condvar4.c (cvthing): switch the order of the INITIALIZERs. + + * eyal1.c (main): Fix trylock loop; was not waiting for thread to lock + the "started" mutex. + +Wed Mar 10 10:41:52 1999 Ross Johnson + + * tryentercs.c: Apply typo patch from bje. + + * tryentercs2.c: Ditto. + +Sun Mar 7 10:41:52 1999 Ross Johnson + + * Makefile (condvar3, condvar4): Add tests. + + * condvar4.c (General): Reduce to simple test case; prerequisite + is condvar3.c; add description. + + * condvar3.c (General): Reduce to simple test case; prerequisite + is condvar2.c; add description. + + * condvar2.c (General): Reduce to simple test case; prerequisite + is condvar1.c; add description. + + * condvar1.c (General): Reduce to simple test case; add + description. + + * Template.c (Comments): Add generic test detail. + +1999-02-23 Ross Johnson + + * Template.c: Revamp. + + * condvar1.c: Add. + + * condvar2.c: Add. + + * Makefile: Add condvar1 condvar2 tests. + + * exit1.c, exit2.c, exit3.c: Cosmetic changes. + +1999-02-23 Ross Johnson + + * Makefile: Some refinement. + + * *.c: More exhaustive checking through assertions; clean up; + add some more tests. + + * Makefile: Now actually runs the tests. + + * tests.h: Define our own assert macro. The Mingw32 + version pops up a dialog but we want to run non-interactively. + + * equal1.c: use assert a little more directly so that it + prints the actual call statement. + + * exit1.c: Modify to return 0 on success, 1 on failure. + +1999-02-22 Ross Johnson + + * self2.c: Bring up to date. + + * self3.c: Ditto. + +1999-02-21 Ben Elliston + + * README: Update. + + * Makefile: New file. Run all tests automatically. Primitive tests + are run first; more complex tests are run last. + + * count1.c: New test. Validate the thread count. + + * exit2.c: Perform a simpler test. + + * exit3.c: New test. Replaces exit2.c, since exit2.c needs to + perform simpler checking first. + + * create1.c: Update to use the new testsuite exiting convention. + + * equal1.c: Likewise. + + * mutex1.c: Likewise. + + * mutex2.c: Likewise. + + * once1.c: Likewise. + + * self2.c: Likewise. + + * self3.c: Likewise. + + * tsd1.c: Likewise. + +1999-02-20 Ross Johnson + + * mutex2.c: Test static mutex initialisation. + + * test.h: New. Declares a table mapping error numbers to + error names. + +1999-01-17 Ross Johnson + + * runtest: New script to build and run a test in the tests directory. + +Wed Dec 30 11:22:44 1998 Ross Johnson + + * tsd1.c: Re-written. See comments at start of file. + * Template.c: New. Contains skeleton code and comment template + intended to fully document the test. + +Fri Oct 16 17:59:49 1998 Ross Johnson + + * tsd1.c (destroy_key): Add function. Change diagnostics. + +Thu Oct 15 17:42:37 1998 Ross Johnson + + * tsd1.c (mythread): Fix some casts and add some message + output. Fix inverted conditional. + +Mon Oct 12 02:12:29 1998 Ross Johnson + + * tsd1.c: New. Test TSD using 1 key and 2 threads. + +1998-09-13 Ben Elliston + + * eyal1.c: New file; contributed by Eyal Lebedinsky + . + +1998-09-12 Ben Elliston + + * exit2.c (func): Return a value. + (main): Call the right thread entry function. + +1998-07-22 Ben Elliston + + * exit2.c (main): Fix size of pthread_t array. + +1998-07-10 Ben Elliston + + * exit2.c: New file; test pthread_exit() harder. + + * exit1.c: New file; test pthread_exit(). diff --git a/win32/3rdparty/pthreads/tests/Debug.dsp b/win32/3rdparty/pthreads/tests/Debug.dsp new file mode 100644 index 000000000..191b97862 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/Debug.dsp @@ -0,0 +1,93 @@ +# Microsoft Developer Studio Project File - Name="Debug" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Debug - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Debug.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Debug.mak" CFG="Debug - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Debug - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Debug - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Debug - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0xc09 /d "NDEBUG" +# ADD RSC /l 0xc09 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "Debug - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /WX /Gm /ZI /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "CLEANUP_C" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0xc09 /d "_DEBUG" +# ADD RSC /l 0xc09 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib pthreadVC2d.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:".." + +!ENDIF + +# Begin Target + +# Name "Debug - Win32 Release" +# Name "Debug - Win32 Debug" +# Begin Source File + +SOURCE=.\Debug.txt +# End Source File +# Begin Source File + +SOURCE=.\semaphore1.c +# End Source File +# End Target +# End Project diff --git a/win32/3rdparty/pthreads/tests/Debug.dsw b/win32/3rdparty/pthreads/tests/Debug.dsw new file mode 100644 index 000000000..5fd6af3e5 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/Debug.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Debug"=.\Debug.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/win32/3rdparty/pthreads/tests/Debug.plg b/win32/3rdparty/pthreads/tests/Debug.plg new file mode 100644 index 000000000..22ce672ce --- /dev/null +++ b/win32/3rdparty/pthreads/tests/Debug.plg @@ -0,0 +1,32 @@ + + +
+

Build Log

+

+--------------------Configuration: Debug - Win32 Debug-------------------- +

+

Command Lines

+Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP9.tmp" with contents +[ +/nologo /MDd /W3 /WX /Gm /ZI /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "CLEANUP_C" /FR"Debug/" /Fp"Debug/Debug.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c +"E:\PTHREADS\pthreads.2\tests\semaphore1.c" +] +Creating command line "cl.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSP9.tmp" +Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSPA.tmp" with contents +[ +kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib pthreadVC2d.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/Debug.pdb" /debug /machine:I386 /out:"Debug/Debug.exe" /pdbtype:sept /libpath:".." +.\Debug\semaphore1.obj +] +Creating command line "link.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSPA.tmp" +

Output Window

+Compiling... +semaphore1.c +Linking... + + + +

Results

+Debug.exe - 0 error(s), 0 warning(s) +
+ + diff --git a/win32/3rdparty/pthreads/tests/Debug.txt b/win32/3rdparty/pthreads/tests/Debug.txt new file mode 100644 index 000000000..5323874f4 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/Debug.txt @@ -0,0 +1,6 @@ +This project is used to debug individual test case programs. + +To build and debug a test case: +- add the .c file to this project; +- remove any .c files from other test cases from this project. +- build and debug as usual. \ No newline at end of file diff --git a/win32/3rdparty/pthreads/tests/GNUmakefile b/win32/3rdparty/pthreads/tests/GNUmakefile new file mode 100644 index 000000000..1762b6c7c --- /dev/null +++ b/win32/3rdparty/pthreads/tests/GNUmakefile @@ -0,0 +1,375 @@ +# Makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +# Pthreads-win32 - POSIX Threads Library for Win32 +# Copyright(C) 1998 John E. Bossom +# Copyright(C) 1999,2005 Pthreads-win32 contributors +# +# Contact Email: rpj@callisto.canberra.edu.au +# +# The current list of contributors is contained +# in the file CONTRIBUTORS included with the source +# code distribution. The list can also be seen at the +# following World Wide Web location: +# http://sources.redhat.com/pthreads-win32/contributors.html +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library in the file COPYING.LIB; +# if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +DLL_VER = 2 + +CP = cp -f +MV = mv -f +RM = rm -f +CAT = cat +#CP = copy +#MV = rename +#RM = erase +#CAT = type +MKDIR = mkdir +TOUCH = echo Passed > +ECHO = @echo +MAKE = make + +# +# Mingw32 +# +XXCFLAGS = +XXLIBS = -lws2_32 +#CFLAGS = -O3 -UNDEBUG -Wall $(XXCFLAGS) +CFLAGS = -g -UNDEBUG -Wall $(XXCFLAGS) +BUILD_DIR = .. +INCLUDES = -I. + + +TEST = GC + +# Default lib version +GCX = $(TEST)$(DLL_VER) + +# Files we need to run the tests +# - paths are relative to pthreads build dir. +HDR = pthread.h semaphore.h sched.h +LIB = libpthread$(GCX).a +DLL = pthread$(GCX).dll +QAPC = ../QueueUserAPCEx/User/quserex.dll + +COPYFILES = $(HDR) $(LIB) $(DLL) $(QAPC) + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +TESTS = sizes loadfree \ + self1 mutex5 mutex1 mutex1e mutex1n mutex1r \ + semaphore1 semaphore2 semaphore3 \ + condvar1 condvar1_1 condvar1_2 condvar2 condvar2_1 exit1 \ + create1 create2 reuse1 reuse2 equal1 \ + kill1 valid1 valid2 \ + exit2 exit3 exit4 exit5 \ + join0 join1 detach1 join2 join3 \ + mutex2 mutex2r mutex2e mutex3 mutex3r mutex3e \ + mutex4 mutex6 mutex6n mutex6e mutex6r \ + mutex6s mutex6es mutex6rs \ + mutex7 mutex7n mutex7e mutex7r mutex8 mutex8n mutex8e mutex8r \ + count1 \ + once1 once2 once3 once4 self2 \ + cancel1 cancel2 \ + semaphore4 semaphore4t semaphore5 \ + barrier1 barrier2 barrier3 barrier4 barrier5 \ + tsd1 tsd2 delay1 delay2 eyal1 \ + condvar3 condvar3_1 condvar3_2 condvar3_3 \ + condvar4 condvar5 condvar6 condvar7 condvar8 condvar9 \ + errno1 \ + rwlock1 rwlock2 rwlock3 rwlock4 rwlock5 rwlock6 rwlock7 rwlock8 \ + rwlock2_t rwlock3_t rwlock4_t rwlock5_t rwlock6_t rwlock6_t2 \ + context1 cancel3 cancel4 cancel5 cancel6a cancel6d \ + cancel7 cancel8 \ + cleanup0 cleanup1 cleanup2 cleanup3 \ + priority1 priority2 inherit1 \ + spin1 spin2 spin3 spin4 \ + exception1 exception2 exception3 \ + cancel9 create3 stress1 + +STRESSTESTS = \ + stress1 + +BENCHTESTS = \ + benchtest1 benchtest2 benchtest3 benchtest4 benchtest5 + +STATICTESTS = \ + self1 + +PASSES = $(TESTS:%=%.pass) +BENCHRESULTS = $(BENCHTESTS:%=%.bench) +STRESSRESULTS = $(STRESSTESTS:%=%.pass) +STATICRESULTS = $(STATICTESTS:%=%.pass) + +help: + @ $(ECHO) "Run one of the following command lines:" + @ $(ECHO) "make clean GC (to test using GC dll with C (no EH) applications)" + @ $(ECHO) "make clean GCX (to test using GC dll with C++ (EH) applications)" + @ $(ECHO) "make clean GCE (to test using GCE dll with C++ (EH) applications)" + @ $(ECHO) "make clean GC-bench (to benchtest using GNU C dll with C cleanup code)" + @ $(ECHO) "make clean GCE-bench (to benchtest using GNU C dll with C++ exception handling)" + @ $(ECHO) "make clean GC-stress (to stresstest using GNU C dll with C cleanup code)" + @ $(ECHO) "make clean GCE-stress (to stresstest using GNU C dll with C++ exception handling)" + @ $(ECHO) "make clean GC-static (to test using GC static lib with C (no EH) applications)" + +all: + @ $(MAKE) clean GC + @ $(MAKE) clean GCX + @ $(MAKE) clean GCE + +GC: + $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" all-pass + +GCE: + $(MAKE) TEST=GCE CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" all-pass + +GCX: + $(MAKE) TEST=GC CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_C" all-pass + +GC-bench: + $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="benchlib.o" all-bench + +GCE-bench: + $(MAKE) TEST=GCE CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="benchlib." all-bench + +GC-debug: + $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" DLL_VER="$(DLL_VER)d" all-pass + +GC-static: + $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C -DPTW32_STATIC_LIB" DLL="" all-static + +GC-stress: + $(ECHO) Stress tests can take a long time since they are trying to + $(ECHO) expose weaknesses that may be intermittant or statistically rare. + $(ECHO) A pass does not prove correctness, but may give greater confidence. + $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" all-stress + +GCE-stress: + $(MAKE) TEST=GCE CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" all-stress + +all-pass: $(PASSES) + @ $(ECHO) ALL TESTS PASSED! Congratulations! + +all-bench: $(BENCHRESULTS) + @ $(ECHO) BENCH TESTS COMPLETED. + +all-stress: $(STRESSRESULTS) + @ $(ECHO) STRESS TESTS COMPLETED. + +all-static: $(STATICRESULTS) + @ $(ECHO) ALL STATIC TESTS PASSED! Congratulations! + @ $(ECHO) Build and test the DLL to run all tests. + @ $(ECHO) This test only confirms that the static lib links correctly. + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: + +barrier1.pass: semaphore4.pass +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel2_1.pass: cancel2.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cancel9.pass: cancel8.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +create3.pass: +delay1.pass: cancel2.pass +delay2.pass: delay1.pass +detach1.pass: join0.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: exit4.pass kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass: +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock8.pass: rwlock7.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +semaphore5.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +stress1.pass: +tsd1.pass: barrier5.pass join1.pass +tsd2.pass: tsd1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass + +sizes.pass: sizes.exe + @ $(ECHO) Running $* + $< > SIZES.$(TEST) + @ $(CAT) SIZES.$(TEST) + @ $(ECHO) Passed + @ $(TOUCH) $@ + +%.pass: %.exe + @ $(ECHO) Running $* + $* + @ $(ECHO) Passed + @ $(TOUCH) $@ + +%.bench: $(LIB) $(DLL) $(HDR) $(QAPC) $(XXLIBS) %.exe + @ $(ECHO) Running $* + $* + @ $(ECHO) Done + @ $(TOUCH) $@ + +%.exe: %.c $(LIB) $(DLL) $(HDR) $(QAPC) + @ $(ECHO) Compiling $@ + @ $(ECHO) $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L. -lpthread$(GCX) -lsupc++ $(XXLIBS) + @ $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L. -lpthread$(GCX) -lsupc++ $(XXLIBS) + +%.pre: %.c $(HDR) + @ $(CC) -E $(CFLAGS) -o $@ $< $(INCLUDES) + +%.s: %.c $(HDR) + @ $(CC) -S $(CFLAGS) -o $@ $< $(INCLUDES) + +$(COPYFILES): + @ $(ECHO) Copying $@ + @ $(CP) $(BUILD_DIR)/$@ . + +benchlib.o: benchlib.c + @ $(ECHO) Compiling $@ + @ $(ECHO) $(CC) -c $(CFLAGS) $< $(INCLUDES) + @ $(CC) -c $(CFLAGS) $< $(INCLUDES) + +pthread.dll: $(DLL) + @ $(CP) $(DLL) $@ + +clean: + - $(RM) *.dll + - $(RM) *.lib + - $(RM) pthread.h + - $(RM) semaphore.h + - $(RM) sched.h + - $(RM) *.a + - $(RM) *.e + - $(RM) *.i + - $(RM) *.o + - $(RM) *.obj + - $(RM) *.pdb + - $(RM) *.exe + - $(RM) *.pass + - $(RM) *.bench + - $(RM) *.static + - $(RM) *.log diff --git a/win32/3rdparty/pthreads/tests/README b/win32/3rdparty/pthreads/tests/README new file mode 100644 index 000000000..a1b5646b9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/README @@ -0,0 +1,44 @@ +Running test cases in this directory +------------------------------------ + +These make scripts expect to be able to copy the dll, library +and header files from this directory's parent directory, +which should be the pthreads-win32 source directory. + +MS VC nmake +------------- + +Run the target corresponding to the DLL version being tested: + +nmake clean VC + +or: + +nmake clean VS + + +GNU GCC make +------------ + +Run "make clean" and then "make". See the "Known bugs" section +in ..\README. + + +Writing Test Cases +------------------ + +Tests written in this test suite should behave in the following manner: + + * If a test fails, leave main() with a result of 1. + + * If a test succeeds, leave main() with a result of 0. + + * No diagnostic output should appear when the test is succeeding. + Diagnostic output may be emitted if something in the test + fails, to help determine the cause of the test failure. + +Notes: +------ + +Many test cases use knowledge of implementation internals which are supposed +to be opaque to portable applications. diff --git a/win32/3rdparty/pthreads/tests/README.BENCHTESTS b/win32/3rdparty/pthreads/tests/README.BENCHTESTS new file mode 100644 index 000000000..448570c1f --- /dev/null +++ b/win32/3rdparty/pthreads/tests/README.BENCHTESTS @@ -0,0 +1,74 @@ + +------------ +Benchmarking +------------ +There is a set a benchmarking programs in the +"tests" directory. These should be runnable using the +following command-lines corresponding to each of the possible +library builds: + +MSVC: +nmake clean VC-bench +nmake clean VCE-bench +nmake clean VSE-bench + +Mingw32: +make clean GC-bench +make clean GCE-bench + +UWIN: +The benchtests are run as part of the testsuite. + + +Mutex benchtests +---------------- + +benchtest1 - Lock plus unlock on an unlocked mutex. +benchtest2 - Lock plus unlock on a locked mutex. +benchtest3 - Trylock on a locked mutex. +benchtest4 - Trylock plus unlock on an unlocked mutex. + + +Each test times up to three alternate synchronisation +implementations as a reference, and then times each of +the four mutex types provided by the library. Each is +described below: + +Simple Critical Section +- uses a simple Win32 critical section. There is no +additional overhead for this case as there is in the +remaining cases. + +POSIX mutex implemented using a Critical Section +- The old implementation which uses runtime adaptation +depending on the Windows variant being run on. When +the pthreads DLL was run on WinNT or higher then +POSIX mutexes would use Win32 Critical Sections. + +POSIX mutex implemented using a Win32 Mutex +- The old implementation which uses runtime adaptation +depending on the Windows variant being run on. When +the pthreads DLL was run on Win9x then POSIX mutexes +would use Win32 Mutexes (because TryEnterCriticalSection +is not implemented on Win9x). + +PTHREAD_MUTEX_DEFAULT +PTHREAD_MUTEX_NORMAL +PTHREAD_MUTEX_ERRORCHECK +PTHREAD_MUTEX_RECURSIVE +- The current implementation supports these mutex types. +The underlying basis of POSIX mutexes is now the same +irrespective of the Windows variant, and should therefore +have consistent performance. + + +Semaphore benchtests +-------------------- + +benchtest5 - Timing for various uncontended cases. + + +In all benchtests, the operation is repeated a large +number of times and an average is calculated. Loop +overhead is measured and subtracted from all test times. + diff --git a/win32/3rdparty/pthreads/tests/SIZES.GC b/win32/3rdparty/pthreads/tests/SIZES.GC new file mode 100644 index 000000000..ae09a84e6 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/SIZES.GC @@ -0,0 +1,20 @@ +Sizes of pthreads-win32 structs +------------------------------- + pthread_t_ 124 + pthread_attr_t_ 28 + sem_t_ 4 + pthread_mutex_t_ 44 + pthread_mutexattr_t_ 8 + pthread_spinlock_t_ 8 + pthread_barrier_t_ 24 + pthread_barrierattr_t_ 4 + pthread_key_t_ 16 + pthread_cond_t_ 32 + pthread_condattr_t_ 4 + pthread_rwlock_t_ 28 + pthread_rwlockattr_t_ 4 + pthread_once_t_ 8 + ptw32_cleanup_t 12 + sched_param 4 +------------------------------- + diff --git a/win32/3rdparty/pthreads/tests/SIZES.GCE b/win32/3rdparty/pthreads/tests/SIZES.GCE new file mode 100644 index 000000000..f36d0d2b1 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/SIZES.GCE @@ -0,0 +1,20 @@ +Sizes of pthreads-win32 structs +------------------------------- + pthread_t_ 60 + pthread_attr_t_ 28 + sem_t_ 4 + pthread_mutex_t_ 44 + pthread_mutexattr_t_ 8 + pthread_spinlock_t_ 8 + pthread_barrier_t_ 24 + pthread_barrierattr_t_ 4 + pthread_key_t_ 16 + pthread_cond_t_ 32 + pthread_condattr_t_ 4 + pthread_rwlock_t_ 28 + pthread_rwlockattr_t_ 4 + pthread_once_t_ 8 + ptw32_cleanup_t 12 + sched_param 4 +------------------------------- + diff --git a/win32/3rdparty/pthreads/tests/SIZES.VC b/win32/3rdparty/pthreads/tests/SIZES.VC new file mode 100644 index 000000000..ae09a84e6 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/SIZES.VC @@ -0,0 +1,20 @@ +Sizes of pthreads-win32 structs +------------------------------- + pthread_t_ 124 + pthread_attr_t_ 28 + sem_t_ 4 + pthread_mutex_t_ 44 + pthread_mutexattr_t_ 8 + pthread_spinlock_t_ 8 + pthread_barrier_t_ 24 + pthread_barrierattr_t_ 4 + pthread_key_t_ 16 + pthread_cond_t_ 32 + pthread_condattr_t_ 4 + pthread_rwlock_t_ 28 + pthread_rwlockattr_t_ 4 + pthread_once_t_ 8 + ptw32_cleanup_t 12 + sched_param 4 +------------------------------- + diff --git a/win32/3rdparty/pthreads/tests/SIZES.VCE b/win32/3rdparty/pthreads/tests/SIZES.VCE new file mode 100644 index 000000000..edc642719 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/SIZES.VCE @@ -0,0 +1,19 @@ +Sizes of pthreads-win32 structs +------------------------------- + pthread_t_ 68 + pthread_attr_t_ 28 + sem_t_ 4 + pthread_mutex_t_ 44 + pthread_mutexattr_t_ 8 + pthread_spinlock_t_ 8 + pthread_barrier_t_ 24 + pthread_barrierattr_t_ 4 + pthread_key_t_ 16 + pthread_cond_t_ 32 + pthread_condattr_t_ 4 + pthread_rwlock_t_ 28 + pthread_rwlockattr_t_ 4 + pthread_once_t_ 8 + ptw32_cleanup_t 12 + sched_param 4 +------------------------------- diff --git a/win32/3rdparty/pthreads/tests/SIZES.VSE b/win32/3rdparty/pthreads/tests/SIZES.VSE new file mode 100644 index 000000000..edc642719 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/SIZES.VSE @@ -0,0 +1,19 @@ +Sizes of pthreads-win32 structs +------------------------------- + pthread_t_ 68 + pthread_attr_t_ 28 + sem_t_ 4 + pthread_mutex_t_ 44 + pthread_mutexattr_t_ 8 + pthread_spinlock_t_ 8 + pthread_barrier_t_ 24 + pthread_barrierattr_t_ 4 + pthread_key_t_ 16 + pthread_cond_t_ 32 + pthread_condattr_t_ 4 + pthread_rwlock_t_ 28 + pthread_rwlockattr_t_ 4 + pthread_once_t_ 8 + ptw32_cleanup_t 12 + sched_param 4 +------------------------------- diff --git a/win32/3rdparty/pthreads/tests/Wmakefile b/win32/3rdparty/pthreads/tests/Wmakefile new file mode 100644 index 000000000..83cd34bb2 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/Wmakefile @@ -0,0 +1,346 @@ +# Watcom makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +# Pthreads-win32 - POSIX Threads Library for Win32 +# Copyright(C) 1998 John E. Bossom +# Copyright(C) 1999,2005 Pthreads-win32 contributors +# +# Contact Email: rpj@callisto.canberra.edu.au +# +# The current list of contributors is contained +# in the file CONTRIBUTORS included with the source +# code distribution. The list can also be seen at the +# following World Wide Web location: +# http://sources.redhat.com/pthreads-win32/contributors.html +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library in the file COPYING.LIB; +# if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + + +DLL_VER = 2 + +.EXTENSIONS: + +.EXTENSIONS: .pass .exe .obj .i .c + +CP = copy +RM = erase +CAT = type +MKDIR = mkdir +TOUCH = echo Passed > +ECHO = @echo + +CPHDR = pthread.h semaphore.h sched.h + +OPTIM = -od + +XXLIBS = + +# C++ Exceptions +WCEFLAGS = -xs -dPtW32NoCatchWarn -d__CLEANUP_CXX +WCELIB = pthreadWCE$(DLL_VER).lib +WCEDLL = pthreadWCE$(DLL_VER).dll +# C cleanup code +WCFLAGS = -d__CLEANUP_C +WCLIB = pthreadWC$(DLL_VER).lib +WCDLL = pthreadWC$(DLL_VER).dll +# C++ Exceptions in application - using WC version of pthreads dll +WCXFLAGS = -xs -d__CLEANUP_C + +CFLAGS= -w4 -e25 -d_WIN32_WINNT=0x400 -d_REENTRANT -zq -bm $(OPTIM) -5r -bt=nt -mf -d2 + +LFLAGS= +INCLUDES= -i=. +BUILD_DIR=.. + +COPYFILES = $(CPHDR) $(CPLIB) $(CPDLL) + +TEST = +EHFLAGS = + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +PASSES = sizes.pass loadfree.pass & + self1.pass mutex5.pass & + mutex1.pass mutex1n.pass mutex1e.pass mutex1r.pass & + semaphore1.pass semaphore2.pass semaphore3.pass & + mutex2.pass mutex3.pass & + mutex2r.pass mutex2e.pass mutex3r.pass mutex3e.pass & + condvar1.pass condvar1_1.pass condvar1_2.pass condvar2.pass condvar2_1.pass & + exit1.pass create1.pass create2.pass reuse1.pass reuse2.pass equal1.pass & + kill1.pass valid1.pass valid2.pass & + exit2.pass exit3.pass exit4 exit5 & + join0.pass join1.pass detach1.pass join2.pass join3.pass & + mutex4.pass mutex6.pass mutex6n.pass mutex6e.pass mutex6r.pass & + mutex6s.pass mutex6es.pass mutex6rs.pass & + mutex7.pass mutex7n.pass mutex7e.pass mutex7r.pass & + mutex8.pass mutex8n.pass mutex8e.pass mutex8r.pass & + count1.pass & + once1.pass once2.pass once3.pass once4.pass tsd1.pass & + self2.pass & + cancel1.pass cancel2.pass & + semaphore4.pass semaphore4t.pass semaphore5.pass & + delay1.pass delay2.pass eyal1.pass & + condvar3.pass condvar3_1.pass condvar3_2.pass condvar3_3.pass & + condvar4.pass condvar5.pass condvar6.pass & + condvar7.pass condvar8.pass condvar9.pass & + errno1.pass & + rwlock1.pass rwlock2.pass rwlock3.pass rwlock4.pass rwlock5.pass & + rwlock6.pass rwlock7.pass rwlock8.pass & + rwlock2_t.pass rwlock3_t.pass rwlock4_t.pass rwlock5_t.pass rwlock6_t.pass rwlock6_t2.pass & + context1.pass & + cancel3.pass cancel4.pass cancel5.pass cancel6a.pass cancel6d.pass & + cancel7 cancel8 & + cleanup0.pass cleanup1.pass cleanup2.pass cleanup3.pass & + priority1.pass priority2.pass inherit1.pass & + spin1.pass spin2.pass spin3.pass spin4.pass & + barrier1.pass barrier2.pass barrier3.pass barrier4.pass barrier5.pass & + exception1.pass exception2.pass exception3.pass & + cancel9.pass create3.pass stress1.pass + +BENCHRESULTS = & + benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench + +help: .SYMBOLIC + @ $(ECHO) Run one of the following command lines: + @ $(ECHO) wmake /f Wmakefile clean WC (to test using WC dll with wcc386 (no EH) applications) + @ $(ECHO) wmake /f Wmakefile clean WCX (to test using WC dll with wpp386 (EH) applications) + @ $(ECHO) wmake /f Wmakefile clean WCE (to test using the WCE dll with wpp386 EH applications) + @ $(ECHO) wmake /f Wmakefile clean WC-bench (to benchtest using WC dll with C bench app) + @ $(ECHO) wmake /f Wmakefile clean WCX-bench (to benchtest using WC dll with C++ bench app) + @ $(ECHO) wmake /f Wmakefile clean WCE-bench (to benchtest using WCE dll with C++ bench app) + +all: .SYMBOLIC + @ wmake /f Wmakefile clean WC + @ wmake /f Wmakefile clean WCX + @ wmake /f Wmakefile clean WCE + @ wmake /f Wmakefile clean WSE + @ wmake /f Wmakefile clean WC-bench + +tests: $(CPLIB) $(CPDLL) $(CPHDR) $(PASSES) .SYMBOLIC + @ $(ECHO) ALL TESTS PASSED! Congratulations! + +benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(XXLIBS) $(BENCHRESULTS) .SYMBOLIC + @ $(ECHO) ALL BENCH TESTS DONE. + +$(BENCHRESULTS): ($[*).exe + @ $(ECHO) ... Running $(TEST) benchtest: ($[*).exe + @ .\($[*).exe + @ $(ECHO) ...... Done + @ $(TOUCH) ($[*).bench + +WCE: .SYMBOLIC + @ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCELIB)" CPDLL="$(WCEDLL)" EHFLAGS="$(WCEFLAGS)" tests + +WC: .SYMBOLIC + @ wmake /f Wmakefile CC=wcc386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCFLAGS)" tests + +WCX: .SYMBOLIC + @ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCXFLAGS)" tests + +WCE-bench: .SYMBOLIC + @ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCELIB)" CPDLL="$(WCEDLL)" EHFLAGS="$(WCEFLAGS)" XXLIBS="benchlib.o" benchtests + +WC-bench: .SYMBOLIC + @ wmake /f Wmakefile CC=wcc386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCFLAGS)" XXLIBS="benchlib.o" benchtests + +WCX-bench: .SYMBOLIC + @ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCXFLAGS)" XXLIBS="benchlib.o" benchtests + +sizes.pass: sizes.exe + @ $(ECHO) ... Running $(TEST) test: $^* + @ $[@ > SIZES.$(TEST) + @ $(CAT) SIZES.$(TEST) + @ $(ECHO) ...... Passed + @ $(TOUCH) $^@ + +.exe.pass: + @ $(ECHO) ... Running $(TEST) test: $^* + @ $[@ + @ $(ECHO) ...... Passed + @ $(TOUCH) $^@ + +.obj.exe: + @ $(ECHO) wlink NAME $^@ FILE $[@ LIBRARY $(CPLIB) OPTION quiet + @ wlink NAME $^@ FILE $[@ LIBRARY $(CPLIB) OPTION quiet + +.c.obj: + @ $(ECHO) $(CC) $^* $(EHFLAGS) $(CFLAGS) $(INCLUDES) + @ $(CC) $^* $(EHFLAGS) $(CFLAGS) $(INCLUDES) + +.c.i: + @ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< + +$(COPYFILES): .SYMBOLIC + @ $(ECHO) Copying $@ + @ $(CP) $(BUILD_DIR)\$@ . + +pthread.dll: + @ $(CP) $(CPDLL) $*.dll + @ $(CP) $(CPLIB) $*.lib + +clean: .SYMBOLIC + @ if exist *.dll $(RM) *.dll + @ if exist *.lib $(RM) *.lib + @ if exist *.err $(RM) *.err + @ if exist pthread.h $(RM) pthread.h + @ if exist semaphore.h $(RM) semaphore.h + @ if exist sched.h $(RM) sched.h + @ if exist *.e $(RM) *.e + @ if exist *.i $(RM) *.i + @ if exist *.obj $(RM) *.obj + @ if exist *.pdb $(RM) *.pdb + @ if exist *.o $(RM) *.o + @ if exist *.asm $(RM) *.asm + @ if exist *.exe $(RM) *.exe + @ if exist *.pass $(RM) *.pass + @ if exist *.bench $(RM) *.bench + @ if exist *.log $(RM) *.log + @ $(ECHO) Clean completed. + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: +barrier1.pass: +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +create3.pass: +delay1.pass: +delay2.pass: delay1.pass +detach1.pass: join0.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass: +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +semaphore5.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +stress1.pass: +tsd1.pass: join1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass +cancel9.pass: cancel8.pass diff --git a/win32/3rdparty/pthreads/tests/barrier1.c b/win32/3rdparty/pthreads/tests/barrier1.c new file mode 100644 index 000000000..76f78df66 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/barrier1.c @@ -0,0 +1,58 @@ +/* + * barrier1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create a barrier object and then destroy it. + * + */ + +#include "test.h" + +pthread_barrier_t barrier = NULL; + +int +main() +{ + assert(barrier == NULL); + + assert(pthread_barrier_init(&barrier, NULL, 1) == 0); + + assert(barrier != NULL); + + assert(pthread_barrier_destroy(&barrier) == 0); + + assert(barrier == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/barrier2.c b/win32/3rdparty/pthreads/tests/barrier2.c new file mode 100644 index 000000000..28aa238c5 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/barrier2.c @@ -0,0 +1,55 @@ +/* + * barrier2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a single barrier object, wait on it, + * and then destroy it. + * + */ + +#include "test.h" + +pthread_barrier_t barrier = NULL; + +int +main() +{ + assert(pthread_barrier_init(&barrier, NULL, 1) == 0); + + assert(pthread_barrier_wait(&barrier) == PTHREAD_BARRIER_SERIAL_THREAD); + + assert(pthread_barrier_destroy(&barrier) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/barrier3.c b/win32/3rdparty/pthreads/tests/barrier3.c new file mode 100644 index 000000000..3e4009068 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/barrier3.c @@ -0,0 +1,71 @@ +/* + * barrier3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a single barrier object with barrier attribute, wait on it, + * and then destroy it. + * + */ + +#include "test.h" + +pthread_barrier_t barrier = NULL; +static int result = 1; + +void * func(void * arg) +{ + return (void *) pthread_barrier_wait(&barrier); +} + +int +main() +{ + pthread_t t; + pthread_barrierattr_t ba; + + assert(pthread_barrierattr_init(&ba) == 0); + assert(pthread_barrierattr_setpshared(&ba, PTHREAD_PROCESS_PRIVATE) == 0); + assert(pthread_barrier_init(&barrier, &ba, 1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + + assert(result == PTHREAD_BARRIER_SERIAL_THREAD); + + assert(pthread_barrier_destroy(&barrier) == 0); + assert(pthread_barrierattr_destroy(&ba) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/barrier4.c b/win32/3rdparty/pthreads/tests/barrier4.c new file mode 100644 index 000000000..042992dfd --- /dev/null +++ b/win32/3rdparty/pthreads/tests/barrier4.c @@ -0,0 +1,110 @@ +/* + * barrier4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a single barrier object, multiple wait on it, + * and then destroy it. + * + */ + +#include "test.h" + +enum { + NUMTHREADS = 16 +}; + +pthread_barrier_t barrier = NULL; +pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER; +static int serialThreadCount = 0; +static int otherThreadCount = 0; + +void * +func(void * arg) +{ + int result = pthread_barrier_wait(&barrier); + + assert(pthread_mutex_lock(&mx) == 0); + + if (result == PTHREAD_BARRIER_SERIAL_THREAD) + { + serialThreadCount++; + } + else if (0 == result) + { + otherThreadCount++; + } + else + { + printf("Barrier wait failed: error = %s\n", error_string[result]); + fflush(stdout); + return NULL; + } + assert(pthread_mutex_unlock(&mx) == 0); + + return NULL; +} + +int +main() +{ + int i, j; + pthread_t t[NUMTHREADS + 1]; + + for (j = 1; j <= NUMTHREADS; j++) + { + printf("Barrier height = %d\n", j); + + serialThreadCount = 0; + + assert(pthread_barrier_init(&barrier, NULL, j) == 0); + + for (i = 1; i <= j; i++) + { + assert(pthread_create(&t[i], NULL, func, NULL) == 0); + } + + for (i = 1; i <= j; i++) + { + assert(pthread_join(t[i], NULL) == 0); + } + + assert(serialThreadCount == 1); + + assert(pthread_barrier_destroy(&barrier) == 0); + } + + assert(pthread_mutex_destroy(&mx) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/barrier5.c b/win32/3rdparty/pthreads/tests/barrier5.c new file mode 100644 index 000000000..5b598c9d9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/barrier5.c @@ -0,0 +1,128 @@ +/* + * barrier5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a single barrier object, set up a sequence of + * barrier points to prove lockstepness, and then destroy it. + * + */ + +#include "test.h" + +enum { + NUMTHREADS = 16, + BARRIERS = 10000 +}; + +pthread_barrier_t barrier = NULL; +pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER; + +int barrierReleases[BARRIERS + 1]; + +void * +func(void * barrierHeight) +{ + int i; + int result; + int serialThreads = 0; + + for (i = 1; i < BARRIERS; i++) + { + result = pthread_barrier_wait(&barrier); + + assert(pthread_mutex_lock(&mx) == 0); + barrierReleases[i]++; + assert(pthread_mutex_unlock(&mx) == 0); + /* + * Confirm the correct number of releases from the previous + * barrier. We can't do the current barrier yet because there may + * still be threads waking up. + */ + if (result == PTHREAD_BARRIER_SERIAL_THREAD) + { + serialThreads++; + assert(barrierReleases[i - 1] == (int) barrierHeight); + barrierReleases[i + 1] = 0; + } + else if (result != 0) + { + printf("Barrier failed: result = %s\n", error_string[result]); + fflush(stdout); + return NULL; + } + } + + return (void *) serialThreads; +} + +int +main() +{ + int i, j; + int result; + int serialThreadsTotal; + pthread_t t[NUMTHREADS + 1]; + + for (j = 1; j <= NUMTHREADS; j++) + { + printf("Barrier height = %d\n", j); + + barrierReleases[0] = j; + barrierReleases[1] = 0; + + assert(pthread_barrier_init(&barrier, NULL, j) == 0); + + for (i = 1; i <= j; i++) + { + assert(pthread_create(&t[i], NULL, func, (void *) j) == 0); + } + + serialThreadsTotal = 0; + for (i = 1; i <= j; i++) + { + assert(pthread_join(t[i], (void **) &result) == 0); + serialThreadsTotal += result; + } + + assert(serialThreadsTotal == BARRIERS - 1); + assert(barrierReleases[BARRIERS - 1] == j); + assert(barrierReleases[BARRIERS] == 0); + + assert(pthread_barrier_destroy(&barrier) == 0); + } + + assert(pthread_mutex_destroy(&mx) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/benchlib.c b/win32/3rdparty/pthreads/tests/benchlib.c new file mode 100644 index 000000000..bf60ae515 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchlib.c @@ -0,0 +1,363 @@ +/* + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + */ + +#include "../config.h" + +#include "pthread.h" +#include "sched.h" +#include "semaphore.h" +#include +#include + +#ifdef __GNUC__ +#include +#endif + +#include "benchtest.h" + +int old_mutex_use = OLD_WIN32CS; + +BOOL (WINAPI *ptw32_try_enter_critical_section)(LPCRITICAL_SECTION) = NULL; +HINSTANCE ptw32_h_kernel32; + +void +dummy_call(int * a) +{ +} + +void +interlocked_inc_with_conditionals(int * a) +{ + if (a != NULL) + if (InterlockedIncrement((long *) a) == -1) + { + *a = 0; + } +} + +void +interlocked_dec_with_conditionals(int * a) +{ + if (a != NULL) + if (InterlockedDecrement((long *) a) == -1) + { + *a = 0; + } +} + +int +old_mutex_init(old_mutex_t *mutex, const old_mutexattr_t *attr) +{ + int result = 0; + old_mutex_t mx; + + if (mutex == NULL) + { + return EINVAL; + } + + mx = (old_mutex_t) calloc(1, sizeof(*mx)); + + if (mx == NULL) + { + result = ENOMEM; + goto FAIL0; + } + + mx->mutex = 0; + + if (attr != NULL + && *attr != NULL + && (*attr)->pshared == PTHREAD_PROCESS_SHARED + ) + { + result = ENOSYS; + } + else + { + CRITICAL_SECTION cs; + + /* + * Load KERNEL32 and try to get address of TryEnterCriticalSection + */ + ptw32_h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL")); + ptw32_try_enter_critical_section = (BOOL (WINAPI *)(LPCRITICAL_SECTION)) + +#if defined(NEED_UNICODE_CONSTS) + GetProcAddress(ptw32_h_kernel32, + (const TCHAR *)TEXT("TryEnterCriticalSection")); +#else + GetProcAddress(ptw32_h_kernel32, + (LPCSTR) "TryEnterCriticalSection"); +#endif + + if (ptw32_try_enter_critical_section != NULL) + { + InitializeCriticalSection(&cs); + if ((*ptw32_try_enter_critical_section)(&cs)) + { + LeaveCriticalSection(&cs); + } + else + { + /* + * Not really supported (Win98?). + */ + ptw32_try_enter_critical_section = NULL; + } + DeleteCriticalSection(&cs); + } + + if (ptw32_try_enter_critical_section == NULL) + { + (void) FreeLibrary(ptw32_h_kernel32); + ptw32_h_kernel32 = 0; + } + + if (old_mutex_use == OLD_WIN32CS) + { + InitializeCriticalSection(&mx->cs); + } + else if (old_mutex_use == OLD_WIN32MUTEX) + { + mx->mutex = CreateMutex (NULL, + FALSE, + NULL); + + if (mx->mutex == 0) + { + result = EAGAIN; + } + } + else + { + result = EINVAL; + } + } + + if (result != 0 && mx != NULL) + { + free(mx); + mx = NULL; + } + +FAIL0: + *mutex = mx; + + return(result); +} + + +int +old_mutex_lock(old_mutex_t *mutex) +{ + int result = 0; + old_mutex_t mx; + + if (mutex == NULL || *mutex == NULL) + { + return EINVAL; + } + + if (*mutex == (old_mutex_t) PTW32_OBJECT_AUTO_INIT) + { + /* + * Don't use initialisers when benchtesting. + */ + result = EINVAL; + } + + mx = *mutex; + + if (result == 0) + { + if (mx->mutex == 0) + { + EnterCriticalSection(&mx->cs); + } + else + { + result = (WaitForSingleObject(mx->mutex, INFINITE) + == WAIT_OBJECT_0) + ? 0 + : EINVAL; + } + } + + return(result); +} + +int +old_mutex_unlock(old_mutex_t *mutex) +{ + int result = 0; + old_mutex_t mx; + + if (mutex == NULL || *mutex == NULL) + { + return EINVAL; + } + + mx = *mutex; + + if (mx != (old_mutex_t) PTW32_OBJECT_AUTO_INIT) + { + if (mx->mutex == 0) + { + LeaveCriticalSection(&mx->cs); + } + else + { + result = (ReleaseMutex (mx->mutex) ? 0 : EINVAL); + } + } + else + { + result = EINVAL; + } + + return(result); +} + + +int +old_mutex_trylock(old_mutex_t *mutex) +{ + int result = 0; + old_mutex_t mx; + + if (mutex == NULL || *mutex == NULL) + { + return EINVAL; + } + + if (*mutex == (old_mutex_t) PTW32_OBJECT_AUTO_INIT) + { + /* + * Don't use initialisers when benchtesting. + */ + result = EINVAL; + } + + mx = *mutex; + + if (result == 0) + { + if (mx->mutex == 0) + { + if (ptw32_try_enter_critical_section == NULL) + { + result = 0; + } + else if ((*ptw32_try_enter_critical_section)(&mx->cs) != TRUE) + { + result = EBUSY; + } + } + else + { + DWORD status; + + status = WaitForSingleObject (mx->mutex, 0); + + if (status != WAIT_OBJECT_0) + { + result = ((status == WAIT_TIMEOUT) + ? EBUSY + : EINVAL); + } + } + } + + return(result); +} + + +int +old_mutex_destroy(old_mutex_t *mutex) +{ + int result = 0; + old_mutex_t mx; + + if (mutex == NULL + || *mutex == NULL) + { + return EINVAL; + } + + if (*mutex != (old_mutex_t) PTW32_OBJECT_AUTO_INIT) + { + mx = *mutex; + + if ((result = old_mutex_trylock(&mx)) == 0) + { + *mutex = NULL; + + (void) old_mutex_unlock(&mx); + + if (mx->mutex == 0) + { + DeleteCriticalSection(&mx->cs); + } + else + { + result = (CloseHandle (mx->mutex) ? 0 : EINVAL); + } + + if (result == 0) + { + mx->mutex = 0; + free(mx); + } + else + { + *mutex = mx; + } + } + } + else + { + result = EINVAL; + } + + if (ptw32_try_enter_critical_section != NULL) + { + (void) FreeLibrary(ptw32_h_kernel32); + ptw32_h_kernel32 = 0; + } + + return(result); +} + +/****************************************************************************************/ diff --git a/win32/3rdparty/pthreads/tests/benchtest.h b/win32/3rdparty/pthreads/tests/benchtest.h new file mode 100644 index 000000000..809057810 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchtest.h @@ -0,0 +1,70 @@ +/* + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + */ + +#include "../config.h" + +enum { + OLD_WIN32CS, + OLD_WIN32MUTEX +}; + +extern int old_mutex_use; + +struct old_mutex_t_ { + HANDLE mutex; + CRITICAL_SECTION cs; +}; + +typedef struct old_mutex_t_ * old_mutex_t; + +struct old_mutexattr_t_ { + int pshared; +}; + +typedef struct old_mutexattr_t_ * old_mutexattr_t; + +extern BOOL (WINAPI *ptw32_try_enter_critical_section)(LPCRITICAL_SECTION); +extern HINSTANCE ptw32_h_kernel32; + +#define PTW32_OBJECT_AUTO_INIT ((void *) -1) + +void dummy_call(int * a); +void interlocked_inc_with_conditionals(int *a); +void interlocked_dec_with_conditionals(int *a); +int old_mutex_init(old_mutex_t *mutex, const old_mutexattr_t *attr); +int old_mutex_lock(old_mutex_t *mutex); +int old_mutex_unlock(old_mutex_t *mutex); +int old_mutex_trylock(old_mutex_t *mutex); +int old_mutex_destroy(old_mutex_t *mutex); +/****************************************************************************************/ diff --git a/win32/3rdparty/pthreads/tests/benchtest1.c b/win32/3rdparty/pthreads/tests/benchtest1.c new file mode 100644 index 000000000..116dad05e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchtest1.c @@ -0,0 +1,249 @@ +/* + * benchtest1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Mutex + * Single thread iteration over lock/unlock for each mutex type. + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#include "benchtest.h" + +#define PTW32_MUTEX_TYPES +#define ITERATIONS 10000000L + +pthread_mutex_t mx; +pthread_mutexattr_t ma; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +long durationMilliSecs; +long overHeadMilliSecs = 0; +int one = 1; +int zero = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ + { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ + }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void +runTest (char * testNameString, int mType) +{ +#ifdef PTW32_MUTEX_TYPES + assert(pthread_mutexattr_settype(&ma, mType) == 0); +#endif + assert(pthread_mutex_init(&mx, &ma) == 0); + + TESTSTART + assert(pthread_mutex_lock(&mx) == zero); + assert(pthread_mutex_unlock(&mx) == zero); + TESTSTOP + + assert(pthread_mutex_destroy(&mx) == 0); + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + testNameString, + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); +} + + +int +main (int argc, char *argv[]) +{ + int i = 0; + CRITICAL_SECTION cs; + old_mutex_t ox; + pthread_mutexattr_init(&ma); + + printf( "=============================================================================\n"); + printf( "\nLock plus unlock on an unlocked mutex.\n%ld iterations\n\n", + ITERATIONS); + printf( "%-45s %15s %15s\n", + "Test", + "Total(msec)", + "average(usec)"); + printf( "-----------------------------------------------------------------------------\n"); + + /* + * Time the loop overhead so we can subtract it from the actual test times. + */ + + TESTSTART + assert(1 == one); + assert(1 == one); + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + overHeadMilliSecs = durationMilliSecs; + + + TESTSTART + assert((dummy_call(&i), 1) == one); + assert((dummy_call(&i), 1) == one); + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + "Dummy call x 2", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + + TESTSTART + assert((interlocked_inc_with_conditionals(&i), 1) == one); + assert((interlocked_dec_with_conditionals(&i), 1) == one); + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + "Dummy call -> Interlocked with cond x 2", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + + TESTSTART + assert((InterlockedIncrement((LPLONG)&i), 1) == (LONG)one); + assert((InterlockedDecrement((LPLONG)&i), 1) == (LONG)one); + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + "InterlockedOp x 2", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + + InitializeCriticalSection(&cs); + + TESTSTART + assert((EnterCriticalSection(&cs), 1) == one); + assert((LeaveCriticalSection(&cs), 1) == one); + TESTSTOP + + DeleteCriticalSection(&cs); + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + "Simple Critical Section", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + + old_mutex_use = OLD_WIN32CS; + assert(old_mutex_init(&ox, NULL) == 0); + + TESTSTART + assert(old_mutex_lock(&ox) == zero); + assert(old_mutex_unlock(&ox) == zero); + TESTSTOP + + assert(old_mutex_destroy(&ox) == 0); + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Critical Section (WNT)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + + old_mutex_use = OLD_WIN32MUTEX; + assert(old_mutex_init(&ox, NULL) == 0); + + TESTSTART + assert(old_mutex_lock(&ox) == zero); + assert(old_mutex_unlock(&ox) == zero); + TESTSTOP + + assert(old_mutex_destroy(&ox) == 0); + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Win32 Mutex (W9x)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + printf( ".............................................................................\n"); + + /* + * Now we can start the actual tests + */ +#ifdef PTW32_MUTEX_TYPES + runTest("PTHREAD_MUTEX_DEFAULT (W9x,WNT)", PTHREAD_MUTEX_DEFAULT); + + runTest("PTHREAD_MUTEX_NORMAL (W9x,WNT)", PTHREAD_MUTEX_NORMAL); + + runTest("PTHREAD_MUTEX_ERRORCHECK (W9x,WNT)", PTHREAD_MUTEX_ERRORCHECK); + + runTest("PTHREAD_MUTEX_RECURSIVE (W9x,WNT)", PTHREAD_MUTEX_RECURSIVE); +#else + runTest("Non-blocking lock", 0); +#endif + + printf( "=============================================================================\n"); + + /* + * End of tests. + */ + + pthread_mutexattr_destroy(&ma); + + one = i; /* Dummy assignment to avoid 'variable unused' warning */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/benchtest2.c b/win32/3rdparty/pthreads/tests/benchtest2.c new file mode 100644 index 000000000..d92bb3c1a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchtest2.c @@ -0,0 +1,311 @@ +/* + * benchtest1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Mutex + * Two threads iterate over lock/unlock for each mutex type. + * The two threads are forced into lock-step using two mutexes, + * forcing the threads to block on each lock operation. The + * time measured is therefore the worst case senario. + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#include "benchtest.h" + +#define PTW32_MUTEX_TYPES +#define ITERATIONS 100000L + +pthread_mutex_t gate1, gate2; +old_mutex_t ox1, ox2; +CRITICAL_SECTION cs1, cs2; +pthread_mutexattr_t ma; +long durationMilliSecs; +long overHeadMilliSecs = 0; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +pthread_t worker; +int running = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ + { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ + }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void * +overheadThread(void * arg) +{ + do + { + sched_yield(); + } + while (running); + + return NULL; +} + + +void * +oldThread(void * arg) +{ + do + { + (void) old_mutex_lock(&ox1); + (void) old_mutex_lock(&ox2); + (void) old_mutex_unlock(&ox1); + sched_yield(); + (void) old_mutex_unlock(&ox2); + } + while (running); + + return NULL; +} + +void * +workerThread(void * arg) +{ + do + { + (void) pthread_mutex_lock(&gate1); + (void) pthread_mutex_lock(&gate2); + (void) pthread_mutex_unlock(&gate1); + sched_yield(); + (void) pthread_mutex_unlock(&gate2); + } + while (running); + + return NULL; +} + +void * +CSThread(void * arg) +{ + do + { + EnterCriticalSection(&cs1); + EnterCriticalSection(&cs2); + LeaveCriticalSection(&cs1); + sched_yield(); + LeaveCriticalSection(&cs2); + } + while (running); + + return NULL; +} + +void +runTest (char * testNameString, int mType) +{ +#ifdef PTW32_MUTEX_TYPES + assert(pthread_mutexattr_settype(&ma, mType) == 0); +#endif + assert(pthread_mutex_init(&gate1, &ma) == 0); + assert(pthread_mutex_init(&gate2, &ma) == 0); + assert(pthread_mutex_lock(&gate1) == 0); + assert(pthread_mutex_lock(&gate2) == 0); + running = 1; + assert(pthread_create(&worker, NULL, workerThread, NULL) == 0); + TESTSTART + (void) pthread_mutex_unlock(&gate1); + sched_yield(); + (void) pthread_mutex_unlock(&gate2); + (void) pthread_mutex_lock(&gate1); + (void) pthread_mutex_lock(&gate2); + TESTSTOP + running = 0; + assert(pthread_mutex_unlock(&gate2) == 0); + assert(pthread_mutex_unlock(&gate1) == 0); + assert(pthread_join(worker, NULL) == 0); + assert(pthread_mutex_destroy(&gate2) == 0); + assert(pthread_mutex_destroy(&gate1) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + testNameString, + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS / 4 /* Four locks/unlocks per iteration */); +} + + +int +main (int argc, char *argv[]) +{ + assert(pthread_mutexattr_init(&ma) == 0); + + printf( "=============================================================================\n"); + printf( "\nLock plus unlock on a locked mutex.\n"); + printf("%ld iterations, four locks/unlocks per iteration.\n\n", ITERATIONS); + + printf( "%-45s %15s %15s\n", + "Test", + "Total(msec)", + "average(usec)"); + printf( "-----------------------------------------------------------------------------\n"); + + /* + * Time the loop overhead so we can subtract it from the actual test times. + */ + + running = 1; + assert(pthread_create(&worker, NULL, overheadThread, NULL) == 0); + TESTSTART + sched_yield(); + sched_yield(); + TESTSTOP + running = 0; + assert(pthread_join(worker, NULL) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + overHeadMilliSecs = durationMilliSecs; + + + InitializeCriticalSection(&cs1); + InitializeCriticalSection(&cs2); + EnterCriticalSection(&cs1); + EnterCriticalSection(&cs2); + running = 1; + assert(pthread_create(&worker, NULL, CSThread, NULL) == 0); + TESTSTART + LeaveCriticalSection(&cs1); + sched_yield(); + LeaveCriticalSection(&cs2); + EnterCriticalSection(&cs1); + EnterCriticalSection(&cs2); + TESTSTOP + running = 0; + LeaveCriticalSection(&cs2); + LeaveCriticalSection(&cs1); + assert(pthread_join(worker, NULL) == 0); + DeleteCriticalSection(&cs2); + DeleteCriticalSection(&cs1); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Simple Critical Section", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS / 4 ); + + + old_mutex_use = OLD_WIN32CS; + assert(old_mutex_init(&ox1, NULL) == 0); + assert(old_mutex_init(&ox2, NULL) == 0); + assert(old_mutex_lock(&ox1) == 0); + assert(old_mutex_lock(&ox2) == 0); + running = 1; + assert(pthread_create(&worker, NULL, oldThread, NULL) == 0); + TESTSTART + (void) old_mutex_unlock(&ox1); + sched_yield(); + (void) old_mutex_unlock(&ox2); + (void) old_mutex_lock(&ox1); + (void) old_mutex_lock(&ox2); + TESTSTOP + running = 0; + assert(old_mutex_unlock(&ox1) == 0); + assert(old_mutex_unlock(&ox2) == 0); + assert(pthread_join(worker, NULL) == 0); + assert(old_mutex_destroy(&ox2) == 0); + assert(old_mutex_destroy(&ox1) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Critical Section (WNT)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS / 4); + + + old_mutex_use = OLD_WIN32MUTEX; + assert(old_mutex_init(&ox1, NULL) == 0); + assert(old_mutex_init(&ox2, NULL) == 0); + assert(old_mutex_lock(&ox1) == 0); + assert(old_mutex_lock(&ox2) == 0); + running = 1; + assert(pthread_create(&worker, NULL, oldThread, NULL) == 0); + TESTSTART + (void) old_mutex_unlock(&ox1); + sched_yield(); + (void) old_mutex_unlock(&ox2); + (void) old_mutex_lock(&ox1); + (void) old_mutex_lock(&ox2); + TESTSTOP + running = 0; + assert(old_mutex_unlock(&ox1) == 0); + assert(old_mutex_unlock(&ox2) == 0); + assert(pthread_join(worker, NULL) == 0); + assert(old_mutex_destroy(&ox2) == 0); + assert(old_mutex_destroy(&ox1) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Win32 Mutex (W9x)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS / 4); + + printf( ".............................................................................\n"); + + /* + * Now we can start the actual tests + */ +#ifdef PTW32_MUTEX_TYPES + runTest("PTHREAD_MUTEX_DEFAULT (W9x,WNT)", PTHREAD_MUTEX_DEFAULT); + + runTest("PTHREAD_MUTEX_NORMAL (W9x,WNT)", PTHREAD_MUTEX_NORMAL); + + runTest("PTHREAD_MUTEX_ERRORCHECK (W9x,WNT)", PTHREAD_MUTEX_ERRORCHECK); + + runTest("PTHREAD_MUTEX_RECURSIVE (W9x,WNT)", PTHREAD_MUTEX_RECURSIVE); +#else + runTest("Blocking locks", 0); +#endif + + printf( "=============================================================================\n"); + /* + * End of tests. + */ + + pthread_mutexattr_destroy(&ma); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/benchtest3.c b/win32/3rdparty/pthreads/tests/benchtest3.c new file mode 100644 index 000000000..023460dfb --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchtest3.c @@ -0,0 +1,201 @@ +/* + * benchtest3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Mutex + * Single thread iteration over a trylock on a locked mutex for each mutex type. + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#include "benchtest.h" + +#define PTW32_MUTEX_TYPES +#define ITERATIONS 10000000L + +pthread_mutex_t mx; +old_mutex_t ox; +pthread_mutexattr_t ma; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +long durationMilliSecs; +long overHeadMilliSecs = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ + { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ + }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void * +trylockThread (void * arg) +{ + TESTSTART + (void) pthread_mutex_trylock(&mx); + TESTSTOP + + return NULL; +} + + +void * +oldTrylockThread (void * arg) +{ + TESTSTART + (void) old_mutex_trylock(&ox); + TESTSTOP + + return NULL; +} + + +void +runTest (char * testNameString, int mType) +{ + pthread_t t; + +#ifdef PTW32_MUTEX_TYPES + (void) pthread_mutexattr_settype(&ma, mType); +#endif + assert(pthread_mutex_init(&mx, &ma) == 0); + assert(pthread_mutex_lock(&mx) == 0); + assert(pthread_create(&t, NULL, trylockThread, 0) == 0); + assert(pthread_join(t, NULL) == 0); + assert(pthread_mutex_unlock(&mx) == 0); + assert(pthread_mutex_destroy(&mx) == 0); + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + testNameString, + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); +} + + +int +main (int argc, char *argv[]) +{ + pthread_t t; + + assert(pthread_mutexattr_init(&ma) == 0); + + printf( "=============================================================================\n"); + printf( "\nTrylock on a locked mutex.\n"); + printf( "%ld iterations.\n\n", ITERATIONS); + printf( "%-45s %15s %15s\n", + "Test", + "Total(msec)", + "average(usec)"); + printf( "-----------------------------------------------------------------------------\n"); + + /* + * Time the loop overhead so we can subtract it from the actual test times. + */ + + TESTSTART + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + overHeadMilliSecs = durationMilliSecs; + + + old_mutex_use = OLD_WIN32CS; + assert(old_mutex_init(&ox, NULL) == 0); + assert(old_mutex_lock(&ox) == 0); + assert(pthread_create(&t, NULL, oldTrylockThread, 0) == 0); + assert(pthread_join(t, NULL) == 0); + assert(old_mutex_unlock(&ox) == 0); + assert(old_mutex_destroy(&ox) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Critical Section (WNT)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + old_mutex_use = OLD_WIN32MUTEX; + assert(old_mutex_init(&ox, NULL) == 0); + assert(old_mutex_lock(&ox) == 0); + assert(pthread_create(&t, NULL, oldTrylockThread, 0) == 0); + assert(pthread_join(t, NULL) == 0); + assert(old_mutex_unlock(&ox) == 0); + assert(old_mutex_destroy(&ox) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Win32 Mutex (W9x)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + printf( ".............................................................................\n"); + + /* + * Now we can start the actual tests + */ +#ifdef PTW32_MUTEX_TYPES + runTest("PTHREAD_MUTEX_DEFAULT (W9x,WNT)", PTHREAD_MUTEX_DEFAULT); + + runTest("PTHREAD_MUTEX_NORMAL (W9x,WNT)", PTHREAD_MUTEX_NORMAL); + + runTest("PTHREAD_MUTEX_ERRORCHECK (W9x,WNT)", PTHREAD_MUTEX_ERRORCHECK); + + runTest("PTHREAD_MUTEX_RECURSIVE (W9x,WNT)", PTHREAD_MUTEX_RECURSIVE); +#else + runTest("Non-blocking lock", 0); +#endif + + printf( "=============================================================================\n"); + + /* + * End of tests. + */ + + pthread_mutexattr_destroy(&ma); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/benchtest4.c b/win32/3rdparty/pthreads/tests/benchtest4.c new file mode 100644 index 000000000..772d10047 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchtest4.c @@ -0,0 +1,182 @@ +/* + * benchtest4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Mutex + * Single thread iteration over trylock/unlock for each mutex type. + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#include "benchtest.h" + +#define PTW32_MUTEX_TYPES +#define ITERATIONS 10000000L + +pthread_mutex_t mx; +old_mutex_t ox; +pthread_mutexattr_t ma; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +long durationMilliSecs; +long overHeadMilliSecs = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ + { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ + }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void +oldRunTest (char * testNameString, int mType) +{ +} + + +void +runTest (char * testNameString, int mType) +{ +#ifdef PTW32_MUTEX_TYPES + pthread_mutexattr_settype(&ma, mType); +#endif + pthread_mutex_init(&mx, &ma); + + TESTSTART + (void) pthread_mutex_trylock(&mx); + (void) pthread_mutex_unlock(&mx); + TESTSTOP + + pthread_mutex_destroy(&mx); + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + testNameString, + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); +} + + +int +main (int argc, char *argv[]) +{ + pthread_mutexattr_init(&ma); + + printf( "=============================================================================\n"); + printf( "Trylock plus unlock on an unlocked mutex.\n"); + printf( "%ld iterations.\n\n", ITERATIONS); + printf( "%-45s %15s %15s\n", + "Test", + "Total(msec)", + "average(usec)"); + printf( "-----------------------------------------------------------------------------\n"); + + /* + * Time the loop overhead so we can subtract it from the actual test times. + */ + + TESTSTART + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + overHeadMilliSecs = durationMilliSecs; + + old_mutex_use = OLD_WIN32CS; + assert(old_mutex_init(&ox, NULL) == 0); + TESTSTART + (void) old_mutex_trylock(&ox); + (void) old_mutex_unlock(&ox); + TESTSTOP + assert(old_mutex_destroy(&ox) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Critical Section (WNT)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + old_mutex_use = OLD_WIN32MUTEX; + assert(old_mutex_init(&ox, NULL) == 0); + TESTSTART + (void) old_mutex_trylock(&ox); + (void) old_mutex_unlock(&ox); + TESTSTOP + assert(old_mutex_destroy(&ox) == 0); + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + printf( "%-45s %15ld %15.3f\n", + "Old PT Mutex using a Win32 Mutex (W9x)", + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); + + printf( ".............................................................................\n"); + + /* + * Now we can start the actual tests + */ +#ifdef PTW32_MUTEX_TYPES + runTest("PTHREAD_MUTEX_DEFAULT (W9x,WNT)", PTHREAD_MUTEX_DEFAULT); + + runTest("PTHREAD_MUTEX_NORMAL (W9x,WNT)", PTHREAD_MUTEX_NORMAL); + + runTest("PTHREAD_MUTEX_ERRORCHECK (W9x,WNT)", PTHREAD_MUTEX_ERRORCHECK); + + runTest("PTHREAD_MUTEX_RECURSIVE (W9x,WNT)", PTHREAD_MUTEX_RECURSIVE); +#else + runTest("Non-blocking lock", 0); +#endif + + printf( "=============================================================================\n"); + + /* + * End of tests. + */ + + pthread_mutexattr_destroy(&ma); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/benchtest5.c b/win32/3rdparty/pthreads/tests/benchtest5.c new file mode 100644 index 000000000..7700fdeaa --- /dev/null +++ b/win32/3rdparty/pthreads/tests/benchtest5.c @@ -0,0 +1,159 @@ +/* + * benchtest5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Semaphore + * Single thread iteration over post/wait for a semaphore. + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#include "benchtest.h" + +#define ITERATIONS 1000000L + +sem_t sema; +HANDLE w32sema; + +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +long durationMilliSecs; +long overHeadMilliSecs = 0; +int one = 1; +int zero = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ + { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ + }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void +reportTest (char * testNameString) +{ + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + + printf( "%-45s %15ld %15.3f\n", + testNameString, + durationMilliSecs, + (float) durationMilliSecs * 1E3 / ITERATIONS); +} + + +int +main (int argc, char *argv[]) +{ + printf( "=============================================================================\n"); + printf( "\nOperations on a semaphore.\n%ld iterations\n\n", + ITERATIONS); + printf( "%-45s %15s %15s\n", + "Test", + "Total(msec)", + "average(usec)"); + printf( "-----------------------------------------------------------------------------\n"); + + /* + * Time the loop overhead so we can subtract it from the actual test times. + */ + + TESTSTART + assert(1 == one); + TESTSTOP + + durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + overHeadMilliSecs = durationMilliSecs; + + + /* + * Now we can start the actual tests + */ + assert((w32sema = CreateSemaphore(NULL, (long) 0, (long) ITERATIONS, NULL)) != 0); + TESTSTART + assert(ReleaseSemaphore(w32sema, 1, NULL) != zero); + TESTSTOP + assert(CloseHandle(w32sema) != 0); + + reportTest("W32 Post with no waiters"); + + + assert((w32sema = CreateSemaphore(NULL, (long) ITERATIONS, (long) ITERATIONS, NULL)) != 0); + TESTSTART + assert(WaitForSingleObject(w32sema, INFINITE) == WAIT_OBJECT_0); + TESTSTOP + assert(CloseHandle(w32sema) != 0); + + reportTest("W32 Wait without blocking"); + + + assert(sem_init(&sema, 0, 0) == 0); + TESTSTART + assert(sem_post(&sema) == zero); + TESTSTOP + assert(sem_destroy(&sema) == 0); + + reportTest("POSIX Post with no waiters"); + + + assert(sem_init(&sema, 0, ITERATIONS) == 0); + TESTSTART + assert(sem_wait(&sema) == zero); + TESTSTOP + assert(sem_destroy(&sema) == 0); + + reportTest("POSIX Wait without blocking"); + + + printf( "=============================================================================\n"); + + /* + * End of tests. + */ + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel1.c b/win32/3rdparty/pthreads/tests/cancel1.c new file mode 100644 index 000000000..be9b102a5 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel1.c @@ -0,0 +1,179 @@ +/* + * File: cancel1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test setting cancel state and cancel type. + * - + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - pthread_setcancelstate function + * - pthread_setcanceltype function + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - pthread_create, pthread_self work. + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 2 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* ... */ + { + int oldstate; + int oldtype; + + assert(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate) == 0); + assert(oldstate == PTHREAD_CANCEL_ENABLE); /* Check default */ + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + assert(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL) == 0); + assert(pthread_setcancelstate(oldstate, &oldstate) == 0); + assert(oldstate == PTHREAD_CANCEL_DISABLE); /* Check setting */ + + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype) == 0); + assert(oldtype == PTHREAD_CANCEL_DEFERRED); /* Check default */ + assert(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) == 0); + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + assert(pthread_setcanceltype(oldtype, &oldtype) == 0); + assert(oldtype == PTHREAD_CANCEL_ASYNCHRONOUS); /* Check setting */ + } + + return 0; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 1000); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + failed = !threadbag[i].started; + + if (failed) + { + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print ouput on failure. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + /* ... */ + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel2.c b/win32/3rdparty/pthreads/tests/cancel2.c new file mode 100644 index 000000000..6ef2043e2 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel2.c @@ -0,0 +1,251 @@ +/* + * File: cancel2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test SEH or C++ cancel exception handling within + * application exception blocks. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 1 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +static pthread_mutex_t waitLock = PTHREAD_MUTEX_INITIALIZER; + +void * +mythread(void * arg) +{ + int result = 0; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + switch (bag->threadnum % 2) + { + case 0: + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + result = 0; + break; + case 1: + assert(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) == 0); + result = 1; + break; + } + +#if defined(_MSC_VER) && !defined(__cplusplus) + __try +#else + try +#endif + { + /* Wait for go from main */ + assert(pthread_mutex_lock(&waitLock) == 0); + assert(pthread_mutex_unlock(&waitLock) == 0); + sched_yield(); + + for (;;) + { + pthread_testcancel(); + } + } +#if defined(_MSC_VER) && !defined(__cplusplus) + __except(EXCEPTION_EXECUTE_HANDLER) +#else +#if defined(PtW32CatchAll) + PtW32CatchAll +#else + catch(...) +#endif +#endif + { + /* + * Should not get into here. + */ + result += 100; + } + + /* + * Should not get to here either. + */ + result += 1000; + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + assert((t[0] = pthread_self()).p != NULL); + assert(pthread_mutex_lock(&waitLock) == 0); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + assert(pthread_mutex_unlock(&waitLock) == 0); + + Sleep(500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_cancel(t[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + assert(pthread_join(t[i], (void **) &result) == 0); + fail = (result != (int) PTHREAD_CANCELED); + if (fail) + { + fprintf(stderr, "Thread %d: started %d: location %d: cancel type %s\n", + i, + threadbag[i].started, + result, + ((result % 2) == 0) ? "ASYNCHRONOUS" : "DEFERRED"); + } + failed |= fail; + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +int +main() +{ + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/cancel3.c b/win32/3rdparty/pthreads/tests/cancel3.c new file mode 100644 index 000000000..1560ccfd2 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel3.c @@ -0,0 +1,201 @@ +/* + * File: cancel3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test asynchronous cancelation (alertable or non-alertable). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - Async cancel if thread is not blocked (i.e. voluntarily resumes if blocked). + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join. + * - quserex.dll and alertdrv.sys are not available. + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum +{ + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ +{ + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +void * +mythread (void *arg) +{ + int result = ((int) PTHREAD_CANCELED + 1); + bag_t *bag = (bag_t *) arg; + + assert (bag == &threadbag[bag->threadnum]); + assert (bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert (pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + + /* + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (bag->count = 0; bag->count < 100; bag->count++) + Sleep (100); + + return (void *) result; +} + +int +main () +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + assert ((t[0] = pthread_self ()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert (pthread_create (&t[i], NULL, mythread, (void *) &threadbag[i]) + == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep (500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert (pthread_cancel (t[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep (NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf (stderr, "Thread %d: started %d\n", i, + threadbag[i].started); + } + } + + assert (!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + /* + * The thread does not contain any cancelation points, so + * a return value of PTHREAD_CANCELED confirms that async + * cancelation succeeded. + */ + assert (pthread_join (t[i], (void **) &result) == 0); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf (stderr, "Thread %d: started %d: count %d\n", + i, threadbag[i].started, threadbag[i].count); + } + failed = (failed || fail); + } + + assert (!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel4.c b/win32/3rdparty/pthreads/tests/cancel4.c new file mode 100644 index 000000000..6d6d3dc7b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel4.c @@ -0,0 +1,203 @@ +/* + * File: cancel4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test cancelation does not occur in deferred + * cancelation threads with no cancelation points. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - pthread_create + * pthread_self + * pthread_cancel + * pthread_join + * pthread_setcancelstate + * pthread_setcanceltype + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +void * +mythread(void * arg) +{ + int result = ((int)PTHREAD_CANCELED + 1); + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) == 0); + + /* + * We wait up to 2 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (bag->count = 0; bag->count < 20; bag->count++) + Sleep(100); + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_cancel(t[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + /* + * The thread does not contain any cancelation points, so + * a return value of PTHREAD_CANCELED indicates that async + * cancelation occurred. + */ + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result == (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel5.c b/win32/3rdparty/pthreads/tests/cancel5.c new file mode 100644 index 000000000..dd6cb8bae --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel5.c @@ -0,0 +1,199 @@ +/* + * File: cancel5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test calling pthread_cancel from the main thread + * without calling pthread_self() in main. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum +{ + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ +{ + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +void * +mythread (void *arg) +{ + int result = ((int) PTHREAD_CANCELED + 1); + bag_t *bag = (bag_t *) arg; + + assert (bag == &threadbag[bag->threadnum]); + assert (bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert (pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + + /* + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (bag->count = 0; bag->count < 100; bag->count++) + Sleep (100); + + return (void *) result; +} + +int +main () +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert (pthread_create (&t[i], NULL, mythread, (void *) &threadbag[i]) + == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep (500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert (pthread_cancel (t[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep (NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf (stderr, "Thread %d: started %d\n", i, + threadbag[i].started); + } + } + + assert (!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + /* + * The thread does not contain any cancelation points, so + * a return value of PTHREAD_CANCELED confirms that async + * cancelation succeeded. + */ + assert (pthread_join (t[i], (void **) &result) == 0); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf (stderr, "Thread %d: started %d: count %d\n", + i, threadbag[i].started, threadbag[i].count); + } + failed = (failed || fail); + } + + assert (!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel6a.c b/win32/3rdparty/pthreads/tests/cancel6a.c new file mode 100644 index 000000000..644cd4a53 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel6a.c @@ -0,0 +1,191 @@ +/* + * File: cancel6a.c + * + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 Ben Elliston and Ross Johnson + * Copyright (C) 1999,2000,2001 Ross Johnson + * + * Contact Email: rpj@ise.canberra.edu.au + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test double cancelation - asynchronous. + * Second attempt should fail (ESRCH). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +void * +mythread(void * arg) +{ + int result = ((int)PTHREAD_CANCELED + 1); + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + + /* + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (bag->count = 0; bag->count < 100; bag->count++) + Sleep(100); + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_cancel(t[i]) == 0); + assert(pthread_cancel(t[i]) == ESRCH); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + /* + * The thread does not contain any cancelation points, so + * a return value of PTHREAD_CANCELED confirms that async + * cancelation succeeded. + */ + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel6d.c b/win32/3rdparty/pthreads/tests/cancel6d.c new file mode 100644 index 000000000..d0ad7ac2c --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel6d.c @@ -0,0 +1,190 @@ +/* + * File: cancel6d.c + * + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 Ben Elliston and Ross Johnson + * Copyright (C) 1999,2000,2001 Ross Johnson + * + * Contact Email: rpj@ise.canberra.edu.au + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test double cancelation - deferred. + * Second attempt should succeed (unless the canceled thread has started + * cancelation already - not tested here). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +void * +mythread(void * arg) +{ + int result = ((int)PTHREAD_CANCELED + 1); + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) == 0); + + /* + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (bag->count = 0; bag->count < 100; bag->count++) + { + Sleep(100); + pthread_testcancel(); + } + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_cancel(t[i]) == 0); + assert(pthread_cancel(t[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cancel7.c b/win32/3rdparty/pthreads/tests/cancel7.c new file mode 100644 index 000000000..9fb2e6166 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel7.c @@ -0,0 +1,216 @@ +/* + * File: cancel7.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test canceling a Win32 thread having created an + * implicit POSIX handle for it. + * + * Test Method (Validation or Falsification): + * - Validate return value and that POSIX handle is created and destroyed. + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#ifndef _UWIN +#include +#endif + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; + pthread_t self; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) +unsigned __stdcall +#else +void +#endif +Win32thread(void * arg) +{ + int i; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + assert((bag->self = pthread_self()).p != NULL); + assert(pthread_kill(bag->self, 0) == 0); + + for (i = 0; i < 100; i++) + { + Sleep(100); + pthread_testcancel(); + } + + return 0; +} + +int +main() +{ + int failed = 0; + int i; + HANDLE h[NUMTHREADS + 1]; + unsigned thrAddr; /* Dummy variable to pass a valid location to _beginthreadex (Win98). */ + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + h[i] = (HANDLE) _beginthreadex(NULL, 0, Win32thread, (void *) &threadbag[i], 0, &thrAddr); +#else + h[i] = (HANDLE) _beginthread(Win32thread, 0, (void *) &threadbag[i]); +#endif + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + /* + * Cancel all threads. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_kill(threadbag[i].self, 0) == 0); + assert(pthread_cancel(threadbag[i].self) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + assert(GetExitCodeThread(h[i], (LPDWORD) &result) == TRUE); +#else + /* + * Can't get a result code. + */ + result = (int) PTHREAD_CANCELED; +#endif + + assert(threadbag[i].self.p != NULL); + assert(pthread_kill(threadbag[i].self, 0) == ESRCH); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/cancel8.c b/win32/3rdparty/pthreads/tests/cancel8.c new file mode 100644 index 000000000..69eafe98e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel8.c @@ -0,0 +1,217 @@ +/* + * File: cancel8.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test cancelling a blocked Win32 thread having created an + * implicit POSIX handle for it. + * + * Test Method (Validation or Falsification): + * - Validate return value and that POSIX handle is created and destroyed. + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#ifndef _UWIN +#include +#endif + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; + pthread_t self; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +pthread_cond_t CV = PTHREAD_COND_INITIALIZER; +pthread_mutex_t CVLock = PTHREAD_MUTEX_INITIALIZER; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) +unsigned __stdcall +#else +void +#endif +Win32thread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + assert((bag->self = pthread_self()).p != NULL); + assert(pthread_kill(bag->self, 0) == 0); + + assert(pthread_mutex_lock(&CVLock) == 0); + pthread_cleanup_push(pthread_mutex_unlock, &CVLock); + pthread_cond_wait(&CV, &CVLock); + pthread_cleanup_pop(1); + + return 0; +} + +int +main() +{ + int failed = 0; + int i; + HANDLE h[NUMTHREADS + 1]; + unsigned thrAddr; /* Dummy variable to pass a valid location to _beginthreadex (Win98). */ + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + h[i] = (HANDLE) _beginthreadex(NULL, 0, Win32thread, (void *) &threadbag[i], 0, &thrAddr); +#else + h[i] = (HANDLE) _beginthread(Win32thread, 0, (void *) &threadbag[i]); +#endif + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + /* + * Cancel all threads. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_kill(threadbag[i].self, 0) == 0); + assert(pthread_cancel(threadbag[i].self) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + assert(GetExitCodeThread(h[i], (LPDWORD) &result) == TRUE); +#else + /* + * Can't get a result code. + */ + result = (int) PTHREAD_CANCELED; +#endif + + assert(threadbag[i].self.p != NULL); + assert(pthread_kill(threadbag[i].self, 0) == ESRCH); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/cancel9.c b/win32/3rdparty/pthreads/tests/cancel9.c new file mode 100644 index 000000000..b0091614a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cancel9.c @@ -0,0 +1,202 @@ +/* + * File: cancel9.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test true asynchronous cancelation with Alert driver. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - Cancel threads, including those blocked on system recources + * such as network I/O. + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + + +void * +test_udp (void *arg) +{ + struct sockaddr_in serverAddress; + struct sockaddr_in clientAddress; + SOCKET UDPSocket; + int addr_len; + int nbyte, bytes; + char buffer[4096]; + WORD wsaVersion = MAKEWORD (2, 2); + WSADATA wsaData; + + pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); + pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + + if (WSAStartup (wsaVersion, &wsaData) != 0) + { + return NULL; + } + + UDPSocket = socket (AF_INET, SOCK_DGRAM, 0); + if ((int)UDPSocket == -1) + { + printf ("Server: socket ERROR \n"); + exit (-1); + } + + serverAddress.sin_family = AF_INET; + serverAddress.sin_addr.s_addr = INADDR_ANY; + serverAddress.sin_port = htons (9003); + + if (bind + (UDPSocket, (struct sockaddr *) &serverAddress, + sizeof (struct sockaddr_in))) + { + printf ("Server: ERROR can't bind UDPSocket"); + exit (-1); + } + + addr_len = sizeof (struct sockaddr); + + nbyte = 512; + + bytes = + recvfrom (UDPSocket, (char *) buffer, nbyte, 0, + (struct sockaddr *) &clientAddress, &addr_len); + + closesocket (UDPSocket); + WSACleanup (); + + return NULL; +} + + +void * +test_sleep (void *arg) +{ + pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); + pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + + Sleep (1000); + return NULL; + +} + +void * +test_wait (void *arg) +{ + HANDLE hEvent; + DWORD dwEvent; + + pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); + pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + + hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); + + dwEvent = WaitForSingleObject (hEvent, 1000); /* WAIT_IO_COMPLETION */ + + return NULL; +} + + +int +main () +{ + pthread_t t; + void *result; + + if (pthread_win32_test_features_np (PTW32_ALERTABLE_ASYNC_CANCEL)) + { + printf ("Cancel sleeping thread.\n"); + assert (pthread_create (&t, NULL, test_sleep, NULL) == 0); + /* Sleep for a while; then cancel */ + Sleep (100); + assert (pthread_cancel (t) == 0); + assert (pthread_join (t, &result) == 0); + assert (result == PTHREAD_CANCELED && "test_sleep" != NULL); + + printf ("Cancel waiting thread.\n"); + assert (pthread_create (&t, NULL, test_wait, NULL) == 0); + /* Sleep for a while; then cancel. */ + Sleep (100); + assert (pthread_cancel (t) == 0); + assert (pthread_join (t, &result) == 0); + assert (result == PTHREAD_CANCELED && "test_wait"); + + printf ("Cancel blocked thread (blocked on network I/O).\n"); + assert (pthread_create (&t, NULL, test_udp, NULL) == 0); + /* Sleep for a while; then cancel. */ + Sleep (100); + assert (pthread_cancel (t) == 0); + assert (pthread_join (t, &result) == 0); + assert (result == PTHREAD_CANCELED && "test_udp" != NULL); + } + else + { + printf ("Alertable async cancel not available.\n"); + } + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/cleanup0.c b/win32/3rdparty/pthreads/tests/cleanup0.c new file mode 100644 index 000000000..77626eb66 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cleanup0.c @@ -0,0 +1,229 @@ +/* + * File: cleanup1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test cleanup handler executes (when thread is not canceled). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 10 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t pop_count = {0, {0}}; + +static void +increment_pop_count(void * arg) +{ + sharedInt_t * sI = (sharedInt_t *) arg; + + EnterCriticalSection(&sI->cs); + sI->i++; + LeaveCriticalSection(&sI->cs); +} + +void * +mythread(void * arg) +{ + int result = 0; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(increment_pop_count, (void *) &pop_count); + + Sleep(100); + + pthread_cleanup_pop(1); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + InitializeCriticalSection(&pop_count.cs); + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result == (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: result %d\n", + i, + threadbag[i].started, + result); + fflush(stderr); + } + failed = (failed || fail); + } + + assert(!failed); + + assert(pop_count.i == NUMTHREADS); + + DeleteCriticalSection(&pop_count.cs); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +int +main() +{ + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/cleanup1.c b/win32/3rdparty/pthreads/tests/cleanup1.c new file mode 100644 index 000000000..385aed959 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cleanup1.c @@ -0,0 +1,242 @@ +/* + * File: cleanup1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test cleanup handler executes (when thread is canceled). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 10 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t pop_count = {0, {0}}; + +static void +#ifdef __CLEANUP_C +__cdecl +#endif +increment_pop_count(void * arg) +{ + sharedInt_t * sI = (sharedInt_t *) arg; + + EnterCriticalSection(&sI->cs); + sI->i++; + LeaveCriticalSection(&sI->cs); +} + +void * +mythread(void * arg) +{ + int result = 0; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Set to known state and type */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(increment_pop_count, (void *) &pop_count); + /* + * We don't have true async cancelation - it relies on the thread + * at least re-entering the run state at some point. + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (bag->count = 0; bag->count < 100; bag->count++) + Sleep(100); + + pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + InitializeCriticalSection(&pop_count.cs); + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_cancel(t[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result != (int) PTHREAD_CANCELED); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: result %d\n", + i, + threadbag[i].started, + result); + } + failed = (failed || fail); + } + + assert(!failed); + + assert(pop_count.i == NUMTHREADS); + + DeleteCriticalSection(&pop_count.cs); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +int +main() +{ + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/cleanup2.c b/win32/3rdparty/pthreads/tests/cleanup2.c new file mode 100644 index 000000000..4c639181b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cleanup2.c @@ -0,0 +1,217 @@ +/* + * File: cleanup2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test cleanup handler executes (when thread is not canceled). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 10 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t pop_count = {0, {0}}; + +static void +increment_pop_count(void * arg) +{ + sharedInt_t * sI = (sharedInt_t *) arg; + + EnterCriticalSection(&sI->cs); + sI->i++; + LeaveCriticalSection(&sI->cs); +} + +void * +mythread(void * arg) +{ + int result = 0; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(increment_pop_count, (void *) &pop_count); + + sched_yield(); + + pthread_cleanup_pop(1); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + InitializeCriticalSection(&pop_count.cs); + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(1000); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result != 0); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: result: %d\n", + i, + threadbag[i].started, + result); + } + failed = (failed || fail); + } + + assert(!failed); + + assert(pop_count.i == NUMTHREADS); + + DeleteCriticalSection(&pop_count.cs); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +int +main() +{ + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/cleanup3.c b/win32/3rdparty/pthreads/tests/cleanup3.c new file mode 100644 index 000000000..b595ab43c --- /dev/null +++ b/win32/3rdparty/pthreads/tests/cleanup3.c @@ -0,0 +1,222 @@ +/* + * File: cleanup3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test cleanup handler does not execute (when thread is + * not canceled). + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 10 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t pop_count = {0, {0}}; + +static void +increment_pop_count(void * arg) +{ + sharedInt_t * sI = (sharedInt_t *) arg; + + EnterCriticalSection(&sI->cs); + sI->i++; + LeaveCriticalSection(&sI->cs); +} + +void * +mythread(void * arg) +{ + int result = 0; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(increment_pop_count, (void *) &pop_count); + + sched_yield(); + + EnterCriticalSection(&pop_count.cs); + pop_count.i--; + LeaveCriticalSection(&pop_count.cs); + + pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + InitializeCriticalSection(&pop_count.cs); + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(1000); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + assert(pthread_join(t[i], (void **) &result) == 0); + + fail = (result != 0); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: result: %d\n", + i, + threadbag[i].started, + result); + } + failed = (failed || fail); + } + + assert(!failed); + + assert(pop_count.i == -(NUMTHREADS)); + + DeleteCriticalSection(&pop_count.cs); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +int +main() +{ + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/condvar1.c b/win32/3rdparty/pthreads/tests/condvar1.c new file mode 100644 index 000000000..380ab1aff --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar1.c @@ -0,0 +1,97 @@ +/* + * File: condvar1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test initialisation and destruction of a CV. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Creates and then imediately destroys a CV. Does not + * test the CV. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_init returns 0, and + * - pthread_cond_destroy returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_init returns non-zero, or + * - pthread_cond_destroy returns non-zero. + * - Process returns non-zero exit status. + */ + +#include "test.h" + +static pthread_cond_t cv = NULL; + +int +main() +{ + assert(cv == NULL); + + assert(pthread_cond_init(&cv, NULL) == 0); + + assert(cv != NULL); + + assert(pthread_cond_destroy(&cv) == 0); + + assert(cv == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar1_1.c b/win32/3rdparty/pthreads/tests/condvar1_1.c new file mode 100644 index 000000000..a05e113b9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar1_1.c @@ -0,0 +1,115 @@ +/* + * File: condvar1_1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test CV linked list management. + * + * Test Method (Validation or Falsification): + * - Validation: + * Initiate and destroy several CVs in random order. + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Creates and then imediately destroys a CV. Does not + * test the CV. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - All initialised CVs destroyed without segfault. + * - Successfully broadcasts all remaining CVs after + * each CV is removed. + * + * Fail Criteria: + */ + +#include +#include "test.h" + +enum { + NUM_CV = 100 +}; + +static pthread_cond_t cv[NUM_CV]; + +int +main() +{ + int i, j; + + for (i = 0; i < NUM_CV; i++) + { + /* Traverse the list before every init of a CV. */ + assert(pthread_timechange_handler_np(NULL) == (void *) 0); + assert(pthread_cond_init(&cv[i], NULL) == 0); + } + + j = NUM_CV; + (void) srand((unsigned)time(NULL)); + + do + { + i = (NUM_CV - 1) * rand() / RAND_MAX; + if (cv[i] != NULL) + { + j--; + assert(pthread_cond_destroy(&cv[i]) == 0); + /* Traverse the list every time we remove a CV. */ + assert(pthread_timechange_handler_np(NULL) == (void *) 0); + } + } + while (j > 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar1_2.c b/win32/3rdparty/pthreads/tests/condvar1_2.c new file mode 100644 index 000000000..503e821b6 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar1_2.c @@ -0,0 +1,124 @@ +/* + * File: condvar1_2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test CV linked list management and serialisation. + * + * Test Method (Validation or Falsification): + * - Validation: + * Initiate and destroy several CVs in random order. + * Asynchronously traverse the CV list and broadcast. + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Creates and then imediately destroys a CV. Does not + * test the CV. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - All initialised CVs destroyed without segfault. + * - Successfully broadcasts all remaining CVs after + * each CV is removed. + * + * Fail Criteria: + */ + +#include +#include "test.h" + +enum { + NUM_CV = 5, + NUM_LOOPS = 5 +}; + +static pthread_cond_t cv[NUM_CV]; + +int +main() +{ + int i, j, k; + int result = -1; + pthread_t t; + + for (k = 0; k < NUM_LOOPS; k++) + { + for (i = 0; i < NUM_CV; i++) + { + assert(pthread_cond_init(&cv[i], NULL) == 0); + } + + j = NUM_CV; + (void) srand((unsigned)time(NULL)); + + /* Traverse the list asynchronously. */ + assert(pthread_create(&t, NULL, pthread_timechange_handler_np, NULL) == 0); + + do + { + i = (NUM_CV - 1) * rand() / RAND_MAX; + if (cv[i] != NULL) + { + j--; + assert(pthread_cond_destroy(&cv[i]) == 0); + } + } + while (j > 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert (result == 0); + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar2.c b/win32/3rdparty/pthreads/tests/condvar2.c new file mode 100644 index 000000000..33f1d3f1d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar2.c @@ -0,0 +1,125 @@ +/* + * File: condvar2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timed wait on a CV. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Because the CV is never signaled, we expect the wait to time out. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include + +pthread_cond_t cv; +pthread_mutex_t mutex; + +#include "../implement.h" + +int +main() +{ + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert(pthread_cond_init(&cv, NULL) == 0); + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == ETIMEDOUT); + + assert(pthread_mutex_unlock(&mutex) == 0); + + { + int result = pthread_cond_destroy(&cv); + if (result != 0) + { + fprintf(stderr, "Result = %s\n", error_string[result]); + fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked); + fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone); + fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock); + fflush(stderr); + } + assert(result == 0); + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar2_1.c b/win32/3rdparty/pthreads/tests/condvar2_1.c new file mode 100644 index 000000000..92dddfd9a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar2_1.c @@ -0,0 +1,153 @@ +/* + * File: condvar2_1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeout of multiple waits on a CV with no signal/broadcast. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Because the CV is never signaled, we expect the waits to time out. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include + +static pthread_cond_t cv; +static pthread_mutex_t mutex; +static struct timespec abstime = { 0, 0 }; + +enum { + NUMTHREADS = 30 +}; + +void * +mythread(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == ETIMEDOUT); + + assert(pthread_mutex_unlock(&mutex) == 0); + + return arg; +} + +#include "../implement.h" + +int +main() +{ + int i; + pthread_t t[NUMTHREADS + 1]; + int result = 0; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert(pthread_cond_init(&cv, NULL) == 0); + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + assert(pthread_mutex_lock(&mutex) == 0); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0); + } + + assert(pthread_mutex_unlock(&mutex) == 0); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_join(t[i], (void **) &result) == 0); + assert(result == i); + } + + { + int result = pthread_cond_destroy(&cv); + if (result != 0) + { + fprintf(stderr, "Result = %s\n", error_string[result]); + fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked); + fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone); + fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock); + fflush(stderr); + } + assert(result == 0); + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar3.c b/win32/3rdparty/pthreads/tests/condvar3.c new file mode 100644 index 000000000..e3a23f54f --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar3.c @@ -0,0 +1,148 @@ +/* + * File: condvar3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test basic function of a CV + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - The primary thread takes the lock before creating any threads. + * The secondary thread blocks on the lock allowing the primary + * thread to enter the cv wait state which releases the lock. + * The secondary thread then takes the lock and signals the waiting + * primary thread. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +static pthread_cond_t cv; +static pthread_mutex_t mutex; +static int shared = 0; + +enum { + NUMTHREADS = 2 /* Including the primary thread. */ +}; + +void * +mythread(void * arg) +{ + int result = 0; + + assert(pthread_mutex_lock(&mutex) == 0); + shared++; + assert(pthread_mutex_unlock(&mutex) == 0); + + if ((result = pthread_cond_signal(&cv)) != 0) + { + printf("Error = %s\n", error_string[result]); + } + assert(result == 0); + + + return (void *) 0; +} + +int +main() +{ + pthread_t t[NUMTHREADS]; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert((t[0] = pthread_self()).p != NULL); + + assert(pthread_cond_init(&cv, NULL) == 0); + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0); + + abstime.tv_sec += 5; + + while (! (shared > 0)) + assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == 0); + + assert(shared > 0); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_join(t[1], NULL) == 0); + + assert(pthread_cond_destroy(&cv) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar3_1.c b/win32/3rdparty/pthreads/tests/condvar3_1.c new file mode 100644 index 000000000..25a50e4bb --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar3_1.c @@ -0,0 +1,201 @@ +/* + * File: condvar3_1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeout of multiple waits on a CV with some signaled. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Because some CVs are never signaled, we expect their waits to time out. + * Some are signaled, the rest time out. Pthread_cond_destroy() will fail + * unless all are accounted for, either signaled or timedout. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include + +static pthread_cond_t cv; +static pthread_cond_t cv1; +static pthread_mutex_t mutex; +static pthread_mutex_t mutex1; +static struct timespec abstime = { 0, 0 }; +static int timedout = 0; +static int signaled = 0; +static int awoken = 0; +static int waiting = 0; + +enum { + NUMTHREADS = 30 +}; + +void * +mythread(void * arg) +{ + int result; + + assert(pthread_mutex_lock(&mutex1) == 0); + ++waiting; + assert(pthread_mutex_unlock(&mutex1) == 0); + assert(pthread_cond_signal(&cv1) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + result = pthread_cond_timedwait(&cv, &mutex, &abstime); + if (result == ETIMEDOUT) + { + timedout++; + } + else + { + awoken++; + } + assert(pthread_mutex_unlock(&mutex) == 0); + + return arg; +} + +#include "../implement.h" + +int +main() +{ + int i; + pthread_t t[NUMTHREADS + 1]; + int result = 0; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert(pthread_cond_init(&cv, NULL) == 0); + assert(pthread_cond_init(&cv1, NULL) == 0); + + assert(pthread_mutex_init(&mutex, NULL) == 0); + assert(pthread_mutex_init(&mutex1, NULL) == 0); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + assert(pthread_mutex_lock(&mutex1) == 0); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0); + } + + do { + assert(pthread_cond_wait(&cv1,&mutex1) == 0); + } while ( NUMTHREADS > waiting ); + + assert(pthread_mutex_unlock(&mutex1) == 0); + + for (i = NUMTHREADS/3; i <= 2*NUMTHREADS/3; i++) + { +// assert(pthread_mutex_lock(&mutex) == 0); + assert(pthread_cond_signal(&cv) == 0); +// assert(pthread_mutex_unlock(&mutex) == 0); + + signaled++; + } + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_join(t[i], (void **) &result) == 0); + assert(result == i); + } + + fprintf(stderr, "awk = %d\n", awoken); + fprintf(stderr, "sig = %d\n", signaled); + fprintf(stderr, "tot = %d\n", timedout); + + assert(signaled == awoken); + assert(timedout == NUMTHREADS - signaled); + + assert(pthread_cond_destroy(&cv1) == 0); + + { + int result = pthread_cond_destroy(&cv); + if (result != 0) + { + fprintf(stderr, "Result = %s\n", error_string[result]); + fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked); + fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone); + fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock); + fflush(stderr); + } + assert(result == 0); + } + + assert(pthread_mutex_destroy(&mutex1) == 0); + assert(pthread_mutex_destroy(&mutex) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar3_2.c b/win32/3rdparty/pthreads/tests/condvar3_2.c new file mode 100644 index 000000000..5ddcf5748 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar3_2.c @@ -0,0 +1,193 @@ +/* + * File: condvar3_2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeout of multiple waits on a CV with remainder broadcast awoken. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Because some CVs are never signaled, we expect their waits to time out. + * Some time out, the rest are broadcast signaled. Pthread_cond_destroy() will fail + * unless all are accounted for, either signaled or timedout. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include + +static pthread_cond_t cv; +static pthread_mutex_t mutex; +static struct timespec abstime = { 0, 0 }; +static struct timespec abstime2 = { 0, 0 }; +static int timedout = 0; +static int awoken = 0; + +enum { + NUMTHREADS = 30 +}; + +void * +mythread(void * arg) +{ + int result; + + assert(pthread_mutex_lock(&mutex) == 0); + + abstime2.tv_sec = abstime.tv_sec; + + if ((int) arg % 3 == 0) + { + abstime2.tv_sec += 2; + } + + result = pthread_cond_timedwait(&cv, &mutex, &abstime2); + assert(pthread_mutex_unlock(&mutex) == 0); + if (result == ETIMEDOUT) + { + InterlockedIncrement((LPLONG)&timedout); + } + else + { + InterlockedIncrement((LPLONG)&awoken); + } + + + return arg; +} + +#include "../implement.h" + +int +main() +{ + int i; + pthread_t t[NUMTHREADS + 1]; + int result = 0; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert(pthread_cond_init(&cv, NULL) == 0); + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = abstime.tv_sec = currSysTime.time + 5; + abstime.tv_nsec = abstime2.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + assert(pthread_mutex_lock(&mutex) == 0); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0); + } + + assert(pthread_mutex_unlock(&mutex) == 0); + + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_join(t[i], (void **) &result) == 0); + assert(result == i); + /* + * Approximately 2/3rds of the threads are expected to time out. + * Signal the remainder after some threads have woken up and exited + * and while some are still waking up after timeout. + * Also tests that redundant broadcasts don't return errors. + */ + +// assert(pthread_mutex_lock(&mutex) == 0); + + if (InterlockedExchangeAdd((LPLONG)&awoken, 0L) > NUMTHREADS/3) + { + assert(pthread_cond_broadcast(&cv) == 0); + } + +// assert(pthread_mutex_unlock(&mutex) == 0); + + } + + assert(awoken == NUMTHREADS - timedout); + + { + int result = pthread_cond_destroy(&cv); + if (result != 0) + { + fprintf(stderr, "Result = %s\n", error_string[result]); + fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked); + fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone); + fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock); + fflush(stderr); + } + assert(result == 0); + } + + assert(pthread_mutex_destroy(&mutex) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar3_3.c b/win32/3rdparty/pthreads/tests/condvar3_3.c new file mode 100644 index 000000000..fe6763249 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar3_3.c @@ -0,0 +1,132 @@ +/* + * File: condvar3_3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeouts and lost signals on a CV. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +/* Timur Aydin (taydin@snet.net) */ + +#include "test.h" + +#include + +pthread_cond_t cnd; +pthread_mutex_t mtx; + +int main() +{ + int rc; + + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert(pthread_cond_init(&cnd, 0) == 0); + assert(pthread_mutex_init(&mtx, 0) == 0); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + abstime.tv_sec += 1; + + /* Here pthread_cond_timedwait should time out after one second. */ + + assert(pthread_mutex_lock(&mtx) == 0); + + assert((rc = pthread_cond_timedwait(&cnd, &mtx, &abstime)) == ETIMEDOUT); + + assert(pthread_mutex_unlock(&mtx) == 0); + + /* Here, the condition variable is signaled, but there are no + threads waiting on it. The signal should be lost and + the next pthread_cond_timedwait should time out too. */ + +// assert(pthread_mutex_lock(&mtx) == 0); + + assert((rc = pthread_cond_signal(&cnd)) == 0); + +// assert(pthread_mutex_unlock(&mtx) == 0); + + assert(pthread_mutex_lock(&mtx) == 0); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + abstime.tv_sec += 1; + + assert((rc = pthread_cond_timedwait(&cnd, &mtx, &abstime)) == ETIMEDOUT); + + assert(pthread_mutex_unlock(&mtx) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar4.c b/win32/3rdparty/pthreads/tests/condvar4.c new file mode 100644 index 000000000..3babeeac5 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar4.c @@ -0,0 +1,169 @@ +/* + * File: condvar4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test PTHREAD_COND_INITIALIZER. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Test basic CV function but starting with a static initialised + * CV. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { + pthread_cond_t notbusy; + pthread_mutex_t lock; + int shared; +}; + +static cvthing_t cvthing = { + PTHREAD_COND_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, + 0 +}; + +enum { + NUMTHREADS = 2 +}; + +void * +mythread(void * arg) +{ + assert(pthread_mutex_lock(&cvthing.lock) == 0); + cvthing.shared++; + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_cond_signal(&cvthing.notbusy) == 0); + + return (void *) 0; +} + +int +main() +{ + pthread_t t[NUMTHREADS]; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + cvthing.shared = 0; + + assert((t[0] = pthread_self()).p != NULL); + + assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + + assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + + assert(cvthing.lock != PTHREAD_MUTEX_INITIALIZER); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT); + + assert(cvthing.notbusy != PTHREAD_COND_INITIALIZER); + + assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0); + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + while (! (cvthing.shared > 0)) + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + + assert(cvthing.shared > 0); + + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_join(t[1], NULL) == 0); + + assert(pthread_mutex_destroy(&cvthing.lock) == 0); + + assert(cvthing.lock == NULL); + + assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + + assert(cvthing.notbusy == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar5.c b/win32/3rdparty/pthreads/tests/condvar5.c new file mode 100644 index 000000000..4d51f396a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar5.c @@ -0,0 +1,168 @@ +/* + * File: condvar5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test pthread_cond_broadcast. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Test broadcast with one waiting CV. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - pthread_cond_timedwait returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { + pthread_cond_t notbusy; + pthread_mutex_t lock; + int shared; +}; + +static cvthing_t cvthing = { + PTHREAD_COND_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, + 0 +}; + +enum { + NUMTHREADS = 2 +}; + +void * +mythread(void * arg) +{ + assert(pthread_mutex_lock(&cvthing.lock) == 0); + cvthing.shared++; + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + + return (void *) 0; +} + +int +main() +{ + pthread_t t[NUMTHREADS]; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + cvthing.shared = 0; + + assert((t[0] = pthread_self()).p != NULL); + + assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + + assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + + assert(cvthing.lock != PTHREAD_MUTEX_INITIALIZER); + + /* get current system time */ + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT); + + assert(cvthing.notbusy != PTHREAD_COND_INITIALIZER); + + assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0); + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + while (! (cvthing.shared > 0)) + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + + assert(cvthing.shared > 0); + + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_join(t[1], NULL) == 0); + + assert(pthread_mutex_destroy(&cvthing.lock) == 0); + + assert(cvthing.lock == NULL); + + assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + + assert(cvthing.notbusy == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar6.c b/win32/3rdparty/pthreads/tests/condvar6.c new file mode 100644 index 000000000..e63132c5d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar6.c @@ -0,0 +1,242 @@ +/* + * File: condvar6.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test pthread_cond_broadcast. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Test broadcast with NUMTHREADS (=5) waiting CVs. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 5 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { + pthread_cond_t notbusy; + pthread_mutex_t lock; + int shared; +}; + +static cvthing_t cvthing = { + PTHREAD_COND_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, + 0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Wait for the start gun */ + assert(pthread_mutex_lock(&start_flag) == 0); + assert(pthread_mutex_unlock(&start_flag) == 0); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + + while (! (cvthing.shared > 0)) + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + + assert(cvthing.shared > 0); + + awoken++; + + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + return (void *) 0; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + cvthing.shared = 0; + + assert((t[0] = pthread_self()).p != NULL); + + assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + + assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&start_flag) == 0); + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + assert((t[0] = pthread_self()).p != NULL); + + awoken = 0; + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + + assert(pthread_mutex_unlock(&start_flag) == 0); + + /* + * Give threads time to start. + */ + Sleep(1000); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + cvthing.shared++; + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + + /* + * Give threads time to complete. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + assert(pthread_join(t[i], NULL) == 0); + } + + /* + * Cleanup the CV. + */ + + assert(pthread_mutex_destroy(&cvthing.lock) == 0); + + assert(cvthing.lock == NULL); + + assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + + assert(cvthing.notbusy == NULL); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + failed = !threadbag[i].started; + + if (failed) + { + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. + */ + + assert(awoken == NUMTHREADS); + + /* + * Success. + */ + return 0; +} + + diff --git a/win32/3rdparty/pthreads/tests/condvar7.c b/win32/3rdparty/pthreads/tests/condvar7.c new file mode 100644 index 000000000..6d89f2ea9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar7.c @@ -0,0 +1,257 @@ +/* + * File: condvar7.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test pthread_cond_broadcast with thread cancelation. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Test broadcast with NUMTHREADS (=5) waiting CVs, one is canceled while waiting. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 5 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { + pthread_cond_t notbusy; + pthread_mutex_t lock; + int shared; +}; + +static cvthing_t cvthing = { + PTHREAD_COND_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, + 0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Wait for the start gun */ + assert(pthread_mutex_lock(&start_flag) == 0); + assert(pthread_mutex_unlock(&start_flag) == 0); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock); + + while (! (cvthing.shared > 0)) + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + + pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + assert(cvthing.shared > 0); + + awoken++; + + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + return (void *) 0; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + cvthing.shared = 0; + + assert((t[0] = pthread_self()).p != NULL); + + assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + + assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&start_flag) == 0); + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 10; + + assert((t[0] = pthread_self()).p != NULL); + + awoken = 0; + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + + assert(pthread_mutex_unlock(&start_flag) == 0); + + /* + * Give threads time to start. + */ + Sleep(1000); + + /* + * Cancel one of the threads. + */ + assert(pthread_cancel(t[1]) == 0); + assert(pthread_join(t[1], NULL) == 0); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + cvthing.shared++; + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + /* + * Signal all remaining waiting threads. + */ + assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + + /* + * Wait for all threads to complete. + */ + for (i = 2; i <= NUMTHREADS; i++) + assert(pthread_join(t[i], NULL) == 0); + + /* + * Cleanup the CV. + */ + + assert(pthread_mutex_destroy(&cvthing.lock) == 0); + + assert(cvthing.lock == NULL); + + assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + + assert(cvthing.notbusy == NULL); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + failed = !threadbag[i].started; + + if (failed) + { + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. + */ + + assert(awoken == (NUMTHREADS - 1)); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar8.c b/win32/3rdparty/pthreads/tests/condvar8.c new file mode 100644 index 000000000..e384a1c9c --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar8.c @@ -0,0 +1,258 @@ +/* + * File: condvar8.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test multiple pthread_cond_broadcasts. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Make NUMTHREADS threads wait on CV, broadcast signal them, and then repeat. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 5 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { + pthread_cond_t notbusy; + pthread_mutex_t lock; + int shared; +}; + +static cvthing_t cvthing = { + PTHREAD_COND_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, + 0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +static void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Wait for the start gun */ + assert(pthread_mutex_lock(&start_flag) == 0); + assert(pthread_mutex_unlock(&start_flag) == 0); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock); + + while (! (cvthing.shared > 0)) + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + + pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + assert(cvthing.shared > 0); + + awoken++; + + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + return (void *) 0; +} + +int +main() +{ + int failed = 0; + int i; + int first, last; + pthread_t t[NUMTHREADS + 1]; + + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert((t[0] = pthread_self()).p != NULL); + + assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + + assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 10; + + assert((t[0] = pthread_self()).p != NULL); + + awoken = 0; + + for (first = 1, last = NUMTHREADS / 2; + first < NUMTHREADS; + first = last + 1, last = NUMTHREADS) + { + assert(pthread_mutex_lock(&start_flag) == 0); + + for (i = first; i <= last; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + cvthing.shared = 0; + + assert(pthread_mutex_unlock(&start_flag) == 0); + + /* + * Give threads time to start. + */ + Sleep(100); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + cvthing.shared++; + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + + /* + * Give threads time to complete. + */ + for (i = first; i <= last; i++) + { + assert(pthread_join(t[i], NULL) == 0); + } + + assert(awoken == (i - 1)); + } + + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + failed = !threadbag[i].started; + + if (failed) + { + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + /* + * Cleanup the CV. + */ + + assert(pthread_mutex_destroy(&cvthing.lock) == 0); + + assert(cvthing.lock == NULL); + + assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + + assert(cvthing.notbusy == NULL); + + assert(!failed); + + /* + * Check any results here. + */ + + assert(awoken == NUMTHREADS); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/condvar9.c b/win32/3rdparty/pthreads/tests/condvar9.c new file mode 100644 index 000000000..c75127108 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/condvar9.c @@ -0,0 +1,267 @@ +/* + * File: condvar9.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test multiple pthread_cond_broadcasts with thread cancelation. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - Make NUMTHREADS threads wait on CV, cancel one, broadcast signal them, + * and then repeat. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 9 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + int finished; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { + pthread_cond_t notbusy; + pthread_mutex_t lock; + int shared; +}; + +static cvthing_t cvthing = { + PTHREAD_COND_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, + 0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +static void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* Wait for the start gun */ + assert(pthread_mutex_lock(&start_flag) == 0); + assert(pthread_mutex_unlock(&start_flag) == 0); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + + /* + * pthread_cond_timedwait is a cancelation point and we're + * going to cancel some threads deliberately. + */ +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock); + + while (! (cvthing.shared > 0)) + assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + + pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + assert(cvthing.shared > 0); + + awoken++; + bag->finished = 1; + + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + return (void *) 0; +} + +int +main() +{ + int failed = 0; + int i; + int first, last; + int canceledThreads = 0; + pthread_t t[NUMTHREADS + 1]; + + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + assert((t[0] = pthread_self()).p != NULL); + + assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + + assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 5; + + assert((t[0] = pthread_self()).p != NULL); + + awoken = 0; + + for (first = 1, last = NUMTHREADS / 2; + first < NUMTHREADS; + first = last + 1, last = NUMTHREADS) + { + int ct; + + assert(pthread_mutex_lock(&start_flag) == 0); + + for (i = first; i <= last; i++) + { + threadbag[i].started = threadbag[i].finished = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + cvthing.shared = 0; + + assert(pthread_mutex_unlock(&start_flag) == 0); + + /* + * Give threads time to start. + */ + Sleep(1000); + + ct = (first + last) / 2; + assert(pthread_cancel(t[ct]) == 0); + canceledThreads++; + assert(pthread_join(t[ct], NULL) == 0); + + assert(pthread_mutex_lock(&cvthing.lock) == 0); + cvthing.shared++; + assert(pthread_mutex_unlock(&cvthing.lock) == 0); + + assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + + /* + * Standard check that all threads started - and wait for them to finish. + */ + for (i = first; i <= last; i++) + { + failed = !threadbag[i].started; + + if (failed) + { + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + else + { + assert(pthread_join(t[i], NULL) == 0 || threadbag[i].finished == 0); +// fprintf(stderr, "Thread %d: finished %d\n", i, threadbag[i].finished); + } + } + } + + /* + * Cleanup the CV. + */ + + assert(pthread_mutex_destroy(&cvthing.lock) == 0); + + assert(cvthing.lock == NULL); + + assert_e(pthread_cond_destroy(&cvthing.notbusy), ==, 0); + + assert(cvthing.notbusy == NULL); + + assert(!failed); + + /* + * Check any results here. + */ + + assert(awoken == NUMTHREADS - canceledThreads); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/context1.c b/win32/3rdparty/pthreads/tests/context1.c new file mode 100644 index 000000000..090df9c9d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/context1.c @@ -0,0 +1,144 @@ +/* + * File: context1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test context switching method. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - pthread_create + * pthread_exit + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include "../implement.h" + +static int washere = 0; + +static void * func(void * arg) +{ + washere = 1; + + Sleep(1000); + + return 0; +} + +static void +anotherEnding () +{ + /* + * Switched context + */ + washere++; + + pthread_exit(0); +} + +int +main() +{ + pthread_t t; + HANDLE hThread; + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + hThread = ((ptw32_thread_t *)t.p)->threadH; + + Sleep(500); + + SuspendThread(hThread); + + if (WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT) + { + /* + * Ok, thread did not exit before we got to it. + */ + CONTEXT context; + + context.ContextFlags = CONTEXT_CONTROL; + + GetThreadContext(hThread, &context); + /* + *_x86 only!!! + */ + context.Eip = (DWORD) anotherEnding; + SetThreadContext(hThread, &context); + ResumeThread(hThread); + } + else + { + printf("Exited early\n"); + fflush(stdout); + } + + Sleep(1000); + + assert(washere == 2); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/count1.c b/win32/3rdparty/pthreads/tests/count1.c new file mode 100644 index 000000000..c2386b0e9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/count1.c @@ -0,0 +1,90 @@ +/* + * count1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Description: + * Test some basic assertions about the number of threads at runtime. + */ + +#include "test.h" + +#define NUMTHREADS (30) + +static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_t threads[NUMTHREADS]; +static unsigned numThreads = 0; + +void * +myfunc(void *arg) +{ + pthread_mutex_lock(&lock); + numThreads++; + pthread_mutex_unlock(&lock); + + Sleep(1000); + return 0; +} +int +main() +{ + int i; + int maxThreads = sizeof(threads) / sizeof(pthread_t); + + /* + * Spawn NUMTHREADS threads. Each thread should increment the + * numThreads variable, sleep for one second. + */ + for (i = 0; i < maxThreads; i++) + { + assert(pthread_create(&threads[i], NULL, myfunc, 0) == 0); + } + + /* + * Wait for all the threads to exit. + */ + for (i = 0; i < maxThreads; i++) + { + assert(pthread_join(threads[i], NULL) == 0); + } + + /* + * Check the number of threads created. + */ + assert((int) numThreads == maxThreads); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/create1.c b/win32/3rdparty/pthreads/tests/create1.c new file mode 100644 index 000000000..8c630cb93 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/create1.c @@ -0,0 +1,66 @@ +/* + * create1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Description: + * Create a thread and check that it ran. + * + * Depends on API functions: None. + */ + +#include "test.h" + +static int washere = 0; + +void * func(void * arg) +{ + washere = 1; + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + /* A dirty hack, but we cannot rely on pthread_join in this + primitive test. */ + Sleep(2000); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/create2.c b/win32/3rdparty/pthreads/tests/create2.c new file mode 100644 index 000000000..2ffb64e08 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/create2.c @@ -0,0 +1,108 @@ +/* + * File: create2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test that threads have a Win32 handle when started. + * + * Test Method (Validation or Falsification): + * - Statistical, not absolute (depends on sample size). + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +enum { + NUMTHREADS = 10000 +}; + +static int washere = 0; + +void * func(void * arg) +{ + washere = 1; + return (void *) 0; +} + +int +main() +{ + pthread_t t; + pthread_attr_t attr; + void * result = NULL; + int i; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + + for (i = 0; i < NUMTHREADS; i++) + { + washere = 0; + assert(pthread_create(&t, &attr, func, NULL) == 0); + pthread_join(t, &result); + assert(washere == 1); + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/create3.c b/win32/3rdparty/pthreads/tests/create3.c new file mode 100644 index 000000000..98bd5200e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/create3.c @@ -0,0 +1,122 @@ +/* + * File: create3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2003 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test passing NULL as thread id arg to pthread_create. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + + +#ifdef __GNUC__ +#include +#endif + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 1 +}; + + +void * +threadFunc(void * arg) +{ + return (void *) 0; +} + +int +main(int argc, char * argv[]) +{ + int i; + pthread_t mt; + + if (argc <= 1) + { + int result; + + printf("You should see an application memory write error message\n"); + fflush(stdout); + result = system("create3.exe die"); + exit(0); + } + + assert((mt = pthread_self()).p != NULL); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(NULL, NULL, threadFunc, NULL) == 0); + } + + /* + * Success. + */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/delay1.c b/win32/3rdparty/pthreads/tests/delay1.c new file mode 100644 index 000000000..83becd890 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/delay1.c @@ -0,0 +1,51 @@ +/* + * delay1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: + * pthread_delay_np + */ + +#include "test.h" + +int +main(int argc, char * argv[]) +{ + struct timespec interval = {1L, 500000000L}; + + assert(pthread_delay_np(&interval) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/delay2.c b/win32/3rdparty/pthreads/tests/delay2.c new file mode 100644 index 000000000..8ecaf0b94 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/delay2.c @@ -0,0 +1,82 @@ +/* + * delay1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: + * pthread_delay_np + */ + +#include "test.h" + +pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER; + +void * +func(void * arg) +{ + struct timespec interval = {5, 500000000L}; + + assert(pthread_mutex_lock(&mx) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif + pthread_cleanup_push(pthread_mutex_unlock, &mx); + assert(pthread_delay_np(&interval) == 0); + pthread_cleanup_pop(1); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + + return (void *) 1; +} + +int +main(int argc, char * argv[]) +{ + pthread_t t; + int result = 0; + + assert(pthread_mutex_lock(&mx) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_cancel(t) == 0); + + assert(pthread_mutex_unlock(&mx) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == (int) PTHREAD_CANCELED); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/detach1.c b/win32/3rdparty/pthreads/tests/detach1.c new file mode 100644 index 000000000..165c8c1d1 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/detach1.c @@ -0,0 +1,93 @@ +/* + * Test for pthread_detach(). + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: pthread_create(), pthread_detach(), pthread_exit(). + */ + +#include "test.h" + + +enum { + NUMTHREADS = 100 +}; + +void * +func(void * arg) +{ + int i = (int) arg; + + Sleep(i * 10); + + pthread_exit(arg); + + /* Never reached. */ + exit(1); +} + +int +main(int argc, char * argv[]) +{ + pthread_t id[NUMTHREADS]; + int i; + + /* Create a few threads and then exit. */ + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(&id[i], NULL, func, (void *) i) == 0); + } + + /* Some threads will finish before they are detached, some after. */ + Sleep(NUMTHREADS/2 * 10 + 50); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_detach(id[i]) == 0); + } + + Sleep(NUMTHREADS * 10 + 100); + + /* + * Check that all threads are now invalid. + * This relies on unique thread IDs - e.g. works with + * pthreads-w32 or Solaris, but may not work for Linux, BSD etc. + */ + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_kill(id[i], 0) == ESRCH); + } + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/equal1.c b/win32/3rdparty/pthreads/tests/equal1.c new file mode 100644 index 000000000..8932bb2aa --- /dev/null +++ b/win32/3rdparty/pthreads/tests/equal1.c @@ -0,0 +1,66 @@ +/* + * Test for pthread_equal. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on functions: pthread_create(). + */ + +#include "test.h" + +void * func(void * arg) +{ + Sleep(2000); + return 0; +} + +int +main() +{ + pthread_t t1, t2; + + assert(pthread_create(&t1, NULL, func, (void *) 1) == 0); + + assert(pthread_create(&t2, NULL, func, (void *) 2) == 0); + + assert(pthread_equal(t1, t2) == 0); + + assert(pthread_equal(t1,t1) != 0); + + /* This is a hack. We don't want to rely on pthread_join + yet if we can help it. */ + Sleep(4000); + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/errno1.c b/win32/3rdparty/pthreads/tests/errno1.c new file mode 100644 index 000000000..70ce92802 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/errno1.c @@ -0,0 +1,177 @@ +/* + * File: errno1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test thread-safety of errno + * - + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 3 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +pthread_mutex_t stop_here = PTHREAD_MUTEX_INITIALIZER; + +void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + errno = bag->threadnum; + + Sleep(1000); + + pthread_mutex_lock(&stop_here); + + assert(errno == bag->threadnum); + + pthread_mutex_unlock(&stop_here); + + Sleep(1000); + + return 0; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t t[NUMTHREADS + 1]; + + pthread_mutex_lock(&stop_here); + errno = 0; + + assert((t[0] = pthread_self()).p != NULL); + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; + assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(2000); + pthread_mutex_unlock(&stop_here); + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 1000); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + failed = !threadbag[i].started; + + if (failed) + { + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print ouput on failure. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + /* ... */ + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/exception1.c b/win32/3rdparty/pthreads/tests/exception1.c new file mode 100644 index 000000000..3f9f59578 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exception1.c @@ -0,0 +1,263 @@ +/* + * File: exception1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test passing of exceptions back to the application. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +void * +exceptionedThread(void * arg) +{ + int dummy = 0; + int result = ((int)PTHREAD_CANCELED + 1); + /* Set to async cancelable */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + + Sleep(100); + +#if defined(_MSC_VER) && !defined(__cplusplus) + __try + { + int zero = (int) arg; /* Passed in from arg to avoid compiler error */ + int one = 1; + /* + * The deliberate exception condition (zero divide) is + * in an "if" to avoid being optimised out. + */ + if (dummy == one/zero) + Sleep(0); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + /* Should get into here. */ + result = ((int)PTHREAD_CANCELED + 2); + } +#elif defined(__cplusplus) + try + { + /* + * I had a zero divide exception here but it + * wasn't being caught by the catch(...) + * below under Mingw32. That could be a problem. + */ + throw dummy; + } +#if defined(PtW32CatchAll) + PtW32CatchAll +#else + catch (...) +#endif + { + /* Should get into here. */ + result = ((int)PTHREAD_CANCELED + 2); + } +#endif + + return (void *) result; +} + +void * +canceledThread(void * arg) +{ + int result = ((int)PTHREAD_CANCELED + 1); + int count; + + /* Set to async cancelable */ + + assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0); + + assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0); + +#if defined(_MSC_VER) && !defined(__cplusplus) + __try + { + /* + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (count = 0; count < 100; count++) + Sleep(100); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + /* Should NOT get into here. */ + result = ((int)PTHREAD_CANCELED + 2); + } +#elif defined(__cplusplus) + try + { + /* + * We wait up to 10 seconds, waking every 0.1 seconds, + * for a cancelation to be applied to us. + */ + for (count = 0; count < 100; count++) + Sleep(100); + } +#if defined(PtW32CatchAll) + PtW32CatchAll +#else + catch (...) +#endif + { + /* Should NOT get into here. */ + result = ((int)PTHREAD_CANCELED + 2); + } +#endif + + return (void *) result; +} + +int +main() +{ + int failed = 0; + int i; + pthread_t mt; + pthread_t et[NUMTHREADS]; + pthread_t ct[NUMTHREADS]; + + assert((mt = pthread_self()).p != NULL); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(&et[i], NULL, exceptionedThread, (void *) 0) == 0); + assert(pthread_create(&ct[i], NULL, canceledThread, NULL) == 0); + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(1000); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_cancel(ct[i]) == 0); + } + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 1000); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 0; i < NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + + /* Canceled thread */ + assert(pthread_join(ct[i], (void **) &result) == 0); + assert(!(fail = (result != (int) PTHREAD_CANCELED))); + + failed = (failed || fail); + + /* Exceptioned thread */ + assert(pthread_join(et[i], (void **) &result) == 0); + assert(!(fail = (result != ((int) PTHREAD_CANCELED + 2)))); + + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +#include + +int +main() +{ + fprintf(stderr, "Test N/A for this compiler environment.\n"); + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/exception2.c b/win32/3rdparty/pthreads/tests/exception2.c new file mode 100644 index 000000000..5c1856810 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exception2.c @@ -0,0 +1,158 @@ +/* + * File: exception2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test passing of exceptions out of thread scope. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + + +#if defined(_MSC_VER) || defined(__cplusplus) + +#if defined(_MSC_VER) && defined(__cplusplus) +#include +#elif defined(__cplusplus) +#include +#endif + +#ifdef __GNUC__ +#include +#endif + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 1 +}; + + +void * +exceptionedThread(void * arg) +{ + int dummy = 0x1; + +#if defined(_MSC_VER) && !defined(__cplusplus) + + RaiseException(dummy, 0, 0, NULL); + +#elif defined(__cplusplus) + + throw dummy; + +#endif + + return (void *) 100; +} + +int +main(int argc, char argv[]) +{ + int i; + pthread_t mt; + pthread_t et[NUMTHREADS]; + + if (argc <= 1) + { + int result; + + printf("You should see an \"abnormal termination\" message\n"); + fflush(stdout); + result = system("exception2.exe die"); + exit(0); + } + + assert((mt = pthread_self()).p != NULL); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(&et[i], NULL, exceptionedThread, NULL) == 0); + } + + Sleep(1000); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +#include + +int +main() +{ + fprintf(stderr, "Test N/A for this compiler environment.\n"); + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/exception3.c b/win32/3rdparty/pthreads/tests/exception3.c new file mode 100644 index 000000000..9a70a405a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exception3.c @@ -0,0 +1,196 @@ +/* + * File: exception3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test running of user supplied terminate() function. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +#if defined(__cplusplus) + +#if defined(_MSC_VER) +# include +#else +# if defined(__GNUC__) && __GNUC__ < 3 +# include +# else +# include + using std::set_terminate; +# endif +#endif + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 1 +}; + +int caught = 0; +pthread_mutex_t caughtLock; + +void +terminateFunction () +{ + assert(pthread_mutex_lock(&caughtLock) == 0); + caught++; +#if 1 + { + FILE * fp = fopen("pthread.log", "a"); + fprintf(fp, "Caught = %d\n", caught); + fclose(fp); + } +#endif + assert(pthread_mutex_unlock(&caughtLock) == 0); + +#if defined(__MINGW32__) + /* + * Seems to work. That is, threads exit and the process + * continues. Note: need to check correct POSIX behaviour. + * My guess is: this is because of the + * eh incompatibility between g++ and MSVC++. That is, + * an exception thrown in g++ code doesn't propogate + * through or to MSVC++ code, and vice versa. + * Applications should probably not depend on this. + */ + pthread_exit((void *) 0); +#else + /* + * Notes from the MSVC++ manual: + * 1) A term_func() should call exit(), otherwise + * abort() will be called on return to the caller. + * abort() raises SIGABRT. The default signal handler + * for all signals terminates the calling program with + * exit code 3. + * 2) A term_func() must not throw an exception. Therefore + * term_func() should not call pthread_exit() if an + * an exception-using version of pthreads-win32 library + * is being used (i.e. either pthreadVCE or pthreadVSE). + */ + exit(0); +#endif +} + +void * +exceptionedThread(void * arg) +{ + int dummy = 0x1; + + (void) set_terminate(&terminateFunction); + + throw dummy; + + return (void *) 0; +} + +int +main() +{ + int i; + pthread_t mt; + pthread_t et[NUMTHREADS]; + pthread_mutexattr_t ma; + + assert((mt = pthread_self()).p != NULL); + + printf("See the notes inside of exception3.c re term_funcs.\n"); + + assert(pthread_mutexattr_init(&ma) == 0); + assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK) == 0); + assert(pthread_mutex_init(&caughtLock, &ma) == 0); + assert(pthread_mutexattr_destroy(&ma) == 0); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(&et[i], NULL, exceptionedThread, NULL) == 0); + } + + Sleep(5000); + + assert(caught == NUMTHREADS); + + /* + * Success. + */ + return 0; +} + +#else /* defined(__cplusplus) */ + +#include + +int +main() +{ + fprintf(stderr, "Test N/A for this compiler environment.\n"); + return 0; +} + +#endif /* defined(__cplusplus) */ diff --git a/win32/3rdparty/pthreads/tests/exit1.c b/win32/3rdparty/pthreads/tests/exit1.c new file mode 100644 index 000000000..38f218211 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exit1.c @@ -0,0 +1,50 @@ +/* + * Test for pthread_exit(). + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: None. + */ + +#include "test.h" + +int +main(int argc, char * argv[]) +{ + /* A simple test first. */ + pthread_exit((void *) 0); + + /* Not reached */ + assert(0); + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/exit2.c b/win32/3rdparty/pthreads/tests/exit2.c new file mode 100644 index 000000000..196139a9f --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exit2.c @@ -0,0 +1,64 @@ +/* + * Test for pthread_exit(). + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: + * pthread_create() + * pthread_exit() + */ + +#include "test.h" + +void * +func(void * arg) +{ + pthread_exit(arg); + + /* Never reached. */ + assert(0); + + return NULL; +} + +int +main(int argc, char * argv[]) +{ + pthread_t t; + + assert(pthread_create(&t, NULL, func, (void *) NULL) == 0); + + Sleep(1000); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/exit3.c b/win32/3rdparty/pthreads/tests/exit3.c new file mode 100644 index 000000000..574a92df7 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exit3.c @@ -0,0 +1,68 @@ +/* + * Test for pthread_exit(). + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: pthread_create(). + */ + +#include "test.h" + +void * +func(void * arg) +{ + pthread_exit(arg); + + /* Never reached. */ + assert(0); + + return NULL; +} + +int +main(int argc, char * argv[]) +{ + pthread_t id[4]; + int i; + + /* Create a few threads and then exit. */ + for (i = 0; i < 4; i++) + { + assert(pthread_create(&id[i], NULL, func, (void *) i) == 0); + } + + Sleep(1000); + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/exit4.c b/win32/3rdparty/pthreads/tests/exit4.c new file mode 100644 index 000000000..1ceca4e35 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exit4.c @@ -0,0 +1,199 @@ +/* + * File: exit4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test calling pthread_exit from a Win32 thread + * without having created an implicit POSIX handle for it. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#ifndef _UWIN +#include +#endif + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) +unsigned __stdcall +#else +void +#endif +Win32thread(void * arg) +{ + int result = 1; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + /* + * Doesn't return and doesn't create an implicit POSIX handle. + */ + pthread_exit((void *) result); + + return 0; +} + +int +main() +{ + int failed = 0; + int i; + HANDLE h[NUMTHREADS + 1]; + unsigned thrAddr; /* Dummy variable to pass a valid location to _beginthreadex (Win98). */ + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + h[i] = (HANDLE) _beginthreadex(NULL, 0, Win32thread, (void *) &threadbag[i], 0, &thrAddr); +#else + h[i] = (HANDLE) _beginthread(Win32thread, 0, (void *) &threadbag[i]); +#endif + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + assert(GetExitCodeThread(h[i], (LPDWORD) &result) == TRUE); +#else + /* + * Can't get a result code. + */ + result = 1; +#endif + + fail = (result != 1); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/exit5.c b/win32/3rdparty/pthreads/tests/exit5.c new file mode 100644 index 000000000..450ed3bea --- /dev/null +++ b/win32/3rdparty/pthreads/tests/exit5.c @@ -0,0 +1,205 @@ +/* + * File: exit5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Test calling pthread_exit from a Win32 thread + * having created an implicit POSIX handle for it. + * + * Test Method (Validation or Falsification): + * - Validate return value and that POSIX handle is created and destroyed. + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#ifndef _UWIN +#include +#endif + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 4 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { + int threadnum; + int started; + /* Add more per-thread state variables here */ + int count; + pthread_t self; +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) +unsigned __stdcall +#else +void +#endif +Win32thread(void * arg) +{ + int result = 1; + bag_t * bag = (bag_t *) arg; + + assert(bag == &threadbag[bag->threadnum]); + assert(bag->started == 0); + bag->started = 1; + + assert((bag->self = pthread_self()).p != NULL); + assert(pthread_kill(bag->self, 0) == 0); + + /* + * Doesn't return. + */ + pthread_exit((void *) result); + + return 0; +} + +int +main() +{ + int failed = 0; + int i; + HANDLE h[NUMTHREADS + 1]; + unsigned thrAddr; /* Dummy variable to pass a valid location to _beginthreadex (Win98). */ + + for (i = 1; i <= NUMTHREADS; i++) + { + threadbag[i].started = 0; + threadbag[i].threadnum = i; +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + h[i] = (HANDLE) _beginthreadex(NULL, 0, Win32thread, (void *) &threadbag[i], 0, &thrAddr); +#else + h[i] = (HANDLE) _beginthread(Win32thread, 0, (void *) &threadbag[i]); +#endif + } + + /* + * Code to control or munipulate child threads should probably go here. + */ + Sleep(500); + + /* + * Give threads time to run. + */ + Sleep(NUMTHREADS * 100); + + /* + * Standard check that all threads started. + */ + for (i = 1; i <= NUMTHREADS; i++) + { + if (!threadbag[i].started) + { + failed |= !threadbag[i].started; + fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); + } + } + + assert(!failed); + + /* + * Check any results here. Set "failed" and only print output on failure. + */ + failed = 0; + for (i = 1; i <= NUMTHREADS; i++) + { + int fail = 0; + int result = 0; + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) + assert(GetExitCodeThread(h[i], (LPDWORD) &result) == TRUE); +#else + /* + * Can't get a result code. + */ + result = 1; +#endif + + assert(threadbag[i].self.p != NULL && pthread_kill(threadbag[i].self, 0) == ESRCH); + + fail = (result != 1); + + if (fail) + { + fprintf(stderr, "Thread %d: started %d: count %d\n", + i, + threadbag[i].started, + threadbag[i].count); + } + failed = (failed || fail); + } + + assert(!failed); + + /* + * Success. + */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/eyal1.c b/win32/3rdparty/pthreads/tests/eyal1.c new file mode 100644 index 000000000..72b5697e9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/eyal1.c @@ -0,0 +1,367 @@ +/* Simple POSIX threads program. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Author: Eyal Lebedinsky eyal@eyal.emu.id.au + * Written: Sep 1998. + * Version Date: 12 Sep 1998 + * + * Do we need to lock stdout or is it thread safe? + * + * Used: + * pthread_t + * pthread_attr_t + * pthread_create() + * pthread_join() + * pthread_mutex_t + * PTHREAD_MUTEX_INITIALIZER + * pthread_mutex_init() [not used now] + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + * + * What this program does is establish a work queue (implemented using + * four mutexes for each thread). It then schedules work (by storing + * a number in 'todo') and releases the threads. When the work is done + * the threads will block. The program then repeats the same thing once + * more (just to test the logic) and when the work is done it destroyes + * the threads. + * + * The 'work' we do is simply burning CPU cycles in a loop. + * The 'todo' work queue is trivial - each threads pops one element + * off it by incrementing it, the poped number is the 'work' to do. + * When 'todo' reaches the limit (nwork) the queue is considered + * empty. + * + * The number displayed at the end is the amount of work each thread + * did, so we can see if the load was properly distributed. + * + * The program was written to test a threading setup (not seen here) + * rather than to demonstrate correct usage of the pthread facilities. + * + * Note how each thread is given access to a thread control structure + * (TC) which is used for communicating to/from the main program (e.g. + * the threads knows its 'id' and also filles in the 'work' done). +*/ + +#include "test.h" + +#include +#include + +struct thread_control { + int id; + pthread_t thread; /* thread id */ + pthread_mutex_t mutex_start; + pthread_mutex_t mutex_started; + pthread_mutex_t mutex_end; + pthread_mutex_t mutex_ended; + long work; /* work done */ + int stat; /* pthread_init status */ +}; + +typedef struct thread_control TC; + +static TC *tcs = NULL; +static int nthreads = 10; +static int nwork = 100; +static int quiet = 0; + +static int todo = -1; + +static pthread_mutex_t mutex_todo = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t mutex_stdout = PTHREAD_MUTEX_INITIALIZER; + + +static void +die (int ret) +{ + if (NULL != tcs) + { + free (tcs); + tcs = NULL; + } + + if (ret) + exit (ret); +} + + +static double +waste_time (int n) +{ + int i; + double f, g, h, s; + + s = 0.0; + + /* + * Useless work. + */ + for (i = n*100; i > 0; --i) + { + f = rand (); + g = rand (); + h = rand (); + s += 2.0 * f * g / (h != 0.0 ? (h * h) : 1.0); + } + return s; +} + +static int +do_work_unit (int who, int n) +{ + int i; + static int nchars = 0; + double f = 0.0; + + if (quiet) + i = 0; + else { + /* + * get lock on stdout + */ + assert(pthread_mutex_lock (&mutex_stdout) == 0); + + /* + * do our job + */ + i = printf ("%c", "0123456789abcdefghijklmnopqrstuvwxyz"[who]); + + if (!(++nchars % 50)) + printf ("\n"); + + fflush (stdout); + + /* + * release lock on stdout + */ + assert(pthread_mutex_unlock (&mutex_stdout) == 0); + } + + n = rand () % 10000; /* ignore incoming 'n' */ + f = waste_time (n); + + /* This prevents the statement above from being optimised out */ + if (f > 0.0) + return(n); + + return (n); +} + +static int +print_server (void *ptr) +{ + int mywork; + int n; + TC *tc = (TC *)ptr; + + assert(pthread_mutex_lock (&tc->mutex_started) == 0); + + for (;;) + { + assert(pthread_mutex_lock (&tc->mutex_start) == 0); + assert(pthread_mutex_unlock (&tc->mutex_start) == 0); + assert(pthread_mutex_lock (&tc->mutex_ended) == 0); + assert(pthread_mutex_unlock (&tc->mutex_started) == 0); + + for (;;) + { + + /* + * get lock on todo list + */ + assert(pthread_mutex_lock (&mutex_todo) == 0); + + mywork = todo; + if (todo >= 0) + { + ++todo; + if (todo >= nwork) + todo = -1; + } + assert(pthread_mutex_unlock (&mutex_todo) == 0); + + if (mywork < 0) + break; + + assert((n = do_work_unit (tc->id, mywork)) >= 0); + tc->work += n; + } + + assert(pthread_mutex_lock (&tc->mutex_end) == 0); + assert(pthread_mutex_unlock (&tc->mutex_end) == 0); + assert(pthread_mutex_lock (&tc->mutex_started) == 0); + assert(pthread_mutex_unlock (&tc->mutex_ended) == 0); + + if (-2 == mywork) + break; + } + + assert(pthread_mutex_unlock (&tc->mutex_started) == 0); + + return (0); +} + +static void +dosync (void) +{ + int i; + + for (i = 0; i < nthreads; ++i) + { + assert(pthread_mutex_lock (&tcs[i].mutex_end) == 0); + assert(pthread_mutex_unlock (&tcs[i].mutex_start) == 0); + assert(pthread_mutex_lock (&tcs[i].mutex_started) == 0); + assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0); + } + + /* + * Now threads do their work + */ + for (i = 0; i < nthreads; ++i) + { + assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0); + assert(pthread_mutex_unlock (&tcs[i].mutex_end) == 0); + assert(pthread_mutex_lock (&tcs[i].mutex_ended) == 0); + assert(pthread_mutex_unlock (&tcs[i].mutex_ended) == 0); + } +} + +static void +dowork (void) +{ + todo = 0; + dosync(); + + todo = 0; + dosync(); +} + +int +main (int argc, char *argv[]) +{ + int i; + + assert(NULL != (tcs = (TC *) calloc (nthreads, sizeof (*tcs)))); + + /* + * Launch threads + */ + for (i = 0; i < nthreads; ++i) + { + tcs[i].id = i; + + assert(pthread_mutex_init (&tcs[i].mutex_start, NULL) == 0); + assert(pthread_mutex_init (&tcs[i].mutex_started, NULL) == 0); + assert(pthread_mutex_init (&tcs[i].mutex_end, NULL) == 0); + assert(pthread_mutex_init (&tcs[i].mutex_ended, NULL) == 0); + + tcs[i].work = 0; + + assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0); + assert((tcs[i].stat = + pthread_create (&tcs[i].thread, + NULL, + (void *(*)(void *))print_server, + (void *) &tcs[i]) + ) == 0); + + /* + * Wait for thread initialisation + */ + { + int trylock = 0; + + while (trylock == 0) + { + trylock = pthread_mutex_trylock(&tcs[i].mutex_started); + assert(trylock == 0 || trylock == EBUSY); + + if (trylock == 0) + { + assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0); + } + } + } + } + + dowork (); + + /* + * Terminate threads + */ + todo = -2; /* please terminate */ + dosync(); + + for (i = 0; i < nthreads; ++i) + { + if (0 == tcs[i].stat) + assert(pthread_join (tcs[i].thread, NULL) == 0); + } + + /* + * destroy locks + */ + assert(pthread_mutex_destroy (&mutex_stdout) == 0); + assert(pthread_mutex_destroy (&mutex_todo) == 0); + + /* + * Cleanup + */ + printf ("\n"); + + /* + * Show results + */ + for (i = 0; i < nthreads; ++i) + { + printf ("%2d ", i); + if (0 == tcs[i].stat) + printf ("%10ld\n", tcs[i].work); + else + printf ("failed %d\n", tcs[i].stat); + + assert(pthread_mutex_unlock(&tcs[i].mutex_start) == 0); + + assert(pthread_mutex_destroy (&tcs[i].mutex_start) == 0); + assert(pthread_mutex_destroy (&tcs[i].mutex_started) == 0); + assert(pthread_mutex_destroy (&tcs[i].mutex_end) == 0); + assert(pthread_mutex_destroy (&tcs[i].mutex_ended) == 0); + } + + die (0); + + return (0); +} diff --git a/win32/3rdparty/pthreads/tests/inherit1.c b/win32/3rdparty/pthreads/tests/inherit1.c new file mode 100644 index 000000000..482a5a884 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/inherit1.c @@ -0,0 +1,177 @@ +/* + * File: inherit1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test thread priority inheritance. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +enum { + PTW32TEST_THREAD_INIT_PRIO = 0, + PTW32TEST_MAXPRIORITIES = 512 +}; + +int minPrio; +int maxPrio; +int validPriorities[PTW32TEST_MAXPRIORITIES]; + + +void * func(void * arg) +{ + int policy; + struct sched_param param; + + assert(pthread_getschedparam(pthread_self(), &policy, ¶m) == 0); + return (void *) param.sched_priority; +} + + +void * +getValidPriorities(void * arg) +{ + int prioSet; + pthread_t thread = pthread_self(); + HANDLE threadH = pthread_getw32threadhandle_np(thread); + struct sched_param param; + + for (prioSet = minPrio; + prioSet <= maxPrio; + prioSet++) + { + /* + * If prioSet is invalid then the threads priority is unchanged + * from the previous value. Make the previous value a known + * one so that we can check later. + */ + param.sched_priority = prioSet; + assert(pthread_setschedparam(thread, SCHED_OTHER, ¶m) == 0); + validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)] = GetThreadPriority(threadH); + } + + return (void *) 0; +} + + +int +main() +{ + pthread_t t; + pthread_t mainThread = pthread_self(); + pthread_attr_t attr; + void * result = NULL; + struct sched_param param; + struct sched_param mainParam; + int prio; + int policy; + int inheritsched = -1; + pthread_t threadID = pthread_self(); + HANDLE threadH = pthread_getw32threadhandle_np(threadID); + + assert((maxPrio = sched_get_priority_max(SCHED_OTHER)) != -1); + assert((minPrio = sched_get_priority_min(SCHED_OTHER)) != -1); + + assert(pthread_create(&t, NULL, getValidPriorities, NULL) == 0); + assert(pthread_join(t, &result) == 0); + + assert(pthread_attr_init(&attr) == 0); + assert(pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED) == 0); + assert(pthread_attr_getinheritsched(&attr, &inheritsched) == 0); + assert(inheritsched == PTHREAD_INHERIT_SCHED); + + for (prio = minPrio; prio <= maxPrio; prio++) + { + mainParam.sched_priority = prio; + + /* Set the thread's priority to a known initial value. */ + SetThreadPriority(threadH, PTW32TEST_THREAD_INIT_PRIO); + + /* Change the main thread priority */ + assert(pthread_setschedparam(mainThread, SCHED_OTHER, &mainParam) == 0); + assert(pthread_getschedparam(mainThread, &policy, &mainParam) == 0); + assert(policy == SCHED_OTHER); + /* Priority returned below should be the level set by pthread_setschedparam(). */ + assert(mainParam.sched_priority == prio); + assert(GetThreadPriority(threadH) == + validPriorities[prio+(PTW32TEST_MAXPRIORITIES/2)]); + + for (param.sched_priority = prio; + param.sched_priority <= maxPrio; + param.sched_priority++) + { + /* The new thread create should ignore this new priority */ + assert(pthread_attr_setschedparam(&attr, ¶m) == 0); + assert(pthread_create(&t, &attr, func, NULL) == 0); + pthread_join(t, &result); + assert((int) result == mainParam.sched_priority); + } + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/join0.c b/win32/3rdparty/pthreads/tests/join0.c new file mode 100644 index 000000000..a6cb25dcc --- /dev/null +++ b/win32/3rdparty/pthreads/tests/join0.c @@ -0,0 +1,67 @@ +/* + * Test for pthread_join(). + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: pthread_create(), pthread_exit(). + */ + +#include "test.h" + +void * +func(void * arg) +{ + Sleep(2000); + + pthread_exit(arg); + + /* Never reached. */ + exit(1); +} + +int +main(int argc, char * argv[]) +{ + pthread_t id; + int result; + + /* Create a single thread and wait for it to exit. */ + assert(pthread_create(&id, NULL, func, (void *) 123) == 0); + + assert(pthread_join(id, (void **) &result) == 0); + + assert(result == 123); + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/join1.c b/win32/3rdparty/pthreads/tests/join1.c new file mode 100644 index 000000000..8b11e9503 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/join1.c @@ -0,0 +1,78 @@ +/* + * Test for pthread_join(). + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: pthread_create(), pthread_join(), pthread_exit(). + */ + +#include "test.h" + +void * +func(void * arg) +{ + int i = (int) arg; + + Sleep(i * 100); + + pthread_exit(arg); + + /* Never reached. */ + exit(1); +} + +int +main(int argc, char * argv[]) +{ + pthread_t id[4]; + int i; + int result; + + /* Create a few threads and then exit. */ + for (i = 0; i < 4; i++) + { + assert(pthread_create(&id[i], NULL, func, (void *) i) == 0); + } + + /* Some threads will finish before they are joined, some after. */ + Sleep(2 * 100 + 50); + + for (i = 0; i < 4; i++) + { + assert(pthread_join(id[i], (void **) &result) == 0); + assert(result == i); + } + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/join2.c b/win32/3rdparty/pthreads/tests/join2.c new file mode 100644 index 000000000..4fa30129e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/join2.c @@ -0,0 +1,69 @@ +/* + * Test for pthread_join() returning return value from threads. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: pthread_create(). + */ + +#include "test.h" + +void * +func(void * arg) +{ + Sleep(1000); + return arg; +} + +int +main(int argc, char * argv[]) +{ + pthread_t id[4]; + int i; + int result; + + /* Create a few threads and then exit. */ + for (i = 0; i < 4; i++) + { + assert(pthread_create(&id[i], NULL, func, (void *) i) == 0); + } + + for (i = 0; i < 4; i++) + { + assert(pthread_join(id[i], (void **) &result) == 0); + assert(result == i); + } + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/join3.c b/win32/3rdparty/pthreads/tests/join3.c new file mode 100644 index 000000000..70cf3e97f --- /dev/null +++ b/win32/3rdparty/pthreads/tests/join3.c @@ -0,0 +1,75 @@ +/* + * Test for pthread_join() returning return value from threads. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Depends on API functions: pthread_create(). + */ + +#include "test.h" + +void * +func(void * arg) +{ + sched_yield(); + return arg; +} + +int +main(int argc, char * argv[]) +{ + pthread_t id[4]; + int i; + int result; + + /* Create a few threads and then exit. */ + for (i = 0; i < 4; i++) + { + assert(pthread_create(&id[i], NULL, func, (void *) i) == 0); + } + + /* + * Let threads exit before we join them. + * We should still retrieve the exit code for the threads. + */ + Sleep(1000); + + for (i = 0; i < 4; i++) + { + assert(pthread_join(id[i], (void **) &result) == 0); + assert(result == i); + } + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/kill1.c b/win32/3rdparty/pthreads/tests/kill1.c new file mode 100644 index 000000000..fd1eaee2b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/kill1.c @@ -0,0 +1,83 @@ +/* + * File: kill1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - pthread_kill() does not support non zero signals.. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + + +int +main() +{ + assert(pthread_kill(pthread_self(), 1) == EINVAL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/loadfree.c b/win32/3rdparty/pthreads/tests/loadfree.c new file mode 100644 index 000000000..65bb15c7b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/loadfree.c @@ -0,0 +1,70 @@ +/* + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * From: Todd Owen + * To: pthreads-win32@sourceware.cygnus.com + * Subject: invalid page fault when using LoadLibrary/FreeLibrary + * + * hi, + * for me, pthread.dll consistently causes an "invalid page fault in + * kernel32.dll" when I load it "explicitly"...to be precise, loading (with + * LoadLibrary) isn't a problem, it gives the error when I call FreeLibrary. + * I guess that the dll's cleanup must be causing the error. + * + * Implicit linkage of the dll has never given me this problem. Here's a + * program (console application) that gives me the error. + * + * I compile with: mingw32 (gcc-2.95 release), with the MSVCRT add-on (not + * that the compiler should make much difference in this case). + * PTHREAD.DLL: is the precompiled 1999-11-02 one (I tried an older one as + * well, with the same result). + * + * Fascinatingly, if you have your own dll (mycode.dll) which implicitly + * loads pthread.dll, and then do LoadLibrary/FreeLibrary on _this_ dll, the + * same thing happens. + * + */ + +#include "test.h" + +int main() { + HINSTANCE hinst; + + assert((hinst = LoadLibrary("pthread")) != (HINSTANCE) 0); + + Sleep(100); + + FreeLibrary(hinst); + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex1.c b/win32/3rdparty/pthreads/tests/mutex1.c new file mode 100644 index 000000000..918c90330 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex1.c @@ -0,0 +1,68 @@ +/* + * mutex1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create a simple mutex object, lock it, and then unlock it again. + * This is the simplest test of the pthread mutex family that we can do. + * + * Depends on API functions: + * pthread_mutex_init() + * pthread_mutex_lock() + * pthread_mutex_unlock() + * pthread_mutex_destroy() + */ + +#include "test.h" + +pthread_mutex_t mutex = NULL; + +int +main() +{ + assert(mutex == NULL); + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + assert(mutex != NULL); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex1e.c b/win32/3rdparty/pthreads/tests/mutex1e.c new file mode 100644 index 000000000..e52810728 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex1e.c @@ -0,0 +1,74 @@ +/* + * mutex1e.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * As for mutex1.c but with type set to PTHREAD_MUTEX_ERRORCHECK. + * + * Create a simple mutex object, lock it, unlock it, then destroy it. + * This is the simplest test of the pthread mutex family that we can do. + * + * Depends on API functions: + * pthread_mutexattr_settype() + * pthread_mutex_init() + * pthread_mutex_destroy() + */ + +#include "test.h" + +pthread_mutex_t mutex = NULL; +pthread_mutexattr_t mxAttr; + +int +main() +{ + assert(pthread_mutexattr_init(&mxAttr) == 0); + + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); + + assert(mutex == NULL); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(mutex != NULL); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex1n.c b/win32/3rdparty/pthreads/tests/mutex1n.c new file mode 100644 index 000000000..74850d6c8 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex1n.c @@ -0,0 +1,74 @@ +/* + * mutex1n.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * As for mutex1.c but with type set to PTHREAD_MUTEX_NORMAL. + * + * Create a simple mutex object, lock it, unlock it, then destroy it. + * This is the simplest test of the pthread mutex family that we can do. + * + * Depends on API functions: + * pthread_mutexattr_settype() + * pthread_mutex_init() + * pthread_mutex_destroy() + */ + +#include "test.h" + +pthread_mutex_t mutex = NULL; +pthread_mutexattr_t mxAttr; + +int +main() +{ + assert(pthread_mutexattr_init(&mxAttr) == 0); + + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_NORMAL) == 0); + + assert(mutex == NULL); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(mutex != NULL); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex1r.c b/win32/3rdparty/pthreads/tests/mutex1r.c new file mode 100644 index 000000000..0666dec0d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex1r.c @@ -0,0 +1,74 @@ +/* + * mutex1r.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * As for mutex1.c but with type set to PTHREAD_MUTEX_RECURSIVE. + * + * Create a simple mutex object, lock it, unlock it, then destroy it. + * This is the simplest test of the pthread mutex family that we can do. + * + * Depends on API functions: + * pthread_mutexattr_settype() + * pthread_mutex_init() + * pthread_mutex_destroy() + */ + +#include "test.h" + +pthread_mutex_t mutex = NULL; +pthread_mutexattr_t mxAttr; + +int +main() +{ + assert(pthread_mutexattr_init(&mxAttr) == 0); + + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_RECURSIVE) == 0); + + assert(mutex == NULL); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(mutex != NULL); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex2.c b/win32/3rdparty/pthreads/tests/mutex2.c new file mode 100644 index 000000000..377468e90 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex2.c @@ -0,0 +1,66 @@ +/* + * mutex2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static mutex object, lock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +int +main() +{ + assert(mutex == PTHREAD_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(mutex != PTHREAD_MUTEX_INITIALIZER); + + assert(mutex != NULL); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex2e.c b/win32/3rdparty/pthreads/tests/mutex2e.c new file mode 100644 index 000000000..7df6073d2 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex2e.c @@ -0,0 +1,66 @@ +/* + * mutex2e.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static mutex object, lock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER; + +int +main() +{ + assert(mutex == PTHREAD_ERRORCHECK_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(mutex != PTHREAD_ERRORCHECK_MUTEX_INITIALIZER); + + assert(mutex != NULL); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex2r.c b/win32/3rdparty/pthreads/tests/mutex2r.c new file mode 100644 index 000000000..c96e366f1 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex2r.c @@ -0,0 +1,66 @@ +/* + * mutex2r.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static mutex object, lock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; + +int +main() +{ + assert(mutex == PTHREAD_RECURSIVE_MUTEX_INITIALIZER); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(mutex != PTHREAD_RECURSIVE_MUTEX_INITIALIZER); + + assert(mutex != NULL); + + assert(pthread_mutex_unlock(&mutex) == 0); + + assert(pthread_mutex_destroy(&mutex) == 0); + + assert(mutex == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex3.c b/win32/3rdparty/pthreads/tests/mutex3.c new file mode 100644 index 000000000..bc1429e0b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex3.c @@ -0,0 +1,75 @@ +/* + * mutex3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static mutex object, lock it, trylock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_mutex_trylock(&mutex1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_mutex_lock(&mutex1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_join(t, NULL) == 0); + + assert(pthread_mutex_unlock(&mutex1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex3e.c b/win32/3rdparty/pthreads/tests/mutex3e.c new file mode 100644 index 000000000..66cfcb71c --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex3e.c @@ -0,0 +1,75 @@ +/* + * mutex3e.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static mutex object, lock it, trylock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +pthread_mutex_t mutex1 = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_mutex_trylock(&mutex1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_mutex_lock(&mutex1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_join(t, NULL) == 0); + + assert(pthread_mutex_unlock(&mutex1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex3r.c b/win32/3rdparty/pthreads/tests/mutex3r.c new file mode 100644 index 000000000..8fa7f2547 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex3r.c @@ -0,0 +1,75 @@ +/* + * mutex3r.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static mutex object, lock it, trylock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +pthread_mutex_t mutex1 = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_mutex_trylock(&mutex1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_mutex_lock(&mutex1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_join(t, NULL) == 0); + + assert(pthread_mutex_unlock(&mutex1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex4.c b/win32/3rdparty/pthreads/tests/mutex4.c new file mode 100644 index 000000000..547d9cb73 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex4.c @@ -0,0 +1,111 @@ +/* + * mutex4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Thread A locks mutex - thread B tries to unlock. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int wasHere = 0; + +static pthread_mutex_t mutex1; + +void * unlocker(void * arg) +{ + int expectedResult = (int) arg; + + wasHere++; + assert(pthread_mutex_unlock(&mutex1) == expectedResult); + wasHere++; + return NULL; +} + +int +main() +{ + pthread_t t; + pthread_mutexattr_t ma; + + assert(pthread_mutexattr_init(&ma) == 0); + + wasHere = 0; + assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_DEFAULT) == 0); + assert(pthread_mutex_init(&mutex1, &ma) == 0); + assert(pthread_mutex_lock(&mutex1) == 0); + /* + * NORMAL (fast) mutexes don't check ownership. + */ + assert(pthread_create(&t, NULL, unlocker, (void *) 0) == 0); + assert(pthread_join(t, NULL) == 0); + assert(pthread_mutex_unlock(&mutex1) == EPERM); + assert(wasHere == 2); + + wasHere = 0; + assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_NORMAL) == 0); + assert(pthread_mutex_init(&mutex1, &ma) == 0); + assert(pthread_mutex_lock(&mutex1) == 0); + /* + * NORMAL (fast) mutexes don't check ownership. + */ + assert(pthread_create(&t, NULL, unlocker, (void *) 0) == 0); + assert(pthread_join(t, NULL) == 0); + assert(pthread_mutex_unlock(&mutex1) == EPERM); + assert(wasHere == 2); + + wasHere = 0; + assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK) == 0); + assert(pthread_mutex_init(&mutex1, &ma) == 0); + assert(pthread_mutex_lock(&mutex1) == 0); + assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0); + assert(pthread_join(t, NULL) == 0); + assert(pthread_mutex_unlock(&mutex1) == 0); + assert(wasHere == 2); + + wasHere = 0; + assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE) == 0); + assert(pthread_mutex_init(&mutex1, &ma) == 0); + assert(pthread_mutex_lock(&mutex1) == 0); + assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0); + assert(pthread_join(t, NULL) == 0); + assert(pthread_mutex_unlock(&mutex1) == 0); + assert(wasHere == 2); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex5.c b/win32/3rdparty/pthreads/tests/mutex5.c new file mode 100644 index 000000000..a71f9d893 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex5.c @@ -0,0 +1,67 @@ +/* + * mutex5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Confirm the equality/inequality of the various mutex types, + * and the default not-set value. + */ + +#include "test.h" + +static pthread_mutexattr_t mxAttr; + +/* Prevent optimiser from removing dead or obvious asserts. */ +int _optimiseFoil; +#define FOIL(x) (_optimiseFoil = x) + +int +main() +{ + int mxType = -1; + + assert(FOIL(PTHREAD_MUTEX_DEFAULT) == PTHREAD_MUTEX_NORMAL); + assert(FOIL(PTHREAD_MUTEX_DEFAULT) != PTHREAD_MUTEX_ERRORCHECK); + assert(FOIL(PTHREAD_MUTEX_DEFAULT) != PTHREAD_MUTEX_RECURSIVE); + assert(FOIL(PTHREAD_MUTEX_RECURSIVE) != PTHREAD_MUTEX_ERRORCHECK); + + assert(FOIL(PTHREAD_MUTEX_NORMAL) == PTHREAD_MUTEX_FAST_NP); + assert(FOIL(PTHREAD_MUTEX_RECURSIVE) == PTHREAD_MUTEX_RECURSIVE_NP); + assert(FOIL(PTHREAD_MUTEX_ERRORCHECK) == PTHREAD_MUTEX_ERRORCHECK_NP); + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_NORMAL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex6.c b/win32/3rdparty/pthreads/tests/mutex6.c new file mode 100644 index 000000000..15649fc8d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6.c @@ -0,0 +1,93 @@ +/* + * mutex6.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test the default (type not set) mutex type. + * Should be the same as PTHREAD_MUTEX_NORMAL. + * Thread locks mutex twice (recursive lock). + * Locking thread should deadlock on second attempt. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + + /* Should wait here (deadlocked) */ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(1000); + + assert(lockCount == 1); + + /* + * Should succeed even though we don't own the lock + * because FAST mutexes don't check ownership. + */ + assert(pthread_mutex_unlock(&mutex) == 0); + + Sleep (1000); + + assert(lockCount == 2); + + exit(0); + + /* Never reached */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex6e.c b/win32/3rdparty/pthreads/tests/mutex6e.c new file mode 100644 index 000000000..8af9274f2 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6e.c @@ -0,0 +1,102 @@ +/* + * mutex6e.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_ERRORCHECK mutex type. + * Thread locks mutex twice (recursive lock). + * This should fail with an EDEADLK error. + * The second unlock attempt should fail with an EPERM error. + * + * Depends on API functions: + * pthread_create() + * pthread_join() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_lock(&mutex) == EDEADLK); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == EPERM); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int result = 0; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_ERRORCHECK); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == 555); + + assert(lockCount == 2); + + assert(pthread_mutex_destroy(&mutex) == 0); + assert(pthread_mutexattr_destroy(&mxAttr) == 0); + + exit(0); + + /* Never reached */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex6es.c b/win32/3rdparty/pthreads/tests/mutex6es.c new file mode 100644 index 000000000..0d879c4ea --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6es.c @@ -0,0 +1,94 @@ +/* + * mutex6es.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_ERRORCHECK static mutex type. + * Thread locks mutex twice (recursive lock). + * This should fail with an EDEADLK error. + * The second unlock attempt should fail with an EPERM error. + * + * Depends on API functions: + * pthread_create() + * pthread_join() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_lock(&mutex) == EDEADLK); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == EPERM); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int result = 0; + + assert(mutex == PTHREAD_ERRORCHECK_MUTEX_INITIALIZER); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == 555); + + assert(lockCount == 2); + + assert(pthread_mutex_destroy(&mutex) == 0); + + exit(0); + + /* Never reached */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex6n.c b/win32/3rdparty/pthreads/tests/mutex6n.c new file mode 100644 index 000000000..9b4bbb920 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6n.c @@ -0,0 +1,104 @@ +/* + * mutex6n.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_NORMAL mutex type. + * Thread locks mutex twice (recursive lock). + * The thread should deadlock. + * + * Depends on API functions: + * pthread_create() + * pthread_mutexattr_init() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + + /* Should wait here (deadlocked) */ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_NORMAL) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_NORMAL); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(1000); + + assert(lockCount == 1); + + /* + * Should succeed even though we don't own the lock + * because FAST mutexes don't check ownership. + */ + assert(pthread_mutex_unlock(&mutex) == 0); + + Sleep (1000); + + assert(lockCount == 2); + + exit(0); + + /* Never reached */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex6r.c b/win32/3rdparty/pthreads/tests/mutex6r.c new file mode 100644 index 000000000..4bf853f8d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6r.c @@ -0,0 +1,100 @@ +/* + * mutex6r.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_RECURSIVE mutex type. + * Thread locks mutex twice (recursive lock). + * Both locks and unlocks should succeed. + * + * Depends on API functions: + * pthread_create() + * pthread_join() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == 0); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int result = 0; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_RECURSIVE) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_RECURSIVE); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == 555); + + assert(lockCount == 2); + + assert(pthread_mutex_destroy(&mutex) == 0); + assert(pthread_mutexattr_destroy(&mxAttr) == 0); + + exit(0); + + /* Never reached */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex6rs.c b/win32/3rdparty/pthreads/tests/mutex6rs.c new file mode 100644 index 000000000..4ebe44ef0 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6rs.c @@ -0,0 +1,92 @@ +/* + * mutex6rs.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_RECURSIVE static mutex type. + * Thread locks mutex twice (recursive lock). + * Both locks and unlocks should succeed. + * + * Depends on API functions: + * pthread_create() + * pthread_join() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == 0); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int result = 0; + + assert(mutex == PTHREAD_RECURSIVE_MUTEX_INITIALIZER); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == 555); + + assert(lockCount == 2); + + assert(pthread_mutex_destroy(&mutex) == 0); + + exit(0); + + /* Never reached */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex6s.c b/win32/3rdparty/pthreads/tests/mutex6s.c new file mode 100644 index 000000000..8b82dc3fa --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex6s.c @@ -0,0 +1,93 @@ +/* + * mutex6s.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test the default (type not set) static mutex type. + * Should be the same as PTHREAD_MUTEX_NORMAL. + * Thread locks mutex twice (recursive lock). + * Locking thread should deadlock on second attempt. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + + /* Should wait here (deadlocked) */ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(mutex == PTHREAD_MUTEX_INITIALIZER); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(1000); + + assert(lockCount == 1); + + /* + * Should succeed even though we don't own the lock + * because FAST mutexes don't check ownership. + */ + assert(pthread_mutex_unlock(&mutex) == 0); + + Sleep (1000); + + assert(lockCount == 2); + + exit(0); + + /* Never reached */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex7.c b/win32/3rdparty/pthreads/tests/mutex7.c new file mode 100644 index 000000000..8772b9712 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex7.c @@ -0,0 +1,82 @@ +/* + * mutex7.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test the default (type not set) mutex type. + * Should be the same as PTHREAD_MUTEX_NORMAL. + * Thread locks then trylocks mutex (attempted recursive lock). + * The thread should lock first time and EBUSY second time. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_trylock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_trylock(&mutex) == EBUSY); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == EPERM); + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(1000); + + assert(lockCount == 2); + + exit(0); + + /* Never reached */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex7e.c b/win32/3rdparty/pthreads/tests/mutex7e.c new file mode 100644 index 000000000..854789b9b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex7e.c @@ -0,0 +1,102 @@ +/* + * mutex7e.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_ERRORCHECK mutex type. + * Thread locks and then trylocks mutex (attempted recursive lock). + * Trylock should fail with an EBUSY error. + * The second unlock attempt should fail with an EPERM error. + * + * Depends on API functions: + * pthread_create() + * pthread_join() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_trylock(&mutex) == EBUSY); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == EPERM); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int result = 0; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_ERRORCHECK); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == 555); + + assert(lockCount == 2); + + assert(pthread_mutex_destroy(&mutex) == 0); + assert(pthread_mutexattr_destroy(&mxAttr) == 0); + + exit(0); + + /* Never reached */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex7n.c b/win32/3rdparty/pthreads/tests/mutex7n.c new file mode 100644 index 000000000..174355fca --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex7n.c @@ -0,0 +1,93 @@ +/* + * mutex7n.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_NORMAL mutex type. + * Thread locks then trylocks mutex (attempted recursive lock). + * The thread should lock first time and EBUSY second time. + * + * Depends on API functions: + * pthread_create() + * pthread_mutexattr_init() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_trylock(&mutex) == EBUSY); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == EPERM); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_NORMAL) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_NORMAL); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(1000); + + assert(lockCount == 2); + + exit(0); + + /* Never reached */ + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex7r.c b/win32/3rdparty/pthreads/tests/mutex7r.c new file mode 100644 index 000000000..f9e5ff0e2 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex7r.c @@ -0,0 +1,100 @@ +/* + * mutex7r.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_RECURSIVE mutex type. + * Thread locks mutex then trylocks mutex (recursive lock twice). + * Both locks and unlocks should succeed. + * + * Depends on API functions: + * pthread_create() + * pthread_join() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_unlock() + */ + +#include "test.h" + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + assert(pthread_mutex_lock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_trylock(&mutex) == 0); + lockCount++; + assert(pthread_mutex_unlock(&mutex) == 0); + assert(pthread_mutex_unlock(&mutex) == 0); + + return (void *) 555; +} + +int +main() +{ + pthread_t t; + int result = 0; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_RECURSIVE) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_RECURSIVE); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result == 555); + + assert(lockCount == 2); + + assert(pthread_mutex_destroy(&mutex) == 0); + assert(pthread_mutexattr_destroy(&mxAttr) == 0); + + exit(0); + + /* Never reached */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex8.c b/win32/3rdparty/pthreads/tests/mutex8.c new file mode 100644 index 000000000..5ca99822e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex8.c @@ -0,0 +1,82 @@ +/* + * mutex8.c + * + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 Ben Elliston and Ross Johnson + * Copyright (C) 1999,2000,2001 Ross Johnson + * + * Contact Email: rpj@ise.canberra.edu.au + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- + * + * Test the default (type not set) mutex type exercising timedlock. + * Thread locks mutex, another thread timedlocks the mutex. + * Timed thread should timeout. + * + * Depends on API functions: + * pthread_mutex_lock() + * pthread_mutex_timedlock() + * pthread_mutex_unlock() + */ + +#include "test.h" +#include + +static int lockCount = 0; + +static pthread_mutex_t mutex; + +void * locker(void * arg) +{ + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_mutex_timedlock(&mutex, &abstime) == ETIMEDOUT); + + lockCount++; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_mutex_init(&mutex, NULL) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(2000); + + assert(lockCount == 1); + + assert(pthread_mutex_unlock(&mutex) == 0); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/mutex8e.c b/win32/3rdparty/pthreads/tests/mutex8e.c new file mode 100644 index 000000000..b99d24edd --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex8e.c @@ -0,0 +1,97 @@ +/* + * mutex8e.c + * + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 Ben Elliston and Ross Johnson + * Copyright (C) 1999,2000,2001 Ross Johnson + * + * Contact Email: rpj@ise.canberra.edu.au + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_ERRORCHECK mutex type exercising timedlock. + * Thread locks mutex, another thread timedlocks the mutex. + * Timed thread should timeout. + * + * Depends on API functions: + * pthread_create() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_timedlock() + * pthread_mutex_unlock() + */ + +#include "test.h" +#include + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_mutex_timedlock(&mutex, &abstime) == ETIMEDOUT); + + lockCount++; + + return 0; +} + +int +main() +{ + pthread_t t; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_ERRORCHECK); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(2000); + + assert(lockCount == 1); + + assert(pthread_mutex_unlock(&mutex) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex8n.c b/win32/3rdparty/pthreads/tests/mutex8n.c new file mode 100644 index 000000000..3cfdae620 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex8n.c @@ -0,0 +1,97 @@ +/* + * mutex8n.c + * + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 Ben Elliston and Ross Johnson + * Copyright (C) 1999,2000,2001 Ross Johnson + * + * Contact Email: rpj@ise.canberra.edu.au + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_NORMAL mutex type exercising timedlock. + * Thread locks mutex, another thread timedlocks the mutex. + * Timed thread should timeout. + * + * Depends on API functions: + * pthread_create() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_timedlock() + * pthread_mutex_unlock() + */ + +#include "test.h" +#include + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_mutex_timedlock(&mutex, &abstime) == ETIMEDOUT); + + lockCount++; + + return 0; +} + +int +main() +{ + pthread_t t; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_NORMAL) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_NORMAL); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(2000); + + assert(lockCount == 1); + + assert(pthread_mutex_unlock(&mutex) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/mutex8r.c b/win32/3rdparty/pthreads/tests/mutex8r.c new file mode 100644 index 000000000..d1328cad9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/mutex8r.c @@ -0,0 +1,97 @@ +/* + * mutex8r.c + * + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 Ben Elliston and Ross Johnson + * Copyright (C) 1999,2000,2001 Ross Johnson + * + * Contact Email: rpj@ise.canberra.edu.au + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- + * + * Tests PTHREAD_MUTEX_RECURSIVE mutex type exercising timedlock. + * Thread locks mutex, another thread timedlocks the mutex. + * Timed thread should timeout. + * + * Depends on API functions: + * pthread_create() + * pthread_mutexattr_init() + * pthread_mutexattr_destroy() + * pthread_mutexattr_settype() + * pthread_mutexattr_gettype() + * pthread_mutex_init() + * pthread_mutex_destroy() + * pthread_mutex_lock() + * pthread_mutex_timedlock() + * pthread_mutex_unlock() + */ + +#include "test.h" +#include + +static int lockCount = 0; + +static pthread_mutex_t mutex; +static pthread_mutexattr_t mxAttr; + +void * locker(void * arg) +{ + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_mutex_timedlock(&mutex, &abstime) == ETIMEDOUT); + + lockCount++; + + return 0; +} + +int +main() +{ + pthread_t t; + int mxType = -1; + + assert(pthread_mutexattr_init(&mxAttr) == 0); + assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_RECURSIVE) == 0); + assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); + assert(mxType == PTHREAD_MUTEX_RECURSIVE); + + assert(pthread_mutex_init(&mutex, &mxAttr) == 0); + + assert(pthread_mutex_lock(&mutex) == 0); + + assert(pthread_create(&t, NULL, locker, NULL) == 0); + + Sleep(2000); + + assert(lockCount == 1); + + assert(pthread_mutex_unlock(&mutex) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/once1.c b/win32/3rdparty/pthreads/tests/once1.c new file mode 100644 index 000000000..daec112d7 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/once1.c @@ -0,0 +1,77 @@ +/* + * once1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create a static pthread_once and test that it calls myfunc once. + * + * Depends on API functions: + * pthread_once() + * pthread_create() + */ + +#include "test.h" + +pthread_once_t once = PTHREAD_ONCE_INIT; + +static int washere = 0; + +void +myfunc(void) +{ + washere++; +} + +void * +mythread(void * arg) +{ + assert(pthread_once(&once, myfunc) == 0); + + return 0; +} + +int +main() +{ + pthread_t t1, t2; + + assert(pthread_create(&t1, NULL, mythread, NULL) == 0); + + assert(pthread_create(&t2, NULL, mythread, NULL) == 0); + + Sleep(2000); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/once2.c b/win32/3rdparty/pthreads/tests/once2.c new file mode 100644 index 000000000..248ccb1a7 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/once2.c @@ -0,0 +1,109 @@ +/* + * once2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create several static pthread_once objects and channel several threads + * through each. + * + * Depends on API functions: + * pthread_once() + * pthread_create() + */ + +#include "test.h" + +#define NUM_THREADS 100 /* Targeting each once control */ +#define NUM_ONCE 10 + +pthread_once_t o = PTHREAD_ONCE_INIT; +pthread_once_t once[NUM_ONCE]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t numOnce = {0, {0}}; +static sharedInt_t numThreads = {0, {0}}; + +void +myfunc(void) +{ + EnterCriticalSection(&numOnce.cs); + numOnce.i++; + LeaveCriticalSection(&numOnce.cs); + /* Simulate slow once routine so that following threads pile up behind it */ + Sleep(100); +} + +void * +mythread(void * arg) +{ + assert(pthread_once(&once[(int) arg], myfunc) == 0); + EnterCriticalSection(&numThreads.cs); + numThreads.i++; + LeaveCriticalSection(&numThreads.cs); + return 0; +} + +int +main() +{ + pthread_t t[NUM_THREADS][NUM_ONCE]; + int i, j; + + InitializeCriticalSection(&numThreads.cs); + InitializeCriticalSection(&numOnce.cs); + + for (j = 0; j < NUM_ONCE; j++) + { + once[j] = o; + + for (i = 0; i < NUM_THREADS; i++) + assert(pthread_create(&t[i][j], NULL, mythread, (void *) j) == 0); + } + + for (j = 0; j < NUM_ONCE; j++) + for (i = 0; i < NUM_THREADS; i++) + if (pthread_join(t[i][j], NULL) != 0) + printf("Join failed for [thread,once] = [%d,%d]\n", i, j); + + assert(numOnce.i == NUM_ONCE); + assert(numThreads.i == NUM_THREADS * NUM_ONCE); + + DeleteCriticalSection(&numOnce.cs); + DeleteCriticalSection(&numThreads.cs); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/once3.c b/win32/3rdparty/pthreads/tests/once3.c new file mode 100644 index 000000000..981bbf7d8 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/once3.c @@ -0,0 +1,132 @@ +/* + * once3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create several pthread_once objects and channel several threads + * through each. Make the init_routine cancelable and cancel them with + * waiters waiting. + * + * Depends on API functions: + * pthread_once() + * pthread_create() + * pthread_testcancel() + * pthread_cancel() + * pthread_once() + */ + +#define ASSERT_TRACE + +#include "test.h" + +#define NUM_THREADS 100 /* Targeting each once control */ +#define NUM_ONCE 10 + +pthread_once_t o = PTHREAD_ONCE_INIT; +pthread_once_t once[NUM_ONCE]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t numOnce = {0, {0}}; +static sharedInt_t numThreads = {0, {0}}; + +void +myfunc(void) +{ + EnterCriticalSection(&numOnce.cs); + numOnce.i++; + assert(numOnce.i > 0); + LeaveCriticalSection(&numOnce.cs); + /* Simulate slow once routine so that following threads pile up behind it */ + Sleep(10); + /* test for cancelation late so we're sure to have waiters. */ + pthread_testcancel(); +} + +void * +mythread(void * arg) +{ + /* + * Cancel every thread. These threads are deferred cancelable only, so + * only the thread performing the once routine (my_func) will see it (there are + * no other cancelation points here). The result will be that every thread + * eventually cancels only when it becomes the new once thread. + */ + assert(pthread_cancel(pthread_self()) == 0); + assert(pthread_once(&once[(int) arg], myfunc) == 0); + EnterCriticalSection(&numThreads.cs); + numThreads.i++; + LeaveCriticalSection(&numThreads.cs); + return 0; +} + +int +main() +{ + pthread_t t[NUM_THREADS][NUM_ONCE]; + int i, j; + + InitializeCriticalSection(&numThreads.cs); + InitializeCriticalSection(&numOnce.cs); + + for (j = 0; j < NUM_ONCE; j++) + { + once[j] = o; + + for (i = 0; i < NUM_THREADS; i++) + { + assert(pthread_create(&t[i][j], NULL, mythread, (void *) j) == 0); + } + } + + for (j = 0; j < NUM_ONCE; j++) + for (i = 0; i < NUM_THREADS; i++) + if (pthread_join(t[i][j], NULL) != 0) + printf("Join failed for [thread,once] = [%d,%d]\n", i, j); + + /* + * All threads will cancel, none will return normally from + * pthread_once and so numThreads should never be incremented. However, + * numOnce should be incremented by every thread (NUM_THREADS*NUM_ONCE). + */ + assert(numOnce.i == NUM_ONCE * NUM_THREADS); + assert(numThreads.i == 0); + + DeleteCriticalSection(&numOnce.cs); + DeleteCriticalSection(&numThreads.cs); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/once4.c b/win32/3rdparty/pthreads/tests/once4.c new file mode 100644 index 000000000..f5be64486 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/once4.c @@ -0,0 +1,191 @@ +/* + * once4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create several pthread_once objects and channel several threads + * through each. Make the init_routine cancelable and cancel them + * waiters waiting. Vary the priorities. + * + * Depends on API functions: + * pthread_once() + * pthread_create() + * pthread_testcancel() + * pthread_cancel() + * pthread_once() + */ + +#include "test.h" + +#define NUM_THREADS 100 /* Targeting each once control */ +#define NUM_ONCE 10 + +pthread_once_t o = PTHREAD_ONCE_INIT; +pthread_once_t once[NUM_ONCE]; + +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t numOnce = {0, {0}}; +static sharedInt_t numThreads = {0, {0}}; + +typedef struct { + int threadnum; + int oncenum; + int myPrio; + HANDLE w32Thread; +} bag_t; + +static bag_t threadbag[NUM_THREADS][NUM_ONCE]; + +CRITICAL_SECTION print_lock; + +void +mycleanupfunc(void * arg) +{ + bag_t * bag = (bag_t *) arg; + EnterCriticalSection(&print_lock); + /* once thrd prio error */ + printf("%4d %4d %4d %4d\n", + bag->oncenum, + bag->threadnum, + bag->myPrio, + bag->myPrio - GetThreadPriority(bag->w32Thread)); + LeaveCriticalSection(&print_lock); +} + +void +myinitfunc(void) +{ + EnterCriticalSection(&numOnce.cs); + numOnce.i++; + LeaveCriticalSection(&numOnce.cs); + /* Simulate slow once routine so that following threads pile up behind it */ + Sleep(10); + /* test for cancelation late so we're sure to have waiters. */ + pthread_testcancel(); +} + +void * +mythread(void * arg) +{ + bag_t * bag = (bag_t *) arg; + struct sched_param param; + + /* + * Cancel every thread. These threads are deferred cancelable only, so + * only the thread performing the init_routine will see it (there are + * no other cancelation points here). The result will be that every thread + * eventually cancels only when it becomes the new initter. + */ + pthread_t self = pthread_self(); + bag->w32Thread = pthread_getw32threadhandle_np(self); + /* + * Set priority between -2 and 2 inclusive. + */ + bag->myPrio = (bag->threadnum % 5) - 2; + param.sched_priority = bag->myPrio; + pthread_setschedparam(self, SCHED_OTHER, ¶m); + + /* Trigger a cancellation at the next cancellation point in this thread */ + pthread_cancel(self); +#if 0 + pthread_cleanup_push(mycleanupfunc, arg); + assert(pthread_once(&once[bag->oncenum], myinitfunc) == 0); + pthread_cleanup_pop(1); +#else + assert(pthread_once(&once[bag->oncenum], myinitfunc) == 0); +#endif + EnterCriticalSection(&numThreads.cs); + numThreads.i++; + LeaveCriticalSection(&numThreads.cs); + return 0; +} + +int +main() +{ + pthread_t t[NUM_THREADS][NUM_ONCE]; + int i, j; + + InitializeCriticalSection(&print_lock); + InitializeCriticalSection(&numThreads.cs); + InitializeCriticalSection(&numOnce.cs); + +#if 0 + /* once thrd prio change */ + printf("once thrd prio error\n"); +#endif + + /* + * Set the priority class to realtime - otherwise normal + * Windows random priority boosting will obscure any problems. + */ + SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); + /* Set main thread to lower prio than threads */ + SetThreadPriority(GetCurrentThread(), -2); + + for (j = 0; j < NUM_ONCE; j++) + { + once[j] = o; + + for (i = 0; i < NUM_THREADS; i++) + { + bag_t * bag = &threadbag[i][j]; + bag->threadnum = i; + bag->oncenum = j; + assert(pthread_create(&t[i][j], NULL, mythread, (void *) bag) == 0); + } + } + + for (j = 0; j < NUM_ONCE; j++) + for (i = 0; i < NUM_THREADS; i++) + if (pthread_join(t[i][j], NULL) != 0) + printf("Join failed for [thread,once] = [%d,%d]\n", i, j); + + /* + * All threads will cancel, none will return normally from + * pthread_once and so numThreads should never be incremented. However, + * numOnce should be incremented by every thread (NUM_THREADS*NUM_ONCE). + */ + assert(numOnce.i == NUM_ONCE * NUM_THREADS); + assert(numThreads.i == 0); + + DeleteCriticalSection(&numOnce.cs); + DeleteCriticalSection(&numThreads.cs); + DeleteCriticalSection(&print_lock); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/priority1.c b/win32/3rdparty/pthreads/tests/priority1.c new file mode 100644 index 000000000..c270e998a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/priority1.c @@ -0,0 +1,172 @@ +/* + * File: priority1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test thread priority explicit setting using thread attribute. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +enum { + PTW32TEST_THREAD_INIT_PRIO = 0, + PTW32TEST_MAXPRIORITIES = 512 +}; + +int minPrio; +int maxPrio; +int validPriorities[PTW32TEST_MAXPRIORITIES]; + +void * +func(void * arg) +{ + int policy; + struct sched_param param; + pthread_t threadID = pthread_self(); + + assert(pthread_getschedparam(threadID, &policy, ¶m) == 0); + assert(policy == SCHED_OTHER); + return (void *) (param.sched_priority); +} + +void * +getValidPriorities(void * arg) +{ + int prioSet; + pthread_t threadID = pthread_self(); + HANDLE threadH = pthread_getw32threadhandle_np(threadID); + + printf("Using GetThreadPriority\n"); + printf("%10s %10s\n", "Set value", "Get value"); + + for (prioSet = minPrio; + prioSet <= maxPrio; + prioSet++) + { + /* + * If prioSet is invalid then the threads priority is unchanged + * from the previous value. Make the previous value a known + * one so that we can check later. + */ + if (prioSet < 0) + SetThreadPriority(threadH, THREAD_PRIORITY_LOWEST); + else + SetThreadPriority(threadH, THREAD_PRIORITY_HIGHEST); + SetThreadPriority(threadH, prioSet); + validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)] = GetThreadPriority(threadH); + printf("%10d %10d\n", prioSet, validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)]); + } + + return (void *) 0; +} + + +int +main() +{ + pthread_t t; + pthread_attr_t attr; + void * result = NULL; + struct sched_param param; + + assert((maxPrio = sched_get_priority_max(SCHED_OTHER)) != -1); + assert((minPrio = sched_get_priority_min(SCHED_OTHER)) != -1); + + assert(pthread_create(&t, NULL, getValidPriorities, NULL) == 0); + assert(pthread_join(t, &result) == 0); + + assert(pthread_attr_init(&attr) == 0); + assert(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0); + + /* Set the thread's priority to a known initial value. */ + SetThreadPriority(pthread_getw32threadhandle_np(pthread_self()), + PTW32TEST_THREAD_INIT_PRIO); + + printf("Using pthread_getschedparam\n"); + printf("%10s %10s %10s\n", "Set value", "Get value", "Win priority"); + + for (param.sched_priority = minPrio; + param.sched_priority <= maxPrio; + param.sched_priority++) + { + int prio; + + assert(pthread_attr_setschedparam(&attr, ¶m) == 0); + assert(pthread_create(&t, &attr, func, (void *) &attr) == 0); + + assert((prio = GetThreadPriority(pthread_getw32threadhandle_np(t))) + == validPriorities[param.sched_priority+(PTW32TEST_MAXPRIORITIES/2)]); + + assert(pthread_join(t, &result) == 0); + + assert(param.sched_priority == (int) result); + printf("%10d %10d %10d\n", param.sched_priority, (int) result, prio); + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/priority2.c b/win32/3rdparty/pthreads/tests/priority2.c new file mode 100644 index 000000000..a5575abe9 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/priority2.c @@ -0,0 +1,169 @@ +/* + * File: priority2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test thread priority setting after creation. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +enum { + PTW32TEST_THREAD_INIT_PRIO = 0, + PTW32TEST_MAXPRIORITIES = 512 +}; + +int minPrio; +int maxPrio; +int validPriorities[PTW32TEST_MAXPRIORITIES]; +pthread_barrier_t startBarrier, endBarrier; + +void * func(void * arg) +{ + int policy; + int result; + struct sched_param param; + + result = pthread_barrier_wait(&startBarrier); + assert(result == 0 || result == PTHREAD_BARRIER_SERIAL_THREAD); + assert(pthread_getschedparam(pthread_self(), &policy, ¶m) == 0); + assert(policy == SCHED_OTHER); + result = pthread_barrier_wait(&endBarrier); + assert(result == 0 || result == PTHREAD_BARRIER_SERIAL_THREAD); + return (void *) param.sched_priority; +} + + +void * +getValidPriorities(void * arg) +{ + int prioSet; + pthread_t thread = pthread_self(); + HANDLE threadH = pthread_getw32threadhandle_np(thread); + struct sched_param param; + + for (prioSet = minPrio; + prioSet <= maxPrio; + prioSet++) + { + /* + * If prioSet is invalid then the threads priority is unchanged + * from the previous value. Make the previous value a known + * one so that we can check later. + */ + param.sched_priority = prioSet; + assert(pthread_setschedparam(thread, SCHED_OTHER, ¶m) == 0); + validPriorities[prioSet+(PTW32TEST_MAXPRIORITIES/2)] = GetThreadPriority(threadH); + } + + return (void *) 0; +} + + +int +main() +{ + pthread_t t; + void * result = NULL; + int result2; + struct sched_param param; + + assert((maxPrio = sched_get_priority_max(SCHED_OTHER)) != -1); + assert((minPrio = sched_get_priority_min(SCHED_OTHER)) != -1); + + assert(pthread_create(&t, NULL, getValidPriorities, NULL) == 0); + assert(pthread_join(t, &result) == 0); + + assert(pthread_barrier_init(&startBarrier, NULL, 2) == 0); + assert(pthread_barrier_init(&endBarrier, NULL, 2) == 0); + + /* Set the thread's priority to a known initial value. + * If the new priority is invalid then the threads priority + * is unchanged from the previous value. + */ + SetThreadPriority(pthread_getw32threadhandle_np(pthread_self()), + PTW32TEST_THREAD_INIT_PRIO); + + for (param.sched_priority = minPrio; + param.sched_priority <= maxPrio; + param.sched_priority++) + { + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_setschedparam(t, SCHED_OTHER, ¶m) == 0); + result2 = pthread_barrier_wait(&startBarrier); + assert(result2 == 0 || result2 == PTHREAD_BARRIER_SERIAL_THREAD); + result2 = pthread_barrier_wait(&endBarrier); + assert(result2 == 0 || result2 == PTHREAD_BARRIER_SERIAL_THREAD); + assert(GetThreadPriority(pthread_getw32threadhandle_np(t)) == + validPriorities[param.sched_priority+(PTW32TEST_MAXPRIORITIES/2)]); + pthread_join(t, &result); + assert(param.sched_priority == (int)result); + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/reuse1.c b/win32/3rdparty/pthreads/tests/reuse1.c new file mode 100644 index 000000000..ae9efe400 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/reuse1.c @@ -0,0 +1,124 @@ +/* + * File: reuse1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Confirm that thread reuse works for joined threads. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +enum { + NUMTHREADS = 100 +}; + +static int washere = 0; + +void * func(void * arg) +{ + washere = 1; + return arg; +} + +int +main() +{ + pthread_t t, + last_t; + pthread_attr_t attr; + void * result = NULL; + int i; + + assert(pthread_attr_init(&attr) == 0);; + assert(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE) == 0); + + washere = 0; + assert(pthread_create(&t, &attr, func, NULL) == 0); + assert(pthread_join(t, &result) == 0);; + assert(result == 0); + assert(washere == 1); + last_t = t; + + for (i = 1; i < NUMTHREADS; i++) + { + washere = 0; + assert(pthread_create(&t, &attr, func, (void *) i) == 0); + pthread_join(t, &result); + assert((int) result == i); + assert(washere == 1); + /* thread IDs should be unique */ + assert(!pthread_equal(t, last_t)); + /* thread struct pointers should be the same */ + assert(t.p == last_t.p); + /* thread handle reuse counter should be different by one */ + assert(t.x == last_t.x+1); + last_t = t; + } + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/reuse2.c b/win32/3rdparty/pthreads/tests/reuse2.c new file mode 100644 index 000000000..c4db81199 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/reuse2.c @@ -0,0 +1,167 @@ +/* + * File: reuse2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test that thread reuse works for detached threads. + * - Analyse thread struct reuse. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - This test is implementation specific + * because it uses knowledge of internals that should be + * opaque to an application. + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +/* + */ + +enum { + NUMTHREADS = 10000 +}; + + +static long done = 0; + +void * func(void * arg) +{ + sched_yield(); + + InterlockedIncrement(&done); + + return (void *) 0; +} + +int +main() +{ + pthread_t t[NUMTHREADS]; + pthread_attr_t attr; + int i; + unsigned int notUnique = 0, + totalHandles = 0, + reuseMax = 0, + reuseMin = NUMTHREADS; + + assert(pthread_attr_init(&attr) == 0); + assert(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0); + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(&t[i], &attr, func, NULL) == 0); + } + + while (NUMTHREADS > InterlockedExchangeAdd((LPLONG)&done, 0L)) + Sleep(100); + + Sleep(100); + + /* + * Analyse reuse by computing min and max number of times pthread_create() + * returned the same pthread_t value. + */ + for (i = 0; i < NUMTHREADS; i++) + { + if (t[i].p != NULL) + { + unsigned int j, thisMax; + + thisMax = t[i].x; + + for (j = i+1; j < NUMTHREADS; j++) + if (t[i].p == t[j].p) + { + if (t[i].x == t[j].x) + notUnique++; + if (thisMax < t[j].x) + thisMax = t[j].x; + t[j].p = NULL; + } + + if (reuseMin > thisMax) + reuseMin = thisMax; + + if (reuseMax < thisMax) + reuseMax = thisMax; + } + } + + for (i = 0; i < NUMTHREADS; i++) + if (t[i].p != NULL) + totalHandles++; + + /* + * pthread_t reuse counts start at 0, so we need to add 1 + * to the max and min values derived above. + */ + printf("For %d total threads:\n", NUMTHREADS); + printf("Non-unique IDs = %d\n", notUnique); + printf("Reuse maximum = %d\n", reuseMax + 1); + printf("Reuse minimum = %d\n", reuseMin + 1); + printf("Total handles = %d\n", totalHandles); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock1.c b/win32/3rdparty/pthreads/tests/rwlock1.c new file mode 100644 index 000000000..3d08ac993 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock1.c @@ -0,0 +1,61 @@ +/* + * rwlock1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create a simple rwlock object and then destroy it. + * + * Depends on API functions: + * pthread_rwlock_init() + * pthread_rwlock_destroy() + */ + +#include "test.h" + +pthread_rwlock_t rwlock = NULL; + +int +main() +{ + assert(rwlock == NULL); + + assert(pthread_rwlock_init(&rwlock, NULL) == 0); + + assert(rwlock != NULL); + + assert(pthread_rwlock_destroy(&rwlock) == 0); + + assert(rwlock == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock2.c b/win32/3rdparty/pthreads/tests/rwlock2.c new file mode 100644 index 000000000..07518ebde --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock2.c @@ -0,0 +1,66 @@ +/* + * rwlock2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, lock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_rdlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" + +pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; + +int +main() +{ + assert(rwlock == PTHREAD_RWLOCK_INITIALIZER); + + assert(pthread_rwlock_rdlock(&rwlock) == 0); + + assert(rwlock != PTHREAD_RWLOCK_INITIALIZER); + + assert(rwlock != NULL); + + assert(pthread_rwlock_unlock(&rwlock) == 0); + + assert(pthread_rwlock_destroy(&rwlock) == 0); + + assert(rwlock == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock2_t.c b/win32/3rdparty/pthreads/tests/rwlock2_t.c new file mode 100644 index 000000000..8e6ab6da0 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock2_t.c @@ -0,0 +1,78 @@ +/* + * rwlock2_t.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, timed-lock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_timedrdlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" +#include + +pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; + +int +main() +{ + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(rwlock == PTHREAD_RWLOCK_INITIALIZER); + + assert(pthread_rwlock_timedrdlock(&rwlock, &abstime) == 0); + + assert(rwlock != PTHREAD_RWLOCK_INITIALIZER); + + assert(rwlock != NULL); + + assert(pthread_rwlock_unlock(&rwlock) == 0); + + assert(pthread_rwlock_destroy(&rwlock) == 0); + + assert(rwlock == NULL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock3.c b/win32/3rdparty/pthreads/tests/rwlock3.c new file mode 100644 index 000000000..4b22c5a16 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock3.c @@ -0,0 +1,76 @@ +/* + * rwlock3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, wrlock it, trywrlock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_wrlock() + * pthread_rwlock_trywrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" + +pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_rwlock_trywrlock(&rwlock1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_rwlock_wrlock(&rwlock1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + Sleep(2000); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock3_t.c b/win32/3rdparty/pthreads/tests/rwlock3_t.c new file mode 100644 index 000000000..bc45abc4d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock3_t.c @@ -0,0 +1,87 @@ +/* + * rwlock3_t.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, timed-wrlock it, trywrlock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_timedwrlock() + * pthread_rwlock_trywrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" +#include + +pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_rwlock_trywrlock(&rwlock1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_rwlock_timedwrlock(&rwlock1, &abstime) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + Sleep(2000); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock4.c b/win32/3rdparty/pthreads/tests/rwlock4.c new file mode 100644 index 000000000..edd9dc2c3 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock4.c @@ -0,0 +1,76 @@ +/* + * rwlock4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, rdlock it, trywrlock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_rdlock() + * pthread_rwlock_trywrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" + +pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_rwlock_trywrlock(&rwlock1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_rwlock_rdlock(&rwlock1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + Sleep(2000); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock4_t.c b/win32/3rdparty/pthreads/tests/rwlock4_t.c new file mode 100644 index 000000000..37ec34fa3 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock4_t.c @@ -0,0 +1,87 @@ +/* + * rwlock4_t.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, timed-rdlock it, trywrlock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_timedrdlock() + * pthread_rwlock_trywrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" +#include + +pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_rwlock_trywrlock(&rwlock1) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + Sleep(2000); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock5.c b/win32/3rdparty/pthreads/tests/rwlock5.c new file mode 100644 index 000000000..75b82f32a --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock5.c @@ -0,0 +1,78 @@ +/* + * rwlock5.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, rdlock it, tryrdlock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_rdlock() + * pthread_rwlock_tryrdlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" + +pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_rwlock_tryrdlock(&rwlock1) == 0); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_rwlock_rdlock(&rwlock1) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + Sleep(2000); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock5_t.c b/win32/3rdparty/pthreads/tests/rwlock5_t.c new file mode 100644 index 000000000..bf473a40e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock5_t.c @@ -0,0 +1,89 @@ +/* + * rwlock5_t.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static rwlock object, timed-rdlock it, tryrdlock it, + * and then unlock it again. + * + * Depends on API functions: + * pthread_rwlock_timedrdlock() + * pthread_rwlock_tryrdlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" +#include + +pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_rwlock_tryrdlock(&rwlock1) == 0); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + Sleep(2000); + + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock6.c b/win32/3rdparty/pthreads/tests/rwlock6.c new file mode 100644 index 000000000..22d10db42 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock6.c @@ -0,0 +1,101 @@ +/* + * rwlock6.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Check writer and reader locking + * + * Depends on API functions: + * pthread_rwlock_rdlock() + * pthread_rwlock_wrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" + +static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int bankAccount = 0; + +void * wrfunc(void * arg) +{ + int ba; + + assert(pthread_rwlock_wrlock(&rwlock1) == 0); + Sleep(2000); + bankAccount += 10; + ba = bankAccount; + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + return ((void *) ba); +} + +void * rdfunc(void * arg) +{ + int ba; + + assert(pthread_rwlock_rdlock(&rwlock1) == 0); + ba = bankAccount; + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + return ((void *) ba); +} + +int +main() +{ + pthread_t wrt1; + pthread_t wrt2; + pthread_t rdt; + int wr1Result = 0; + int wr2Result = 0; + int rdResult = 0; + + bankAccount = 0; + + assert(pthread_create(&wrt1, NULL, wrfunc, NULL) == 0); + Sleep(500); + assert(pthread_create(&rdt, NULL, rdfunc, NULL) == 0); + Sleep(500); + assert(pthread_create(&wrt2, NULL, wrfunc, NULL) == 0); + + assert(pthread_join(wrt1, (void **) &wr1Result) == 0); + assert(pthread_join(rdt, (void **) &rdResult) == 0); + assert(pthread_join(wrt2, (void **) &wr2Result) == 0); + + assert(wr1Result == 10); + assert(rdResult == 10); + assert(wr2Result == 20); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock6_t.c b/win32/3rdparty/pthreads/tests/rwlock6_t.c new file mode 100644 index 000000000..aa38bf564 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock6_t.c @@ -0,0 +1,126 @@ +/* + * rwlock6_t.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Check writer and reader locking with reader timeouts + * + * Depends on API functions: + * pthread_rwlock_timedrdlock() + * pthread_rwlock_wrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" +#include + +static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int bankAccount = 0; + +void * wrfunc(void * arg) +{ + assert(pthread_rwlock_wrlock(&rwlock1) == 0); + Sleep(2000); + bankAccount += 10; + assert(pthread_rwlock_unlock(&rwlock1) == 0); + + return ((void *) bankAccount); +} + +void * rdfunc(void * arg) +{ + int ba = -1; + struct timespec abstime = { 0, 0 }; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + + if ((int) arg == 1) + { + abstime.tv_sec += 1; + assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == ETIMEDOUT); + ba = 0; + } + else if ((int) arg == 2) + { + abstime.tv_sec += 3; + assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == 0); + ba = bankAccount; + assert(pthread_rwlock_unlock(&rwlock1) == 0); + } + + return ((void *) ba); +} + +int +main() +{ + pthread_t wrt1; + pthread_t wrt2; + pthread_t rdt1; + pthread_t rdt2; + int wr1Result = 0; + int wr2Result = 0; + int rd1Result = 0; + int rd2Result = 0; + + bankAccount = 0; + + assert(pthread_create(&wrt1, NULL, wrfunc, NULL) == 0); + Sleep(500); + assert(pthread_create(&rdt1, NULL, rdfunc, (void *) 1) == 0); + Sleep(500); + assert(pthread_create(&wrt2, NULL, wrfunc, NULL) == 0); + Sleep(500); + assert(pthread_create(&rdt2, NULL, rdfunc, (void *) 2) == 0); + + assert(pthread_join(wrt1, (void **) &wr1Result) == 0); + assert(pthread_join(rdt1, (void **) &rd1Result) == 0); + assert(pthread_join(wrt2, (void **) &wr2Result) == 0); + assert(pthread_join(rdt2, (void **) &rd2Result) == 0); + + assert(wr1Result == 10); + assert(rd1Result == 0); + assert(wr2Result == 20); + assert(rd2Result == 20); + + return 0; +} + + diff --git a/win32/3rdparty/pthreads/tests/rwlock6_t2.c b/win32/3rdparty/pthreads/tests/rwlock6_t2.c new file mode 100644 index 000000000..58bfc3d94 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock6_t2.c @@ -0,0 +1,119 @@ +/* + * rwlock6_t2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Check writer and reader timeouts. + * + * Depends on API functions: + * pthread_rwlock_timedrdlock() + * pthread_rwlock_timedwrlock() + * pthread_rwlock_unlock() + */ + +#include "test.h" +#include + +static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; + +static int bankAccount = 0; +struct timespec abstime = { 0, 0 }; + +void * wrfunc(void * arg) +{ + int result; + + result = pthread_rwlock_timedwrlock(&rwlock1, &abstime); + if ((int) arg == 1) + { + assert(result == 0); + Sleep(2000); + bankAccount += 10; + assert(pthread_rwlock_unlock(&rwlock1) == 0); + return ((void *) bankAccount); + } + else if ((int) arg == 2) + { + assert(result == ETIMEDOUT); + return ((void *) 100); + } + + return ((void *) -1); +} + +void * rdfunc(void * arg) +{ + int ba = 0; + + assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == ETIMEDOUT); + + return ((void *) ba); +} + +int +main() +{ + pthread_t wrt1; + pthread_t wrt2; + pthread_t rdt; + int wr1Result = 0; + int wr2Result = 0; + int rdResult = 0; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + + _ftime(&currSysTime); + + abstime.tv_sec = currSysTime.time; + abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + + abstime.tv_sec += 1; + + bankAccount = 0; + + assert(pthread_create(&wrt1, NULL, wrfunc, (void *) 1) == 0); + Sleep(100); + assert(pthread_create(&rdt, NULL, rdfunc, NULL) == 0); + Sleep(100); + assert(pthread_create(&wrt2, NULL, wrfunc, (void *) 2) == 0); + + assert(pthread_join(wrt1, (void **) &wr1Result) == 0); + assert(pthread_join(rdt, (void **) &rdResult) == 0); + assert(pthread_join(wrt2, (void **) &wr2Result) == 0); + + assert(wr1Result == 10); + assert(rdResult == 0); + assert(wr2Result == 100); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock7.c b/win32/3rdparty/pthreads/tests/rwlock7.c new file mode 100644 index 000000000..91466e4de --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock7.c @@ -0,0 +1,199 @@ +/* + * rwlock7.c + * + * Hammer on a bunch of rwlocks to test robustness and fairness. + * Printed stats should be roughly even for each thread. + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#define THREADS 5 +#define DATASIZE 7 +#define ITERATIONS 1000000 + +/* + * Keep statistics for each thread. + */ +typedef struct thread_tag { + int thread_num; + pthread_t thread_id; + int updates; + int reads; + int changed; + int seed; +} thread_t; + +/* + * Read-write lock and shared data + */ +typedef struct data_tag { + pthread_rwlock_t lock; + int data; + int updates; +} data_t; + +static thread_t threads[THREADS]; +static data_t data[DATASIZE]; + +/* + * Thread start routine that uses read-write locks + */ +void *thread_routine (void *arg) +{ + thread_t *self = (thread_t*)arg; + int iteration; + int element = 0; + int seed = self->seed; + int interval = 1 + rand_r (&seed) % 71; + + self->changed = 0; + + for (iteration = 0; iteration < ITERATIONS; iteration++) + { + if (iteration % (ITERATIONS / 10) == 0) + { + putchar('.'); + fflush(stdout); + } + /* + * Each "self->interval" iterations, perform an + * update operation (write lock instead of read + * lock). + */ + if ((iteration % interval) == 0) + { + assert(pthread_rwlock_wrlock (&data[element].lock) == 0); + data[element].data = self->thread_num; + data[element].updates++; + self->updates++; + interval = 1 + rand_r (&seed) % 71; + assert(pthread_rwlock_unlock (&data[element].lock) == 0); + } else { + /* + * Look at the current data element to see whether + * the current thread last updated it. Count the + * times, to report later. + */ + assert(pthread_rwlock_rdlock (&data[element].lock) == 0); + + self->reads++; + + if (data[element].data != self->thread_num) + { + self->changed++; + interval = 1 + self->changed % 71; + } + + assert(pthread_rwlock_unlock (&data[element].lock) == 0); + } + + element = (element + 1) % DATASIZE; + + } + + return NULL; +} + +int +main (int argc, char *argv[]) +{ + int count; + int data_count; + int thread_updates = 0; + int data_updates = 0; + int seed = 1; + + struct _timeb currSysTime1; + struct _timeb currSysTime2; + + /* + * Initialize the shared data. + */ + for (data_count = 0; data_count < DATASIZE; data_count++) + { + data[data_count].data = 0; + data[data_count].updates = 0; + + assert(pthread_rwlock_init (&data[data_count].lock, NULL) == 0); + } + + _ftime(&currSysTime1); + + /* + * Create THREADS threads to access shared data. + */ + for (count = 0; count < THREADS; count++) + { + threads[count].thread_num = count; + threads[count].updates = 0; + threads[count].reads = 0; + threads[count].seed = 1 + rand_r (&seed) % 71; + + assert(pthread_create (&threads[count].thread_id, + NULL, thread_routine, (void*)&threads[count]) == 0); + } + + /* + * Wait for all threads to complete, and collect + * statistics. + */ + for (count = 0; count < THREADS; count++) + { + assert(pthread_join (threads[count].thread_id, NULL) == 0); + } + + putchar('\n'); + fflush(stdout); + + for (count = 0; count < THREADS; count++) + { + if (threads[count].changed > 0) + { + printf ("Thread %d found changed elements %d times\n", + count, threads[count].changed); + } + } + + putchar('\n'); + fflush(stdout); + + for (count = 0; count < THREADS; count++) + { + thread_updates += threads[count].updates; + printf ("%02d: seed %d, updates %d, reads %d\n", + count, threads[count].seed, + threads[count].updates, threads[count].reads); + } + + putchar('\n'); + fflush(stdout); + + /* + * Collect statistics for the data. + */ + for (data_count = 0; data_count < DATASIZE; data_count++) + { + data_updates += data[data_count].updates; + printf ("data %02d: value %d, %d updates\n", + data_count, data[data_count].data, data[data_count].updates); + assert(pthread_rwlock_destroy (&data[data_count].lock) == 0); + } + + printf ("%d thread updates, %d data updates\n", + thread_updates, data_updates); + + _ftime(&currSysTime2); + + printf( "\nstart: %ld/%d, stop: %ld/%d, duration:%ld\n", + currSysTime1.time,currSysTime1.millitm, + currSysTime2.time,currSysTime2.millitm, + (currSysTime2.time*1000+currSysTime2.millitm) - + (currSysTime1.time*1000+currSysTime1.millitm)); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/rwlock8.c b/win32/3rdparty/pthreads/tests/rwlock8.c new file mode 100644 index 000000000..c83a775ce --- /dev/null +++ b/win32/3rdparty/pthreads/tests/rwlock8.c @@ -0,0 +1,205 @@ +/* + * rwlock8.c + * + * Hammer on a bunch of rwlocks to test robustness and fairness. + * Printed stats should be roughly even for each thread. + * + * Yield during each access to exercise lock contention code paths + * more than rwlock7.c does (particularly on uni-processor systems). + */ + +#include "test.h" +#include + +#ifdef __GNUC__ +#include +#endif + +#define THREADS 5 +#define DATASIZE 7 +#define ITERATIONS 100000 + +/* + * Keep statistics for each thread. + */ +typedef struct thread_tag { + int thread_num; + pthread_t thread_id; + int updates; + int reads; + int changed; + int seed; +} thread_t; + +/* + * Read-write lock and shared data + */ +typedef struct data_tag { + pthread_rwlock_t lock; + int data; + int updates; +} data_t; + +static thread_t threads[THREADS]; +static data_t data[DATASIZE]; + +/* + * Thread start routine that uses read-write locks + */ +void *thread_routine (void *arg) +{ + thread_t *self = (thread_t*)arg; + int iteration; + int element = 0; + int seed = self->seed; + int interval = 1 + rand_r (&seed) % 71; + + self->changed = 0; + + for (iteration = 0; iteration < ITERATIONS; iteration++) + { + if (iteration % (ITERATIONS / 10) == 0) + { + putchar('.'); + fflush(stdout); + } + /* + * Each "self->interval" iterations, perform an + * update operation (write lock instead of read + * lock). + */ + if ((iteration % interval) == 0) + { + assert(pthread_rwlock_wrlock (&data[element].lock) == 0); + data[element].data = self->thread_num; + data[element].updates++; + self->updates++; + interval = 1 + rand_r (&seed) % 71; + sched_yield(); + assert(pthread_rwlock_unlock (&data[element].lock) == 0); + } else { + /* + * Look at the current data element to see whether + * the current thread last updated it. Count the + * times, to report later. + */ + assert(pthread_rwlock_rdlock (&data[element].lock) == 0); + + self->reads++; + + if (data[element].data != self->thread_num) + { + self->changed++; + interval = 1 + self->changed % 71; + } + + sched_yield(); + + assert(pthread_rwlock_unlock (&data[element].lock) == 0); + } + + element = (element + 1) % DATASIZE; + + } + + return NULL; +} + +int +main (int argc, char *argv[]) +{ + int count; + int data_count; + int thread_updates = 0; + int data_updates = 0; + int seed = 1; + + struct _timeb currSysTime1; + struct _timeb currSysTime2; + + /* + * Initialize the shared data. + */ + for (data_count = 0; data_count < DATASIZE; data_count++) + { + data[data_count].data = 0; + data[data_count].updates = 0; + + assert(pthread_rwlock_init (&data[data_count].lock, NULL) == 0); + } + + _ftime(&currSysTime1); + + /* + * Create THREADS threads to access shared data. + */ + for (count = 0; count < THREADS; count++) + { + threads[count].thread_num = count; + threads[count].updates = 0; + threads[count].reads = 0; + threads[count].seed = 1 + rand_r (&seed) % 71; + + assert(pthread_create (&threads[count].thread_id, + NULL, thread_routine, (void*)&threads[count]) == 0); + } + + /* + * Wait for all threads to complete, and collect + * statistics. + */ + for (count = 0; count < THREADS; count++) + { + assert(pthread_join (threads[count].thread_id, NULL) == 0); + } + + putchar('\n'); + fflush(stdout); + + for (count = 0; count < THREADS; count++) + { + if (threads[count].changed > 0) + { + printf ("Thread %d found changed elements %d times\n", + count, threads[count].changed); + } + } + + putchar('\n'); + fflush(stdout); + + for (count = 0; count < THREADS; count++) + { + thread_updates += threads[count].updates; + printf ("%02d: seed %d, updates %d, reads %d\n", + count, threads[count].seed, + threads[count].updates, threads[count].reads); + } + + putchar('\n'); + fflush(stdout); + + /* + * Collect statistics for the data. + */ + for (data_count = 0; data_count < DATASIZE; data_count++) + { + data_updates += data[data_count].updates; + printf ("data %02d: value %d, %d updates\n", + data_count, data[data_count].data, data[data_count].updates); + assert(pthread_rwlock_destroy (&data[data_count].lock) == 0); + } + + printf ("%d thread updates, %d data updates\n", + thread_updates, data_updates); + + _ftime(&currSysTime2); + + printf( "\nstart: %ld/%d, stop: %ld/%d, duration:%ld\n", + currSysTime1.time,currSysTime1.millitm, + currSysTime2.time,currSysTime2.millitm, + (currSysTime2.time*1000+currSysTime2.millitm) - + (currSysTime1.time*1000+currSysTime1.millitm)); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/self1.c b/win32/3rdparty/pthreads/tests/self1.c new file mode 100644 index 000000000..59498d97e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/self1.c @@ -0,0 +1,69 @@ +/* + * self1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test for pthread_self(). + * + * Depends on API functions: + * pthread_self() + * + * Implicitly depends on: + * pthread_getspecific() + * pthread_setspecific() + */ + +#include "test.h" + +int +main(int argc, char * argv[]) +{ + /* + * This should always succeed unless the system has no + * resources (memory) left. + */ + pthread_t self; + +#ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); +#endif + + self = pthread_self(); + + assert(self.p != NULL); + +#ifdef PTW32_STATIC_LIB + pthread_win32_process_detach_np(); +#endif + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/self2.c b/win32/3rdparty/pthreads/tests/self2.c new file mode 100644 index 000000000..28e57252e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/self2.c @@ -0,0 +1,73 @@ +/* + * self2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test for pthread_self(). + * + * Depends on API functions: + * pthread_create() + * pthread_self() + * + * Implicitly depends on: + * pthread_getspecific() + * pthread_setspecific() + */ + +#include "test.h" +#include + +static pthread_t me; + +void * +entry(void * arg) +{ + me = pthread_self(); + + return arg; +} + +int +main() +{ + pthread_t t; + + assert(pthread_create(&t, NULL, entry, NULL) == 0); + + Sleep(100); + + assert(pthread_equal(t, me) != 0); + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/semaphore1.c b/win32/3rdparty/pthreads/tests/semaphore1.c new file mode 100644 index 000000000..f89a43081 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/semaphore1.c @@ -0,0 +1,161 @@ +/* + * File: semaphore1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Verify trywait() returns -1 and sets EAGAIN. + * - + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +void * +thr(void * arg) +{ + sem_t s; + int result; + + assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + + assert((result = sem_trywait(&s)) == -1); + + if ( result == -1 ) + { + int err = errno; + printf("thread: sem_trywait 1: expecting error %s: got %s\n", + error_string[EAGAIN], error_string[err]); fflush(stdout); + assert(err == EAGAIN); + } + else + { + printf("thread: ok 1\n"); + } + + assert((result = sem_post(&s)) == 0); + + assert((result = sem_trywait(&s)) == 0); + + if ( result == -1 ) + { + perror("thread: sem_trywait 2"); + } + else + { + printf("thread: ok 2\n"); + } + + assert(sem_post(&s) == 0); + + return 0; +} + + +int +main() +{ + pthread_t t; + sem_t s; + int result; + + assert(pthread_create(&t, NULL, thr, NULL) == 0); + assert(pthread_join(t, (void **)&result) == 0); + assert(result == 0); + + assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + + assert((result = sem_trywait(&s)) == -1); + + if ( result == -1 ) + { + int err = errno; + printf("main: sem_trywait 1: expecting error %s: got %s\n", + error_string[EAGAIN], error_string[err]); fflush(stdout); + assert(err == EAGAIN); + } + else + { + printf("main: ok 1\n"); + } + + assert((result = sem_post(&s)) == 0); + + assert((result = sem_trywait(&s)) == 0); + + if ( result == -1 ) + { + perror("main: sem_trywait 2"); + } + else + { + printf("main: ok 2\n"); + } + + assert(sem_post(&s) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/semaphore2.c b/win32/3rdparty/pthreads/tests/semaphore2.c new file mode 100644 index 000000000..af4d0ea70 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/semaphore2.c @@ -0,0 +1,108 @@ +/* + * File: semaphore2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Verify sem_getvalue returns the correct value. + * - + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +#define MAX_COUNT 100 + +int +main() +{ + sem_t s; + int value = 0; + int i; + + assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, MAX_COUNT) == 0); + assert(sem_getvalue(&s, &value) == 0); + assert(value == MAX_COUNT); +// printf("Value = %ld\n", value); + + for (i = MAX_COUNT - 1; i >= 0; i--) + { + assert(sem_wait(&s) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %ld\n", value); + assert(value == i); + } + + for (i = 1; i <= MAX_COUNT; i++) + { + assert(sem_post(&s) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %ld\n", value); + assert(value == i); + } + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/semaphore3.c b/win32/3rdparty/pthreads/tests/semaphore3.c new file mode 100644 index 000000000..a0dfcb6f6 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/semaphore3.c @@ -0,0 +1,121 @@ +/* + * File: semaphore3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Verify sem_getvalue returns the correct number of waiters. + * - + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +#define MAX_COUNT 100 + +sem_t s; + +void * +thr (void * arg) +{ + assert(sem_wait(&s) == 0); + assert(pthread_detach(pthread_self()) == 0); + return NULL; +} + +int +main() +{ + int value = 0; + int i; + pthread_t t[MAX_COUNT+1]; + + assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %d\n", value); fflush(stdout); + assert(value == 0); + + for (i = 1; i <= MAX_COUNT; i++) + { + assert(pthread_create(&t[i], NULL, thr, NULL) == 0); + do { + sched_yield(); + assert(sem_getvalue(&s, &value) == 0); + } while (value != -i); +// printf("Value = %d\n", value); fflush(stdout); + assert(-value == i); + } + + for (i = MAX_COUNT - 1; i >= 0; i--) + { + assert(sem_post(&s) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %d\n", value); fflush(stdout); + assert(-value == i); + } + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/semaphore4.c b/win32/3rdparty/pthreads/tests/semaphore4.c new file mode 100644 index 000000000..37613ac39 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/semaphore4.c @@ -0,0 +1,138 @@ +/* + * File: semaphore4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Verify sem_getvalue returns the correct number of waiters + * after threads are cancelled. + * - + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +#define MAX_COUNT 100 + +sem_t s; + +void * +thr (void * arg) +{ + assert(sem_wait(&s) == 0); + return NULL; +} + +int +main() +{ + int value = 0; + int i; + pthread_t t[MAX_COUNT+1]; + + assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %d\n", value); fflush(stdout); + assert(value == 0); + + for (i = 1; i <= MAX_COUNT; i++) + { + assert(pthread_create(&t[i], NULL, thr, NULL) == 0); + do { + sched_yield(); + assert(sem_getvalue(&s, &value) == 0); + } while (value != -i); +// printf("Value = %d\n", value); fflush(stdout); + assert(-value == i); + } + + assert(sem_getvalue(&s, &value) == 0); + assert(-value == MAX_COUNT); +//printf("value = %d\n", -value); fflush(stdout); + assert(pthread_cancel(t[50]) == 0); + { + int result; + assert(pthread_join(t[50], (void **) &result) == 0); +// printf("result = %d\n", result); fflush(stdout); + } + assert(sem_getvalue(&s, &value) == 0); +//printf("value = %d\n", -value); fflush(stdout); + assert(-value == (MAX_COUNT - 1)); + + for (i = MAX_COUNT - 2; i >= 0; i--) + { + assert(sem_post(&s) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %d\n", value); fflush(stdout); + assert(-value == i); + } + + for (i = 1; i <= MAX_COUNT; i++) + if (i != 50) + assert(pthread_join(t[i], NULL) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/semaphore4t.c b/win32/3rdparty/pthreads/tests/semaphore4t.c new file mode 100644 index 000000000..14a46694c --- /dev/null +++ b/win32/3rdparty/pthreads/tests/semaphore4t.c @@ -0,0 +1,132 @@ +/* + * File: semaphore4t.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Verify sem_getvalue returns the correct number of waiters + * after threads are cancelled. + * - + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - sem_timedwait cancellation. + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +#define MAX_COUNT 100 + +sem_t s; + +void * +thr (void * arg) +{ + assert(sem_timedwait(&s, NULL) == 0); + return NULL; +} + +int +main() +{ + int value = 0; + int i; + pthread_t t[MAX_COUNT+1]; + + assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %d\n", value); fflush(stdout); + assert(value == 0); + + for (i = 1; i <= MAX_COUNT; i++) + { + assert(pthread_create(&t[i], NULL, thr, NULL) == 0); + do { + sched_yield(); + assert(sem_getvalue(&s, &value) == 0); + } while (value != -i); +// printf("Value = %d\n", value); fflush(stdout); + assert(-value == i); + } + + assert(sem_getvalue(&s, &value) == 0); + assert(-value == MAX_COUNT); + assert(pthread_cancel(t[50]) == 0); + assert(pthread_join(t[50], NULL) == 0); + assert(sem_getvalue(&s, &value) == 0); + assert(-value == MAX_COUNT - 1); + + for (i = MAX_COUNT - 2; i >= 0; i--) + { + assert(sem_post(&s) == 0); + assert(sem_getvalue(&s, &value) == 0); +// printf("Value = %d\n", value); fflush(stdout); + assert(-value == i); + } + + for (i = 1; i <= MAX_COUNT; i++) + if (i != 50) + assert(pthread_join(t[i], NULL) == 0); + + return 0; +} + diff --git a/win32/3rdparty/pthreads/tests/sizes.c b/win32/3rdparty/pthreads/tests/sizes.c new file mode 100644 index 000000000..73c726171 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/sizes.c @@ -0,0 +1,32 @@ +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include "../implement.h" + +int +main() +{ + printf("Sizes of pthreads-win32 structs\n"); + printf("-------------------------------\n"); + printf("%30s %4d\n", "pthread_t", sizeof(pthread_t)); + printf("%30s %4d\n", "ptw32_thread_t", sizeof(ptw32_thread_t)); + printf("%30s %4d\n", "pthread_attr_t_", sizeof(struct pthread_attr_t_)); + printf("%30s %4d\n", "sem_t_", sizeof(struct sem_t_)); + printf("%30s %4d\n", "pthread_mutex_t_", sizeof(struct pthread_mutex_t_)); + printf("%30s %4d\n", "pthread_mutexattr_t_", sizeof(struct pthread_mutexattr_t_)); + printf("%30s %4d\n", "pthread_spinlock_t_", sizeof(struct pthread_spinlock_t_)); + printf("%30s %4d\n", "pthread_barrier_t_", sizeof(struct pthread_barrier_t_)); + printf("%30s %4d\n", "pthread_barrierattr_t_", sizeof(struct pthread_barrierattr_t_)); + printf("%30s %4d\n", "pthread_key_t_", sizeof(struct pthread_key_t_)); + printf("%30s %4d\n", "pthread_cond_t_", sizeof(struct pthread_cond_t_)); + printf("%30s %4d\n", "pthread_condattr_t_", sizeof(struct pthread_condattr_t_)); + printf("%30s %4d\n", "pthread_rwlock_t_", sizeof(struct pthread_rwlock_t_)); + printf("%30s %4d\n", "pthread_rwlockattr_t_", sizeof(struct pthread_rwlockattr_t_)); + printf("%30s %4d\n", "pthread_once_t_", sizeof(struct pthread_once_t_)); + printf("%30s %4d\n", "ptw32_cleanup_t", sizeof(struct ptw32_cleanup_t)); + printf("%30s %4d\n", "ptw32_mcs_node_t_", sizeof(struct ptw32_mcs_node_t_)); + printf("%30s %4d\n", "sched_param", sizeof(struct sched_param)); + printf("-------------------------------\n"); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/spin1.c b/win32/3rdparty/pthreads/tests/spin1.c new file mode 100644 index 000000000..00ecd11b1 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/spin1.c @@ -0,0 +1,59 @@ +/* + * spin1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create a simple spinlock object, lock it, and then unlock it again. + * This is the simplest test of the pthread mutex family that we can do. + * + */ + +#include "test.h" + +pthread_spinlock_t lock; + +int +main() +{ + assert(pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE) == 0); + + assert(pthread_spin_lock(&lock) == 0); + + assert(pthread_spin_unlock(&lock) == 0); + + assert(pthread_spin_destroy(&lock) == 0); + + assert(pthread_spin_lock(&lock) == EINVAL); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/spin2.c b/win32/3rdparty/pthreads/tests/spin2.c new file mode 100644 index 000000000..b13c29c4e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/spin2.c @@ -0,0 +1,75 @@ +/* + * spin2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a spinlock object, lock it, trylock it, + * and then unlock it again. + * + */ + +#include "test.h" + +pthread_spinlock_t lock = NULL; + +static int washere = 0; + +void * func(void * arg) +{ + assert(pthread_spin_trylock(&lock) == EBUSY); + + washere = 1; + + return 0; +} + +int +main() +{ + pthread_t t; + + assert(pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE) == 0); + + assert(pthread_spin_lock(&lock) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_join(t, NULL) == 0); + + assert(pthread_spin_unlock(&lock) == 0); + + assert(pthread_spin_destroy(&lock) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/spin3.c b/win32/3rdparty/pthreads/tests/spin3.c new file mode 100644 index 000000000..8c0dae69f --- /dev/null +++ b/win32/3rdparty/pthreads/tests/spin3.c @@ -0,0 +1,72 @@ +/* + * spin3.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Thread A locks spin - thread B tries to unlock. + * This should succeed, but it's undefined behaviour. + * + */ + +#include "test.h" + +static int wasHere = 0; + +static pthread_spinlock_t spin; + +void * unlocker(void * arg) +{ + int expectedResult = (int) arg; + + wasHere++; + assert(pthread_spin_unlock(&spin) == expectedResult); + wasHere++; + return NULL; +} + +int +main() +{ + pthread_t t; + + wasHere = 0; + assert(pthread_spin_init(&spin, PTHREAD_PROCESS_PRIVATE) == 0); + assert(pthread_spin_lock(&spin) == 0); + assert(pthread_create(&t, NULL, unlocker, (void *) 0) == 0); + assert(pthread_join(t, NULL) == 0); + assert(pthread_spin_unlock(&spin) == EPERM); + assert(pthread_spin_destroy(&spin) == 0); + assert(wasHere == 2); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/spin4.c b/win32/3rdparty/pthreads/tests/spin4.c new file mode 100644 index 000000000..8386d0956 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/spin4.c @@ -0,0 +1,103 @@ +/* + * spin4.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Declare a static spinlock object, lock it, spin on it, + * and then unlock it again. + */ + +#include "test.h" +#include + +pthread_spinlock_t lock = PTHREAD_SPINLOCK_INITIALIZER; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +static int washere = 0; + +void * func(void * arg) +{ + _ftime(&currSysTimeStart); + washere = 1; + assert(pthread_spin_lock(&lock) == 0); + assert(pthread_spin_unlock(&lock) == 0); + _ftime(&currSysTimeStop); + + return (void *) GetDurationMilliSecs(currSysTimeStart, currSysTimeStop); +} + +int +main() +{ + long result = 0; + pthread_t t; + int CPUs; + struct _timeb sysTime; + + if ((CPUs = pthread_num_processors_np()) == 1) + { + printf("Test not run - it requires multiple CPUs.\n"); + exit(0); + } + + assert(pthread_spin_lock(&lock) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + while (washere == 0) + { + sched_yield(); + } + + do + { + sched_yield(); + _ftime(&sysTime); + } + while (GetDurationMilliSecs(currSysTimeStart, sysTime) <= 1000); + + assert(pthread_spin_unlock(&lock) == 0); + + assert(pthread_join(t, (void **) &result) == 0); + assert(result > 1000); + + assert(pthread_spin_destroy(&lock) == 0); + + assert(washere == 1); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/stress1.c b/win32/3rdparty/pthreads/tests/stress1.c new file mode 100644 index 000000000..efaf44517 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/stress1.c @@ -0,0 +1,278 @@ +/* + * stress1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Stress test condition variables, mutexes, semaphores. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * - Correct accounting of semaphore and condition variable waiters. + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * Attempting to expose race conditions in cond vars, semaphores etc. + * - Master attempts to signal slave close to when timeout is due. + * - Master and slave do battle continuously until main tells them to stop. + * - Afterwards, the CV must be successfully destroyed (will return an + * error if there are waiters (including any internal semaphore waiters, + * which, if there are, cannot not be real waiters). + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - CV is successfully destroyed. + * + * Fail Criteria: + * - CV destroy fails. + */ + +#include "test.h" +#include +#include + + +const unsigned int ITERATIONS = 1000; + +static pthread_t master, slave; +typedef struct { + int value; + pthread_cond_t cv; + pthread_mutex_t mx; +} mysig_t; + +static int allExit; +static mysig_t control = {0, PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER}; +static pthread_barrier_t startBarrier, readyBarrier, holdBarrier; +static int timeoutCount = 0; +static int signalsTakenCount = 0; +static int signalsSent = 0; +static int bias = 0; +static int timeout = 10; // Must be > 0 + +enum { + CTL_STOP = -1 +}; + +/* + * Returns abstime 'milliseconds' from 'now'. + * + * Works for: -INT_MAX <= millisecs <= INT_MAX + */ +struct timespec * +millisecondsFromNow (struct timespec * time, int millisecs) +{ + struct _timeb currSysTime; + int64_t nanosecs, secs; + const int64_t NANOSEC_PER_MILLISEC = 1000000; + const int64_t NANOSEC_PER_SEC = 1000000000; + + /* get current system time and add millisecs */ + _ftime(&currSysTime); + + secs = (int64_t)(currSysTime.time) + (millisecs / 1000); + nanosecs = ((int64_t) (millisecs%1000 + currSysTime.millitm)) * NANOSEC_PER_MILLISEC; + if (nanosecs >= NANOSEC_PER_SEC) + { + secs++; + nanosecs -= NANOSEC_PER_SEC; + } + else if (nanosecs < 0) + { + secs--; + nanosecs += NANOSEC_PER_SEC; + } + + time->tv_nsec = (long)nanosecs; + time->tv_sec = (long)secs; + + return time; +} + +void * +masterThread (void * arg) +{ + int dither = (int) arg; + + timeout = (int) arg; + + pthread_barrier_wait(&startBarrier); + + do + { + int sleepTime; + + assert(pthread_mutex_lock(&control.mx) == 0); + control.value = timeout; + assert(pthread_mutex_unlock(&control.mx) == 0); + + /* + * We are attempting to send the signal close to when the slave + * is due to timeout. We feel around by adding some [non-random] dither. + * + * dither is in the range 2*timeout peak-to-peak + * sleep time is the average of timeout plus dither. + * e.g. + * if timeout = 10 then dither = 20 and + * sleep millisecs is: 5 <= ms <= 15 + * + * The bias value attempts to apply some negative feedback to keep + * the ratio of timeouts to signals taken close to 1:1. + * bias changes more slowly than dither so as to average more. + * + * Finally, if abs(bias) exceeds timeout then timeout is incremented. + */ + if (signalsSent % timeout == 0) + { + if (timeoutCount > signalsTakenCount) + { + bias++; + } + else if (timeoutCount < signalsTakenCount) + { + bias--; + } + if (bias < -timeout || bias > timeout) + { + timeout++; + } + } + dither = (dither + 1 ) % (timeout * 2); + sleepTime = (timeout - bias + dither) / 2; + Sleep(sleepTime); + assert(pthread_cond_signal(&control.cv) == 0); + signalsSent++; + + pthread_barrier_wait(&holdBarrier); + pthread_barrier_wait(&readyBarrier); + } + while (!allExit); + + return NULL; +} + +void * +slaveThread (void * arg) +{ + struct timespec time; + + pthread_barrier_wait(&startBarrier); + + do + { + assert(pthread_mutex_lock(&control.mx) == 0); + if (pthread_cond_timedwait(&control.cv, + &control.mx, + millisecondsFromNow(&time, control.value)) == ETIMEDOUT) + { + timeoutCount++; + } + else + { + signalsTakenCount++; + } + assert(pthread_mutex_unlock(&control.mx) == 0); + + pthread_barrier_wait(&holdBarrier); + pthread_barrier_wait(&readyBarrier); + } + while (!allExit); + + return NULL; +} + +int +main () +{ + unsigned int i; + + assert(pthread_barrier_init(&startBarrier, NULL, 3) == 0); + assert(pthread_barrier_init(&readyBarrier, NULL, 3) == 0); + assert(pthread_barrier_init(&holdBarrier, NULL, 3) == 0); + + assert(pthread_create(&master, NULL, masterThread, (void *) timeout) == 0); + assert(pthread_create(&slave, NULL, slaveThread, NULL) == 0); + + allExit = FALSE; + + pthread_barrier_wait(&startBarrier); + + for (i = 1; !allExit; i++) + { + pthread_barrier_wait(&holdBarrier); + if (i >= ITERATIONS) + { + allExit = TRUE; + } + pthread_barrier_wait(&readyBarrier); + } + + assert(pthread_join(slave, NULL) == 0); + assert(pthread_join(master, NULL) == 0); + + printf("Signals sent = %d\nWait timeouts = %d\nSignals taken = %d\nBias = %d\nTimeout = %d\n", + signalsSent, + timeoutCount, + signalsTakenCount, + (int) bias, + timeout); + + /* Cleanup */ + assert(pthread_barrier_destroy(&holdBarrier) == 0); + assert(pthread_barrier_destroy(&readyBarrier) == 0); + assert(pthread_barrier_destroy(&startBarrier) == 0); + assert(pthread_cond_destroy(&control.cv) == 0); + assert(pthread_mutex_destroy(&control.mx) == 0); + + /* Success. */ + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/test.h b/win32/3rdparty/pthreads/tests/test.h new file mode 100644 index 000000000..3132c6914 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/test.h @@ -0,0 +1,140 @@ +/* + * test.h + * + * Useful definitions and declarations for tests. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + */ + +#ifndef _PTHREAD_TEST_H_ +#define _PTHREAD_TEST_H_ + +#include "pthread.h" +#include "sched.h" +#include "semaphore.h" + +#include +#include + +#define PTW32_THREAD_NULL_ID {NULL,0} + +#if defined(__MINGW32__) +#include +#elif defined(__BORLANDC__) +#define int64_t ULONGLONG +#else +#define int64_t _int64 +#endif + + +char * error_string[] = { + "ZERO_or_EOK", + "EPERM", + "ENOFILE_or_ENOENT", + "ESRCH", + "EINTR", + "EIO", + "ENXIO", + "E2BIG", + "ENOEXEC", + "EBADF", + "ECHILD", + "EAGAIN", + "ENOMEM", + "EACCES", + "EFAULT", + "UNKNOWN_15", + "EBUSY", + "EEXIST", + "EXDEV", + "ENODEV", + "ENOTDIR", + "EISDIR", + "EINVAL", + "ENFILE", + "EMFILE", + "ENOTTY", + "UNKNOWN_26", + "EFBIG", + "ENOSPC", + "ESPIPE", + "EROFS", + "EMLINK", + "EPIPE", + "EDOM", + "ERANGE", + "UNKNOWN_35", + "EDEADLOCK_or_EDEADLK", + "UNKNOWN_37", + "ENAMETOOLONG", + "ENOLCK", + "ENOSYS", + "ENOTEMPTY", + "EILSEQ", +}; + +/* + * The Mingw32 assert macro calls the CRTDLL _assert function + * which pops up a dialog. We want to run in batch mode so + * we define our own assert macro. + */ +#ifdef assert +# undef assert +#endif + +#ifndef ASSERT_TRACE +# define ASSERT_TRACE 0 +#else +# undef ASSERT_TRACE +# define ASSERT_TRACE 1 +#endif + +# define assert(e) \ + ((e) ? ((ASSERT_TRACE) ? fprintf(stderr, \ + "Assertion succeeded: (%s), file %s, line %d\n", \ + #e, __FILE__, (int) __LINE__), \ + fflush(stderr) : \ + 0) : \ + (fprintf(stderr, "Assertion failed: (%s), file %s, line %d\n", \ + #e, __FILE__, (int) __LINE__), exit(1), 0)) + +int assertE; +# define assert_e(e, o, r) \ + (((assertE = e) o (r)) ? ((ASSERT_TRACE) ? fprintf(stderr, \ + "Assertion succeeded: (%s), file %s, line %d\n", \ + #e, __FILE__, (int) __LINE__), \ + fflush(stderr) : \ + 0) : \ + (fprintf(stderr, "Assertion failed: (%s %s %s), file %s, line %d, error %s\n", \ + #e,#o,#r, __FILE__, (int) __LINE__, error_string[assertE]), exit(1), 0)) + +#endif diff --git a/win32/3rdparty/pthreads/tests/tryentercs.c b/win32/3rdparty/pthreads/tests/tryentercs.c new file mode 100644 index 000000000..13a6e096d --- /dev/null +++ b/win32/3rdparty/pthreads/tests/tryentercs.c @@ -0,0 +1,103 @@ +/* + * tryentercs.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * See if we have the TryEnterCriticalSection function. + * Does not use any part of pthreads. + */ + +#include +#include +#include + +/* + * Function pointer to TryEnterCriticalSection if it exists + * - otherwise NULL + */ +BOOL (WINAPI *_try_enter_critical_section)(LPCRITICAL_SECTION) = +NULL; + +/* + * Handle to kernel32.dll + */ +static HINSTANCE _h_kernel32; + + +int +main() +{ + CRITICAL_SECTION cs; + + SetLastError(0); + + printf("Last Error [main enter] %ld\n", (long) GetLastError()); + + /* + * Load KERNEL32 and try to get address of TryEnterCriticalSection + */ + _h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL")); + _try_enter_critical_section = + (BOOL (PT_STDCALL *)(LPCRITICAL_SECTION)) + GetProcAddress(_h_kernel32, + (LPCSTR) "TryEnterCriticalSection"); + + if (_try_enter_critical_section != NULL) + { + InitializeCriticalSection(&cs); + + SetLastError(0); + + if ((*_try_enter_critical_section)(&cs) != 0) + { + LeaveCriticalSection(&cs); + } + else + { + printf("Last Error [try enter] %ld\n", (long) GetLastError()); + + _try_enter_critical_section = NULL; + } + DeleteCriticalSection(&cs); + } + + (void) FreeLibrary(_h_kernel32); + + printf("This system %s TryEnterCriticalSection.\n", + (_try_enter_critical_section == NULL) ? "DOES NOT SUPPORT" : "SUPPORTS"); + printf("POSIX Mutexes will be based on Win32 %s.\n", + (_try_enter_critical_section == NULL) ? "Mutexes" : "Critical Sections"); + + return(0); +} + diff --git a/win32/3rdparty/pthreads/tests/tryentercs2.c b/win32/3rdparty/pthreads/tests/tryentercs2.c new file mode 100644 index 000000000..a1c4d97f3 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/tryentercs2.c @@ -0,0 +1,92 @@ +/* + * tryentercs.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * See if we have the TryEnterCriticalSection function. + * Does not use any part of pthreads. + */ + +#include +#include +#include + +/* + * Function pointer to TryEnterCriticalSection if it exists + * - otherwise NULL + */ +BOOL (WINAPI *_try_enter_critical_section)(LPCRITICAL_SECTION) = NULL; + +/* + * Handle to kernel32.dll + */ +static HINSTANCE _h_kernel32; + + +int +main() +{ + LPCRITICAL_SECTION lpcs = NULL; + + SetLastError(0); + + printf("Last Error [main enter] %ld\n", (long) GetLastError()); + + /* + * Load KERNEL32 and try to get address of TryEnterCriticalSection + */ + _h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL")); + _try_enter_critical_section = + (BOOL (PT_STDCALL *)(LPCRITICAL_SECTION)) + GetProcAddress(_h_kernel32, + (LPCSTR) "TryEnterCriticalSection"); + + if (_try_enter_critical_section != NULL) + { + SetLastError(0); + + (*_try_enter_critical_section)(lpcs); + + printf("Last Error [try enter] %ld\n", (long) GetLastError()); + } + + (void) FreeLibrary(_h_kernel32); + + printf("This system %s TryEnterCriticalSection.\n", + (_try_enter_critical_section == NULL) ? "DOES NOT SUPPORT" : "SUPPORTS"); + printf("POSIX Mutexes will be based on Win32 %s.\n", + (_try_enter_critical_section == NULL) ? "Mutexes" : "Critical Sections"); + + return(0); +} + diff --git a/win32/3rdparty/pthreads/tests/tsd1.c b/win32/3rdparty/pthreads/tests/tsd1.c new file mode 100644 index 000000000..c28e4c53e --- /dev/null +++ b/win32/3rdparty/pthreads/tests/tsd1.c @@ -0,0 +1,211 @@ +/* + * tsd1.c + * + * Test Thread Specific Data (TSD) key creation and destruction. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * + * -------------------------------------------------------------------------- + * + * Description: + * - + * + * Test Method (validation or falsification): + * - validation + * + * Requirements Tested: + * - keys are created for each existing thread including the main thread + * - keys are created for newly created threads + * - keys are thread specific + * - destroy routine is called on each thread exit including the main thread + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Environment: + * - + * + * Input: + * - none + * + * Output: + * - text to stdout + * + * Assumptions: + * - already validated: pthread_create() + * pthread_once() + * - main thread also has a POSIX thread identity + * + * Pass Criteria: + * - stdout matches file reference/tsd1.out + * + * Fail Criteria: + * - fails to match file reference/tsd1.out + * - output identifies failed component + */ + +#include +#include "test.h" + +enum { + NUM_THREADS = 100 +}; + +static pthread_key_t key = NULL; +static int accesscount[NUM_THREADS]; +static int thread_set[NUM_THREADS]; +static int thread_destroyed[NUM_THREADS]; +static pthread_barrier_t startBarrier; + +static void +destroy_key(void * arg) +{ + int * j = (int *) arg; + + (*j)++; + + assert(*j == 2); + + thread_destroyed[j - accesscount] = 1; +} + +static void +setkey(void * arg) +{ + int * j = (int *) arg; + + thread_set[j - accesscount] = 1; + + assert(*j == 0); + + assert(pthread_getspecific(key) == NULL); + + assert(pthread_setspecific(key, arg) == 0); + assert(pthread_setspecific(key, arg) == 0); + assert(pthread_setspecific(key, arg) == 0); + + assert(pthread_getspecific(key) == arg); + + (*j)++; + + assert(*j == 1); +} + +static void * +mythread(void * arg) +{ + (void) pthread_barrier_wait(&startBarrier); + + setkey(arg); + + return 0; + + /* Exiting the thread will call the key destructor. */ +} + +int +main() +{ + int i; + int fail = 0; + pthread_t thread[NUM_THREADS]; + + assert(pthread_barrier_init(&startBarrier, NULL, NUM_THREADS/2) == 0); + + for (i = 1; i < NUM_THREADS/2; i++) + { + accesscount[i] = thread_set[i] = thread_destroyed[i] = 0; + assert(pthread_create(&thread[i], NULL, mythread, (void *)&accesscount[i]) == 0); + } + + /* + * Here we test that existing threads will get a key created + * for them. + */ + assert(pthread_key_create(&key, destroy_key) == 0); + + (void) pthread_barrier_wait(&startBarrier); + + /* + * Test main thread key. + */ + accesscount[0] = 0; + setkey((void *) &accesscount[0]); + + /* + * Here we test that new threads will get a key created + * for them. + */ + for (i = NUM_THREADS/2; i < NUM_THREADS; i++) + { + accesscount[i] = thread_set[i] = thread_destroyed[i] = 0; + assert(pthread_create(&thread[i], NULL, mythread, (void *)&accesscount[i]) == 0); + } + + /* + * Wait for all threads to complete. + */ + for (i = 1; i < NUM_THREADS; i++) + { + int result = 0; + + assert(pthread_join(thread[i], (void **) &result) == 0); + } + + assert(pthread_key_delete(key) == 0); + + assert(pthread_barrier_destroy(&startBarrier) == 0); + + for (i = 1; i < NUM_THREADS; i++) + { + /* + * The counter is incremented once when the key is set to + * a value, and again when the key is destroyed. If the key + * doesn't get set for some reason then it will still be + * NULL and the destroy function will not be called, and + * hence accesscount will not equal 2. + */ + if (accesscount[i] != 2) + { + fail++; + fprintf(stderr, "Thread %d key, set = %d, destroyed = %d\n", + i, thread_set[i], thread_destroyed[i]); + } + } + + fflush(stderr); + + return (fail); +} diff --git a/win32/3rdparty/pthreads/tests/tsd2.c b/win32/3rdparty/pthreads/tests/tsd2.c new file mode 100644 index 000000000..d1f50cde3 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/tsd2.c @@ -0,0 +1,215 @@ +/* + * tsd2.c + * + * Test Thread Specific Data (TSD) key creation and destruction. + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * + * -------------------------------------------------------------------------- + * + * Description: + * - + * + * Test Method (validation or falsification): + * - validation + * + * Requirements Tested: + * - keys are created for each existing thread including the main thread + * - keys are created for newly created threads + * - keys are thread specific + * - destroy routine is called on each thread exit including the main thread + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Environment: + * - + * + * Input: + * - none + * + * Output: + * - text to stdout + * + * Assumptions: + * - already validated: pthread_create() + * pthread_once() + * - main thread also has a POSIX thread identity + * + * Pass Criteria: + * - stdout matches file reference/tsd1.out + * + * Fail Criteria: + * - fails to match file reference/tsd1.out + * - output identifies failed component + */ + +#include +#include "test.h" + +enum { + NUM_THREADS = 100 +}; + +static pthread_key_t key = NULL; +static int accesscount[NUM_THREADS]; +static int thread_set[NUM_THREADS]; +static int thread_destroyed[NUM_THREADS]; +static pthread_barrier_t startBarrier; + +static void +destroy_key(void * arg) +{ + int * j = (int *) arg; + + (*j)++; + + /* Set TSD key from the destructor to test destructor iteration */ + if (*j == 2) + assert(pthread_setspecific(key, arg) == 0); + else + assert(*j == 3); + + thread_destroyed[j - accesscount] = 1; +} + +static void +setkey(void * arg) +{ + int * j = (int *) arg; + + thread_set[j - accesscount] = 1; + + assert(*j == 0); + + assert(pthread_getspecific(key) == NULL); + + assert(pthread_setspecific(key, arg) == 0); + assert(pthread_setspecific(key, arg) == 0); + assert(pthread_setspecific(key, arg) == 0); + + assert(pthread_getspecific(key) == arg); + + (*j)++; + + assert(*j == 1); +} + +static void * +mythread(void * arg) +{ + (void) pthread_barrier_wait(&startBarrier); + + setkey(arg); + + return 0; + + /* Exiting the thread will call the key destructor. */ +} + +int +main() +{ + int i; + int fail = 0; + pthread_t thread[NUM_THREADS]; + + assert(pthread_barrier_init(&startBarrier, NULL, NUM_THREADS/2) == 0); + + for (i = 1; i < NUM_THREADS/2; i++) + { + accesscount[i] = thread_set[i] = thread_destroyed[i] = 0; + assert(pthread_create(&thread[i], NULL, mythread, (void *)&accesscount[i]) == 0); + } + + /* + * Here we test that existing threads will get a key created + * for them. + */ + assert(pthread_key_create(&key, destroy_key) == 0); + + (void) pthread_barrier_wait(&startBarrier); + + /* + * Test main thread key. + */ + accesscount[0] = 0; + setkey((void *) &accesscount[0]); + + /* + * Here we test that new threads will get a key created + * for them. + */ + for (i = NUM_THREADS/2; i < NUM_THREADS; i++) + { + accesscount[i] = thread_set[i] = thread_destroyed[i] = 0; + assert(pthread_create(&thread[i], NULL, mythread, (void *)&accesscount[i]) == 0); + } + + /* + * Wait for all threads to complete. + */ + for (i = 1; i < NUM_THREADS; i++) + { + int result = 0; + + assert(pthread_join(thread[i], (void **) &result) == 0); + } + + assert(pthread_key_delete(key) == 0); + + assert(pthread_barrier_destroy(&startBarrier) == 0); + + for (i = 1; i < NUM_THREADS; i++) + { + /* + * The counter is incremented once when the key is set to + * a value, and again when the key is destroyed. If the key + * doesn't get set for some reason then it will still be + * NULL and the destroy function will not be called, and + * hence accesscount will not equal 2. + */ + if (accesscount[i] != 3) + { + fail++; + fprintf(stderr, "Thread %d key, set = %d, destroyed = %d\n", + i, thread_set[i], thread_destroyed[i]); + } + } + + fflush(stderr); + + return (fail); +} diff --git a/win32/3rdparty/pthreads/tests/valid1.c b/win32/3rdparty/pthreads/tests/valid1.c new file mode 100644 index 000000000..4d5cab592 --- /dev/null +++ b/win32/3rdparty/pthreads/tests/valid1.c @@ -0,0 +1,103 @@ +/* + * File: valid1.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test that thread validation works. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +enum { + NUMTHREADS = 1 +}; + +static int washere = 0; + +void * func(void * arg) +{ + washere = 1; + return (void *) 0; +} + +int +main() +{ + pthread_t t; + void * result = NULL; + + washere = 0; + assert(pthread_create(&t, NULL, func, NULL) == 0); + assert(pthread_join(t, &result) == 0); + assert(result == 0); + assert(washere == 1); + sched_yield(); + assert(pthread_kill(t, 0) == ESRCH); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tests/valid2.c b/win32/3rdparty/pthreads/tests/valid2.c new file mode 100644 index 000000000..b9671798b --- /dev/null +++ b/win32/3rdparty/pthreads/tests/valid2.c @@ -0,0 +1,84 @@ +/* + * File: valid2.c + * + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Confirm that thread validation fails for garbage thread ID. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +int +main() +{ + pthread_t NullThread = PTW32_THREAD_NULL_ID; + + assert(pthread_kill(NullThread, 0) == ESRCH); + + return 0; +} diff --git a/win32/3rdparty/pthreads/tsd.c b/win32/3rdparty/pthreads/tsd.c new file mode 100644 index 000000000..ed44fe6cb --- /dev/null +++ b/win32/3rdparty/pthreads/tsd.c @@ -0,0 +1,44 @@ +/* + * tsd.c + * + * Description: + * POSIX thread functions which implement thread-specific data (TSD). + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +#include "pthread_key_create.c" +#include "pthread_key_delete.c" +#include "pthread_setspecific.c" +#include "pthread_getspecific.c" diff --git a/win32/3rdparty/pthreads/version.rc b/win32/3rdparty/pthreads/version.rc new file mode 100644 index 000000000..a6c22a2ac --- /dev/null +++ b/win32/3rdparty/pthreads/version.rc @@ -0,0 +1,384 @@ +/* This is an implementation of the threads API of POSIX 1003.1-2001. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include "pthread.h" + +/* + * Note: the correct __CLEANUP_* macro must be defined corresponding to + * the definition used for the object file builds. This is done in the + * relevent makefiles for the command line builds, but users should ensure + * that their resource compiler knows what it is too. + * If using the default (no __CLEANUP_* defined), pthread.h will define it + * as __CLEANUP_C. + */ + +#ifdef PTW32_RC_MSC +# if defined(__CLEANUP_C) +# define PTW32_VERSIONINFO_NAME "pthreadVC\0" +# define PTW32_VERSIONINFO_COMMENT "MS C build -- longjmp thread exiting\0" +# elif defined(__CLEANUP_CXX) +# define PTW32_VERSIONINFO_NAME "pthreadVCE\0" +# define PTW32_VERSIONINFO_COMMENT "MS C++ build -- C++ exception thread exiting\0" +# elif defined(__CLEANUP_SEH) +# define PTW32_VERSIONINFO_NAME "pthreadVSE\0" +# define PTW32_VERSIONINFO_COMMENT "MS C build -- structured exception thread exiting\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#elif defined(__GNUC__) +# if defined(__CLEANUP_C) +# define PTW32_VERSIONINFO_NAME "pthreadGC\0" +# define PTW32_VERSIONINFO_COMMENT "GNU C build -- longjmp thread exiting\0" +# elif defined(__CLEANUP_CXX) +# define PTW32_VERSIONINFO_NAME "pthreadGCE\0" +# define PTW32_VERSIONINFO_COMMENT "GNU C++ build -- C++ exception thread exiting\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#elif defined(__BORLANDC__) +# if defined(__CLEANUP_C) +# define PTW32_VERSIONINFO_NAME "pthreadBC\0" +# define PTW32_VERSIONINFO_COMMENT "BORLAND C build -- longjmp thread exiting\0" +# elif defined(__CLEANUP_CXX) +# define PTW32_VERSIONINFO_NAME "pthreadBCE\0" +# define PTW32_VERSIONINFO_COMMENT "BORLAND C++ build -- C++ exception thread exiting\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#elif defined(__WATCOMC__) +# if defined(__CLEANUP_C) +# define PTW32_VERSIONINFO_NAME "pthreadWC\0" +# define PTW32_VERSIONINFO_COMMENT "WATCOM C build -- longjmp thread exiting\0" +# elif defined(__CLEANUP_CXX) +# define PTW32_VERSIONINFO_NAME "pthreadWCE\0" +# define PTW32_VERSIONINFO_COMMENT "WATCOM C++ build -- C++ exception thread exiting\0" +# else +# error Resource compiler doesn't know which cleanup style you're using - see version.rc +# endif +#else +# error Resource compiler doesn't know which compiler you're using - see version.rc +#endif + + +VS_VERSION_INFO VERSIONINFO + FILEVERSION PTW32_VERSION + PRODUCTVERSION PTW32_VERSION + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "POSIX Threads for Windows32 Library\0" + VALUE "ProductVersion", PTW32_VERSION_STRING + VALUE "FileVersion", PTW32_VERSION_STRING + VALUE "InternalName", PTW32_VERSIONINFO_NAME + VALUE "OriginalFilename", PTW32_VERSIONINFO_NAME + VALUE "CompanyName", "Open Source Software community project\0" + VALUE "LegalCopyright", "Copyright (C) Project contributors 1998-2004\0" + VALUE "Licence", "LGPL\0" + VALUE "Info", "http://sources.redhat.com/pthreads-win32/\0" + VALUE "Comment", PTW32_VERSIONINFO_COMMENT + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +/* +VERSIONINFO Resource + +The VERSIONINFO resource-definition statement creates a version-information +resource. The resource contains such information about the file as its +version number, its intended operating system, and its original filename. +The resource is intended to be used with the Version Information functions. + +versionID VERSIONINFO fixed-info { block-statement...} + +versionID + Version-information resource identifier. This value must be 1. + +fixed-info + Version information, such as the file version and the intended operating + system. This parameter consists of the following statements. + + + Statement Description + -------------------------------------------------------------------------- + FILEVERSION + version Binary version number for the file. The version + consists of two 32-bit integers, defined by four + 16-bit integers. For example, "FILEVERSION 3,10,0,61" + is translated into two doublewords: 0x0003000a and + 0x0000003d, in that order. Therefore, if version is + defined by the DWORD values dw1 and dw2, they need + to appear in the FILEVERSION statement as follows: + HIWORD(dw1), LOWORD(dw1), HIWORD(dw2), LOWORD(dw2). + PRODUCTVERSION + version Binary version number for the product with which the + file is distributed. The version parameter is two + 32-bit integers, defined by four 16-bit integers. + For more information about version, see the + FILEVERSION description. + FILEFLAGSMASK + fileflagsmask Bits in the FILEFLAGS statement are valid. If a bit + is set, the corresponding bit in FILEFLAGS is valid. + FILEFLAGSfileflags Attributes of the file. The fileflags parameter must + be the combination of all the file flags that are + valid at compile time. For 16-bit Windows, this + value is 0x3f. + FILEOSfileos Operating system for which this file was designed. + The fileos parameter can be one of the operating + system values given in the Remarks section. + FILETYPEfiletype General type of file. The filetype parameter can be + one of the file type values listed in the Remarks + section. + FILESUBTYPE + subtype Function of the file. The subtype parameter is zero + unless the type parameter in the FILETYPE statement + is VFT_DRV, VFT_FONT, or VFT_VXD. For a list of file + subtype values, see the Remarks section. + +block-statement + Specifies one or more version-information blocks. A block can contain + string information or variable information. For more information, see + StringFileInfo Block or VarFileInfo Block. + +Remarks + +To use the constants specified with the VERSIONINFO statement, you must +include the Winver.h or Windows.h header file in the resource-definition file. + +The following list describes the parameters used in the VERSIONINFO statement: + +fileflags + A combination of the following values. + + Value Description + + VS_FF_DEBUG File contains debugging information or is compiled + with debugging features enabled. + VS_FF_PATCHED File has been modified and is not identical to the + original shipping file of the same version number. + VS_FF_PRERELEASE File is a development version, not a commercially + released product. + VS_FF_PRIVATEBUILD File was not built using standard release procedures. + If this value is given, the StringFileInfo block must + contain a PrivateBuild string. + VS_FF_SPECIALBUILD File was built by the original company using standard + release procedures but is a variation of the standard + file of the same version number. If this value is + given, the StringFileInfo block must contain a + SpecialBuild string. + +fileos + One of the following values. + + Value Description + + VOS_UNKNOWN The operating system for which the file was designed + is unknown. + VOS_DOS File was designed for MS-DOS. + VOS_NT File was designed for Windows Server 2003 family, + Windows XP, Windows 2000, or Windows NT. + VOS__WINDOWS16 File was designed for 16-bit Windows. + VOS__WINDOWS32 File was designed for 32-bit Windows. + VOS_DOS_WINDOWS16 File was designed for 16-bit Windows running with + MS-DOS. + VOS_DOS_WINDOWS32 File was designed for 32-bit Windows running with + MS-DOS. + VOS_NT_WINDOWS32 File was designed for Windows Server 2003 family, + Windows XP, Windows 2000, or Windows NT. + + The values 0x00002L, 0x00003L, 0x20000L and 0x30000L are reserved. + +filetype + One of the following values. + + Value Description + + VFT_UNKNOWN File type is unknown. + VFT_APP File contains an application. + VFT_DLL File contains a dynamic-link library (DLL). + VFT_DRV File contains a device driver. If filetype is + VFT_DRV, subtype contains a more specific + description of the driver. + VFT_FONT File contains a font. If filetype is VFT_FONT, + subtype contains a more specific description of the + font. + VFT_VXD File contains a virtual device. + VFT_STATIC_LIB File contains a static-link library. + + All other values are reserved for use by Microsoft. + +subtype + Additional information about the file type. + + If filetype specifies VFT_DRV, this parameter can be one of the + following values. + + Value Description + + VFT2_UNKNOWN Driver type is unknown. + VFT2_DRV_COMM File contains a communications driver. + VFT2_DRV_PRINTER File contains a printer driver. + VFT2_DRV_KEYBOARD File contains a keyboard driver. + VFT2_DRV_LANGUAGE File contains a language driver. + VFT2_DRV_DISPLAY File contains a display driver. + VFT2_DRV_MOUSE File contains a mouse driver. + VFT2_DRV_NETWORK File contains a network driver. + VFT2_DRV_SYSTEM File contains a system driver. + VFT2_DRV_INSTALLABLE File contains an installable driver. + VFT2_DRV_SOUND File contains a sound driver. + VFT2_DRV_VERSIONED_PRINTER File contains a versioned printer driver. + + If filetype specifies VFT_FONT, this parameter can be one of the + following values. + + Value Description + + VFT2_UNKNOWN Font type is unknown. + VFT2_FONT_RASTER File contains a raster font. + VFT2_FONT_VECTOR File contains a vector font. + VFT2_FONT_TRUETYPE File contains a TrueType font. + + If filetype specifies VFT_VXD, this parameter must be the virtual-device + identifier included in the virtual-device control block. + + All subtype values not listed here are reserved for use by Microsoft. + +langID + One of the following language codes. + + Code Language Code Language + + 0x0401 Arabic 0x0415 Polish + 0x0402 Bulgarian 0x0416 Portuguese (Brazil) + 0x0403 Catalan 0x0417 Rhaeto-Romanic + 0x0404 Traditional Chinese 0x0418 Romanian + 0x0405 Czech 0x0419 Russian + 0x0406 Danish 0x041A Croato-Serbian (Latin) + 0x0407 German 0x041B Slovak + 0x0408 Greek 0x041C Albanian + 0x0409 U.S. English 0x041D Swedish + 0x040A Castilian Spanish 0x041E Thai + 0x040B Finnish 0x041F Turkish + 0x040C French 0x0420 Urdu + 0x040D Hebrew 0x0421 Bahasa + 0x040E Hungarian 0x0804 Simplified Chinese + 0x040F Icelandic 0x0807 Swiss German + 0x0410 Italian 0x0809 U.K. English + 0x0411 Japanese 0x080A Mexican Spanish + 0x0412 Korean 0x080C Belgian French + 0x0413 Dutch 0x0C0C Canadian French + 0x0414 Norwegian – Bokmal 0x100C Swiss French + 0x0810 Swiss Italian 0x0816 Portuguese (Portugal) + 0x0813 Belgian Dutch 0x081A Serbo-Croatian (Cyrillic) + 0x0814 Norwegian – Nynorsk + +charsetID + One of the following character-set identifiers. + + Identifier Character Set + + 0 7-bit ASCII + 932 Japan (Shift %G–%@ JIS X-0208) + 949 Korea (Shift %G–%@ KSC 5601) + 950 Taiwan (Big5) + 1200 Unicode + 1250 Latin-2 (Eastern European) + 1251 Cyrillic + 1252 Multilingual + 1253 Greek + 1254 Turkish + 1255 Hebrew + 1256 Arabic + +string-name + One of the following predefined names. + + Name Description + + Comments Additional information that should be displayed for + diagnostic purposes. + CompanyName Company that produced the file%G—%@for example, + "Microsoft Corporation" or "Standard Microsystems + Corporation, Inc." This string is required. + FileDescription File description to be presented to users. This + string may be displayed in a list box when the user + is choosing files to install%G—%@for example, + "Keyboard Driver for AT-Style Keyboards". This + string is required. + FileVersion Version number of the file%G—%@for example, + "3.10" or "5.00.RC2". This string is required. + InternalName Internal name of the file, if one exists — for + example, a module name if the file is a dynamic-link + library. If the file has no internal name, this + string should be the original filename, without + extension. This string is required. + LegalCopyright Copyright notices that apply to the file. This + should include the full text of all notices, legal + symbols, copyright dates, and so on — for example, + "Copyright (C) Microsoft Corporation 1990–1999". + This string is optional. + LegalTrademarks Trademarks and registered trademarks that apply to + the file. This should include the full text of all + notices, legal symbols, trademark numbers, and so on. + This string is optional. + OriginalFilename Original name of the file, not including a path. + This information enables an application to determine + whether a file has been renamed by a user. The + format of the name depends on the file system for + which the file was created. This string is required. + PrivateBuild Information about a private version of the file — for + example, "Built by TESTER1 on \TESTBED". This string + should be present only if VS_FF_PRIVATEBUILD is + specified in the fileflags parameter of the root + block. + ProductName Name of the product with which the file is + distributed. This string is required. + ProductVersion Version of the product with which the file is + distributed — for example, "3.10" or "5.00.RC2". + This string is required. + SpecialBuild Text that indicates how this version of the file + differs from the standard version — for example, + "Private build for TESTER1 solving mouse problems + on M250 and M250E computers". This string should be + present only if VS_FF_SPECIALBUILD is specified in + the fileflags parameter of the root block. + */ diff --git a/win32/3rdparty/pthreads/w32_CancelableWait.c b/win32/3rdparty/pthreads/w32_CancelableWait.c new file mode 100644 index 000000000..97e15aa31 --- /dev/null +++ b/win32/3rdparty/pthreads/w32_CancelableWait.c @@ -0,0 +1,160 @@ +/* + * w32_CancelableWait.c + * + * Description: + * This translation unit implements miscellaneous thread functions. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "pthread.h" +#include "implement.h" + + +static INLINE int +ptw32_cancelable_wait (HANDLE waitHandle, DWORD timeout) + /* + * ------------------------------------------------------------------- + * This provides an extra hook into the pthread_cancel + * mechanism that will allow you to wait on a Windows handle and make it a + * cancellation point. This function blocks until the given WIN32 handle is + * signaled or pthread_cancel has been called. It is implemented using + * WaitForMultipleObjects on 'waitHandle' and a manually reset WIN32 + * event used to implement pthread_cancel. + * + * Given this hook it would be possible to implement more of the cancellation + * points. + * ------------------------------------------------------------------- + */ +{ + int result; + pthread_t self; + ptw32_thread_t * sp; + HANDLE handles[2]; + DWORD nHandles = 1; + DWORD status; + + handles[0] = waitHandle; + + self = pthread_self(); + sp = (ptw32_thread_t *) self.p; + + if (sp != NULL) + { + /* + * Get cancelEvent handle + */ + if (sp->cancelState == PTHREAD_CANCEL_ENABLE) + { + + if ((handles[1] = sp->cancelEvent) != NULL) + { + nHandles++; + } + } + } + else + { + handles[1] = NULL; + } + + status = WaitForMultipleObjects (nHandles, handles, PTW32_FALSE, timeout); + + switch (status - WAIT_OBJECT_0) + { + case 0: + /* + * Got the handle. + * In the event that both handles are signalled, the smallest index + * value (us) is returned. As it has been arranged, this ensures that + * we don't drop a signal that we should act on (i.e. semaphore, + * mutex, or condition variable etc). + */ + result = 0; + break; + + case 1: + /* + * Got cancel request. + * In the event that both handles are signaled, the cancel will + * be ignored (see case 0 comment). + */ + ResetEvent (handles[1]); + + if (sp != NULL) + { + /* + * Should handle POSIX and implicit POSIX threads.. + * Make sure we haven't been async-canceled in the meantime. + */ + (void) pthread_mutex_lock (&sp->cancelLock); + if (sp->state < PThreadStateCanceling) + { + sp->state = PThreadStateCanceling; + sp->cancelState = PTHREAD_CANCEL_DISABLE; + (void) pthread_mutex_unlock (&sp->cancelLock); + ptw32_throw (PTW32_EPS_CANCEL); + + /* Never reached */ + } + (void) pthread_mutex_unlock (&sp->cancelLock); + } + + /* Should never get to here. */ + result = EINVAL; + break; + + default: + if (status == WAIT_TIMEOUT) + { + result = ETIMEDOUT; + } + else + { + result = EINVAL; + } + break; + } + + return (result); + +} /* CancelableWait */ + +int +pthreadCancelableWait (HANDLE waitHandle) +{ + return (ptw32_cancelable_wait (waitHandle, INFINITE)); +} + +int +pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout) +{ + return (ptw32_cancelable_wait (waitHandle, timeout)); +} diff --git a/win32/3rdparty/zlib/ChangeLog b/win32/3rdparty/zlib/ChangeLog new file mode 100644 index 000000000..7f6869d32 --- /dev/null +++ b/win32/3rdparty/zlib/ChangeLog @@ -0,0 +1,855 @@ + + ChangeLog file for zlib + +Changes in 1.2.3 (18 July 2005) +- Apply security vulnerability fixes to contrib/infback9 as well +- Clean up some text files (carriage returns, trailing space) +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] + +Changes in 1.2.2.4 (11 July 2005) +- Add inflatePrime() function for starting inflation at bit boundary +- Avoid some Visual C warnings in deflate.c +- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit + compile +- Fix some spelling errors in comments [Betts] +- Correct inflateInit2() error return documentation in zlib.h +- Added zran.c example of compressed data random access to examples + directory, shows use of inflatePrime() +- Fix cast for assignments to strm->state in inflate.c and infback.c +- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +- Add cast in trees.c t avoid a warning [Oberhumer] +- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +- Update make_vms.com [Zinser] +- Initialize state->write in inflateReset() since copied in inflate_fast() +- Be more strict on incomplete code sets in inflate_table() and increase + ENOUGH and MAXD -- this repairs a possible security vulnerability for + invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for + discovering the vulnerability and providing test cases. +- Add ia64 support to configure for HP-UX [Smith] +- Add error return to gzread() for format or i/o error [Levin] +- Use malloc.h for OS/2 [Necasek] + +Changes in 1.2.2.3 (27 May 2005) +- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +- Typecast fread() return values in gzio.c [Vollant] +- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +- Fix crc check bug in gzread() after gzungetc() [Heiner] +- Add the deflateTune() function to adjust internal compression parameters +- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +- Remove an incorrect assertion in examples/zpipe.c +- Add C++ wrapper in infback9.h [Donais] +- Fix bug in inflateCopy() when decoding fixed codes +- Note in zlib.h how much deflateSetDictionary() actually uses +- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +- Add gzdirect() function to indicate transparent reads +- Update contrib/minizip [Vollant] +- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +- Add casts in crc32.c to avoid warnings [Oberhumer] +- Add contrib/masmx64 [Vollant] +- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] + +Changes in 1.2.2.2 (30 December 2004) +- Replace structure assignments in deflate.c and inflate.c with zmemcpy to + avoid implicit memcpy calls (portability for no-library compilation) +- Increase sprintf() buffer size in gzdopen() to allow for large numbers +- Add INFLATE_STRICT to check distances against zlib header +- Improve WinCE errno handling and comments [Chang] +- Remove comment about no gzip header processing in FAQ +- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +- Add updated make_vms.com [Coghlan], update README +- Create a new "examples" directory, move gzappend.c there, add zpipe.c, + fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +- Add FAQ entry and comments in deflate.c on uninitialized memory access +- Add Solaris 9 make options in configure [Gilbert] +- Allow strerror() usage in gzio.c for STDC +- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +- Use z_off_t for adler32_combine() and crc32_combine() lengths +- Make adler32() much faster for small len +- Use OS_CODE in deflate() default gzip header + +Changes in 1.2.2.1 (31 October 2004) +- Allow inflateSetDictionary() call for raw inflate +- Fix inflate header crc check bug for file names and comments +- Add deflateSetHeader() and gz_header structure for custom gzip headers +- Add inflateGetheader() to retrieve gzip headers +- Add crc32_combine() and adler32_combine() functions +- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +- Use zstreamp consistently in zlib.h (inflate_back functions) +- Remove GUNZIP condition from definition of inflate_mode in inflate.h + and in contrib/inflate86/inffast.S [Truta, Anderson] +- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +- Update projects/README.projects and projects/visualc6 [Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +- Use a new algorithm for setting strm->data_type in trees.c [Truta] +- Do not define an exit() prototype in zutil.c unless DEBUG defined +- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +- Fix Darwin build version identification [Peterson] + +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + +Changes in 1.2.1.2 (9 September 2004) +- Update INDEX file +- Fix trees.c to update strm->data_type (no one ever noticed!) +- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +- Add limited multitasking protection to DYNAMIC_CRC_TABLE +- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +- Don't declare strerror() under VMS [Mozilla] +- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +- Update contrib/ada [Anisimkov] +- Update contrib/minizip [Vollant] +- Fix configure to not hardcode directories for Darwin [Peterson] +- Fix gzio.c to not return error on empty files [Brown] +- Fix indentation; update version in contrib/delphi/ZLib.pas and + contrib/pascal/zlibpas.pas [Truta] +- Update mkasm.bat in contrib/masmx86 [Truta] +- Update contrib/untgz [Truta] +- Add projects/README.projects [Truta] +- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +- Remove an unnecessary assignment to curr in inftrees.c [Truta] +- Add OS/2 to exe builds in configure [Poltorak] +- Remove err dummy parameter in zlib.h [Kientzle] + +Changes in 1.2.1.1 (9 January 2004) +- Update email address in README +- Several FAQ updates +- Fix a big fat bug in inftrees.c that prevented decoding valid + dynamic blocks with only literals and no distance codes -- + Thanks to "Hot Emu" for the bug report and sample file +- Add a note to puff.c on no distance codes case. + +Changes in 1.2.1 (17 November 2003) +- Remove a tab in contrib/gzappend/gzappend.c +- Update some interfaces in contrib for new zlib functions +- Update zlib version number in some contrib entries +- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +- Support shared libraries on Hurd and KFreeBSD [Brown] +- Fix error in NO_DIVIDE option of adler32.c + +Changes in 1.2.0.8 (4 November 2003) +- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +- Add experimental NO_DIVIDE #define in adler32.c + - Possibly faster on some processors (let me know if it is) +- Correct Z_BLOCK to not return on first inflate call if no wrap +- Fix strm->data_type on inflate() return to correctly indicate EOB +- Add deflatePrime() function for appending in the middle of a byte +- Add contrib/gzappend for an example of appending to a stream +- Update win32/DLL_FAQ.txt [Truta] +- Delete Turbo C comment in README [Truta] +- Improve some indentation in zconf.h [Truta] +- Fix infinite loop on bad input in configure script [Church] +- Fix gzeof() for concatenated gzip files [Johnson] +- Add example to contrib/visual-basic.txt [Michael B.] +- Add -p to mkdir's in Makefile.in [vda] +- Fix configure to properly detect presence or lack of printf functions +- Add AS400 support [Monnerat] +- Add a little Cygwin support [Wilson] + +Changes in 1.2.0.7 (21 September 2003) +- Correct some debug formats in contrib/infback9 +- Cast a type in a debug statement in trees.c +- Change search and replace delimiter in configure from % to # [Beebe] +- Update contrib/untgz to 0.2 with various fixes [Truta] +- Add build support for Amiga [Nikl] +- Remove some directories in old that have been updated to 1.2 +- Add dylib building for Mac OS X in configure and Makefile.in +- Remove old distribution stuff from Makefile +- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +- Update links in README + +Changes in 1.2.0.6 (13 September 2003) +- Minor FAQ updates +- Update contrib/minizip to 1.00 [Vollant] +- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +- Update POSTINC comment for 68060 [Nikl] +- Add contrib/infback9 with deflate64 decoding (unsupported) +- For MVS define NO_vsnprintf and undefine FAR [van Burik] +- Add pragma for fdopen on MVS [van Burik] + +Changes in 1.2.0.5 (8 September 2003) +- Add OF to inflateBackEnd() declaration in zlib.h +- Remember start when using gzdopen in the middle of a file +- Use internal off_t counters in gz* functions to properly handle seeks +- Perform more rigorous check for distance-too-far in inffast.c +- Add Z_BLOCK flush option to return from inflate at block boundary +- Set strm->data_type on return from inflate + - Indicate bits unused, if at block boundary, and if in last block +- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +- Add condition so old NO_DEFLATE define still works for compatibility +- FAQ update regarding the Windows DLL [Truta] +- INDEX update: add qnx entry, remove aix entry [Truta] +- Install zlib.3 into mandir [Wilson] +- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +- Adapt the zlib interface to the new DLL convention guidelines [Truta] +- Introduce ZLIB_WINAPI macro to allow the export of functions using + the WINAPI calling convention, for Visual Basic [Vollant, Truta] +- Update msdos and win32 scripts and makefiles [Truta] +- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +- Add contrib/ada [Anisimkov] +- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +- Add contrib/masm686 [Truta] +- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm + [Truta, Vollant] +- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +- Remove contrib/delphi2; add a new contrib/delphi [Truta] +- Avoid inclusion of the nonstandard in contrib/iostream, + and fix some method prototypes [Truta] +- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip + [Truta] +- Avoid the use of backslash (\) in contrib/minizip [Vollant] +- Fix file time handling in contrib/untgz; update makefiles [Truta] +- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines + [Vollant] +- Remove contrib/vstudio/vc15_16 [Vollant] +- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +- Update README.contrib [Truta] +- Invert the assignment order of match_head and s->prev[...] in + INSERT_STRING [Truta] +- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings + [Truta] +- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +- Fix prototype of syncsearch in inflate.c [Truta] +- Introduce ASMINF macro to be enabled when using an ASM implementation + of inflate_fast [Truta] +- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +- Modify test_gzio in example.c to take a single file name as a + parameter [Truta] +- Exit the example.c program if gzopen fails [Truta] +- Add type casts around strlen in example.c [Truta] +- Remove casting to sizeof in minigzip.c; give a proper type + to the variable compared with SUFFIX_LEN [Truta] +- Update definitions of STDC and STDC99 in zconf.h [Truta] +- Synchronize zconf.h with the new Windows DLL interface [Truta] +- Use SYS16BIT instead of __32BIT__ to distinguish between + 16- and 32-bit platforms [Truta] +- Use far memory allocators in small 16-bit memory models for + Turbo C [Truta] +- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in + zlibCompileFlags [Truta] +- Cygwin has vsnprintf [Wilson] +- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] + +Changes in 1.2.0.4 (10 August 2003) +- Minor FAQ updates +- Be more strict when checking inflateInit2's windowBits parameter +- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +- Add gzip wrapper option to deflateInit2 using windowBits +- Add updated QNX rule in configure and qnx directory [Bonnefoy] +- Make inflate distance-too-far checks more rigorous +- Clean up FAR usage in inflate +- Add casting to sizeof() in gzio.c and minigzip.c + +Changes in 1.2.0.3 (19 July 2003) +- Fix silly error in gzungetc() implementation [Vollant] +- Update contrib/minizip and contrib/vstudio [Vollant] +- Fix printf format in example.c +- Correct cdecl support in zconf.in.h [Anisimkov] +- Minor FAQ updates + +Changes in 1.2.0.2 (13 July 2003) +- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +- Attempt to avoid warnings in crc32.c for pointer-int conversion +- Add AIX to configure, remove aix directory [Bakker] +- Add some casts to minigzip.c +- Improve checking after insecure sprintf() or vsprintf() calls +- Remove #elif's from crc32.c +- Change leave label to inf_leave in inflate.c and infback.c to avoid + library conflicts +- Remove inflate gzip decoding by default--only enable gzip decoding by + special request for stricter backward compatibility +- Add zlibCompileFlags() function to return compilation information +- More typecasting in deflate.c to avoid warnings +- Remove leading underscore from _Capital #defines [Truta] +- Fix configure to link shared library when testing +- Add some Windows CE target adjustments [Mai] +- Remove #define ZLIB_DLL in zconf.h [Vollant] +- Add zlib.3 [Rodgers] +- Update RFC URL in deflate.c and algorithm.txt [Mai] +- Add zlib_dll_FAQ.txt to contrib [Truta] +- Add UL to some constants [Truta] +- Update minizip and vstudio [Vollant] +- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +- Expand use of NO_DUMMY_DECL to avoid all dummy structures +- Added iostream3 to contrib [Schwardt] +- Replace rewind() with fseek() for WinCE [Truta] +- Improve setting of zlib format compression level flags + - Report 0 for huffman and rle strategies and for level == 0 or 1 + - Report 2 only for level == 6 +- Only deal with 64K limit when necessary at compile time [Truta] +- Allow TOO_FAR check to be turned off at compile time [Truta] +- Add gzclearerr() function [Souza] +- Add gzungetc() function + +Changes in 1.2.0.1 (17 March 2003) +- Add Z_RLE strategy for run-length encoding [Truta] + - When Z_RLE requested, restrict matches to distance one + - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +- Correct FASTEST compilation to allow level == 0 +- Clean up what gets compiled for FASTEST +- Incorporate changes to zconf.in.h [Vollant] + - Refine detection of Turbo C need for dummy returns + - Refine ZLIB_DLL compilation + - Include additional header file on VMS for off_t typedef +- Try to use _vsnprintf where it supplants vsprintf [Vollant] +- Add some casts in inffast.c +- Enchance comments in zlib.h on what happens if gzprintf() tries to + write more than 4095 bytes before compression +- Remove unused state from inflateBackEnd() +- Remove exit(0) from minigzip.c, example.c +- Get rid of all those darn tabs +- Add "check" target to Makefile.in that does the same thing as "test" +- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +- Update contrib/inflate86 [Anderson] +- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +- Add msdos and win32 directories with makefiles [Truta] +- More additions and improvements to the FAQ + +Changes in 1.2.0 (9 March 2003) +- New and improved inflate code + - About 20% faster + - Does not allocate 32K window unless and until needed + - Automatically detects and decompresses gzip streams + - Raw inflate no longer needs an extra dummy byte at end + - Added inflateBack functions using a callback interface--even faster + than inflate, useful for file utilities (gzip, zip) + - Added inflateCopy() function to record state for random access on + externally generated deflate streams (e.g. in gzip files) + - More readable code (I hope) +- New and improved crc32() + - About 50% faster, thanks to suggestions from Rodney Brown +- Add deflateBound() and compressBound() functions +- Fix memory leak in deflateInit2() +- Permit setting dictionary for raw deflate (for parallel deflate) +- Fix const declaration for gzwrite() +- Check for some malloc() failures in gzio.c +- Fix bug in gzopen() on single-byte file 0x1f +- Fix bug in gzread() on concatenated file with 0x1f at end of buffer + and next buffer doesn't start with 0x8b +- Fix uncompress() to return Z_DATA_ERROR on truncated input +- Free memory at end of example.c +- Remove MAX #define in trees.c (conflicted with some libraries) +- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +- Declare malloc() and free() in gzio.c if STDC not defined +- Use malloc() instead of calloc() in zutil.c if int big enough +- Define STDC for AIX +- Add aix/ with approach for compiling shared library on AIX +- Add HP-UX support for shared libraries in configure +- Add OpenUNIX support for shared libraries in configure +- Use $cc instead of gcc to build shared library +- Make prefix directory if needed when installing +- Correct Macintosh avoidance of typedef Byte in zconf.h +- Correct Turbo C memory allocation when under Linux +- Use libz.a instead of -lz in Makefile (assure use of compiled library) +- Update configure to check for snprintf or vsnprintf functions and their + return value, warn during make if using an insecure function +- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that + is lost when library is used--resolution is to build new zconf.h +- Documentation improvements (in zlib.h): + - Document raw deflate and inflate + - Update RFCs URL + - Point out that zlib and gzip formats are different + - Note that Z_BUF_ERROR is not fatal + - Document string limit for gzprintf() and possible buffer overflow + - Note requirement on avail_out when flushing + - Note permitted values of flush parameter of inflate() +- Add some FAQs (and even answers) to the FAQ +- Add contrib/inflate86/ for x86 faster inflate +- Add contrib/blast/ for PKWare Data Compression Library decompression +- Add contrib/puff/ simple inflate for deflate format description + +Changes in 1.1.4 (11 March 2002) +- ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt +- Returned incorrect error (Z_MEM_ERROR) on some invalid data +- Avoid accesses before window for invalid distances with inflate window + less than 32K. +- force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + +Changes in 1.1.3 (9 July 1998) +- fix "an inflate input buffer bug that shows up on rare but persistent + occasions" (Mark) +- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +- fix gzseek(..., SEEK_SET) in write mode +- fix crc check after a gzeek (Frank Faubert) +- fix miniunzip when the last entry in a zip file is itself a zip file + (J Lillge) +- add contrib/asm586 and contrib/asm686 (Brian Raiter) + See http://www.muppetlabs.com/~breadbox/software/assembly.html +- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +- added a FAQ file + +- Support gzdopen on Mac with Metrowerks (Jason Linhart) +- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +- avoid some warnings with Borland C (Tom Tanner) +- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +- use libdir and includedir in Makefile.in (Tim Mooney) +- support shared libraries on OSF1 V4 (Tim Mooney) +- remove so_locations in "make clean" (Tim Mooney) +- fix maketree.c compilation error (Glenn, Mark) +- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +- new Makefile.riscos (Rich Walker) +- initialize static descriptors in trees.c for embedded targets (Nick Smith) +- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +- fix maketree.c to allow clean compilation of inffixed.h (Mark) +- fix parameter check in deflateCopy (Gunther Nikl) +- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +- Many portability patches by Christian Spieler: + . zutil.c, zutil.h: added "const" for zmem* + . Make_vms.com: fixed some typos + . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists + . msdos/Makefile.msc: remove "default rtl link library" info from obj files + . msdos/Makefile.*: use model-dependent name for the built zlib library + . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: + new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +- replace __far with _far for better portability (Christian Spieler, Tom Lane) +- fix test for errno.h in configure (Tim Newsham) + +Changes in 1.1.2 (19 March 98) +- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) + See http://www.winimage.com/zLibDll/unzip.html +- preinitialize the inflate tables for fixed codes, to make the code + completely thread safe (Mark) +- some simplifications and slight speed-up to the inflate code (Mark) +- fix gzeof on non-compressed files (Allan Schrum) +- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +- do not wrap extern "C" around system includes (Tom Lane) +- mention zlib binding for TCL in README (Andreas Kupries) +- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +- allow "configure --prefix $HOME" (Tim Mooney) +- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +- move Makefile.sas to amiga/Makefile.sas + +Changes in 1.1.1 (27 Feb 98) +- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +- remove block truncation heuristic which had very marginal effect for zlib + (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the + compression ratio on some files. This also allows inlining _tr_tally for + matches in deflate_slow. +- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) + +Changes in 1.1.0 (24 Feb 98) +- do not return STREAM_END prematurely in inflate (John Bowler) +- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +- compile with -DFASTEST to get compression code optimized for speed only +- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain + on Sun but significant on HP) + +- add a pointer to experimental unzip library in README (Gilles Vollant) +- initialize variable gcc in configure (Chris Herborth) + +Changes in 1.0.9 (17 Feb 1998) +- added gzputs and gzgets functions +- do not clear eof flag in gzseek (Mark Diekhans) +- fix gzseek for files in transparent mode (Mark Diekhans) +- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +- replace EXPORT with ZEXPORT to avoid conflict with other programs +- added compress2 in zconf.h, zlib.def, zlib.dnt +- new asm code from Gilles Vollant in contrib/asm386 +- simplify the inflate code (Mark): + . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() + . ZALLOC the length list in inflate_trees_fixed() instead of using stack + . ZALLOC the value area for huft_build() instead of using stack + . Simplify Z_FINISH check in inflate() + +- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with + the declaration of FAR (Gilles VOllant) +- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +- read_buf buf parameter of type Bytef* instead of charf* +- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +- fix check for presence of directories in "make install" (Ian Willis) + +Changes in 1.0.8 (27 Jan 1998) +- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +- added compress2() to allow setting the compression level +- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +- use constant arrays for the static trees in trees.c instead of computing + them at run time (thanks to Ken Raeburn for this suggestion). To create + trees.h, compile with GEN_TREES_H and run "make test". +- check return code of example in "make test" and display result +- pass minigzip command line options to file_compress +- simplifying code of inflateSync to avoid gcc 2.8 bug + +- support CC="gcc -Wall" in configure -s (QingLong) +- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +- fix test for shared library support to avoid compiler warnings +- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +- add checks for gzputc and gzputc in example.c +- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +- use const for the CRC table (Ken Raeburn) +- fixed "make uninstall" for shared libraries +- use Tracev instead of Trace in infblock.c +- in example.c use correct compressed length for test_sync +- suppress +vnocompatwarnings in configure for HPUX (not always supported) + +Changes in 1.0.7 (20 Jan 1998) +- fix gzseek which was broken in write mode +- return error for gzseek to negative absolute position +- fix configure for Linux (Chun-Chung Chen) +- increase stack space for MSC (Tim Wegner) +- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +- define EXPORTVA for gzprintf (Gilles Vollant) +- added man page zlib.3 (Rick Rodgers) +- for contrib/untgz, fix makedir() and improve Makefile + +- check gzseek in write mode in example.c +- allocate extra buffer for seeks only if gzseek is actually called +- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +- add inflateSyncPoint in zconf.h +- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def + +Changes in 1.0.6 (19 Jan 1998) +- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and + gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +- Fix a deflate bug occurring only with compression level 0 (thanks to + Andy Buckler for finding this one). +- In minigzip, pass transparently also the first byte for .Z files. +- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +- check Z_FINISH in inflate (thanks to Marc Schluper) +- Implement deflateCopy (thanks to Adam Costello) +- make static libraries by default in configure, add --shared option. +- move MSDOS or Windows specific files to directory msdos +- suppress the notion of partial flush to simplify the interface + (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +- suppress history buffer provided by application to simplify the interface + (this feature was not implemented anyway in 1.0.4) +- next_in and avail_in must be initialized before calling inflateInit or + inflateInit2 +- add EXPORT in all exported functions (for Windows DLL) +- added Makefile.nt (thanks to Stephen Williams) +- added the unsupported "contrib" directory: + contrib/asm386/ by Gilles Vollant + 386 asm code replacing longest_match(). + contrib/iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + contrib/iostream2/ by Tyge Lvset + Another C++ I/O streams interface + contrib/untgz/ by "Pedro A. Aranda Guti\irrez" + A very simple tar.gz file extractor using zlib + contrib/visual-basic.txt by Carlos Rios + How to use compress(), uncompress() and the gz* functions from VB. +- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression + level) in minigzip (thanks to Tom Lane) + +- use const for rommable constants in deflate +- added test for gzseek and gztell in example.c +- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +- add undocumented function zError to convert error code to string + (for Tim Smithers) +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +- Use default memcpy for Symantec MSDOS compiler. +- Add EXPORT keyword for check_func (needed for Windows DLL) +- add current directory to LD_LIBRARY_PATH for "make test" +- create also a link for libz.so.1 +- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +- added -soname for Linux in configure (Chun-Chung Chen, +- assign numbers to the exported functions in zlib.def (for Windows DLL) +- add advice in zlib.h for best usage of deflateSetDictionary +- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +- allow compilation with ANSI keywords only enabled for TurboC in large model +- avoid "versionString"[0] (Borland bug) +- add NEED_DUMMY_RETURN for Borland +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- allow compilation with CC +- defined STDC for OS/2 (David Charlap) +- limit external names to 8 chars for MVS (Thomas Lund) +- in minigzip.c, use static buffers only for 16-bit systems +- fix suffix check for "minigzip -d foo.gz" +- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +- added makelcc.bat for lcc-win32 (Tom St Denis) +- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- check for unistd.h in configure (for off_t) +- remove useless check parameter in inflate_blocks_free +- avoid useless assignment of s->check to itself in inflate_blocks_new +- do not flush twice in gzclose (thanks to Ken Raeburn) +- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +- work around buggy fclose on pipes for HP/UX +- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +- fix configure if CC is already equal to gcc + +Changes in 1.0.5 (3 Jan 98) +- Fix inflate to terminate gracefully when fed corrupted or invalid data +- Use const for rommable constants in inflate +- Eliminate memory leaks on error conditions in inflate +- Removed some vestigial code in inflate +- Update web address in README + +Changes in 1.0.4 (24 Jul 96) +- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF + bit, so the decompressor could decompress all the correct data but went + on to attempt decompressing extra garbage data. This affected minigzip too. +- zlibVersion and gzerror return const char* (needed for DLL) +- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +- use z_error only for DEBUG (avoid problem with DLLs) + +Changes in 1.0.3 (2 Jul 96) +- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS + small and medium models; this makes the library incompatible with previous + versions for these models. (No effect in large model or on other systems.) +- return OK instead of BUF_ERROR if previous deflate call returned with + avail_out as zero but there is nothing to do +- added memcmp for non STDC compilers +- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +- better check for 16-bit mode MSC (avoids problem with Symantec) + +Changes in 1.0.2 (23 May 96) +- added Windows DLL support +- added a function zlibVersion (for the DLL support) +- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +- Bytef is define's instead of typedef'd only for Borland C +- avoid reading uninitialized memory in example.c +- mention in README that the zlib format is now RFC1950 +- updated Makefile.dj2 +- added algorithm.doc + +Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +- fix array overlay in deflate.c which sometimes caused bad compressed data +- fix inflate bug with empty stored block +- fix MSDOS medium model which was broken in 0.99 +- fix deflateParams() which could generated bad compressed data. +- Bytef is define'd instead of typedef'ed (work around Borland bug) +- added an INDEX file +- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), + Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +- speed up adler32 for modern machines without auto-increment +- added -ansi for IRIX in configure +- static_init_done in trees.c is an int +- define unlink as delete for VMS +- fix configure for QNX +- add configure branch for SCO and HPUX +- avoid many warnings (unused variables, dead assignments, etc...) +- no fdopen for BeOS +- fix the Watcom fix for 32 bit mode (define FAR as empty) +- removed redefinition of Byte for MKWERKS +- work around an MWKERKS bug (incorrect merge of all .h files) + +Changes in 0.99 (27 Jan 96) +- allow preset dictionary shared between compressor and decompressor +- allow compression level 0 (no compression) +- add deflateParams in zlib.h: allow dynamic change of compression level + and compression strategy. +- test large buffers and deflateParams in example.c +- add optional "configure" to build zlib as a shared library +- suppress Makefile.qnx, use configure instead +- fixed deflate for 64-bit systems (detected on Cray) +- fixed inflate_blocks for 64-bit systems (detected on Alpha) +- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +- always return Z_BUF_ERROR when deflate() has nothing to do +- deflateInit and inflateInit are now macros to allow version checking +- prefix all global functions and types with z_ with -DZ_PREFIX +- make falloc completely reentrant (inftrees.c) +- fixed very unlikely race condition in ct_static_init +- free in reverse order of allocation to help memory manager +- use zlib-1.0/* instead of zlib/* inside the tar.gz +- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith + -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +- allow gzread on concatenated .gz files +- deflateEnd now returns Z_DATA_ERROR if it was premature +- deflate is finally (?) fully deterministic (no matches beyond end of input) +- Document Z_SYNC_FLUSH +- add uninstall in Makefile +- Check for __cpluplus in zlib.h +- Better test in ct_align for partial flush +- avoid harmless warnings for Borland C++ +- initialize hash_head in deflate.c +- avoid warning on fdopen (gzio.c) for HP cc -Aa +- include stdlib.h for STDC compilers +- include errno.h for Cray +- ignore error if ranlib doesn't exist +- call ranlib twice for NeXTSTEP +- use exec_prefix instead of prefix for libz.a +- renamed ct_* as _tr_* to avoid conflict with applications +- clear z->msg in inflateInit2 before any error return +- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +- fixed typo in zconf.h (_GNUC__ => __GNUC__) +- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +- in fcalloc, normalize pointer if size > 65520 bytes +- don't use special fcalloc for 32 bit Borland C++ +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use Z_BINARY instead of BINARY +- document that gzclose after gzdopen will close the file +- allow "a" as mode in gzopen. +- fix error checking in gzread +- allow skipping .gz extra-field on pipes +- added reference to Perl interface in README +- put the crc table in FAR data (I dislike more and more the medium model :) +- added get_crc_table +- added a dimension to all arrays (Borland C can't count). +- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +- guard against multiple inclusion of *.h (for precompiled header on Mac) +- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- don't use unsized arrays to avoid silly warnings by Visual C++: + warning C4746: 'inflate_mask' : unsized array treated as '__far' + (what's wrong with far data in far model?). +- define enum out of inflate_blocks_state to allow compilation with C++ + +Changes in 0.95 (16 Aug 95) +- fix MSDOS small and medium model (now easier to adapt to any compiler) +- inlined send_bits +- fix the final (:-) bug for deflate with flush (output was correct but + not completely flushed in rare occasions). +- default window size is same for compression and decompression + (it's now sufficient to set MAX_WBITS in zconf.h). +- voidp -> voidpf and voidnp -> voidp (for consistency with other + typedefs and because voidnp was not near in large model). + +Changes in 0.94 (13 Aug 95) +- support MSDOS medium model +- fix deflate with flush (could sometimes generate bad output) +- fix deflateReset (zlib header was incorrectly suppressed) +- added support for VMS +- allow a compression level in gzopen() +- gzflush now calls fflush +- For deflate with flush, flush even if no more input is provided. +- rename libgz.a as libz.a +- avoid complex expression in infcodes.c triggering Turbo C bug +- work around a problem with gcc on Alpha (in INSERT_STRING) +- don't use inline functions (problem with some gcc versions) +- allow renaming of Byte, uInt, etc... with #define. +- avoid warning about (unused) pointer before start of array in deflate.c +- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +- avoid reserved word 'new' in trees.c + +Changes in 0.93 (25 June 95) +- temporarily disable inline functions +- make deflate deterministic +- give enough lookahead for PARTIAL_FLUSH +- Set binary mode for stdin/stdout in minigzip.c for OS/2 +- don't even use signed char in inflate (not portable enough) +- fix inflate memory leak for segmented architectures + +Changes in 0.92 (3 May 95) +- don't assume that char is signed (problem on SGI) +- Clear bit buffer when starting a stored block +- no memcpy on Pyramid +- suppressed inftest.c +- optimized fill_window, put longest_match inline for gcc +- optimized inflate on stored blocks. +- untabify all sources to simplify patches + +Changes in 0.91 (2 May 95) +- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +- Document the memory requirements in zconf.h +- added "make install" +- fix sync search logic in inflateSync +- deflate(Z_FULL_FLUSH) now works even if output buffer too short +- after inflateSync, don't scare people with just "lo world" +- added support for DJGPP + +Changes in 0.9 (1 May 95) +- don't assume that zalloc clears the allocated memory (the TurboC bug + was Mark's bug after all :) +- let again gzread copy uncompressed data unchanged (was working in 0.71) +- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +- added a test of inflateSync in example.c +- moved MAX_WBITS to zconf.h because users might want to change that. +- document explicitly that zalloc(64K) on MSDOS must return a normalized + pointer (zero offset) +- added Makefiles for Microsoft C, Turbo C, Borland C++ +- faster crc32() + +Changes in 0.8 (29 April 95) +- added fast inflate (inffast.c) +- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this + is incompatible with previous versions of zlib which returned Z_OK. +- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) + (actually that was not a compiler bug, see 0.81 above) +- gzread no longer reads one extra byte in certain cases +- In gzio destroy(), don't reference a freed structure +- avoid many warnings for MSDOS +- avoid the ERROR symbol which is used by MS Windows + +Changes in 0.71 (14 April 95) +- Fixed more MSDOS compilation problems :( There is still a bug with + TurboC large model. + +Changes in 0.7 (14 April 95) +- Added full inflate support. +- Simplified the crc32() interface. The pre- and post-conditioning + (one's complement) is now done inside crc32(). WARNING: this is + incompatible with previous versions; see zlib.h for the new usage. + +Changes in 0.61 (12 April 95) +- workaround for a bug in TurboC. example and minigzip now work on MSDOS. + +Changes in 0.6 (11 April 95) +- added minigzip.c +- added gzdopen to reopen a file descriptor as gzFile +- added transparent reading of non-gziped files in gzread. +- fixed bug in gzread (don't read crc as data) +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- don't allocate big arrays in the stack (for MSDOS) +- fix some MSDOS compilation problems + +Changes in 0.5: +- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but + not yet Z_FULL_FLUSH. +- support decompression but only in a single step (forced Z_FINISH) +- added opaque object for zalloc and zfree. +- added deflateReset and inflateReset +- added a variable zlib_version for consistency checking. +- renamed the 'filter' parameter of deflateInit2 as 'strategy'. + Added Z_FILTERED and Z_HUFFMAN_ONLY constants. + +Changes in 0.4: +- avoid "zip" everywhere, use zlib instead of ziplib. +- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush + if compression method == 8. +- added adler32 and crc32 +- renamed deflateOptions as deflateInit2, call one or the other but not both +- added the method parameter for deflateInit2. +- added inflateInit2 +- simplied considerably deflateInit and inflateInit by not supporting + user-provided history buffer. This is supported only in deflateInit2 + and inflateInit2. + +Changes in 0.3: +- prefix all macro names with Z_ +- use Z_FINISH instead of deflateEnd to finish compression. +- added Z_HUFFMAN_ONLY +- added gzerror() diff --git a/win32/3rdparty/zlib/FAQ b/win32/3rdparty/zlib/FAQ new file mode 100644 index 000000000..441d910da --- /dev/null +++ b/win32/3rdparty/zlib/FAQ @@ -0,0 +1,339 @@ + + Frequently Asked Questions about zlib + + +If your question is not there, please check the zlib home page +http://www.zlib.org which may have more recent information. +The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html + + + 1. Is zlib Y2K-compliant? + + Yes. zlib doesn't handle dates. + + 2. Where can I get a Windows DLL version? + + The zlib sources can be compiled without change to produce a DLL. + See the file win32/DLL_FAQ.txt in the zlib distribution. + Pointers to the precompiled DLL are found in the zlib web site at + http://www.zlib.org. + + 3. Where can I get a Visual Basic interface to zlib? + + See + * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm + * contrib/visual-basic.txt in the zlib distribution + * win32/DLL_FAQ.txt in the zlib distribution + + 4. compress() returns Z_BUF_ERROR. + + Make sure that before the call of compress, the length of the compressed + buffer is equal to the total size of the compressed buffer and not + zero. For Visual Basic, check that this parameter is passed by reference + ("as any"), not by value ("as long"). + + 5. deflate() or inflate() returns Z_BUF_ERROR. + + Before making the call, make sure that avail_in and avail_out are not + zero. When setting the parameter flush equal to Z_FINISH, also make sure + that avail_out is big enough to allow processing all pending input. + Note that a Z_BUF_ERROR is not fatal--another call to deflate() or + inflate() can be made with more input or output space. A Z_BUF_ERROR + may in fact be unavoidable depending on how the functions are used, since + it is not possible to tell whether or not there is more output pending + when strm.avail_out returns with zero. + + 6. Where's the zlib documentation (man pages, etc.)? + + It's in zlib.h for the moment, and Francis S. Lin has converted it to a + web page zlib.html. Volunteers to transform this to Unix-style man pages, + please contact us (zlib@gzip.org). Examples of zlib usage are in the files + example.c and minigzip.c. + + 7. Why don't you use GNU autoconf or libtool or ...? + + Because we would like to keep zlib as a very small and simple + package. zlib is rather portable and doesn't need much configuration. + + 8. I found a bug in zlib. + + Most of the time, such problems are due to an incorrect usage of + zlib. Please try to reproduce the problem with a small program and send + the corresponding source to us at zlib@gzip.org . Do not send + multi-megabyte data files without prior agreement. + + 9. Why do I get "undefined reference to gzputc"? + + If "make test" produces something like + + example.o(.text+0x154): undefined reference to `gzputc' + + check that you don't have old files libz.* in /usr/lib, /usr/local/lib or + /usr/X11R6/lib. Remove any old versions, then do "make install". + +10. I need a Delphi interface to zlib. + + See the contrib/delphi directory in the zlib distribution. + +11. Can zlib handle .zip archives? + + Not by itself, no. See the directory contrib/minizip in the zlib + distribution. + +12. Can zlib handle .Z files? + + No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt + the code of uncompress on your own. + +13. How can I make a Unix shared library? + + make clean + ./configure -s + make + +14. How do I install a shared zlib library on Unix? + + After the above, then: + + make install + + However, many flavors of Unix come with a shared zlib already installed. + Before going to the trouble of compiling a shared version of zlib and + trying to install it, you may want to check if it's already there! If you + can #include , it's there. The -lz option will probably link to it. + +15. I have a question about OttoPDF. + + We are not the authors of OttoPDF. The real author is on the OttoPDF web + site: Joel Hainley, jhainley@myndkryme.com. + +16. Can zlib decode Flate data in an Adobe PDF file? + + Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ . + To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ . + +17. Why am I getting this "register_frame_info not found" error on Solaris? + + After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib + generates an error such as: + + ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: + symbol __register_frame_info: referenced symbol not found + + The symbol __register_frame_info is not part of zlib, it is generated by + the C compiler (cc or gcc). You must recompile applications using zlib + which have this problem. This problem is specific to Solaris. See + http://www.sunfreeware.com for Solaris versions of zlib and applications + using zlib. + +18. Why does gzip give an error on a file I make with compress/deflate? + + The compress and deflate functions produce data in the zlib format, which + is different and incompatible with the gzip format. The gz* functions in + zlib on the other hand use the gzip format. Both the zlib and gzip + formats use the same compressed data format internally, but have different + headers and trailers around the compressed data. + +19. Ok, so why are there two different formats? + + The gzip format was designed to retain the directory information about + a single file, such as the name and last modification date. The zlib + format on the other hand was designed for in-memory and communication + channel applications, and has a much more compact header and trailer and + uses a faster integrity check than gzip. + +20. Well that's nice, but how do I make a gzip file in memory? + + You can request that deflate write the gzip format instead of the zlib + format using deflateInit2(). You can also request that inflate decode + the gzip format using inflateInit2(). Read zlib.h for more details. + +21. Is zlib thread-safe? + + Yes. However any library routines that zlib uses and any application- + provided memory allocation routines must also be thread-safe. zlib's gz* + functions use stdio library routines, and most of zlib's functions use the + library memory allocation routines by default. zlib's Init functions allow + for the application to provide custom memory allocation routines. + + Of course, you should only operate on any given zlib or gzip stream from a + single thread at a time. + +22. Can I use zlib in my commercial application? + + Yes. Please read the license in zlib.h. + +23. Is zlib under the GNU license? + + No. Please read the license in zlib.h. + +24. The license says that altered source versions must be "plainly marked". So + what exactly do I need to do to meet that requirement? + + You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In + particular, the final version number needs to be changed to "f", and an + identification string should be appended to ZLIB_VERSION. Version numbers + x.x.x.f are reserved for modifications to zlib by others than the zlib + maintainers. For example, if the version of the base zlib you are altering + is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and + ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also + update the version strings in deflate.c and inftrees.c. + + For altered source distributions, you should also note the origin and + nature of the changes in zlib.h, as well as in ChangeLog and README, along + with the dates of the alterations. The origin should include at least your + name (or your company's name), and an email address to contact for help or + issues with the library. + + Note that distributing a compiled zlib library along with zlib.h and + zconf.h is also a source distribution, and so you should change + ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes + in zlib.h as you would for a full source distribution. + +25. Will zlib work on a big-endian or little-endian architecture, and can I + exchange compressed data between them? + + Yes and yes. + +26. Will zlib work on a 64-bit machine? + + It should. It has been tested on 64-bit machines, and has no dependence + on any data types being limited to 32-bits in length. If you have any + difficulties, please provide a complete problem report to zlib@gzip.org + +27. Will zlib decompress data from the PKWare Data Compression Library? + + No. The PKWare DCL uses a completely different compressed data format + than does PKZIP and zlib. However, you can look in zlib's contrib/blast + directory for a possible solution to your problem. + +28. Can I access data randomly in a compressed stream? + + No, not without some preparation. If when compressing you periodically + use Z_FULL_FLUSH, carefully write all the pending data at those points, + and keep an index of those locations, then you can start decompression + at those points. You have to be careful to not use Z_FULL_FLUSH too + often, since it can significantly degrade compression. + +29. Does zlib work on MVS, OS/390, CICS, etc.? + + We don't know for sure. We have heard occasional reports of success on + these systems. If you do use it on one of these, please provide us with + a report, instructions, and patches that we can reference when we get + these questions. Thanks. + +30. Is there some simpler, easier to read version of inflate I can look at + to understand the deflate format? + + First off, you should read RFC 1951. Second, yes. Look in zlib's + contrib/puff directory. + +31. Does zlib infringe on any patents? + + As far as we know, no. In fact, that was originally the whole point behind + zlib. Look here for some more information: + + http://www.gzip.org/#faq11 + +32. Can zlib work with greater than 4 GB of data? + + Yes. inflate() and deflate() will process any amount of data correctly. + Each call of inflate() or deflate() is limited to input and output chunks + of the maximum value that can be stored in the compiler's "unsigned int" + type, but there is no limit to the number of chunks. Note however that the + strm.total_in and strm_total_out counters may be limited to 4 GB. These + counters are provided as a convenience and are not used internally by + inflate() or deflate(). The application can easily set up its own counters + updated after each call of inflate() or deflate() to count beyond 4 GB. + compress() and uncompress() may be limited to 4 GB, since they operate in a + single call. gzseek() and gztell() may be limited to 4 GB depending on how + zlib is compiled. See the zlibCompileFlags() function in zlib.h. + + The word "may" appears several times above since there is a 4 GB limit + only if the compiler's "long" type is 32 bits. If the compiler's "long" + type is 64 bits, then the limit is 16 exabytes. + +33. Does zlib have any security vulnerabilities? + + The only one that we are aware of is potentially in gzprintf(). If zlib + is compiled to use sprintf() or vsprintf(), then there is no protection + against a buffer overflow of a 4K string space, other than the caller of + gzprintf() assuring that the output will not exceed 4K. On the other + hand, if zlib is compiled to use snprintf() or vsnprintf(), which should + normally be the case, then there is no vulnerability. The ./configure + script will display warnings if an insecure variation of sprintf() will + be used by gzprintf(). Also the zlibCompileFlags() function will return + information on what variant of sprintf() is used by gzprintf(). + + If you don't have snprintf() or vsnprintf() and would like one, you can + find a portable implementation here: + + http://www.ijs.si/software/snprintf/ + + Note that you should be using the most recent version of zlib. Versions + 1.1.3 and before were subject to a double-free vulnerability. + +34. Is there a Java version of zlib? + + Probably what you want is to use zlib in Java. zlib is already included + as part of the Java SDK in the java.util.zip package. If you really want + a version of zlib written in the Java language, look on the zlib home + page for links: http://www.zlib.org/ + +35. I get this or that compiler or source-code scanner warning when I crank it + up to maximally-pedantic. Can't you guys write proper code? + + Many years ago, we gave up attempting to avoid warnings on every compiler + in the universe. It just got to be a waste of time, and some compilers + were downright silly. So now, we simply make sure that the code always + works. + +36. Valgrind (or some similar memory access checker) says that deflate is + performing a conditional jump that depends on an uninitialized value. + Isn't that a bug? + + No. That is intentional for performance reasons, and the output of + deflate is not affected. This only started showing up recently since + zlib 1.2.x uses malloc() by default for allocations, whereas earlier + versions used calloc(), which zeros out the allocated memory. + +37. Will zlib read the (insert any ancient or arcane format here) compressed + data format? + + Probably not. Look in the comp.compression FAQ for pointers to various + formats and associated software. + +38. How can I encrypt/decrypt zip files with zlib? + + zlib doesn't support encryption. The original PKZIP encryption is very weak + and can be broken with freely available programs. To get strong encryption, + use GnuPG, http://www.gnupg.org/ , which already includes zlib compression. + For PKZIP compatible "encryption", look at http://www.info-zip.org/ + +39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? + + "gzip" is the gzip format, and "deflate" is the zlib format. They should + probably have called the second one "zlib" instead to avoid confusion + with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 + correctly points to the zlib specification in RFC 1950 for the "deflate" + transfer encoding, there have been reports of servers and browsers that + incorrectly produce or expect raw deflate data per the deflate + specficiation in RFC 1951, most notably Microsoft. So even though the + "deflate" transfer encoding using the zlib format would be the more + efficient approach (and in fact exactly what the zlib format was designed + for), using the "gzip" transfer encoding is probably more reliable due to + an unfortunate choice of name on the part of the HTTP 1.1 authors. + + Bottom line: use the gzip format for HTTP 1.1 encoding. + +40. Does zlib support the new "Deflate64" format introduced by PKWare? + + No. PKWare has apparently decided to keep that format proprietary, since + they have not documented it as they have previous compression formats. + In any case, the compression improvements are so modest compared to other + more modern approaches, that it's not worth the effort to implement. + +41. Can you please sign these lengthy legal documents and fax them back to us + so that we can use your software in our product? + + No. Go away. Shoo. diff --git a/win32/3rdparty/zlib/INDEX b/win32/3rdparty/zlib/INDEX new file mode 100644 index 000000000..0587e5902 --- /dev/null +++ b/win32/3rdparty/zlib/INDEX @@ -0,0 +1,51 @@ +ChangeLog history of changes +FAQ Frequently Asked Questions about zlib +INDEX this file +Makefile makefile for Unix (generated by configure) +Makefile.in makefile for Unix (template for configure) +README guess what +algorithm.txt description of the (de)compression algorithm +configure configure script for Unix +zconf.in.h template for zconf.h (used by configure) + +amiga/ makefiles for Amiga SAS C +as400/ makefiles for IBM AS/400 +msdos/ makefiles for MSDOS +old/ makefiles for various architectures and zlib documentation + files that have not yet been updated for zlib 1.2.x +projects/ projects for various Integrated Development Environments +qnx/ makefiles for QNX +win32/ makefiles for Windows + + zlib public header files (must be kept): +zconf.h +zlib.h + + private source files used to build the zlib library: +adler32.c +compress.c +crc32.c +crc32.h +deflate.c +deflate.h +gzio.c +infback.c +inffast.c +inffast.h +inffixed.h +inflate.c +inflate.h +inftrees.c +inftrees.h +trees.c +trees.h +uncompr.c +zutil.c +zutil.h + + source files for sample programs: +example.c +minigzip.c + + unsupported contribution by third parties +See contrib/README.contrib diff --git a/win32/3rdparty/zlib/Makefile.in b/win32/3rdparty/zlib/Makefile.in new file mode 100644 index 000000000..2fd6e45c4 --- /dev/null +++ b/win32/3rdparty/zlib/Makefile.in @@ -0,0 +1,154 @@ +# Makefile for zlib +# Copyright (C) 1995-2005 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# ./configure; make test +# The call of configure is optional if you don't have special requirements +# If you wish to build zlib as a shared library, use: ./configure -s + +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o + +# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: +# make install +# To install in $HOME instead of /usr/local, use: +# make install prefix=$HOME + +CC=cc + +CFLAGS=-O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DDEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +LDFLAGS=libz.a +LDSHARED=$(CC) +CPP=$(CC) -E + +LIBS=libz.a +SHAREDLIB=libz.so +SHAREDLIBV=libz.so.1.2.3 +SHAREDLIBM=libz.so.1 + +AR=ar rc +RANLIB=ranlib +TAR=tar +SHELL=/bin/sh +EXE= + +prefix = /usr/local +exec_prefix = ${prefix} +libdir = ${exec_prefix}/lib +includedir = ${prefix}/include +mandir = ${prefix}/share/man +man3dir = ${mandir}/man3 + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infback.o inftrees.o inffast.o + +OBJA = +# to use the asm code: make OBJA=match.o + +TEST_OBJS = example.o minigzip.o + +all: example$(EXE) minigzip$(EXE) + +check: test +test: all + @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + echo hello world | ./minigzip | ./minigzip -d || \ + echo ' *** minigzip test FAILED ***' ; \ + if ./example; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; \ + fi + +libz.a: $(OBJS) $(OBJA) + $(AR) $@ $(OBJS) $(OBJA) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +match.o: match.S + $(CPP) match.S > _match.s + $(CC) -c _match.s + mv _match.o match.o + rm -f _match.s + +$(SHAREDLIBV): $(OBJS) + $(LDSHARED) -o $@ $(OBJS) + rm -f $(SHAREDLIB) $(SHAREDLIBM) + ln -s $@ $(SHAREDLIB) + ln -s $@ $(SHAREDLIBM) + +example$(EXE): example.o $(LIBS) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) + +minigzip$(EXE): minigzip.o $(LIBS) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + +install: $(LIBS) + -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi + -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi + -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi + -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi + cp zlib.h zconf.h $(includedir) + chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h + cp $(LIBS) $(libdir) + cd $(libdir); chmod 755 $(LIBS) + -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 + cd $(libdir); if test -f $(SHAREDLIBV); then \ + rm -f $(SHAREDLIB) $(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ + (ldconfig || true) >/dev/null 2>&1; \ + fi + cp zlib.3 $(man3dir) + chmod 644 $(man3dir)/zlib.3 +# The ranlib in install is needed on NeXTSTEP which checks file times +# ldconfig is for Linux + +uninstall: + cd $(includedir); \ + cd $(libdir); rm -f libz.a; \ + if test -f $(SHAREDLIBV); then \ + rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ + fi + cd $(man3dir); rm -f zlib.3 + +mostlyclean: clean +clean: + rm -f *.o *~ example$(EXE) minigzip$(EXE) \ + libz.* foo.gz so_locations \ + _match.s maketree contrib/infback9/*.o + +maintainer-clean: distclean +distclean: clean + cp -p Makefile.in Makefile + cp -p zconf.in.h zconf.h + rm -f .DS_Store + +tags: + etags *.[ch] + +depend: + makedepend -- $(CFLAGS) -- *.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/win32/3rdparty/zlib/README b/win32/3rdparty/zlib/README new file mode 100644 index 000000000..758cc5002 --- /dev/null +++ b/win32/3rdparty/zlib/README @@ -0,0 +1,125 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.3 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). These documents are also available in other +formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file example.c which also tests that the library +is working correctly. Another example is given in the file minigzip.c. The +compression library itself is composed of all source files except example.c and +minigzip.c. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile. In short "make test; make install" should work for most +machines. For Unix: "./configure; make test; make install". For MSDOS, use one +of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, +please check this site to verify that you have the latest version of zlib; +otherwise get the latest version and check whether the problem still exists or +not. + +PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking +for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available in +http://dogma.net/markn/articles/zlibtool/zlibtool.htm + +The changes made in version 1.2.3 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory "contrib". + +A Java implementation of zlib is available in the Java Development Kit +http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html +See the zlib home page http://www.zlib.org for details. + +A Perl interface to zlib written by Paul Marquess is in the +CPAN (Comprehensive Perl Archive Network) sites +http://www.cpan.org/modules/by-module/Compress/ + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://www.python.org/doc/lib/module-zlib.html + +A zlib binding for TCL written by Andreas Kupries is +availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + +- When building a shared, i.e. dynamic library on Mac OS X, the library must be + installed before testing (do "make install" before "make test"), since the + library location is specified in the library. + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate + and zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; + they are too numerous to cite here. + +Copyright notice: + + (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* +receiving lengthy legal documents to sign. The sources are provided +for free but without warranty of any kind. The library has been +entirely written by Jean-loup Gailly and Mark Adler; it does not +include third-party code. + +If you redistribute modified sources, we would appreciate that you include +in the file ChangeLog history information documenting your changes. Please +read the FAQ for more information on the distribution of modified source +versions. diff --git a/win32/3rdparty/zlib/adler32.c b/win32/3rdparty/zlib/adler32.c new file mode 100644 index 000000000..007ba2627 --- /dev/null +++ b/win32/3rdparty/zlib/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/win32/3rdparty/zlib/algorithm.txt b/win32/3rdparty/zlib/algorithm.txt new file mode 100644 index 000000000..b022dde31 --- /dev/null +++ b/win32/3rdparty/zlib/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend two much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://www.ietf.org/rfc/rfc1951.txt diff --git a/win32/3rdparty/zlib/amiga/Makefile.pup b/win32/3rdparty/zlib/amiga/Makefile.pup new file mode 100644 index 000000000..3f7e15537 --- /dev/null +++ b/win32/3rdparty/zlib/amiga/Makefile.pup @@ -0,0 +1,66 @@ +# Amiga powerUP (TM) Makefile +# makefile for libpng and SAS C V6.58/7.00 PPC compiler +# Copyright (C) 1998 by Andreas R. Kleinert + +LIBNAME = libzip.a + +CC = scppc +CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \ + OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8 NOVER +AR = ppc-amigaos-ar cr +RANLIB = ppc-amigaos-ranlib +LD = ppc-amigaos-ld -r +LDFLAGS = -o +LDLIBS = LIB:scppc.a LIB:end.o +RM = delete quiet + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example minigzip + +check: test +test: all + example + echo hello world | minigzip | minigzip -d + +$(LIBNAME): $(OBJS) + $(AR) $@ $(OBJS) + -$(RANLIB) $@ + +example: example.o $(LIBNAME) + $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS) + +minigzip: minigzip.o $(LIBNAME) + $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS) + +mostlyclean: clean +clean: + $(RM) *.o example minigzip $(LIBNAME) foo.gz + +zip: + zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \ + descrip.mms *.[ch] + +tgz: + cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ + zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/win32/3rdparty/zlib/amiga/Makefile.sas b/win32/3rdparty/zlib/amiga/Makefile.sas new file mode 100644 index 000000000..296ef48a2 --- /dev/null +++ b/win32/3rdparty/zlib/amiga/Makefile.sas @@ -0,0 +1,65 @@ +# SMakefile for zlib +# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly +# Osma Ahvenlampi +# Amiga, SAS/C 6.56 & Smake + +CC=sc +CFLAGS=OPT +#CFLAGS=OPT CPU=68030 +#CFLAGS=DEBUG=LINE +LDFLAGS=LIB z.lib + +SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \ + NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX \ + DEF=POSTINC + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: SCOPTIONS example minigzip + +check: test +test: all + example + echo hello world | minigzip | minigzip -d + +install: z.lib + copy clone zlib.h zconf.h INCLUDE: + copy clone z.lib LIB: + +z.lib: $(OBJS) + oml z.lib r $(OBJS) + +example: example.o z.lib + $(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS) + +minigzip: minigzip.o z.lib + $(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS) + +mostlyclean: clean +clean: + -delete force quiet example minigzip *.o z.lib foo.gz *.lnk SCOPTIONS + +SCOPTIONS: Makefile.sas + copy to $@ 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} diff --git a/win32/3rdparty/zlib/configure b/win32/3rdparty/zlib/configure new file mode 100644 index 000000000..d7ffdc345 --- /dev/null +++ b/win32/3rdparty/zlib/configure @@ -0,0 +1,459 @@ +#!/bin/sh +# configure script for zlib. This script is needed only if +# you wish to build a shared library and your system supports them, +# of if you need special compiler, flags or install directory. +# Otherwise, you can just use directly "make test; make install" +# +# To create a shared library, use "configure --shared"; by default a static +# library is created. If the primitive shared library support provided here +# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz +# +# To impose specific compiler or flags or install directory, use for example: +# prefix=$HOME CC=cc CFLAGS="-O4" ./configure +# or for csh/tcsh users: +# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) +# LDSHARED is the command to be used to create a shared library + +# Incorrect settings of CC or CFLAGS may prevent creating a shared library. +# If you have problems, try without defining CC and CFLAGS before reporting +# an error. + +LIBS=libz.a +LDFLAGS="-L. ${LIBS}" +VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` +VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` +VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` +AR=${AR-"ar rc"} +RANLIB=${RANLIB-"ranlib"} +prefix=${prefix-/usr/local} +exec_prefix=${exec_prefix-'${prefix}'} +libdir=${libdir-'${exec_prefix}/lib'} +includedir=${includedir-'${prefix}/include'} +mandir=${mandir-'${prefix}/share/man'} +shared_ext='.so' +shared=0 +gcc=0 +old_cc="$CC" +old_cflags="$CFLAGS" + +while test $# -ge 1 +do +case "$1" in + -h* | --h*) + echo 'usage:' + echo ' configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]' + echo ' [--libdir=LIBDIR] [--includedir=INCLUDEDIR]' + exit 0;; + -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; + -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; + -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; + -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;; + -p* | --p*) prefix="$2"; shift; shift;; + -e* | --e*) exec_prefix="$2"; shift; shift;; + -l* | --l*) libdir="$2"; shift; shift;; + -i* | --i*) includedir="$2"; shift; shift;; + -s* | --s*) shared=1; shift;; + *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1;; + esac +done + +test=ztest$$ +cat > $test.c </dev/null; then + CC="$cc" + SFLAGS=${CFLAGS-"-fPIC -O3"} + CFLAGS="$cflags" + case `(uname -s || echo unknown) 2>/dev/null` in + Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};; + CYGWIN* | Cygwin* | cygwin* | OS/2* ) + EXE='.exe';; + QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 + # (alain.bonnefoy@icbt.com) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};; + HP-UX*) + LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so';; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl';; + esac;; + Darwin*) shared_ext='.dylib' + SHAREDLIB=libz$shared_ext + SHAREDLIBV=libz.$VER$shared_ext + SHAREDLIBM=libz.$VER1$shared_ext + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER"};; + *) LDSHARED=${LDSHARED-"$cc -shared"};; + esac +else + # find system name and corresponding cc options + CC=${CC-cc} + case `(uname -sr || echo unknown) 2>/dev/null` in + HP-UX*) SFLAGS=${CFLAGS-"-O +z"} + CFLAGS=${CFLAGS-"-O"} +# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} + LDSHARED=${LDSHARED-"ld -b"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so';; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl';; + esac;; + IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} + CFLAGS=${CFLAGS-"-ansi -O2"} + LDSHARED=${LDSHARED-"cc -shared"};; + OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} + CFLAGS=${CFLAGS-"-O -std1"} + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};; + OSF1*) SFLAGS=${CFLAGS-"-O -std1"} + CFLAGS=${CFLAGS-"-O -std1"} + LDSHARED=${LDSHARED-"cc -shared"};; + QNX*) SFLAGS=${CFLAGS-"-4 -O"} + CFLAGS=${CFLAGS-"-4 -O"} + LDSHARED=${LDSHARED-"cc"} + RANLIB=${RANLIB-"true"} + AR="cc -A";; + SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} + CFLAGS=${CFLAGS-"-O3"} + LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};; + SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} + CFLAGS=${CFLAGS-"-fast -xcg89"} + LDSHARED=${LDSHARED-"cc -G"};; + SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} + CFLAGS=${CFLAGS-"-O2"} + LDSHARED=${LDSHARED-"ld"};; + SunStudio\ 9*) SFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} + CFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xtarget=ultra3 -xarch=v9b"} + LDSHARED=${LDSHARED-"cc -xarch=v9b"};; + UNIX_System_V\ 4.2.0) + SFLAGS=${CFLAGS-"-KPIC -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"};; + UNIX_SV\ 4.2MP) + SFLAGS=${CFLAGS-"-Kconform_pic -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"};; + OpenUNIX\ 5) + SFLAGS=${CFLAGS-"-KPIC -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"};; + AIX*) # Courtesy of dbakker@arrayasolutions.com + SFLAGS=${CFLAGS-"-O -qmaxmem=8192"} + CFLAGS=${CFLAGS-"-O -qmaxmem=8192"} + LDSHARED=${LDSHARED-"xlc -G"};; + # send working options for other systems to support@gzip.org + *) SFLAGS=${CFLAGS-"-O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -shared"};; + esac +fi + +SHAREDLIB=${SHAREDLIB-"libz$shared_ext"} +SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"} +SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} + +if test $shared -eq 1; then + echo Checking for shared library support... + # we must test in two steps (cc then ld), required at least on SunOS 4.x + if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" && + test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then + CFLAGS="$SFLAGS" + LIBS="$SHAREDLIBV" + echo Building shared library $SHAREDLIBV with $CC. + elif test -z "$old_cc" -a -z "$old_cflags"; then + echo No shared library support. + shared=0; + else + echo 'No shared library support; try without defining CC and CFLAGS' + shared=0; + fi +fi +if test $shared -eq 0; then + LDSHARED="$CC" + echo Building static library $LIBS version $VER with $CC. +else + LDFLAGS="-L. ${SHAREDLIBV}" +fi + +cat > $test.c < +int main() { return 0; } +EOF +if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + sed < zconf.in.h "/HAVE_UNISTD_H/s%0%1%" > zconf.h + echo "Checking for unistd.h... Yes." +else + cp -p zconf.in.h zconf.h + echo "Checking for unistd.h... No." +fi + +cat > $test.c < +#include +#include "zconf.h" + +int main() +{ +#ifndef STDC + choke me +#endif + + return 0; +} +EOF + +if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()" + + cat > $test.c < +#include + +int mytest(char *fmt, ...) +{ + char buf[20]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return 0; +} + +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then + echo "Checking for vsnprintf() in stdio.h... Yes." + + cat >$test.c < +#include + +int mytest(char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} + +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for return value of vsnprintf()... Yes." + else + CFLAGS="$CFLAGS -DHAS_vsnprintf_void" + echo "Checking for return value of vsnprintf()... No." + echo " WARNING: apparently vsnprintf() does not return a value. zlib" + echo " can build but will be open to possible string-format security" + echo " vulnerabilities." + fi + else + CFLAGS="$CFLAGS -DNO_vsnprintf" + echo "Checking for vsnprintf() in stdio.h... No." + echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" + echo " can build but will be open to possible buffer-overflow security" + echo " vulnerabilities." + + cat >$test.c < +#include + +int mytest(char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + + va_start(ap, fmt); + n = vsprintf(buf, fmt, ap); + va_end(ap); + return n; +} + +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for return value of vsprintf()... Yes." + else + CFLAGS="$CFLAGS -DHAS_vsprintf_void" + echo "Checking for return value of vsprintf()... No." + echo " WARNING: apparently vsprintf() does not return a value. zlib" + echo " can build but will be open to possible string-format security" + echo " vulnerabilities." + fi + fi +else + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()" + + cat >$test.c < + +int mytest() +{ + char buf[20]; + + snprintf(buf, sizeof(buf), "%s", "foo"); + return 0; +} + +int main() +{ + return (mytest()); +} +EOF + + if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then + echo "Checking for snprintf() in stdio.h... Yes." + + cat >$test.c < + +int mytest() +{ + char buf[20]; + + return snprintf(buf, sizeof(buf), "%s", "foo"); +} + +int main() +{ + return (mytest()); +} +EOF + + if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for return value of snprintf()... Yes." + else + CFLAGS="$CFLAGS -DHAS_snprintf_void" + echo "Checking for return value of snprintf()... No." + echo " WARNING: apparently snprintf() does not return a value. zlib" + echo " can build but will be open to possible string-format security" + echo " vulnerabilities." + fi + else + CFLAGS="$CFLAGS -DNO_snprintf" + echo "Checking for snprintf() in stdio.h... No." + echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" + echo " can build but will be open to possible buffer-overflow security" + echo " vulnerabilities." + + cat >$test.c < + +int mytest() +{ + char buf[20]; + + return sprintf(buf, "%s", "foo"); +} + +int main() +{ + return (mytest()); +} +EOF + + if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for return value of sprintf()... Yes." + else + CFLAGS="$CFLAGS -DHAS_sprintf_void" + echo "Checking for return value of sprintf()... No." + echo " WARNING: apparently sprintf() does not return a value. zlib" + echo " can build but will be open to possible string-format security" + echo " vulnerabilities." + fi + fi +fi + +cat >$test.c < +int main() { return 0; } +EOF +if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for errno.h... Yes." +else + echo "Checking for errno.h... No." + CFLAGS="$CFLAGS -DNO_ERRNO_H" +fi + +cat > $test.c < +#include +#include +caddr_t hello() { + return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0); +} +EOF +if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + CFLAGS="$CFLAGS -DUSE_MMAP" + echo Checking for mmap support... Yes. +else + echo Checking for mmap support... No. +fi + +CPP=${CPP-"$CC -E"} +case $CFLAGS in + *ASMV*) + if test "`nm $test.o | grep _hello`" = ""; then + CPP="$CPP -DNO_UNDERLINE" + echo Checking for underline in external names... No. + else + echo Checking for underline in external names... Yes. + fi;; +esac + +rm -f $test.[co] $test $test$shared_ext + +# udpate Makefile +sed < Makefile.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^CPP *=/s#=.*#=$CPP# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^LIBS *=/s#=.*#=$LIBS# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR# +/^RANLIB *=/s#=.*#=$RANLIB# +/^EXE *=/s#=.*#=$EXE# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# +" > Makefile diff --git a/win32/3rdparty/zlib/contrib/README.contrib b/win32/3rdparty/zlib/contrib/README.contrib new file mode 100644 index 000000000..20afc6215 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/README.contrib @@ -0,0 +1,71 @@ +All files under this contrib directory are UNSUPPORTED. There were +provided by users of zlib and were not tested by the authors of zlib. +Use at your own risk. Please contact the authors of the contributions +for help about these, not the zlib authors. Thanks. + + +ada/ by Dmitriy Anisimkov + Support for Ada + See http://zlib-ada.sourceforge.net/ + +asm586/ +asm686/ by Brian Raiter + asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax + See http://www.muppetlabs.com/~breadbox/software/assembly.html + +blast/ by Mark Adler + Decompressor for output of PKWare Data Compression Library (DCL) + +delphi/ by Cosmin Truta + Support for Delphi and C++ Builder + +dotzlib/ by Henrik Ravn + Support for Microsoft .Net and Visual C++ .Net + +infback9/ by Mark Adler + Unsupported diffs to infback to decode the deflate64 format + +inflate86/ by Chris Anderson + Tuned x86 gcc asm code to replace inflate_fast() + +iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + +iostream2/ by Tyge Lvset + Another C++ I/O streams interface + +iostream3/ by Ludwig Schwardt + and Kevin Ruland + Yet another C++ I/O streams interface + +masm686/ by Dan Higdon + and Chuck Walbourn + asm code for Pentium Pro/PII, using the MASM syntax + +masmx64/ by Gilles Vollant + x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to + replace longest_match() and inflate_fast() + +masmx86/ by Gilles Vollant + x86 asm code to replace longest_match() and inflate_fast(), + for Visual C++ and MASM + +minizip/ by Gilles Vollant + Mini zip and unzip based on zlib + See http://www.winimage.com/zLibDll/unzip.html + +pascal/ by Bob Dellaca et al. + Support for Pascal + +puff/ by Mark Adler + Small, low memory usage inflate. Also serves to provide an + unambiguous description of the deflate format. + +testzlib/ by Gilles Vollant + Example of the use of zlib + +untgz/ by Pedro A. Aranda Gutierrez + A very simple tar.gz file extractor using zlib + +vstudio/ by Gilles Vollant + Building a minizip-enhanced zlib with Microsoft Visual Studio diff --git a/win32/3rdparty/zlib/contrib/ada/buffer_demo.adb b/win32/3rdparty/zlib/contrib/ada/buffer_demo.adb new file mode 100644 index 000000000..46b863810 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/buffer_demo.adb @@ -0,0 +1,106 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- +-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $ + +-- This demo program provided by Dr Steve Sangwine +-- +-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer +-- of exactly the correct size is used for decompressed data, and the last +-- few bytes passed in to Zlib are checksum bytes. + +-- This program compresses a string of text, and then decompresses the +-- compressed text into a buffer of the same size as the original text. + +with Ada.Streams; use Ada.Streams; +with Ada.Text_IO; + +with ZLib; use ZLib; + +procedure Buffer_Demo is + EOL : Character renames ASCII.LF; + Text : constant String + := "Four score and seven years ago our fathers brought forth," & EOL & + "upon this continent, a new nation, conceived in liberty," & EOL & + "and dedicated to the proposition that `all men are created equal'."; + + Source : Stream_Element_Array (1 .. Text'Length); + for Source'Address use Text'Address; + +begin + Ada.Text_IO.Put (Text); + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes"); + + declare + Compressed_Data : Stream_Element_Array (1 .. Text'Length); + L : Stream_Element_Offset; + begin + Compress : declare + Compressor : Filter_Type; + I : Stream_Element_Offset; + begin + Deflate_Init (Compressor); + + -- Compress the whole of T at once. + + Translate (Compressor, Source, I, Compressed_Data, L, Finish); + pragma Assert (I = Source'Last); + + Close (Compressor); + + Ada.Text_IO.Put_Line + ("Compressed size : " + & Stream_Element_Offset'Image (L) & " bytes"); + end Compress; + + -- Now we decompress the data, passing short blocks of data to Zlib + -- (because this demonstrates the problem - the last block passed will + -- contain checksum information and there will be no output, only a + -- check inside Zlib that the checksum is correct). + + Decompress : declare + Decompressor : Filter_Type; + + Uncompressed_Data : Stream_Element_Array (1 .. Text'Length); + + Block_Size : constant := 4; + -- This makes sure that the last block contains + -- only Adler checksum data. + + P : Stream_Element_Offset := Compressed_Data'First - 1; + O : Stream_Element_Offset; + begin + Inflate_Init (Decompressor); + + loop + Translate + (Decompressor, + Compressed_Data + (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)), + P, + Uncompressed_Data + (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last), + O, + No_Flush); + + Ada.Text_IO.Put_Line + ("Total in : " & Count'Image (Total_In (Decompressor)) & + ", out : " & Count'Image (Total_Out (Decompressor))); + + exit when P = L; + end loop; + + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Decompressed text matches original text : " + & Boolean'Image (Uncompressed_Data = Source)); + end Decompress; + end; +end Buffer_Demo; diff --git a/win32/3rdparty/zlib/contrib/ada/mtest.adb b/win32/3rdparty/zlib/contrib/ada/mtest.adb new file mode 100644 index 000000000..c4dfd080f --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/mtest.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- Continuous test for ZLib multithreading. If the test would fail +-- we should provide thread safe allocation routines for the Z_Stream. +-- +-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $ + +with ZLib; +with Ada.Streams; +with Ada.Numerics.Discrete_Random; +with Ada.Text_IO; +with Ada.Exceptions; +with Ada.Task_Identification; + +procedure MTest is + use Ada.Streams; + use ZLib; + + Stop : Boolean := False; + + pragma Atomic (Stop); + + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + task type Test_Task; + + task body Test_Task is + Buffer : Stream_Element_Array (1 .. 100_000); + Gen : Random_Elements.Generator; + + Buffer_First : Stream_Element_Offset; + Compare_First : Stream_Element_Offset; + + Deflate : Filter_Type; + Inflate : Filter_Type; + + procedure Further (Item : in Stream_Element_Array); + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + ------------- + -- Further -- + ------------- + + procedure Further (Item : in Stream_Element_Array) is + + procedure Compare (Item : in Stream_Element_Array); + + ------------- + -- Compare -- + ------------- + + procedure Compare (Item : in Stream_Element_Array) is + Next_First : Stream_Element_Offset := Compare_First + Item'Length; + begin + if Buffer (Compare_First .. Next_First - 1) /= Item then + raise Program_Error; + end if; + + Compare_First := Next_First; + end Compare; + + procedure Compare_Write is new ZLib.Write (Write => Compare); + begin + Compare_Write (Inflate, Item, No_Flush); + end Further; + + ----------------- + -- Read_Buffer -- + ----------------- + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset) + is + Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First; + Next_First : Stream_Element_Offset; + begin + if Item'Length <= Buff_Diff then + Last := Item'Last; + + Next_First := Buffer_First + Item'Length; + + Item := Buffer (Buffer_First .. Next_First - 1); + + Buffer_First := Next_First; + else + Last := Item'First + Buff_Diff; + Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); + Buffer_First := Buffer'Last + 1; + end if; + end Read_Buffer; + + procedure Translate is new Generic_Translate + (Data_In => Read_Buffer, + Data_Out => Further); + + begin + Random_Elements.Reset (Gen); + + Buffer := (others => 20); + + Main : loop + for J in Buffer'Range loop + Buffer (J) := Random_Elements.Random (Gen); + + Deflate_Init (Deflate); + Inflate_Init (Inflate); + + Buffer_First := Buffer'First; + Compare_First := Buffer'First; + + Translate (Deflate); + + if Compare_First /= Buffer'Last + 1 then + raise Program_Error; + end if; + + Ada.Text_IO.Put_Line + (Ada.Task_Identification.Image + (Ada.Task_Identification.Current_Task) + & Stream_Element_Offset'Image (J) + & ZLib.Count'Image (Total_Out (Deflate))); + + Close (Deflate); + Close (Inflate); + + exit Main when Stop; + end loop; + end loop Main; + exception + when E : others => + Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); + Stop := True; + end Test_Task; + + Test : array (1 .. 4) of Test_Task; + + pragma Unreferenced (Test); + + Dummy : Character; + +begin + Ada.Text_IO.Get_Immediate (Dummy); + Stop := True; +end MTest; diff --git a/win32/3rdparty/zlib/contrib/ada/read.adb b/win32/3rdparty/zlib/contrib/ada/read.adb new file mode 100644 index 000000000..1f2efbfeb --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/read.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $ + +-- Test/demo program for the generic read interface. + +with Ada.Numerics.Discrete_Random; +with Ada.Streams; +with Ada.Text_IO; + +with ZLib; + +procedure Read is + + use Ada.Streams; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Stream_Element_Offset := 100_000; + + Continuous : constant Boolean := False; + -- If this constant is True, the test would be repeated again and again, + -- with increment File_Size for every iteration. + + Header : constant ZLib.Header_Type := ZLib.Default; + -- Do not use Header other than Default in ZLib versions 1.1.4 and older. + + Init_Random : constant := 8; + -- We are using the same random sequence, in case of we catch bug, + -- so we would be able to reproduce it. + + -- End -- + + Pack_Size : Stream_Element_Offset; + Offset : Stream_Element_Offset; + + Filter : ZLib.Filter_Type; + + subtype Visible_Symbols + is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is new + Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Period : constant Stream_Element_Offset := 200; + -- Period constant variable for random generator not to be very random. + -- Bigger period, harder random. + + Read_Buffer : Stream_Element_Array (1 .. 2048); + Read_First : Stream_Element_Offset; + Read_Last : Stream_Element_Offset; + + procedure Reset; + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Read + -- reading data from the File_In. + + procedure Read is new ZLib.Read + (Read, + Read_Buffer, + Rest_First => Read_First, + Rest_Last => Read_Last); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Last := Stream_Element_Offset'Min + (Item'Last, + Item'First + File_Size - Offset); + + for J in Item'First .. Last loop + if J < Item'First + Period then + Item (J) := Random_Elements.Random (Gen); + else + Item (J) := Item (J - Period); + end if; + + Offset := Offset + 1; + end loop; + end Read; + + ----------- + -- Reset -- + ----------- + + procedure Reset is + begin + Random_Elements.Reset (Gen, Init_Random); + Pack_Size := 0; + Offset := 1; + Read_First := Read_Buffer'Last + 1; + Read_Last := Read_Buffer'Last; + end Reset; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter, + Level, + Header => Header); + + Reset; + + Ada.Text_IO.Put + (Stream_Element_Offset'Image (File_Size) & " ->"); + + loop + declare + Buffer : Stream_Element_Array (1 .. 1024); + Last : Stream_Element_Offset; + begin + Read (Filter, Buffer, Last); + + Pack_Size := Pack_Size + Last - Buffer'First + 1; + + exit when Last < Buffer'Last; + end; + end loop; + + Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size)); + + ZLib.Close (Filter); + end loop; + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Read; diff --git a/win32/3rdparty/zlib/contrib/ada/readme.txt b/win32/3rdparty/zlib/contrib/ada/readme.txt new file mode 100644 index 000000000..ce4d2cadf --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/readme.txt @@ -0,0 +1,65 @@ + ZLib for Ada thick binding (ZLib.Ada) + Release 1.3 + +ZLib.Ada is a thick binding interface to the popular ZLib data +compression library, available at http://www.gzip.org/zlib/. +It provides Ada-style access to the ZLib C library. + + + Here are the main changes since ZLib.Ada 1.2: + +- Attension: ZLib.Read generic routine have a initialization requirement + for Read_Last parameter now. It is a bit incompartible with previous version, + but extends functionality, we could use new parameters Allow_Read_Some and + Flush now. + +- Added Is_Open routines to ZLib and ZLib.Streams packages. + +- Add pragma Assert to check Stream_Element is 8 bit. + +- Fix extraction to buffer with exact known decompressed size. Error reported by + Steve Sangwine. + +- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits + computers. Patch provided by Pascal Obry. + +- Add Status_Error exception definition. + +- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit. + + + How to build ZLib.Ada under GNAT + +You should have the ZLib library already build on your computer, before +building ZLib.Ada. Make the directory of ZLib.Ada sources current and +issue the command: + + gnatmake test -largs -L -lz + +Or use the GNAT project file build for GNAT 3.15 or later: + + gnatmake -Pzlib.gpr -L + + + How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2 + +1. Make a project with all *.ads and *.adb files from the distribution. +2. Build the libz.a library from the ZLib C sources. +3. Rename libz.a to z.lib. +4. Add the library z.lib to the project. +5. Add the libc.lib library from the ObjectAda distribution to the project. +6. Build the executable using test.adb as a main procedure. + + + How to use ZLib.Ada + +The source files test.adb and read.adb are small demo programs that show +the main functionality of ZLib.Ada. + +The routines from the package specifications are commented. + + +Homepage: http://zlib-ada.sourceforge.net/ +Author: Dmitriy Anisimkov + +Contributors: Pascal Obry , Steve Sangwine diff --git a/win32/3rdparty/zlib/contrib/ada/test.adb b/win32/3rdparty/zlib/contrib/ada/test.adb new file mode 100644 index 000000000..90773acfa --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/test.adb @@ -0,0 +1,463 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ + +-- The program has a few aims. +-- 1. Test ZLib.Ada95 thick binding functionality. +-- 2. Show the example of use main functionality of the ZLib.Ada95 binding. +-- 3. Build this program automatically compile all ZLib.Ada95 packages under +-- GNAT Ada95 compiler. + +with ZLib.Streams; +with Ada.Streams.Stream_IO; +with Ada.Numerics.Discrete_Random; + +with Ada.Text_IO; + +with Ada.Calendar; + +procedure Test is + + use Ada.Streams; + use Stream_IO; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Count := 100_000; + Continuous : constant Boolean := False; + + Header : constant ZLib.Header_Type := ZLib.Default; + -- ZLib.None; + -- ZLib.Auto; + -- ZLib.GZip; + -- Do not use Header other then Default in ZLib versions 1.1.4 + -- and older. + + Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy; + Init_Random : constant := 10; + + -- End -- + + In_File_Name : constant String := "testzlib.in"; + -- Name of the input file + + Z_File_Name : constant String := "testzlib.zlb"; + -- Name of the compressed file. + + Out_File_Name : constant String := "testzlib.out"; + -- Name of the decompressed file. + + File_In : File_Type; + File_Out : File_Type; + File_Back : File_Type; + File_Z : ZLib.Streams.Stream_Type; + + Filter : ZLib.Filter_Type; + + Time_Stamp : Ada.Calendar.Time; + + procedure Generate_File; + -- Generate file of spetsified size with some random data. + -- The random data is repeatable, for the good compression. + + procedure Compare_Streams + (Left, Right : in out Root_Stream_Type'Class); + -- The procedure compearing data in 2 streams. + -- It is for compare data before and after compression/decompression. + + procedure Compare_Files (Left, Right : String); + -- Compare files. Based on the Compare_Streams. + + procedure Copy_Streams + (Source, Target : in out Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024); + -- Copying data from one stream to another. It is for test stream + -- interface of the library. + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- reading data from the File_In. + + procedure Data_Out (Item : in Stream_Element_Array); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- writing data to the File_Out. + + procedure Stamp; + -- Store the timestamp to the local variable. + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count); + -- Print the time statistic with the message. + + procedure Translate is new ZLib.Generic_Translate + (Data_In => Data_In, + Data_Out => Data_Out); + -- This procedure is moving data from File_In to File_Out + -- with compression or decompression, depend on initialization of + -- Filter parameter. + + ------------------- + -- Compare_Files -- + ------------------- + + procedure Compare_Files (Left, Right : String) is + Left_File, Right_File : File_Type; + begin + Open (Left_File, In_File, Left); + Open (Right_File, In_File, Right); + Compare_Streams (Stream (Left_File).all, Stream (Right_File).all); + Close (Left_File); + Close (Right_File); + end Compare_Files; + + --------------------- + -- Compare_Streams -- + --------------------- + + procedure Compare_Streams + (Left, Right : in out Ada.Streams.Root_Stream_Type'Class) + is + Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#); + Left_Last, Right_Last : Stream_Element_Offset; + begin + loop + Read (Left, Left_Buffer, Left_Last); + Read (Right, Right_Buffer, Right_Last); + + if Left_Last /= Right_Last then + Ada.Text_IO.Put_Line ("Compare error :" + & Stream_Element_Offset'Image (Left_Last) + & " /= " + & Stream_Element_Offset'Image (Right_Last)); + + raise Constraint_Error; + + elsif Left_Buffer (0 .. Left_Last) + /= Right_Buffer (0 .. Right_Last) + then + Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal."); + raise Constraint_Error; + + end if; + + exit when Left_Last < Left_Buffer'Last; + end loop; + end Compare_Streams; + + ------------------ + -- Copy_Streams -- + ------------------ + + procedure Copy_Streams + (Source, Target : in out Ada.Streams.Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Read (Source, Buffer, Last); + Write (Target, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Copy_Streams; + + ------------- + -- Data_In -- + ------------- + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Read (File_In, Item, Last); + end Data_In; + + -------------- + -- Data_Out -- + -------------- + + procedure Data_Out (Item : in Stream_Element_Array) is + begin + Write (File_Out, Item); + end Data_Out; + + ------------------- + -- Generate_File -- + ------------------- + + procedure Generate_File is + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10; + + Buffer_Count : constant Count := File_Size / Buffer'Length; + -- Number of same buffers in the packet. + + Density : constant Count := 30; -- from 0 to Buffer'Length - 2; + + procedure Fill_Buffer (J, D : in Count); + -- Change the part of the buffer. + + ----------------- + -- Fill_Buffer -- + ----------------- + + procedure Fill_Buffer (J, D : in Count) is + begin + for K in 0 .. D loop + Buffer + (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1)) + := Random_Elements.Random (Gen); + + end loop; + end Fill_Buffer; + + begin + Random_Elements.Reset (Gen, Init_Random); + + Create (File_In, Out_File, In_File_Name); + + Fill_Buffer (1, Buffer'Length - 2); + + for J in 1 .. Buffer_Count loop + Write (File_In, Buffer); + + Fill_Buffer (J, Density); + end loop; + + -- fill remain size. + + Write + (File_In, + Buffer + (1 .. Stream_Element_Offset + (File_Size - Buffer'Length * Buffer_Count))); + + Flush (File_In); + Close (File_In); + end Generate_File; + + --------------------- + -- Print_Statistic -- + --------------------- + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is + use Ada.Calendar; + use Ada.Text_IO; + + package Count_IO is new Integer_IO (ZLib.Count); + + Curr_Dur : Duration := Clock - Time_Stamp; + begin + Put (Msg); + + Set_Col (20); + Ada.Text_IO.Put ("size ="); + + Count_IO.Put + (Data_Size, + Width => Stream_IO.Count'Image (File_Size)'Length); + + Put_Line (" duration =" & Duration'Image (Curr_Dur)); + end Print_Statistic; + + ----------- + -- Stamp -- + ----------- + + procedure Stamp is + begin + Time_Stamp := Ada.Calendar.Clock; + end Stamp; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + Generate_File; + + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put_Line ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Test generic interface. + Open (File_In, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + Stamp; + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter => Filter, + Level => Level, + Strategy => Strategy, + Header => Header); + + Translate (Filter); + Print_Statistic ("Generic compress", ZLib.Total_Out (Filter)); + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Open (File_In, In_File, Z_File_Name); + Create (File_Out, Out_File, Out_File_Name); + + Stamp; + + -- Inflate using generic instantiation. + + ZLib.Inflate_Init (Filter, Header => Header); + + Translate (Filter); + Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter)); + + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Compare_Files (In_File_Name, Out_File_Name); + + -- Test stream interface. + + -- Compress to the back stream. + + Open (File_In, In_File, In_File_Name); + Create (File_Back, Out_File, Z_File_Name); + + Stamp; + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Level => Level, + Strategy => Strategy, + Header => Header); + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + -- Flushing internal buffers to the back stream. + + ZLib.Streams.Flush (File_Z, ZLib.Finish); + + Print_Statistic ("Write compress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_In); + Close (File_Back); + + -- Compare reading from original file and from + -- decompression stream. + + Open (File_In, In_File, In_File_Name); + Open (File_Back, In_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Header => Header); + + Stamp; + Compare_Streams (Stream (File_In).all, File_Z); + + Print_Statistic ("Read decompress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + -- Compress by reading from compression stream. + + Open (File_Back, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Level => Level, + Strategy => Strategy, + Header => Header); + + Stamp; + Copy_Streams + (Source => File_Z, + Target => Stream (File_Out).all); + + Print_Statistic ("Read compress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_Out); + Close (File_Back); + + -- Decompress to decompression stream. + + Open (File_In, In_File, Z_File_Name); + Create (File_Back, Out_File, Out_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Header => Header); + + Stamp; + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + Print_Statistic ("Write decompress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + Compare_Files (In_File_Name, Out_File_Name); + end loop; + + Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok."); + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Test; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib-streams.adb b/win32/3rdparty/zlib/contrib/ada/zlib-streams.adb new file mode 100644 index 000000000..b6497bae2 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib-streams.adb @@ -0,0 +1,225 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ + +with Ada.Unchecked_Deallocation; + +package body ZLib.Streams is + + ----------- + -- Close -- + ----------- + + procedure Close (Stream : in out Stream_Type) is + procedure Free is new Ada.Unchecked_Deallocation + (Stream_Element_Array, Buffer_Access); + begin + if Stream.Mode = Out_Stream or Stream.Mode = Duplex then + -- We should flush the data written by the writer. + + Flush (Stream, Finish); + + Close (Stream.Writer); + end if; + + if Stream.Mode = In_Stream or Stream.Mode = Duplex then + Close (Stream.Reader); + Free (Stream.Buffer); + end if; + end Close; + + ------------ + -- Create -- + ------------ + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size) + is + + subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean); + + ----------------- + -- Init_Filter -- + ----------------- + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean) is + begin + if Compress then + Deflate_Init + (Filter, Level, Strategy, Header => Header); + else + Inflate_Init (Filter, Header => Header); + end if; + end Init_Filter; + + begin + Stream.Back := Back; + Stream.Mode := Mode; + + if Mode = Out_Stream or Mode = Duplex then + Init_Filter (Stream.Writer, Back_Compressed); + Stream.Buffer_Size := Write_Buffer_Size; + else + Stream.Buffer_Size := 0; + end if; + + if Mode = In_Stream or Mode = Duplex then + Init_Filter (Stream.Reader, not Back_Compressed); + + Stream.Buffer := new Buffer_Subtype; + Stream.Rest_First := Stream.Buffer'Last + 1; + Stream.Rest_Last := Stream.Buffer'Last; + end if; + end Create; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush) + is + Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Flush (Stream.Writer, Buffer, Last, Mode); + + Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Flush; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Stream : Stream_Type) return Boolean is + begin + return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); + end Is_Open; + + ---------- + -- Read -- + ---------- + + procedure Read + (Stream : in out Stream_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) + is + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Ada.Streams.Read (Stream.Back.all, Item, Last); + end Read; + + procedure Read is new ZLib.Read + (Read => Read, + Buffer => Stream.Buffer.all, + Rest_First => Stream.Rest_First, + Rest_Last => Stream.Rest_Last); + + begin + Read (Stream.Reader, Item, Last); + end Read; + + ------------------- + -- Read_Total_In -- + ------------------- + + function Read_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Reader); + end Read_Total_In; + + -------------------- + -- Read_Total_Out -- + -------------------- + + function Read_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Reader); + end Read_Total_Out; + + ----------- + -- Write -- + ----------- + + procedure Write + (Stream : in out Stream_Type; + Item : in Stream_Element_Array) + is + + procedure Write (Item : in Stream_Element_Array); + + ----------- + -- Write -- + ----------- + + procedure Write (Item : in Stream_Element_Array) is + begin + Ada.Streams.Write (Stream.Back.all, Item); + end Write; + + procedure Write is new ZLib.Write + (Write => Write, + Buffer_Size => Stream.Buffer_Size); + + begin + Write (Stream.Writer, Item, No_Flush); + end Write; + + -------------------- + -- Write_Total_In -- + -------------------- + + function Write_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Writer); + end Write_Total_In; + + --------------------- + -- Write_Total_Out -- + --------------------- + + function Write_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Writer); + end Write_Total_Out; + +end ZLib.Streams; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib-streams.ads b/win32/3rdparty/zlib/contrib/ada/zlib-streams.ads new file mode 100644 index 000000000..f0193c6ba --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib-streams.ads @@ -0,0 +1,114 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $ + +package ZLib.Streams is + + type Stream_Mode is (In_Stream, Out_Stream, Duplex); + + type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class; + + type Stream_Type is + new Ada.Streams.Root_Stream_Type with private; + + procedure Read + (Stream : in out Stream_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + procedure Write + (Stream : in out Stream_Type; + Item : in Ada.Streams.Stream_Element_Array); + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush); + -- Flush the written data to the back stream, + -- all data placed to the compressor is flushing to the Back stream. + -- Should not be used untill necessary, becouse it is decreasing + -- compression. + + function Read_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_In); + -- Return total number of bytes read from back stream so far. + + function Read_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_Out); + -- Return total number of bytes read so far. + + function Write_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_In); + -- Return total number of bytes written so far. + + function Write_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_Out); + -- Return total number of bytes written to the back stream. + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size); + -- Create the Comression/Decompression stream. + -- If mode is In_Stream then Write operation is disabled. + -- If mode is Out_Stream then Read operation is disabled. + + -- If Back_Compressed is true then + -- Data written to the Stream is compressing to the Back stream + -- and data read from the Stream is decompressed data from the Back stream. + + -- If Back_Compressed is false then + -- Data written to the Stream is decompressing to the Back stream + -- and data read from the Stream is compressed data from the Back stream. + + -- !!! When the Need_Header is False ZLib-Ada is using undocumented + -- ZLib 1.1.4 functionality to do not create/wait for ZLib headers. + + function Is_Open (Stream : Stream_Type) return Boolean; + + procedure Close (Stream : in out Stream_Type); + +private + + use Ada.Streams; + + type Buffer_Access is access all Stream_Element_Array; + + type Stream_Type + is new Root_Stream_Type with + record + Mode : Stream_Mode; + + Buffer : Buffer_Access; + Rest_First : Stream_Element_Offset; + Rest_Last : Stream_Element_Offset; + -- Buffer for Read operation. + -- We need to have this buffer in the record + -- becouse not all read data from back stream + -- could be processed during the read operation. + + Buffer_Size : Stream_Element_Offset; + -- Buffer size for write operation. + -- We do not need to have this buffer + -- in the record becouse all data could be + -- processed in the write operation. + + Back : Stream_Access; + Reader : Filter_Type; + Writer : Filter_Type; + end record; + +end ZLib.Streams; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib-thin.adb b/win32/3rdparty/zlib/contrib/ada/zlib-thin.adb new file mode 100644 index 000000000..0ca4a7120 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib-thin.adb @@ -0,0 +1,141 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $ + +package body ZLib.Thin is + + ZLIB_VERSION : constant Chars_Ptr := zlibVersion; + + Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit; + + -------------- + -- Avail_In -- + -------------- + + function Avail_In (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_In; + end Avail_In; + + --------------- + -- Avail_Out -- + --------------- + + function Avail_Out (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_Out; + end Avail_Out; + + ------------------ + -- Deflate_Init -- + ------------------ + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int is + begin + return deflateInit2 + (strm, + level, + method, + windowBits, + memLevel, + strategy, + ZLIB_VERSION, + Z_Stream_Size); + end Deflate_Init; + + ------------------ + -- Inflate_Init -- + ------------------ + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is + begin + return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size); + end Inflate_Init; + + ------------------------ + -- Last_Error_Message -- + ------------------------ + + function Last_Error_Message (Strm : in Z_Stream) return String is + use Interfaces.C.Strings; + begin + if Strm.msg = Null_Ptr then + return ""; + else + return Value (Strm.msg); + end if; + end Last_Error_Message; + + ------------ + -- Set_In -- + ------------ + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_In := Buffer; + Strm.Avail_In := Size; + end Set_In; + + ------------------ + -- Set_Mem_Func -- + ------------------ + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func) is + begin + Strm.opaque := Opaque; + Strm.zalloc := Alloc; + Strm.zfree := Free; + end Set_Mem_Func; + + ------------- + -- Set_Out -- + ------------- + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_Out := Buffer; + Strm.Avail_Out := Size; + end Set_Out; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_In; + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_Out; + end Total_Out; + +end ZLib.Thin; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib-thin.ads b/win32/3rdparty/zlib/contrib/ada/zlib-thin.ads new file mode 100644 index 000000000..d4407eb80 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib-thin.ads @@ -0,0 +1,450 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $ + +with Interfaces.C.Strings; + +with System; + +private package ZLib.Thin is + + -- From zconf.h + + MAX_MEM_LEVEL : constant := 9; -- zconf.h:105 + -- zconf.h:105 + MAX_WBITS : constant := 15; -- zconf.h:115 + -- 32K LZ77 window + -- zconf.h:115 + SEEK_SET : constant := 8#0000#; -- zconf.h:244 + -- Seek from beginning of file. + -- zconf.h:244 + SEEK_CUR : constant := 1; -- zconf.h:245 + -- Seek from current position. + -- zconf.h:245 + SEEK_END : constant := 2; -- zconf.h:246 + -- Set file pointer to EOF plus "offset" + -- zconf.h:246 + + type Byte is new Interfaces.C.unsigned_char; -- 8 bits + -- zconf.h:214 + type UInt is new Interfaces.C.unsigned; -- 16 bits or more + -- zconf.h:216 + type Int is new Interfaces.C.int; + + type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more + -- zconf.h:217 + subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr; + + type ULong_Access is access ULong; + type Int_Access is access Int; + + subtype Voidp is System.Address; -- zconf.h:232 + + subtype Byte_Access is Voidp; + + Nul : constant Voidp := System.Null_Address; + -- end from zconf + + Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125 + -- zlib.h:125 + Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126 + -- will be removed, use + -- Z_SYNC_FLUSH instead + -- zlib.h:126 + Z_SYNC_FLUSH : constant := 2; -- zlib.h:127 + -- zlib.h:127 + Z_FULL_FLUSH : constant := 3; -- zlib.h:128 + -- zlib.h:128 + Z_FINISH : constant := 4; -- zlib.h:129 + -- zlib.h:129 + Z_OK : constant := 8#0000#; -- zlib.h:132 + -- zlib.h:132 + Z_STREAM_END : constant := 1; -- zlib.h:133 + -- zlib.h:133 + Z_NEED_DICT : constant := 2; -- zlib.h:134 + -- zlib.h:134 + Z_ERRNO : constant := -1; -- zlib.h:135 + -- zlib.h:135 + Z_STREAM_ERROR : constant := -2; -- zlib.h:136 + -- zlib.h:136 + Z_DATA_ERROR : constant := -3; -- zlib.h:137 + -- zlib.h:137 + Z_MEM_ERROR : constant := -4; -- zlib.h:138 + -- zlib.h:138 + Z_BUF_ERROR : constant := -5; -- zlib.h:139 + -- zlib.h:139 + Z_VERSION_ERROR : constant := -6; -- zlib.h:140 + -- zlib.h:140 + Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145 + -- zlib.h:145 + Z_BEST_SPEED : constant := 1; -- zlib.h:146 + -- zlib.h:146 + Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147 + -- zlib.h:147 + Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148 + -- zlib.h:148 + Z_FILTERED : constant := 1; -- zlib.h:151 + -- zlib.h:151 + Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152 + -- zlib.h:152 + Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153 + -- zlib.h:153 + Z_BINARY : constant := 8#0000#; -- zlib.h:156 + -- zlib.h:156 + Z_ASCII : constant := 1; -- zlib.h:157 + -- zlib.h:157 + Z_UNKNOWN : constant := 2; -- zlib.h:158 + -- zlib.h:158 + Z_DEFLATED : constant := 8; -- zlib.h:161 + -- zlib.h:161 + Z_NULL : constant := 8#0000#; -- zlib.h:164 + -- for initializing zalloc, zfree, opaque + -- zlib.h:164 + type gzFile is new Voidp; -- zlib.h:646 + + type Z_Stream is private; + + type Z_Streamp is access all Z_Stream; -- zlib.h:89 + + type alloc_func is access function + (Opaque : Voidp; + Items : UInt; + Size : UInt) + return Voidp; -- zlib.h:63 + + type free_func is access procedure (opaque : Voidp; address : Voidp); + + function zlibVersion return Chars_Ptr; + + function Deflate (strm : Z_Streamp; flush : Int) return Int; + + function DeflateEnd (strm : Z_Streamp) return Int; + + function Inflate (strm : Z_Streamp; flush : Int) return Int; + + function InflateEnd (strm : Z_Streamp) return Int; + + function deflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; + + function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int; + -- zlib.h:478 + + function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495 + + function deflateParams + (strm : Z_Streamp; + level : Int; + strategy : Int) + return Int; -- zlib.h:506 + + function inflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; -- zlib.h:548 + + function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565 + + function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580 + + function compress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; -- zlib.h:601 + + function compress2 + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong; + level : Int) + return Int; -- zlib.h:615 + + function uncompress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; + + function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile; + + function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile; + + function gzsetparams + (file : gzFile; + level : Int; + strategy : Int) + return Int; + + function gzread + (file : gzFile; + buf : Voidp; + len : UInt) + return Int; + + function gzwrite + (file : in gzFile; + buf : in Voidp; + len : in UInt) + return Int; + + function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int; + + function gzputs (file : in gzFile; s : in Chars_Ptr) return Int; + + function gzgets + (file : gzFile; + buf : Chars_Ptr; + len : Int) + return Chars_Ptr; + + function gzputc (file : gzFile; char : Int) return Int; + + function gzgetc (file : gzFile) return Int; + + function gzflush (file : gzFile; flush : Int) return Int; + + function gzseek + (file : gzFile; + offset : Int; + whence : Int) + return Int; + + function gzrewind (file : gzFile) return Int; + + function gztell (file : gzFile) return Int; + + function gzeof (file : gzFile) return Int; + + function gzclose (file : gzFile) return Int; + + function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr; + + function adler32 + (adler : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function crc32 + (crc : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function deflateInit + (strm : Z_Streamp; + level : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function deflateInit2 + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int; + pragma Inline (Deflate_Init); + + function inflateInit + (strm : Z_Streamp; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function inflateInit2 + (strm : in Z_Streamp; + windowBits : in Int; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + + function inflateBackInit + (strm : in Z_Streamp; + windowBits : in Int; + window : in Byte_Access; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + -- Size of window have to be 2**windowBits. + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int; + pragma Inline (Inflate_Init); + + function zError (err : Int) return Chars_Ptr; + + function inflateSyncPoint (z : Z_Streamp) return Int; + + function get_crc_table return ULong_Access; + + -- Interface to the available fields of the z_stream structure. + -- The application must update next_in and avail_in when avail_in has + -- dropped to zero. It must update next_out and avail_out when avail_out + -- has dropped to zero. The application must initialize zalloc, zfree and + -- opaque before calling the init function. + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_In); + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_Out); + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func); + pragma Inline (Set_Mem_Func); + + function Last_Error_Message (Strm : in Z_Stream) return String; + pragma Inline (Last_Error_Message); + + function Avail_Out (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_Out); + + function Avail_In (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_In); + + function Total_In (Strm : in Z_Stream) return ULong; + pragma Inline (Total_In); + + function Total_Out (Strm : in Z_Stream) return ULong; + pragma Inline (Total_Out); + + function inflateCopy + (dest : in Z_Streamp; + Source : in Z_Streamp) + return Int; + + function compressBound (Source_Len : in ULong) return ULong; + + function deflateBound + (Strm : in Z_Streamp; + Source_Len : in ULong) + return ULong; + + function gzungetc (C : in Int; File : in gzFile) return Int; + + function zlibCompileFlags return ULong; + +private + + type Z_Stream is record -- zlib.h:68 + Next_In : Voidp := Nul; -- next input byte + Avail_In : UInt := 0; -- number of bytes available at next_in + Total_In : ULong := 0; -- total nb of input bytes read so far + Next_Out : Voidp := Nul; -- next output byte should be put there + Avail_Out : UInt := 0; -- remaining free space at next_out + Total_Out : ULong := 0; -- total nb of bytes output so far + msg : Chars_Ptr; -- last error message, NULL if no error + state : Voidp; -- not visible by applications + zalloc : alloc_func := null; -- used to allocate the internal state + zfree : free_func := null; -- used to free the internal state + opaque : Voidp; -- private data object passed to + -- zalloc and zfree + data_type : Int; -- best guess about the data type: + -- ascii or binary + adler : ULong; -- adler32 value of the uncompressed + -- data + reserved : ULong; -- reserved for future use + end record; + + pragma Convention (C, Z_Stream); + + pragma Import (C, zlibVersion, "zlibVersion"); + pragma Import (C, Deflate, "deflate"); + pragma Import (C, DeflateEnd, "deflateEnd"); + pragma Import (C, Inflate, "inflate"); + pragma Import (C, InflateEnd, "inflateEnd"); + pragma Import (C, deflateSetDictionary, "deflateSetDictionary"); + pragma Import (C, deflateCopy, "deflateCopy"); + pragma Import (C, deflateReset, "deflateReset"); + pragma Import (C, deflateParams, "deflateParams"); + pragma Import (C, inflateSetDictionary, "inflateSetDictionary"); + pragma Import (C, inflateSync, "inflateSync"); + pragma Import (C, inflateReset, "inflateReset"); + pragma Import (C, compress, "compress"); + pragma Import (C, compress2, "compress2"); + pragma Import (C, uncompress, "uncompress"); + pragma Import (C, gzopen, "gzopen"); + pragma Import (C, gzdopen, "gzdopen"); + pragma Import (C, gzsetparams, "gzsetparams"); + pragma Import (C, gzread, "gzread"); + pragma Import (C, gzwrite, "gzwrite"); + pragma Import (C, gzprintf, "gzprintf"); + pragma Import (C, gzputs, "gzputs"); + pragma Import (C, gzgets, "gzgets"); + pragma Import (C, gzputc, "gzputc"); + pragma Import (C, gzgetc, "gzgetc"); + pragma Import (C, gzflush, "gzflush"); + pragma Import (C, gzseek, "gzseek"); + pragma Import (C, gzrewind, "gzrewind"); + pragma Import (C, gztell, "gztell"); + pragma Import (C, gzeof, "gzeof"); + pragma Import (C, gzclose, "gzclose"); + pragma Import (C, gzerror, "gzerror"); + pragma Import (C, adler32, "adler32"); + pragma Import (C, crc32, "crc32"); + pragma Import (C, deflateInit, "deflateInit_"); + pragma Import (C, inflateInit, "inflateInit_"); + pragma Import (C, deflateInit2, "deflateInit2_"); + pragma Import (C, inflateInit2, "inflateInit2_"); + pragma Import (C, zError, "zError"); + pragma Import (C, inflateSyncPoint, "inflateSyncPoint"); + pragma Import (C, get_crc_table, "get_crc_table"); + + -- since zlib 1.2.0: + + pragma Import (C, inflateCopy, "inflateCopy"); + pragma Import (C, compressBound, "compressBound"); + pragma Import (C, deflateBound, "deflateBound"); + pragma Import (C, gzungetc, "gzungetc"); + pragma Import (C, zlibCompileFlags, "zlibCompileFlags"); + + pragma Import (C, inflateBackInit, "inflateBackInit_"); + + -- I stopped binding the inflateBack routines, becouse realize that + -- it does not support zlib and gzip headers for now, and have no + -- symmetric deflateBack routines. + -- ZLib-Ada is symmetric regarding deflate/inflate data transformation + -- and has a similar generic callback interface for the + -- deflate/inflate transformation based on the regular Deflate/Inflate + -- routines. + + -- pragma Import (C, inflateBack, "inflateBack"); + -- pragma Import (C, inflateBackEnd, "inflateBackEnd"); + +end ZLib.Thin; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib.adb b/win32/3rdparty/zlib/contrib/ada/zlib.adb new file mode 100644 index 000000000..8b6fd686a --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib.adb @@ -0,0 +1,701 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Exceptions; +with Ada.Unchecked_Conversion; +with Ada.Unchecked_Deallocation; + +with Interfaces.C.Strings; + +with ZLib.Thin; + +package body ZLib is + + use type Thin.Int; + + type Z_Stream is new Thin.Z_Stream; + + type Return_Code_Enum is + (OK, + STREAM_END, + NEED_DICT, + ERRNO, + STREAM_ERROR, + DATA_ERROR, + MEM_ERROR, + BUF_ERROR, + VERSION_ERROR); + + type Flate_Step_Function is access + function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int; + pragma Convention (C, Flate_Step_Function); + + type Flate_End_Function is access + function (Ctrm : in Thin.Z_Streamp) return Thin.Int; + pragma Convention (C, Flate_End_Function); + + type Flate_Type is record + Step : Flate_Step_Function; + Done : Flate_End_Function; + end record; + + subtype Footer_Array is Stream_Element_Array (1 .. 8); + + Simple_GZip_Header : constant Stream_Element_Array (1 .. 10) + := (16#1f#, 16#8b#, -- Magic header + 16#08#, -- Z_DEFLATED + 16#00#, -- Flags + 16#00#, 16#00#, 16#00#, 16#00#, -- Time + 16#00#, -- XFlags + 16#03# -- OS code + ); + -- The simplest gzip header is not for informational, but just for + -- gzip format compatibility. + -- Note that some code below is using assumption + -- Simple_GZip_Header'Last > Footer_Array'Last, so do not make + -- Simple_GZip_Header'Last <= Footer_Array'Last. + + Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum + := (0 => OK, + 1 => STREAM_END, + 2 => NEED_DICT, + -1 => ERRNO, + -2 => STREAM_ERROR, + -3 => DATA_ERROR, + -4 => MEM_ERROR, + -5 => BUF_ERROR, + -6 => VERSION_ERROR); + + Flate : constant array (Boolean) of Flate_Type + := (True => (Step => Thin.Deflate'Access, + Done => Thin.DeflateEnd'Access), + False => (Step => Thin.Inflate'Access, + Done => Thin.InflateEnd'Access)); + + Flush_Finish : constant array (Boolean) of Flush_Mode + := (True => Finish, False => No_Flush); + + procedure Raise_Error (Stream : in Z_Stream); + pragma Inline (Raise_Error); + + procedure Raise_Error (Message : in String); + pragma Inline (Raise_Error); + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int); + + procedure Free is new Ada.Unchecked_Deallocation + (Z_Stream, Z_Stream_Access); + + function To_Thin_Access is new Ada.Unchecked_Conversion + (Z_Stream_Access, Thin.Z_Streamp); + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Separate translate routine for make gzip header. + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- translate routine without additional headers. + + ----------------- + -- Check_Error -- + ----------------- + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is + use type Thin.Int; + begin + if Code /= Thin.Z_OK then + Raise_Error + (Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Last_Error_Message (Stream)); + end if; + end Check_Error; + + ----------- + -- Close -- + ----------- + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False) + is + Code : Thin.Int; + begin + if not Ignore_Error and then not Is_Open (Filter) then + raise Status_Error; + end if; + + Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm)); + + if Ignore_Error or else Code = Thin.Z_OK then + Free (Filter.Strm); + else + declare + Error_Message : constant String + := Last_Error_Message (Filter.Strm.all); + begin + Free (Filter.Strm); + Ada.Exceptions.Raise_Exception + (ZLib_Error'Identity, + Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Error_Message); + end; + end if; + end Close; + + ----------- + -- CRC32 -- + ----------- + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32 + is + use Thin; + begin + return Unsigned_32 (crc32 (ULong (CRC), + Data'Address, + Data'Length)); + end CRC32; + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) is + begin + CRC := CRC32 (CRC, Data); + end CRC32; + + ------------------ + -- Deflate_Init -- + ------------------ + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + -- We allow ZLib to make header only in case of default header type. + -- Otherwise we would either do header by ourselfs, or do not do + -- header at all. + + if Header = None or else Header = GZip then + Win_Bits := -Win_Bits; + end if; + + -- For the GZip CRC calculation and make headers. + + if Header = GZip then + Filter.CRC := 0; + Filter.Offset := Simple_GZip_Header'First; + else + Filter.Offset := Simple_GZip_Header'Last + 1; + end if; + + Filter.Strm := new Z_Stream; + Filter.Compression := True; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Deflate_Init + (To_Thin_Access (Filter.Strm), + Level => Thin.Int (Level), + method => Thin.Int (Method), + windowBits => Win_Bits, + memLevel => Thin.Int (Memory_Level), + strategy => Thin.Int (Strategy)) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Deflate_Init; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + No_Data : Stream_Element_Array := (1 .. 0 => 0); + Last : Stream_Element_Offset; + begin + Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush); + end Flush; + + ----------------------- + -- Generic_Translate -- + ----------------------- + + procedure Generic_Translate + (Filter : in out ZLib.Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size) + is + In_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (In_Buffer_Size)); + Out_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (Out_Buffer_Size)); + Last : Stream_Element_Offset; + In_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + begin + Main : loop + Data_In (In_Buffer, Last); + + In_First := In_Buffer'First; + + loop + Translate + (Filter => Filter, + In_Data => In_Buffer (In_First .. Last), + In_Last => In_Last, + Out_Data => Out_Buffer, + Out_Last => Out_Last, + Flush => Flush_Finish (Last < In_Buffer'First)); + + if Out_Buffer'First <= Out_Last then + Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last)); + end if; + + exit Main when Stream_End (Filter); + + -- The end of in buffer. + + exit when In_Last = Last; + + In_First := In_Last + 1; + end loop; + end loop Main; + + end Generic_Translate; + + ------------------ + -- Inflate_Init -- + ------------------ + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + + procedure Check_Version; + -- Check the latest header types compatibility. + + procedure Check_Version is + begin + if Version <= "1.1.4" then + Raise_Error + ("Inflate header type " & Header_Type'Image (Header) + & " incompatible with ZLib version " & Version); + end if; + end Check_Version; + + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + case Header is + when None => + Check_Version; + + -- Inflate data without headers determined + -- by negative Win_Bits. + + Win_Bits := -Win_Bits; + when GZip => + Check_Version; + + -- Inflate gzip data defined by flag 16. + + Win_Bits := Win_Bits + 16; + when Auto => + Check_Version; + + -- Inflate with automatic detection + -- of gzip or native header defined by flag 32. + + Win_Bits := Win_Bits + 32; + when Default => null; + end case; + + Filter.Strm := new Z_Stream; + Filter.Compression := False; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Inflate_Init + (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Inflate_Init; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Filter : in Filter_Type) return Boolean is + begin + return Filter.Strm /= null; + end Is_Open; + + ----------------- + -- Raise_Error -- + ----------------- + + procedure Raise_Error (Message : in String) is + begin + Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message); + end Raise_Error; + + procedure Raise_Error (Stream : in Z_Stream) is + begin + Raise_Error (Last_Error_Message (Stream)); + end Raise_Error; + + ---------- + -- Read -- + ---------- + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush) + is + In_Last : Stream_Element_Offset; + Item_First : Ada.Streams.Stream_Element_Offset := Item'First; + V_Flush : Flush_Mode := Flush; + + begin + pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1); + pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last); + + loop + if Rest_Last = Buffer'First - 1 then + V_Flush := Finish; + + elsif Rest_First > Rest_Last then + Read (Buffer, Rest_Last); + Rest_First := Buffer'First; + + if Rest_Last < Buffer'First then + V_Flush := Finish; + end if; + end if; + + Translate + (Filter => Filter, + In_Data => Buffer (Rest_First .. Rest_Last), + In_Last => In_Last, + Out_Data => Item (Item_First .. Item'Last), + Out_Last => Last, + Flush => V_Flush); + + Rest_First := In_Last + 1; + + exit when Stream_End (Filter) + or else Last = Item'Last + or else (Last >= Item'First and then Allow_Read_Some); + + Item_First := Last + 1; + end loop; + end Read; + + ---------------- + -- Stream_End -- + ---------------- + + function Stream_End (Filter : in Filter_Type) return Boolean is + begin + if Filter.Header = GZip and Filter.Compression then + return Filter.Stream_End + and then Filter.Offset = Footer_Array'Last + 1; + else + return Filter.Stream_End; + end if; + end Stream_End; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all)); + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all)); + end Total_Out; + + --------------- + -- Translate -- + --------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) is + begin + if Filter.Header = GZip and then Filter.Compression then + Translate_GZip + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + else + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + end if; + end Translate; + + -------------------- + -- Translate_Auto -- + -------------------- + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + use type Thin.Int; + Code : Thin.Int; + + begin + if not Is_Open (Filter) then + raise Status_Error; + end if; + + if Out_Data'Length = 0 and then In_Data'Length = 0 then + raise Constraint_Error; + end if; + + Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length); + Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length); + + Code := Flate (Filter.Compression).Step + (To_Thin_Access (Filter.Strm), + Thin.Int (Flush)); + + if Code = Thin.Z_STREAM_END then + Filter.Stream_End := True; + else + Check_Error (Filter.Strm.all, Code); + end if; + + In_Last := In_Data'Last + - Stream_Element_Offset (Avail_In (Filter.Strm.all)); + Out_Last := Out_Data'Last + - Stream_Element_Offset (Avail_Out (Filter.Strm.all)); + end Translate_Auto; + + -------------------- + -- Translate_GZip -- + -------------------- + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + Out_First : Stream_Element_Offset; + + procedure Add_Data (Data : in Stream_Element_Array); + -- Add data to stream from the Filter.Offset till necessary, + -- used for add gzip headr/footer. + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32); + pragma Inline (Put_32); + + -------------- + -- Add_Data -- + -------------- + + procedure Add_Data (Data : in Stream_Element_Array) is + Data_First : Stream_Element_Offset renames Filter.Offset; + Data_Last : Stream_Element_Offset; + Data_Len : Stream_Element_Offset; -- -1 + Out_Len : Stream_Element_Offset; -- -1 + begin + Out_First := Out_Last + 1; + + if Data_First > Data'Last then + return; + end if; + + Data_Len := Data'Last - Data_First; + Out_Len := Out_Data'Last - Out_First; + + if Data_Len <= Out_Len then + Out_Last := Out_First + Data_Len; + Data_Last := Data'Last; + else + Out_Last := Out_Data'Last; + Data_Last := Data_First + Out_Len; + end if; + + Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last); + + Data_First := Data_Last + 1; + Out_First := Out_Last + 1; + end Add_Data; + + ------------ + -- Put_32 -- + ------------ + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32) + is + D : Unsigned_32 := Data; + begin + for J in Item'First .. Item'First + 3 loop + Item (J) := Stream_Element (D and 16#FF#); + D := Shift_Right (D, 8); + end loop; + end Put_32; + + begin + Out_Last := Out_Data'First - 1; + + if not Filter.Stream_End then + Add_Data (Simple_GZip_Header); + + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data (Out_First .. Out_Data'Last), + Out_Last => Out_Last, + Flush => Flush); + + CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last)); + end if; + + if Filter.Stream_End and then Out_Last <= Out_Data'Last then + -- This detection method would work only when + -- Simple_GZip_Header'Last > Footer_Array'Last + + if Filter.Offset = Simple_GZip_Header'Last + 1 then + Filter.Offset := Footer_Array'First; + end if; + + declare + Footer : Footer_Array; + begin + Put_32 (Footer, Filter.CRC); + Put_32 (Footer (Footer'First + 4 .. Footer'Last), + Unsigned_32 (Total_In (Filter))); + Add_Data (Footer); + end; + end if; + end Translate_GZip; + + ------------- + -- Version -- + ------------- + + function Version return String is + begin + return Interfaces.C.Strings.Value (Thin.zlibVersion); + end Version; + + ----------- + -- Write -- + ----------- + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + In_Last : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset := Item'First; + begin + if Item'Length = 0 and Flush = No_Flush then + return; + end if; + + loop + Translate + (Filter => Filter, + In_Data => Item (In_First .. Item'Last), + In_Last => In_Last, + Out_Data => Buffer, + Out_Last => Out_Last, + Flush => Flush); + + if Out_Last >= Buffer'First then + Write (Buffer (1 .. Out_Last)); + end if; + + exit when In_Last = Item'Last or Stream_End (Filter); + + In_First := In_Last + 1; + end loop; + end Write; + +end ZLib; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib.ads b/win32/3rdparty/zlib/contrib/ada/zlib.ads new file mode 100644 index 000000000..79ffc4095 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib.ads @@ -0,0 +1,328 @@ +------------------------------------------------------------------------------ +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- This library is free software; you can redistribute it and/or modify -- +-- it under the terms of the GNU General Public License as published by -- +-- the Free Software Foundation; either version 2 of the License, or (at -- +-- your option) any later version. -- +-- -- +-- This library is distributed in the hope that it will be useful, but -- +-- WITHOUT ANY WARRANTY; without even the implied warranty of -- +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- +-- General Public License for more details. -- +-- -- +-- You should have received a copy of the GNU General Public License -- +-- along with this library; if not, write to the Free Software Foundation, -- +-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +------------------------------------------------------------------------------ + +-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Streams; + +with Interfaces; + +package ZLib is + + ZLib_Error : exception; + Status_Error : exception; + + type Compression_Level is new Integer range -1 .. 9; + + type Flush_Mode is private; + + type Compression_Method is private; + + type Window_Bits_Type is new Integer range 8 .. 15; + + type Memory_Level_Type is new Integer range 1 .. 9; + + type Unsigned_32 is new Interfaces.Unsigned_32; + + type Strategy_Type is private; + + type Header_Type is (None, Auto, Default, GZip); + -- Header type usage have a some limitation for inflate. + -- See comment for Inflate_Init. + + subtype Count is Ada.Streams.Stream_Element_Count; + + Default_Memory_Level : constant Memory_Level_Type := 8; + Default_Window_Bits : constant Window_Bits_Type := 15; + + ---------------------------------- + -- Compression method constants -- + ---------------------------------- + + Deflated : constant Compression_Method; + -- Only one method allowed in this ZLib version + + --------------------------------- + -- Compression level constants -- + --------------------------------- + + No_Compression : constant Compression_Level := 0; + Best_Speed : constant Compression_Level := 1; + Best_Compression : constant Compression_Level := 9; + Default_Compression : constant Compression_Level := -1; + + -------------------------- + -- Flush mode constants -- + -------------------------- + + No_Flush : constant Flush_Mode; + -- Regular way for compression, no flush + + Partial_Flush : constant Flush_Mode; + -- Will be removed, use Z_SYNC_FLUSH instead + + Sync_Flush : constant Flush_Mode; + -- All pending output is flushed to the output buffer and the output + -- is aligned on a byte boundary, so that the decompressor can get all + -- input data available so far. (In particular avail_in is zero after the + -- call if enough output space has been provided before the call.) + -- Flushing may degrade compression for some compression algorithms and so + -- it should be used only when necessary. + + Block_Flush : constant Flush_Mode; + -- Z_BLOCK requests that inflate() stop + -- if and when it get to the next deflate block boundary. When decoding the + -- zlib or gzip format, this will cause inflate() to return immediately + -- after the header and before the first block. When doing a raw inflate, + -- inflate() will go ahead and process the first block, and will return + -- when it gets to the end of that block, or when it runs out of data. + + Full_Flush : constant Flush_Mode; + -- All output is flushed as with SYNC_FLUSH, and the compression state + -- is reset so that decompression can restart from this point if previous + -- compressed data has been damaged or if random access is desired. Using + -- Full_Flush too often can seriously degrade the compression. + + Finish : constant Flush_Mode; + -- Just for tell the compressor that input data is complete. + + ------------------------------------ + -- Compression strategy constants -- + ------------------------------------ + + -- RLE stategy could be used only in version 1.2.0 and later. + + Filtered : constant Strategy_Type; + Huffman_Only : constant Strategy_Type; + RLE : constant Strategy_Type; + Default_Strategy : constant Strategy_Type; + + Default_Buffer_Size : constant := 4096; + + type Filter_Type is tagged limited private; + -- The filter is for compression and for decompression. + -- The usage of the type is depend of its initialization. + + function Version return String; + pragma Inline (Version); + -- Return string representation of the ZLib version. + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default); + -- Compressor initialization. + -- When Header parameter is Auto or Default, then default zlib header + -- would be provided for compressed data. + -- When Header is GZip, then gzip header would be set instead of + -- default header. + -- When Header is None, no header would be set for compressed data. + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default); + -- Decompressor initialization. + -- Default header type mean that ZLib default header is expecting in the + -- input compressed stream. + -- Header type None mean that no header is expecting in the input stream. + -- GZip header type mean that GZip header is expecting in the + -- input compressed stream. + -- Auto header type mean that header type (GZip or Native) would be + -- detected automatically in the input stream. + -- Note that header types parameter values None, GZip and Auto are + -- supported for inflate routine only in ZLib versions 1.2.0.2 and later. + -- Deflate_Init is supporting all header types. + + function Is_Open (Filter : in Filter_Type) return Boolean; + pragma Inline (Is_Open); + -- Is the filter opened for compression or decompression. + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False); + -- Closing the compression or decompressor. + -- If stream is closing before the complete and Ignore_Error is False, + -- The exception would be raised. + + generic + with procedure Data_In + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + with procedure Data_Out + (Item : in Ada.Streams.Stream_Element_Array); + procedure Generic_Translate + (Filter : in out Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size); + -- Compress/decompress data fetch from Data_In routine and pass the result + -- to the Data_Out routine. User should provide Data_In and Data_Out + -- for compression/decompression data flow. + -- Compression or decompression depend on Filter initialization. + + function Total_In (Filter : in Filter_Type) return Count; + pragma Inline (Total_In); + -- Returns total number of input bytes read so far + + function Total_Out (Filter : in Filter_Type) return Count; + pragma Inline (Total_Out); + -- Returns total number of bytes output so far + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32; + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array); + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + ------------------------------------------------- + -- Below is more complex low level routines. -- + ------------------------------------------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Compress/decompress the In_Data buffer and place the result into + -- Out_Data. In_Last is the index of last element from In_Data accepted by + -- the Filter. Out_Last is the last element of the received data from + -- Filter. To tell the filter that incoming data are complete put the + -- Flush parameter to Finish. + + function Stream_End (Filter : in Filter_Type) return Boolean; + pragma Inline (Stream_End); + -- Return the true when the stream is complete. + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + pragma Inline (Flush); + -- Flushing the data from the compressor. + + generic + with procedure Write + (Item : in Ada.Streams.Stream_Element_Array); + -- User should provide this routine for accept + -- compressed/decompressed data. + + Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + -- Buffer size for Write user routine. + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from Item to the generic parameter procedure + -- Write. Output buffer size could be set in Buffer_Size generic parameter. + + generic + with procedure Read + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + -- User should provide data for compression/decompression + -- thru this routine. + + Buffer : in out Ada.Streams.Stream_Element_Array; + -- Buffer for keep remaining data from the previous + -- back read. + + Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset; + -- Rest_First have to be initialized to Buffer'Last + 1 + -- Rest_Last have to be initialized to Buffer'Last + -- before usage. + + Allow_Read_Some : in Boolean := False; + -- Is it allowed to return Last < Item'Last before end of data. + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from generic parameter procedure Read to the + -- Item. User should provide Buffer and initialized Rest_First, Rest_Last + -- indicators. If Allow_Read_Some is True, Read routines could return + -- Last < Item'Last only at end of stream. + +private + + use Ada.Streams; + + pragma Assert (Ada.Streams.Stream_Element'Size = 8); + pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8); + + type Flush_Mode is new Integer range 0 .. 5; + + type Compression_Method is new Integer range 8 .. 8; + + type Strategy_Type is new Integer range 0 .. 3; + + No_Flush : constant Flush_Mode := 0; + Partial_Flush : constant Flush_Mode := 1; + Sync_Flush : constant Flush_Mode := 2; + Full_Flush : constant Flush_Mode := 3; + Finish : constant Flush_Mode := 4; + Block_Flush : constant Flush_Mode := 5; + + Filtered : constant Strategy_Type := 1; + Huffman_Only : constant Strategy_Type := 2; + RLE : constant Strategy_Type := 3; + Default_Strategy : constant Strategy_Type := 0; + + Deflated : constant Compression_Method := 8; + + type Z_Stream; + + type Z_Stream_Access is access all Z_Stream; + + type Filter_Type is tagged limited record + Strm : Z_Stream_Access; + Compression : Boolean; + Stream_End : Boolean; + Header : Header_Type; + CRC : Unsigned_32; + Offset : Stream_Element_Offset; + -- Offset for gzip header/footer output. + end record; + +end ZLib; diff --git a/win32/3rdparty/zlib/contrib/ada/zlib.gpr b/win32/3rdparty/zlib/contrib/ada/zlib.gpr new file mode 100644 index 000000000..296b22aa9 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/ada/zlib.gpr @@ -0,0 +1,20 @@ +project Zlib is + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Object_Dir use "."; + for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo"); + + package Compiler is + for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst"); + end Compiler; + + package Linker is + for Default_Switches ("ada") use ("-lz"); + end Linker; + + package Builder is + for Default_Switches ("ada") use ("-s", "-gnatQ"); + end Builder; + +end Zlib; diff --git a/win32/3rdparty/zlib/contrib/asm586/README.586 b/win32/3rdparty/zlib/contrib/asm586/README.586 new file mode 100644 index 000000000..6bb78f320 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/asm586/README.586 @@ -0,0 +1,43 @@ +This is a patched version of zlib modified to use +Pentium-optimized assembly code in the deflation algorithm. The files +changed/added by this patch are: + +README.586 +match.S + +The effectiveness of these modifications is a bit marginal, as the the +program's bottleneck seems to be mostly L1-cache contention, for which +there is no real way to work around without rewriting the basic +algorithm. The speedup on average is around 5-10% (which is generally +less than the amount of variance between subsequent executions). +However, when used at level 9 compression, the cache contention can +drop enough for the assembly version to achieve 10-20% speedup (and +sometimes more, depending on the amount of overall redundancy in the +files). Even here, though, cache contention can still be the limiting +factor, depending on the nature of the program using the zlib library. +This may also mean that better improvements will be seen on a Pentium +with MMX, which suffers much less from L1-cache contention, but I have +not yet verified this. + +Note that this code has been tailored for the Pentium in particular, +and will not perform well on the Pentium Pro (due to the use of a +partial register in the inner loop). + +If you are using an assembler other than GNU as, you will have to +translate match.S to use your assembler's syntax. (Have fun.) + +Brian Raiter +breadbox@muppetlabs.com +April, 1998 + + +Added for zlib 1.1.3: + +The patches come from +http://www.muppetlabs.com/~breadbox/software/assembly.html + +To compile zlib with this asm file, copy match.S to the zlib directory +then do: + +CFLAGS="-O3 -DASMV" ./configure +make OBJA=match.o diff --git a/win32/3rdparty/zlib/contrib/asm586/match.S b/win32/3rdparty/zlib/contrib/asm586/match.S new file mode 100644 index 000000000..0368b35fe --- /dev/null +++ b/win32/3rdparty/zlib/contrib/asm586/match.S @@ -0,0 +1,364 @@ +/* match.s -- Pentium-optimized version of longest_match() + * Written for zlib 1.1.2 + * Copyright (C) 1998 Brian Raiter + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License. + */ + +#ifndef NO_UNDERLINE +#define match_init _match_init +#define longest_match _longest_match +#endif + +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ + +#define wmask 0 /* local copy of s->wmask */ +#define window 4 /* local copy of s->window */ +#define windowbestlen 8 /* s->window + bestlen */ +#define chainlenscanend 12 /* high word: current chain len */ + /* low word: last bytes sought */ +#define scanstart 16 /* first two bytes of string */ +#define scanalign 20 /* dword-misalignment of string */ +#define nicematch 24 /* a good enough match size */ +#define bestlen 28 /* size of best match so far */ +#define scan 32 /* ptr to string wanting match */ + +#define LocalVarsSize (36) +/* saved ebx 36 */ +/* saved edi 40 */ +/* saved esi 44 */ +/* saved ebp 48 */ +/* return address 52 */ +#define deflatestate 56 /* the function arguments */ +#define curmatch 60 + +/* Offsets for fields in the deflate_state structure. These numbers + * are calculated from the definition of deflate_state, with the + * assumption that the compiler will dword-align the fields. (Thus, + * changing the definition of deflate_state could easily cause this + * program to crash horribly, without so much as a warning at + * compile time. Sigh.) + */ + +/* All the +zlib1222add offsets are due to the addition of fields + * in zlib in the deflate_state structure since the asm code was first written + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + */ + +#define zlib1222add (8) + +#define dsWSize (36+zlib1222add) +#define dsWMask (44+zlib1222add) +#define dsWindow (48+zlib1222add) +#define dsPrev (56+zlib1222add) +#define dsMatchLen (88+zlib1222add) +#define dsPrevMatch (92+zlib1222add) +#define dsStrStart (100+zlib1222add) +#define dsMatchStart (104+zlib1222add) +#define dsLookahead (108+zlib1222add) +#define dsPrevLen (112+zlib1222add) +#define dsMaxChainLen (116+zlib1222add) +#define dsGoodMatch (132+zlib1222add) +#define dsNiceMatch (136+zlib1222add) + + +.file "match.S" + +.globl match_init, longest_match + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ + +longest_match: + +/* Save registers that the compiler may be using, and adjust %esp to */ +/* make room for our stack frame. */ + + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx + subl $LocalVarsSize, %esp + +/* Retrieve the function arguments. %ecx will hold cur_match */ +/* throughout the entire function. %edx will hold the pointer to the */ +/* deflate_state structure during the function's setup (before */ +/* entering the main loop). */ + + movl deflatestate(%esp), %edx + movl curmatch(%esp), %ecx + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch(%edx), %eax + movl dsLookahead(%edx), %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, nicematch(%esp) + +/* register Bytef *scan = s->window + s->strstart; */ + + movl dsWindow(%edx), %esi + movl %esi, window(%esp) + movl dsStrStart(%edx), %ebp + lea (%esi,%ebp), %edi + movl %edi, scan(%esp) + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + movl %edi, %eax + negl %eax + andl $3, %eax + movl %eax, scanalign(%esp) + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize(%edx), %eax + subl $MIN_LOOKAHEAD, %eax + subl %eax, %ebp + jg LimitPositive + xorl %ebp, %ebp +LimitPositive: + +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen(%edx), %eax + movl dsGoodMatch(%edx), %ebx + cmpl %ebx, %eax + movl dsMaxChainLen(%edx), %ebx + jl LastMatchGood + shrl $2, %ebx +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the scanend */ +/* scanend value, which it will always accompany. */ + + decl %ebx + shll $16, %ebx + +/* int best_len = s->prev_length; */ + + movl dsPrevLen(%edx), %eax + movl %eax, bestlen(%esp) + +/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ + + addl %eax, %esi + movl %esi, windowbestlen(%esp) + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ + + movw (%edi), %bx + movw %bx, scanstart(%esp) + movw -1(%edi,%eax), %bx + movl %ebx, chainlenscanend(%esp) + +/* Posf *prev = s->prev; */ +/* uInt wmask = s->w_mask; */ + + movl dsPrev(%edx), %edi + movl dsWMask(%edx), %edx + mov %edx, wmask(%esp) + +/* Jump into the main loop. */ + + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + * + * Within this loop: + * %ebx = chainlenscanend - i.e., ((chainlen << 16) | scanend) + * %ecx = curmatch + * %edx = curmatch & wmask + * %esi = windowbestlen - i.e., (window + bestlen) + * %edi = prev + * %ebp = limit + * + * Two optimization notes on the choice of instructions: + * + * The first instruction uses a 16-bit address, which costs an extra, + * unpairable cycle. This is cheaper than doing a 32-bit access and + * zeroing the high word, due to the 3-cycle misalignment penalty which + * would occur half the time. This also turns out to be cheaper than + * doing two separate 8-bit accesses, as the memory is so rarely in the + * L1 cache. + * + * The window buffer, however, apparently spends a lot of time in the + * cache, and so it is faster to retrieve the word at the end of the + * match string with two 8-bit loads. The instructions that test the + * word at the beginning of the match string, however, are executed + * much less frequently, and there it was cheaper to use 16-bit + * instructions, which avoided the necessity of saving off and + * subsequently reloading one of the other registers. + */ +LookupLoop: + /* 1 U & V */ + movw (%edi,%edx,2), %cx /* 2 U pipe */ + movl wmask(%esp), %edx /* 2 V pipe */ + cmpl %ebp, %ecx /* 3 U pipe */ + jbe LeaveNow /* 3 V pipe */ + subl $0x00010000, %ebx /* 4 U pipe */ + js LeaveNow /* 4 V pipe */ +LoopEntry: movb -1(%esi,%ecx), %al /* 5 U pipe */ + andl %ecx, %edx /* 5 V pipe */ + cmpb %bl, %al /* 6 U pipe */ + jnz LookupLoop /* 6 V pipe */ + movb (%esi,%ecx), %ah + cmpb %bh, %ah + jnz LookupLoop + movl window(%esp), %eax + movw (%eax,%ecx), %ax + cmpw scanstart(%esp), %ax + jnz LookupLoop + +/* Store the current value of chainlen. */ + + movl %ebx, chainlenscanend(%esp) + +/* Point %edi to the string under scrutiny, and %esi to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + movl window(%esp), %esi + movl scan(%esp), %edi + addl %ecx, %esi + movl scanalign(%esp), %eax + movl $(-MAX_MATCH_8), %edx + lea MAX_MATCH_8(%edi,%eax), %edi + lea MAX_MATCH_8(%esi,%eax), %esi + +/* Test the strings for equality, 8 bytes at a time. At the end, + * adjust %edx so that it is offset to the exact byte that mismatched. + * + * We already know at this point that the first three bytes of the + * strings match each other, and they can be safely passed over before + * starting the compare loop. So what this code does is skip over 0-3 + * bytes, as much as necessary in order to dword-align the %edi + * pointer. (%esi will still be misaligned three times out of four.) + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance. + */ +LoopCmps: + movl (%esi,%edx), %eax + movl (%edi,%edx), %ebx + xorl %ebx, %eax + jnz LeaveLoopCmps + movl 4(%esi,%edx), %eax + movl 4(%edi,%edx), %ebx + xorl %ebx, %eax + jnz LeaveLoopCmps4 + addl $8, %edx + jnz LoopCmps + jmp LenMaximum +LeaveLoopCmps4: addl $4, %edx +LeaveLoopCmps: testl $0x0000FFFF, %eax + jnz LenLower + addl $2, %edx + shrl $16, %eax +LenLower: subb $1, %al + adcl $0, %edx + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%edi,%edx), %eax + movl scan(%esp), %edi + subl %edi, %eax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + cmpl %ebx, %eax + jg LongerMatch + movl chainlenscanend(%esp), %ebx + movl windowbestlen(%esp), %esi + movl dsPrev(%edx), %edi + movl wmask(%esp), %edx + andl %ecx, %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: movl nicematch(%esp), %ebx + movl %eax, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + cmpl %ebx, %eax + jge LeaveNow + movl window(%esp), %esi + addl %eax, %esi + movl %esi, windowbestlen(%esp) + movl chainlenscanend(%esp), %ebx + movw -1(%edi,%eax), %bx + movl dsPrev(%edx), %edi + movl %ebx, chainlenscanend(%esp) + movl wmask(%esp), %edx + andl %ecx, %edx + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: movl deflatestate(%esp), %edx + movl $MAX_MATCH, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + movl dsLookahead(%edx), %eax + cmpl %eax, %ebx + jg LookaheadRet + movl %ebx, %eax +LookaheadRet: + +/* Restore the stack and return from whence we came. */ + + addl $LocalVarsSize, %esp + popl %ebx + popl %esi + popl %edi + popl %ebp +match_init: ret diff --git a/win32/3rdparty/zlib/contrib/asm686/README.686 b/win32/3rdparty/zlib/contrib/asm686/README.686 new file mode 100644 index 000000000..a593f23af --- /dev/null +++ b/win32/3rdparty/zlib/contrib/asm686/README.686 @@ -0,0 +1,34 @@ +This is a patched version of zlib, modified to use +Pentium-Pro-optimized assembly code in the deflation algorithm. The +files changed/added by this patch are: + +README.686 +match.S + +The speedup that this patch provides varies, depending on whether the +compiler used to build the original version of zlib falls afoul of the +PPro's speed traps. My own tests show a speedup of around 10-20% at +the default compression level, and 20-30% using -9, against a version +compiled using gcc 2.7.2.3. Your mileage may vary. + +Note that this code has been tailored for the PPro/PII in particular, +and will not perform particuarly well on a Pentium. + +If you are using an assembler other than GNU as, you will have to +translate match.S to use your assembler's syntax. (Have fun.) + +Brian Raiter +breadbox@muppetlabs.com +April, 1998 + + +Added for zlib 1.1.3: + +The patches come from +http://www.muppetlabs.com/~breadbox/software/assembly.html + +To compile zlib with this asm file, copy match.S to the zlib directory +then do: + +CFLAGS="-O3 -DASMV" ./configure +make OBJA=match.o diff --git a/win32/3rdparty/zlib/contrib/asm686/match.S b/win32/3rdparty/zlib/contrib/asm686/match.S new file mode 100644 index 000000000..5c3e9ee36 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/asm686/match.S @@ -0,0 +1,329 @@ +/* match.s -- Pentium-Pro-optimized version of longest_match() + * Written for zlib 1.1.2 + * Copyright (C) 1998 Brian Raiter + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License. + */ + +#ifndef NO_UNDERLINE +#define match_init _match_init +#define longest_match _longest_match +#endif + +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ + +#define chainlenwmask 0 /* high word: current chain len */ + /* low word: s->wmask */ +#define window 4 /* local copy of s->window */ +#define windowbestlen 8 /* s->window + bestlen */ +#define scanstart 16 /* first two bytes of string */ +#define scanend 12 /* last two bytes of string */ +#define scanalign 20 /* dword-misalignment of string */ +#define nicematch 24 /* a good enough match size */ +#define bestlen 28 /* size of best match so far */ +#define scan 32 /* ptr to string wanting match */ + +#define LocalVarsSize (36) +/* saved ebx 36 */ +/* saved edi 40 */ +/* saved esi 44 */ +/* saved ebp 48 */ +/* return address 52 */ +#define deflatestate 56 /* the function arguments */ +#define curmatch 60 + +/* All the +zlib1222add offsets are due to the addition of fields + * in zlib in the deflate_state structure since the asm code was first written + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + */ + +#define zlib1222add (8) + +#define dsWSize (36+zlib1222add) +#define dsWMask (44+zlib1222add) +#define dsWindow (48+zlib1222add) +#define dsPrev (56+zlib1222add) +#define dsMatchLen (88+zlib1222add) +#define dsPrevMatch (92+zlib1222add) +#define dsStrStart (100+zlib1222add) +#define dsMatchStart (104+zlib1222add) +#define dsLookahead (108+zlib1222add) +#define dsPrevLen (112+zlib1222add) +#define dsMaxChainLen (116+zlib1222add) +#define dsGoodMatch (132+zlib1222add) +#define dsNiceMatch (136+zlib1222add) + + +.file "match.S" + +.globl match_init, longest_match + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ + +longest_match: + +/* Save registers that the compiler may be using, and adjust %esp to */ +/* make room for our stack frame. */ + + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx + subl $LocalVarsSize, %esp + +/* Retrieve the function arguments. %ecx will hold cur_match */ +/* throughout the entire function. %edx will hold the pointer to the */ +/* deflate_state structure during the function's setup (before */ +/* entering the main loop). */ + + movl deflatestate(%esp), %edx + movl curmatch(%esp), %ecx + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen(%edx), %eax + movl dsGoodMatch(%edx), %ebx + cmpl %ebx, %eax + movl dsWMask(%edx), %eax + movl dsMaxChainLen(%edx), %ebx + jl LastMatchGood + shrl $2, %ebx +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %ebx + shll $16, %ebx + orl %eax, %ebx + movl %ebx, chainlenwmask(%esp) + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch(%edx), %eax + movl dsLookahead(%edx), %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, nicematch(%esp) + +/* register Bytef *scan = s->window + s->strstart; */ + + movl dsWindow(%edx), %esi + movl %esi, window(%esp) + movl dsStrStart(%edx), %ebp + lea (%esi,%ebp), %edi + movl %edi, scan(%esp) + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + movl %edi, %eax + negl %eax + andl $3, %eax + movl %eax, scanalign(%esp) + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize(%edx), %eax + subl $MIN_LOOKAHEAD, %eax + subl %eax, %ebp + jg LimitPositive + xorl %ebp, %ebp +LimitPositive: + +/* int best_len = s->prev_length; */ + + movl dsPrevLen(%edx), %eax + movl %eax, bestlen(%esp) + +/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ + + addl %eax, %esi + movl %esi, windowbestlen(%esp) + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%edi), %ebx + movl %ebx, scanstart(%esp) + movzwl -1(%edi,%eax), %ebx + movl %ebx, scanend(%esp) + movl dsPrev(%edx), %edi + +/* Jump into the main loop. */ + + movl chainlenwmask(%esp), %edx + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + * + * Within this loop: + * %ebx = scanend + * %ecx = curmatch + * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) + * %esi = windowbestlen - i.e., (window + bestlen) + * %edi = prev + * %ebp = limit + */ +LookupLoop: + andl %edx, %ecx + movzwl (%edi,%ecx,2), %ecx + cmpl %ebp, %ecx + jbe LeaveNow + subl $0x00010000, %edx + js LeaveNow +LoopEntry: movzwl -1(%esi,%ecx), %eax + cmpl %ebx, %eax + jnz LookupLoop + movl window(%esp), %eax + movzwl (%eax,%ecx), %eax + cmpl scanstart(%esp), %eax + jnz LookupLoop + +/* Store the current value of chainlen. */ + + movl %edx, chainlenwmask(%esp) + +/* Point %edi to the string under scrutiny, and %esi to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + movl window(%esp), %esi + movl scan(%esp), %edi + addl %ecx, %esi + movl scanalign(%esp), %eax + movl $(-MAX_MATCH_8), %edx + lea MAX_MATCH_8(%edi,%eax), %edi + lea MAX_MATCH_8(%esi,%eax), %esi + +/* Test the strings for equality, 8 bytes at a time. At the end, + * adjust %edx so that it is offset to the exact byte that mismatched. + * + * We already know at this point that the first three bytes of the + * strings match each other, and they can be safely passed over before + * starting the compare loop. So what this code does is skip over 0-3 + * bytes, as much as necessary in order to dword-align the %edi + * pointer. (%esi will still be misaligned three times out of four.) + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance. + */ +LoopCmps: + movl (%esi,%edx), %eax + xorl (%edi,%edx), %eax + jnz LeaveLoopCmps + movl 4(%esi,%edx), %eax + xorl 4(%edi,%edx), %eax + jnz LeaveLoopCmps4 + addl $8, %edx + jnz LoopCmps + jmp LenMaximum +LeaveLoopCmps4: addl $4, %edx +LeaveLoopCmps: testl $0x0000FFFF, %eax + jnz LenLower + addl $2, %edx + shrl $16, %eax +LenLower: subb $1, %al + adcl $0, %edx + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%edi,%edx), %eax + movl scan(%esp), %edi + subl %edi, %eax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + cmpl %ebx, %eax + jg LongerMatch + movl windowbestlen(%esp), %esi + movl dsPrev(%edx), %edi + movl scanend(%esp), %ebx + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: movl nicematch(%esp), %ebx + movl %eax, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + cmpl %ebx, %eax + jge LeaveNow + movl window(%esp), %esi + addl %eax, %esi + movl %esi, windowbestlen(%esp) + movzwl -1(%edi,%eax), %ebx + movl dsPrev(%edx), %edi + movl %ebx, scanend(%esp) + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: movl deflatestate(%esp), %edx + movl $MAX_MATCH, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + movl dsLookahead(%edx), %eax + cmpl %eax, %ebx + jg LookaheadRet + movl %ebx, %eax +LookaheadRet: + +/* Restore the stack and return from whence we came. */ + + addl $LocalVarsSize, %esp + popl %ebx + popl %esi + popl %edi + popl %ebp +match_init: ret diff --git a/win32/3rdparty/zlib/contrib/blast/README b/win32/3rdparty/zlib/contrib/blast/README new file mode 100644 index 000000000..e3a60b3f5 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/blast/README @@ -0,0 +1,4 @@ +Read blast.h for purpose and usage. + +Mark Adler +madler@alumni.caltech.edu diff --git a/win32/3rdparty/zlib/contrib/blast/blast.c b/win32/3rdparty/zlib/contrib/blast/blast.c new file mode 100644 index 000000000..4ce697a41 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/blast/blast.c @@ -0,0 +1,444 @@ +/* blast.c + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in blast.h + * version 1.1, 16 Feb 2003 + * + * blast.c decompresses data compressed by the PKWare Compression Library. + * This function provides functionality similar to the explode() function of + * the PKWare library, hence the name "blast". + * + * This decompressor is based on the excellent format description provided by + * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the + * example Ben provided in the post is incorrect. The distance 110001 should + * instead be 111000. When corrected, the example byte stream becomes: + * + * 00 04 82 24 25 8f 80 7f + * + * which decompresses to "AIAIAIAIAIAIA" (without the quotes). + */ + +/* + * Change history: + * + * 1.0 12 Feb 2003 - First version + * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "blast.h" /* prototype for blast() */ + +#define local static /* for local function definitions */ +#define MAXBITS 13 /* maximum code length */ +#define MAXWIN 4096 /* maximum window size */ + +/* input and output state */ +struct state { + /* input state */ + blast_in infun; /* input function provided by user */ + void *inhow; /* opaque information passed to infun() */ + unsigned char *in; /* next input location */ + unsigned left; /* available input at in */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; + + /* output state */ + blast_out outfun; /* output function provided by user */ + void *outhow; /* opaque information passed to outfun() */ + unsigned next; /* index of next write location in out[] */ + int first; /* true to check distances (for first 4K) */ + unsigned char out[MAXWIN]; /* output buffer and sliding window */ +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + int val; /* bit accumulator */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */ + s->left--; + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = val >> need; + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return val & ((1 << need) - 1); +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -9 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. + * + * - The first code for the shortest length is all ones. Subsequent codes of + * the same length are simply integer decrements of the previous code. When + * moving up a length, a one bit is appended to the code. For a complete + * code, the last code of the longest length will be all zeros. To support + * this ordering, the bits pulled during decoding are inverted to apply the + * more "natural" ordering starting with all zeros and incrementing. + */ +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= (bitbuf & 1) ^ 1; /* invert code */ + bitbuf >>= 1; + count = *next++; + if (code < first + count) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + bitbuf = *(s->in)++; + s->left--; + if (left > 8) left = 8; + } + return -9; /* ran out of codes */ +} + +/* + * Given a list of repeated code lengths rep[0..n-1], where each byte is a + * count (high four bits + 1) and a code length (low four bits), generate the + * list of code lengths. This compaction reduces the size of the object code. + * Then given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + */ +local int construct(struct huffman *h, const unsigned char *rep, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + short length[256]; /* code lengths */ + + /* convert compact repeat counts into symbol bit length list */ + symbol = 0; + do { + len = *rep++; + left = (len >> 4) + 1; + len &= 15; + do { + length[symbol++] = len; + } while (--left); + } while (--n); + n = symbol; + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode PKWare Compression Library stream. + * + * Format notes: + * + * - First byte is 0 if literals are uncoded or 1 if they are coded. Second + * byte is 4, 5, or 6 for the number of extra bits in the distance code. + * This is the base-2 logarithm of the dictionary size minus six. + * + * - Compressed data is a combination of literals and length/distance pairs + * terminated by an end code. Literals are either Huffman coded or + * uncoded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - A bit preceding a literal or length/distance pair indicates which comes + * next, 0 for literals, 1 for length/distance. + * + * - If literals are uncoded, then the next eight bits are the literal, in the + * normal bit order in th stream, i.e. no bit-reversal is needed. Similarly, + * no bit reversal is needed for either the length extra bits or the distance + * extra bits. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 518 + * simply copies the last byte 518 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. + */ +local int decomp(struct state *s) +{ + int lit; /* true if literals are coded */ + int dict; /* log2(dictionary size) - 6 */ + int symbol; /* decoded symbol, extra bits for distance */ + int len; /* length for copy */ + int dist; /* distance for copy */ + int copy; /* copy counter */ + unsigned char *from, *to; /* copy pointers */ + static int virgin = 1; /* build tables once */ + static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */ + static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */ + static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */ + static struct huffman litcode = {litcnt, litsym}; /* length code */ + static struct huffman lencode = {lencnt, lensym}; /* length code */ + static struct huffman distcode = {distcnt, distsym};/* distance code */ + /* bit lengths of literal codes */ + static const unsigned char litlen[] = { + 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8, + 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5, + 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12, + 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27, + 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45, + 44, 173}; + /* bit lengths of length codes 0..15 */ + static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23}; + /* bit lengths of distance codes 0..63 */ + static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248}; + static const short base[16] = { /* base for length codes */ + 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264}; + static const char extra[16] = { /* extra bits for length codes */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; + + /* set up decoding tables (once--might not be thread-safe) */ + if (virgin) { + construct(&litcode, litlen, sizeof(litlen)); + construct(&lencode, lenlen, sizeof(lenlen)); + construct(&distcode, distlen, sizeof(distlen)); + virgin = 0; + } + + /* read header */ + lit = bits(s, 8); + if (lit > 1) return -1; + dict = bits(s, 8); + if (dict < 4 || dict > 6) return -2; + + /* decode literals and length/distance pairs */ + do { + if (bits(s, 1)) { + /* get length */ + symbol = decode(s, &lencode); + len = base[symbol] + bits(s, extra[symbol]); + if (len == 519) break; /* end code */ + + /* get distance */ + symbol = len == 2 ? 2 : dict; + dist = decode(s, &distcode) << symbol; + dist += bits(s, symbol); + dist++; + if (s->first && dist > s->next) + return -3; /* distance too far back */ + + /* copy length bytes from distance bytes back */ + do { + to = s->out + s->next; + from = to - dist; + copy = MAXWIN; + if (s->next < dist) { + from += copy; + copy = dist; + } + copy -= s->next; + if (copy > len) copy = len; + len -= copy; + s->next += copy; + do { + *to++ = *from++; + } while (--copy); + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } while (len != 0); + } + else { + /* get literal and write it */ + symbol = lit ? decode(s, &litcode) : bits(s, 8); + s->out[s->next++] = symbol; + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } + } while (1); + return 0; +} + +/* See comments in blast.h */ +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow) +{ + struct state s; /* input/output state */ + int err; /* return value */ + + /* initialize input state */ + s.infun = infun; + s.inhow = inhow; + s.left = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* initialize output state */ + s.outfun = outfun; + s.outhow = outhow; + s.next = 0; + s.first = 1; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp(), */ + err = 2; /* then skip decomp(), return error */ + else + err = decomp(&s); /* decompress */ + + /* write any leftover output and update the error code if needed */ + if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0) + err = 1; + return err; +} + +#ifdef TEST +/* Example of how to use blast() */ +#include +#include + +#define CHUNK 16384 + +local unsigned inf(void *how, unsigned char **buf) +{ + static unsigned char hold[CHUNK]; + + *buf = hold; + return fread(hold, 1, CHUNK, (FILE *)how); +} + +local int outf(void *how, unsigned char *buf, unsigned len) +{ + return fwrite(buf, 1, len, (FILE *)how) != len; +} + +/* Decompress a PKWare Compression Library stream from stdin to stdout */ +int main(void) +{ + int ret, n; + + /* decompress to stdout */ + ret = blast(inf, stdin, outf, stdout); + if (ret != 0) fprintf(stderr, "blast error: %d\n", ret); + + /* see if there are any leftover bytes */ + n = 0; + while (getchar() != EOF) n++; + if (n) fprintf(stderr, "blast warning: %d unused bytes of input\n", n); + + /* return blast() error code */ + return ret; +} +#endif diff --git a/win32/3rdparty/zlib/contrib/blast/blast.h b/win32/3rdparty/zlib/contrib/blast/blast.h new file mode 100644 index 000000000..ce9e5410f --- /dev/null +++ b/win32/3rdparty/zlib/contrib/blast/blast.h @@ -0,0 +1,71 @@ +/* blast.h -- interface for blast.c + Copyright (C) 2003 Mark Adler + version 1.1, 16 Feb 2003 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * blast() decompresses the PKWare Data Compression Library (DCL) compressed + * format. It provides the same functionality as the explode() function in + * that library. (Note: PKWare overused the "implode" verb, and the format + * used by their library implode() function is completely different and + * incompatible with the implode compression method supported by PKZIP.) + */ + + +typedef unsigned (*blast_in)(void *how, unsigned char **buf); +typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len); +/* Definitions for input/output functions passed to blast(). See below for + * what the provided functions need to do. + */ + + +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow); +/* Decompress input to output using the provided infun() and outfun() calls. + * On success, the return value of blast() is zero. If there is an error in + * the source data, i.e. it is not in the proper format, then a negative value + * is returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. + * + * The input function is invoked: len = infun(how, &buf), where buf is set by + * infun() to point to the input buffer, and infun() returns the number of + * available bytes there. If infun() returns zero, then blast() returns with + * an input error. (blast() only asks for input if it needs it.) inhow is for + * use by the application to pass an input descriptor to infun(), if desired. + * + * The output function is invoked: err = outfun(how, buf, len), where the bytes + * to be written are buf[0..len-1]. If err is not zero, then blast() returns + * with an output error. outfun() is always called with len <= 4096. outhow + * is for use by the application to pass an output descriptor to outfun(), if + * desired. + * + * The return codes are: + * + * 2: ran out of input before completing decompression + * 1: output error before completing decompression + * 0: successful decompression + * -1: literal flag not zero or one + * -2: dictionary size not in 4..6 + * -3: distance is too far back + * + * At the bottom of blast.c is an example program that uses blast() that can be + * compiled to produce a command-line decompression filter by defining TEST. + */ diff --git a/win32/3rdparty/zlib/contrib/blast/test.txt b/win32/3rdparty/zlib/contrib/blast/test.txt new file mode 100644 index 000000000..bfdf1c5dc --- /dev/null +++ b/win32/3rdparty/zlib/contrib/blast/test.txt @@ -0,0 +1 @@ +AIAIAIAIAIAIA \ No newline at end of file diff --git a/win32/3rdparty/zlib/contrib/delphi/ZLib.pas b/win32/3rdparty/zlib/contrib/delphi/ZLib.pas new file mode 100644 index 000000000..3f2b8b4a5 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/delphi/ZLib.pas @@ -0,0 +1,557 @@ +{*******************************************************} +{ } +{ Borland Delphi Supplemental Components } +{ ZLIB Data Compression Interface Unit } +{ } +{ Copyright (c) 1997,99 Borland Corporation } +{ } +{*******************************************************} + +{ Updated for zlib 1.2.x by Cosmin Truta } + +unit ZLib; + +interface + +uses SysUtils, Classes; + +type + TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl; + TFree = procedure (AppData, Block: Pointer); cdecl; + + // Internal structure. Ignore. + TZStreamRec = packed record + next_in: PChar; // next input byte + avail_in: Integer; // number of bytes available at next_in + total_in: Longint; // total nb of input bytes read so far + + next_out: PChar; // next output byte should be put here + avail_out: Integer; // remaining free space at next_out + total_out: Longint; // total nb of bytes output so far + + msg: PChar; // last error message, NULL if no error + internal: Pointer; // not visible by applications + + zalloc: TAlloc; // used to allocate the internal state + zfree: TFree; // used to free the internal state + AppData: Pointer; // private data object passed to zalloc and zfree + + data_type: Integer; // best guess about the data type: ascii or binary + adler: Longint; // adler32 value of the uncompressed data + reserved: Longint; // reserved for future use + end; + + // Abstract ancestor class + TCustomZlibStream = class(TStream) + private + FStrm: TStream; + FStrmPos: Integer; + FOnProgress: TNotifyEvent; + FZRec: TZStreamRec; + FBuffer: array [Word] of Char; + protected + procedure Progress(Sender: TObject); dynamic; + property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; + constructor Create(Strm: TStream); + end; + +{ TCompressionStream compresses data on the fly as data is written to it, and + stores the compressed data to another stream. + + TCompressionStream is write-only and strictly sequential. Reading from the + stream will raise an exception. Using Seek to move the stream pointer + will raise an exception. + + Output data is cached internally, written to the output stream only when + the internal output buffer is full. All pending output data is flushed + when the stream is destroyed. + + The Position property returns the number of uncompressed bytes of + data that have been written to the stream so far. + + CompressionRate returns the on-the-fly percentage by which the original + data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100 + If raw data size = 100 and compressed data size = 25, the CompressionRate + is 75% + + The OnProgress event is called each time the output buffer is filled and + written to the output stream. This is useful for updating a progress + indicator when you are writing a large chunk of data to the compression + stream in a single call.} + + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + TCompressionStream = class(TCustomZlibStream) + private + function GetCompressionRate: Single; + public + constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property CompressionRate: Single read GetCompressionRate; + property OnProgress; + end; + +{ TDecompressionStream decompresses data on the fly as data is read from it. + + Compressed data comes from a separate source stream. TDecompressionStream + is read-only and unidirectional; you can seek forward in the stream, but not + backwards. The special case of setting the stream position to zero is + allowed. Seeking forward decompresses data until the requested position in + the uncompressed data has been reached. Seeking backwards, seeking relative + to the end of the stream, requesting the size of the stream, and writing to + the stream will raise an exception. + + The Position property returns the number of bytes of uncompressed data that + have been read from the stream so far. + + The OnProgress event is called each time the internal input buffer of + compressed data is exhausted and the next block is read from the input stream. + This is useful for updating a progress indicator when you are reading a + large chunk of data from the decompression stream in a single call.} + + TDecompressionStream = class(TCustomZlibStream) + public + constructor Create(Source: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property OnProgress; + end; + + + +{ CompressBuf compresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); + + +{ DecompressBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + OutEstimate = zero, or est. size of the decompressed data + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); + +{ DecompressToUserBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to user-allocated buffer to contain decompressed data + BufSize = number of bytes in OutBuf } +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); + +const + zlib_version = '1.2.3'; + +type + EZlibError = class(Exception); + ECompressionError = class(EZlibError); + EDecompressionError = class(EZlibError); + +implementation + +uses ZLibConst; + +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = (-1); + Z_STREAM_ERROR = (-2); + Z_DATA_ERROR = (-3); + Z_MEM_ERROR = (-4); + Z_BUF_ERROR = (-5); + Z_VERSION_ERROR = (-6); + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = (-1); + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +procedure adler32; external; +procedure compressBound; external; +procedure crc32; external; +procedure deflateInit2_; external; +procedure deflateParams; external; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + Result := AllocMem(Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + + + +// deflate compresses data +function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; + recsize: Integer): Integer; external; +function deflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function deflateEnd(var strm: TZStreamRec): Integer; external; + +// inflate decompresses data +function inflateInit_(var strm: TZStreamRec; version: PChar; + recsize: Integer): Integer; external; +function inflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function inflateEnd(var strm: TZStreamRec): Integer; external; +function inflateReset(var strm: TZStreamRec): Integer; external; + + +function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl; +begin +// GetMem(Result, Items*Size); + Result := AllocMem(Items * Size); +end; + +procedure zlibFreeMem(AppData, Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +{function zlibCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EZlibError.Create('error'); //!! +end;} + +function CCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise ECompressionError.Create('error'); //!! +end; + +function DCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EDecompressionError.Create('error'); //!! +end; + +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm))); + try + while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, 256); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := 256; + end; + finally + CCheck(deflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + + +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; + BufInc: Integer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + BufInc := (InBytes + 255) and not 255; + if OutEstimate = 0 then + OutBytes := BufInc + else + OutBytes := OutEstimate; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, BufInc); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := BufInc; + end; + finally + DCheck(inflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); +var + strm: TZStreamRec; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := BufSize; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then + raise EZlibError.CreateRes(@sTargetBufferTooSmall); + finally + DCheck(inflateEnd(strm)); + end; +end; + +// TCustomZlibStream + +constructor TCustomZLibStream.Create(Strm: TStream); +begin + inherited Create; + FStrm := Strm; + FStrmPos := Strm.Position; + FZRec.zalloc := zlibAllocMem; + FZRec.zfree := zlibFreeMem; +end; + +procedure TCustomZLibStream.Progress(Sender: TObject); +begin + if Assigned(FOnProgress) then FOnProgress(Sender); +end; + + +// TCompressionStream + +constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel; + Dest: TStream); +const + Levels: array [TCompressionLevel] of ShortInt = + (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION); +begin + inherited Create(Dest); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec))); +end; + +destructor TCompressionStream.Destroy; +begin + FZRec.next_in := nil; + FZRec.avail_in := 0; + try + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END) + and (FZRec.avail_out = 0) do + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + end; + if FZRec.avail_out < sizeof(FBuffer) then + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out); + finally + deflateEnd(FZRec); + end; + inherited Destroy; +end; + +function TCompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + FZRec.next_in := @Buffer; + FZRec.avail_in := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_in > 0) do + begin + CCheck(deflate(FZRec, 0)); + if FZRec.avail_out = 0 then + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + FStrmPos := FStrm.Position; + Progress(Self); + end; + end; + Result := Count; +end; + +function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + if (Offset = 0) and (Origin = soFromCurrent) then + Result := FZRec.total_in + else + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.GetCompressionRate: Single; +begin + if FZRec.total_in = 0 then + Result := 0 + else + Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0; +end; + + +// TDecompressionStream + +constructor TDecompressionStream.Create(Source: TStream); +begin + inherited Create(Source); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec))); +end; + +destructor TDecompressionStream.Destroy; +begin + FStrm.Seek(-FZRec.avail_in, 1); + inflateEnd(FZRec); + inherited Destroy; +end; + +function TDecompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + FZRec.next_out := @Buffer; + FZRec.avail_out := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_out > 0) do + begin + if FZRec.avail_in = 0 then + begin + FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); + if FZRec.avail_in = 0 then + begin + Result := Count - FZRec.avail_out; + Exit; + end; + FZRec.next_in := FBuffer; + FStrmPos := FStrm.Position; + Progress(Self); + end; + CCheck(inflate(FZRec, 0)); + end; + Result := Count; +end; + +function TDecompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + raise EDecompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +var + I: Integer; + Buf: array [0..4095] of Char; +begin + if (Offset = 0) and (Origin = soFromBeginning) then + begin + DCheck(inflateReset(FZRec)); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + FStrm.Position := 0; + FStrmPos := 0; + end + else if ( (Offset >= 0) and (Origin = soFromCurrent)) or + ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then + begin + if Origin = soFromBeginning then Dec(Offset, FZRec.total_out); + if Offset > 0 then + begin + for I := 1 to Offset div sizeof(Buf) do + ReadBuffer(Buf, sizeof(Buf)); + ReadBuffer(Buf, Offset mod sizeof(Buf)); + end; + end + else + raise EDecompressionError.CreateRes(@sInvalidStreamOp); + Result := FZRec.total_out; +end; + + +end. diff --git a/win32/3rdparty/zlib/contrib/delphi/ZLibConst.pas b/win32/3rdparty/zlib/contrib/delphi/ZLibConst.pas new file mode 100644 index 000000000..cdfe13671 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/delphi/ZLibConst.pas @@ -0,0 +1,11 @@ +unit ZLibConst; + +interface + +resourcestring + sTargetBufferTooSmall = 'ZLib error: target buffer may be too small'; + sInvalidStreamOp = 'Invalid stream operation'; + +implementation + +end. diff --git a/win32/3rdparty/zlib/contrib/delphi/readme.txt b/win32/3rdparty/zlib/contrib/delphi/readme.txt new file mode 100644 index 000000000..2dc9a8bba --- /dev/null +++ b/win32/3rdparty/zlib/contrib/delphi/readme.txt @@ -0,0 +1,76 @@ + +Overview +======== + +This directory contains an update to the ZLib interface unit, +distributed by Borland as a Delphi supplemental component. + +The original ZLib unit is Copyright (c) 1997,99 Borland Corp., +and is based on zlib version 1.0.4. There are a series of bugs +and security problems associated with that old zlib version, and +we recommend the users to update their ZLib unit. + + +Summary of modifications +======================== + +- Improved makefile, adapted to zlib version 1.2.1. + +- Some field types from TZStreamRec are changed from Integer to + Longint, for consistency with the zlib.h header, and for 64-bit + readiness. + +- The zlib_version constant is updated. + +- The new Z_RLE strategy has its corresponding symbolic constant. + +- The allocation and deallocation functions and function types + (TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl, + and _malloc and _free are added as C RTL stubs. As a result, + the original C sources of zlib can be compiled out of the box, + and linked to the ZLib unit. + + +Suggestions for improvements +============================ + +Currently, the ZLib unit provides only a limited wrapper around +the zlib library, and much of the original zlib functionality is +missing. Handling compressed file formats like ZIP/GZIP or PNG +cannot be implemented without having this functionality. +Applications that handle these formats are either using their own, +duplicated code, or not using the ZLib unit at all. + +Here are a few suggestions: + +- Checksum class wrappers around adler32() and crc32(), similar + to the Java classes that implement the java.util.zip.Checksum + interface. + +- The ability to read and write raw deflate streams, without the + zlib stream header and trailer. Raw deflate streams are used + in the ZIP file format. + +- The ability to read and write gzip streams, used in the GZIP + file format, and normally produced by the gzip program. + +- The ability to select a different compression strategy, useful + to PNG and MNG image compression, and to multimedia compression + in general. Besides the compression level + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + which, in fact, could have used the 'z' prefix and avoided + TColor-like symbols + + TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax); + + there could be a compression strategy + + TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle); + +- ZIP and GZIP stream handling via TStreams. + + +-- +Cosmin Truta diff --git a/win32/3rdparty/zlib/contrib/delphi/zlibd32.mak b/win32/3rdparty/zlib/contrib/delphi/zlibd32.mak new file mode 100644 index 000000000..88fafa0b1 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/delphi/zlibd32.mak @@ -0,0 +1,93 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj +OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj +OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib.build b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib.build new file mode 100644 index 000000000..ed19cc9dc --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib.build @@ -0,0 +1,33 @@ + + + A .Net wrapper library around ZLib1.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib.sln b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib.sln new file mode 100644 index 000000000..ac45ca048 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotZLib", "DotZLib\DotZLib.csproj", "{BB1EE0B1-1808-46CB-B786-949D91117FC5}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.ActiveCfg = Debug|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.Build.0 = Debug|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.ActiveCfg = Release|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.Build.0 = Release|.NET + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs new file mode 100644 index 000000000..6fc0fdcc2 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("DotZLib")] +[assembly: AssemblyDescription(".Net bindings for ZLib compression dll 1.2.x")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Henrik Ravn")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 by Henrik Ravn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs new file mode 100644 index 000000000..dfe7e90a8 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs @@ -0,0 +1,202 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + #region ChecksumGeneratorBase + /// + /// Implements the common functionality needed for all s + /// + /// + public abstract class ChecksumGeneratorBase : ChecksumGenerator + { + /// + /// The value of the current checksum + /// + protected uint _current; + + /// + /// Initializes a new instance of the checksum generator base - the current checksum is + /// set to zero + /// + public ChecksumGeneratorBase() + { + _current = 0; + } + + /// + /// Initializes a new instance of the checksum generator basewith a specified value + /// + /// The value to set the current checksum to + public ChecksumGeneratorBase(uint initialValue) + { + _current = initialValue; + } + + /// + /// Resets the current checksum to zero + /// + public void Reset() { _current = 0; } + + /// + /// Gets the current checksum value + /// + public uint Value { get { return _current; } } + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + /// All the other Update methods are implmeneted in terms of this one. + /// This is therefore the only method a derived class has to implement + public abstract void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with an array of bytes. + /// + /// The data to update the checksum with + public void Update(byte[] data) + { + Update(data, 0, data.Length); + } + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + public void Update(string data) + { + Update(Encoding.UTF8.GetBytes(data)); + } + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + public void Update(string data, Encoding encoding) + { + Update(encoding.GetBytes(data)); + } + + } + #endregion + + #region CRC32 + /// + /// Implements a CRC32 checksum generator + /// + public sealed class CRC32Checksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint crc32(uint crc, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the CRC32 checksum generator + /// + public CRC32Checksum() : base() {} + + /// + /// Initializes a new instance of the CRC32 checksum generator with a specified value + /// + /// The value to set the current checksum to + public CRC32Checksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + + #region Adler + /// + /// Implements a checksum generator that computes the Adler checksum on data + /// + public sealed class AdlerChecksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint adler32(uint adler, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the Adler checksum generator + /// + public AdlerChecksum() : base() {} + + /// + /// Initializes a new instance of the Adler checksum generator with a specified value + /// + /// The value to set the current checksum to + public AdlerChecksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + +} \ No newline at end of file diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 000000000..16997e906 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs @@ -0,0 +1,83 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; + +namespace DotZLib +{ + + /// + /// This class implements a circular buffer + /// + internal class CircularBuffer + { + #region Private data + private int _capacity; + private int _head; + private int _tail; + private int _size; + private byte[] _buffer; + #endregion + + public CircularBuffer(int capacity) + { + Debug.Assert( capacity > 0 ); + _buffer = new byte[capacity]; + _capacity = capacity; + _head = 0; + _tail = 0; + _size = 0; + } + + public int Size { get { return _size; } } + + public int Put(byte[] source, int offset, int count) + { + Debug.Assert( count > 0 ); + int trueCount = Math.Min(count, _capacity - Size); + for (int i = 0; i < trueCount; ++i) + _buffer[(_tail+i) % _capacity] = source[offset+i]; + _tail += trueCount; + _tail %= _capacity; + _size += trueCount; + return trueCount; + } + + public bool Put(byte b) + { + if (Size == _capacity) // no room + return false; + _buffer[_tail++] = b; + _tail %= _capacity; + ++_size; + return true; + } + + public int Get(byte[] destination, int offset, int count) + { + int trueCount = Math.Min(count,Size); + for (int i = 0; i < trueCount; ++i) + destination[offset + i] = _buffer[(_head+i) % _capacity]; + _head += trueCount; + _head %= _capacity; + _size -= trueCount; + return trueCount; + } + + public int Get() + { + if (Size == 0) + return -1; + + int result = (int)_buffer[_head++ % _capacity]; + --_size; + return result; + } + + } +} diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CodecBase.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 000000000..954db7db0 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/CodecBase.cs @@ -0,0 +1,198 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements the common functionality needed for all s + /// + public abstract class CodecBase : Codec, IDisposable + { + + #region Data members + + /// + /// Instance of the internal zlib buffer structure that is + /// passed to all functions in the zlib dll + /// + internal ZStream _ztream = new ZStream(); + + /// + /// True if the object instance has been disposed, false otherwise + /// + protected bool _isDisposed = false; + + /// + /// The size of the internal buffers + /// + protected const int kBufferSize = 16384; + + private byte[] _outBuffer = new byte[kBufferSize]; + private byte[] _inBuffer = new byte[kBufferSize]; + + private GCHandle _hInput; + private GCHandle _hOutput; + + private uint _checksum = 0; + + #endregion + + /// + /// Initializes a new instance of the CodeBase class. + /// + public CodecBase() + { + try + { + _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); + _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); + } + catch (Exception) + { + CleanUp(false); + throw; + } + } + + + #region Codec Members + + /// + /// Occurs when more processed data are available. + /// + public event DataAvailableHandler DataAvailable; + + /// + /// Fires the event + /// + protected void OnDataAvailable() + { + if (_ztream.total_out > 0) + { + if (DataAvailable != null) + DataAvailable( _outBuffer, 0, (int)_ztream.total_out); + resetOutput(); + } + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + public void Add(byte[] data) + { + Add(data,0,data.Length); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + /// This must be implemented by a derived class + public abstract void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + /// This must be implemented by a derived class + public abstract void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + public uint Checksum { get { return _checksum; } } + + #endregion + + #region Destructor & IDisposable stuff + + /// + /// Destroys this instance + /// + ~CodecBase() + { + CleanUp(false); + } + + /// + /// Releases any unmanaged resources and calls the method of the derived class + /// + public void Dispose() + { + CleanUp(true); + } + + /// + /// Performs any codec specific cleanup + /// + /// This must be implemented by a derived class + protected abstract void CleanUp(); + + // performs the release of the handles and calls the dereived CleanUp() + private void CleanUp(bool isDisposing) + { + if (!_isDisposed) + { + CleanUp(); + if (_hInput.IsAllocated) + _hInput.Free(); + if (_hOutput.IsAllocated) + _hOutput.Free(); + + _isDisposed = true; + } + } + + + #endregion + + #region Helper methods + + /// + /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// + /// The byte array that contains the data to copy + /// The index of the first byte to copy + /// The number of bytes to copy from data + protected void copyInput(byte[] data, int startIndex, int count) + { + Array.Copy(data, startIndex, _inBuffer,0, count); + _ztream.next_in = _hInput.AddrOfPinnedObject(); + _ztream.total_in = 0; + _ztream.avail_in = (uint)count; + + } + + /// + /// Resets the internal output buffers to a known state - ready for processing + /// + protected void resetOutput() + { + _ztream.total_out = 0; + _ztream.avail_out = kBufferSize; + _ztream.next_out = _hOutput.AddrOfPinnedObject(); + } + + /// + /// Updates the running checksum property + /// + /// The new checksum value + protected void setChecksum(uint newSum) + { + _checksum = newSum; + } + #endregion + + } +} diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Deflater.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 000000000..d7b8dccca --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Deflater.cs @@ -0,0 +1,106 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data compressor, using the deflate algorithm in the ZLib dll + /// + public sealed class Deflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Deflater + /// + /// The compression level to use for this Deflater + public Deflater(CompressLevel level) : base() + { + int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize deflater"); + + resetOutput(); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + while (err >= 0 && _ztream.avail_in > 0) + { + err = deflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = deflate(ref _ztream, (int)FlushTypes.None); + } + inputIndex += (int)_ztream.total_in; + } + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = deflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + deflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib deflate stream + /// + protected override void CleanUp() { deflateEnd(ref _ztream); } + + } +} diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 000000000..410deb088 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.cs @@ -0,0 +1,288 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + + #region Internal types + + /// + /// Defines constants for the various flush types used with zlib + /// + internal enum FlushTypes + { + None, Partial, Sync, Full, Finish, Block + } + + #region ZStream structure + // internal mapping of the zlib zstream structure for marshalling + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + internal struct ZStream + { + public IntPtr next_in; + public uint avail_in; + public uint total_in; + + public IntPtr next_out; + public uint avail_out; + public uint total_out; + + [MarshalAs(UnmanagedType.LPStr)] + string msg; + uint state; + + uint zalloc; + uint zfree; + uint opaque; + + int data_type; + public uint adler; + uint reserved; + } + + #endregion + + #endregion + + #region Public enums + /// + /// Defines constants for the available compression levels in zlib + /// + public enum CompressLevel : int + { + /// + /// The default compression level with a reasonable compromise between compression and speed + /// + Default = -1, + /// + /// No compression at all. The data are passed straight through. + /// + None = 0, + /// + /// The maximum compression rate available. + /// + Best = 9, + /// + /// The fastest available compression level. + /// + Fastest = 1 + } + #endregion + + #region Exception classes + /// + /// The exception that is thrown when an error occurs on the zlib dll + /// + public class ZLibException : ApplicationException + { + /// + /// Initializes a new instance of the class with a specified + /// error message and error code + /// + /// The zlib error code that caused the exception + /// A message that (hopefully) describes the error + public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg)) + { + } + + /// + /// Initializes a new instance of the class with a specified + /// error code + /// + /// The zlib error code that caused the exception + public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode)) + { + } + } + #endregion + + #region Interfaces + + /// + /// Declares methods and properties that enables a running checksum to be calculated + /// + public interface ChecksumGenerator + { + /// + /// Gets the current value of the checksum + /// + uint Value { get; } + + /// + /// Clears the current checksum to 0 + /// + void Reset(); + + /// + /// Updates the current checksum with an array of bytes + /// + /// The data to update the checksum with + void Update(byte[] data); + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + void Update(string data); + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + void Update(string data, Encoding encoding); + } + + + /// + /// Represents the method that will be called from a codec when new data + /// are available. + /// + /// The byte array containing the processed data + /// The index of the first processed byte in data + /// The number of processed bytes available + /// On return from this method, the data may be overwritten, so grab it while you can. + /// You cannot assume that startIndex will be zero. + /// + public delegate void DataAvailableHandler(byte[] data, int startIndex, int count); + + /// + /// Declares methods and events for implementing compressors/decompressors + /// + public interface Codec + { + /// + /// Occurs when more processed data are available. + /// + event DataAvailableHandler DataAvailable; + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data); + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + uint Checksum { get; } + + + } + + #endregion + + #region Classes + /// + /// Encapsulates general information about the ZLib library + /// + public class Info + { + #region DLL imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint zlibCompileFlags(); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern string zlibVersion(); + #endregion + + #region Private stuff + private uint _flags; + + // helper function that unpacks a bitsize mask + private static int bitSize(uint bits) + { + switch (bits) + { + case 0: return 16; + case 1: return 32; + case 2: return 64; + } + return -1; + } + #endregion + + /// + /// Constructs an instance of the Info class. + /// + public Info() + { + _flags = zlibCompileFlags(); + } + + /// + /// True if the library is compiled with debug info + /// + public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } } + + /// + /// True if the library is compiled with assembly optimizations + /// + public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } } + + /// + /// Gets the size of the unsigned int that was compiled into Zlib + /// + public int SizeOfUInt { get { return bitSize(_flags & 3); } } + + /// + /// Gets the size of the unsigned long that was compiled into Zlib + /// + public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } } + + /// + /// Gets the size of the pointers that were compiled into Zlib + /// + public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } } + + /// + /// Gets the size of the z_off_t type that was compiled into Zlib + /// + public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } } + + /// + /// Gets the version of ZLib as a string, e.g. "1.2.1" + /// + public static string Version { get { return zlibVersion(); } } + } + + #endregion + +} diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 000000000..71eeb8590 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/GZipStream.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 000000000..f861675b5 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/GZipStream.cs @@ -0,0 +1,301 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements a compressed , in GZip (.gz) format. + /// + public class GZipStream : Stream, IDisposable + { + #region Dll Imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern IntPtr gzopen(string name, string mode); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzclose(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzwrite(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzread(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzgetc(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzputc(IntPtr gzFile, int c); + + #endregion + + #region Private data + private IntPtr _gzFile; + private bool _isDisposed = false; + private bool _isWriting; + #endregion + + #region Constructors + /// + /// Creates a new file as a writeable GZipStream + /// + /// The name of the compressed file to create + /// The compression level to use when adding data + /// If an error occurred in the internal zlib function + public GZipStream(string fileName, CompressLevel level) + { + _isWriting = true; + _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + } + + /// + /// Opens an existing file as a readable GZipStream + /// + /// The name of the file to open + /// If an error occurred in the internal zlib function + public GZipStream(string fileName) + { + _isWriting = false; + _gzFile = gzopen(fileName, "rb"); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + + } + #endregion + + #region Access properties + /// + /// Returns true of this stream can be read from, false otherwise + /// + public override bool CanRead + { + get + { + return !_isWriting; + } + } + + + /// + /// Returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Returns true if this tsream is writeable, false otherwise + /// + public override bool CanWrite + { + get + { + return _isWriting; + } + } + #endregion + + #region Destructor & IDispose stuff + + /// + /// Destroys this instance + /// + ~GZipStream() + { + cleanUp(false); + } + + /// + /// Closes the external file handle + /// + public void Dispose() + { + cleanUp(true); + } + + // Does the actual closing of the file handle. + private void cleanUp(bool isDisposing) + { + if (!_isDisposed) + { + gzclose(_gzFile); + _isDisposed = true; + } + } + #endregion + + #region Basic reading and writing + /// + /// Attempts to read a number of bytes from the stream. + /// + /// The destination data buffer + /// The index of the first destination byte in buffer + /// The number of bytes requested + /// The number of bytes read + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not readable. + /// If this stream has been disposed. + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + int result; + try + { + result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + return result; + } + + /// + /// Attempts to read a single byte from the stream. + /// + /// The byte that was read, or -1 in case of error or End-Of-File + public override int ReadByte() + { + if (!CanRead) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + return gzgetc(_gzFile); + } + + /// + /// Writes a number of bytes to the stream + /// + /// + /// + /// + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void Write(byte[] buffer, int offset, int count) + { + if (!CanWrite) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + } + + /// + /// Writes a single byte to the stream + /// + /// The byte to add to the stream. + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void WriteByte(byte value) + { + if (!CanWrite) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + int result = gzputc(_gzFile, (int)value); + if (result < 0) + throw new IOException(); + } + #endregion + + #region Position & length stuff + /// + /// Not supported. + /// + /// + /// Always thrown + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Not suppported. + /// + /// + /// + /// + /// Always thrown + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Flushes the GZipStream. + /// + /// In this implementation, this method does nothing. This is because excessive + /// flushing may degrade the achievable compression rates. + public override void Flush() + { + // left empty on purpose + } + + /// + /// Gets/sets the current position in the GZipStream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + /// + /// Gets the size of the stream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + #endregion + } +} diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Inflater.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 000000000..4e60cda07 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/Inflater.cs @@ -0,0 +1,105 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data decompressor, using the inflate algorithm in the ZLib dll + /// + public class Inflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int inflateInit_(ref ZStream sz, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Inflater + /// + public Inflater() : base() + { + int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize inflater"); + + resetOutput(); + } + + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + err = inflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = inflate(ref _ztream, (int)FlushTypes.None); + } + + inputIndex += (int)_ztream.total_in; + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = inflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + inflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib inflate stream + /// + protected override void CleanUp() { inflateEnd(ref _ztream); } + + + } +} diff --git a/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 000000000..8dc00db92 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs @@ -0,0 +1,274 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Collections; +using System.IO; + +// uncomment the define below to include unit tests +//#define nunit +#if nunit +using NUnit.Framework; + +// Unit tests for the DotZLib class library +// ---------------------------------------- +// +// Use this with NUnit 2 from http://www.nunit.org +// + +namespace DotZLibTests +{ + using DotZLib; + + // helper methods + internal class Utils + { + public static bool byteArrEqual( byte[] lhs, byte[] rhs ) + { + if (lhs.Length != rhs.Length) + return false; + for (int i = lhs.Length-1; i >= 0; --i) + if (lhs[i] != rhs[i]) + return false; + return true; + } + + } + + + [TestFixture] + public class CircBufferTests + { + #region Circular buffer tests + [Test] + public void SinglePutGet() + { + CircularBuffer buf = new CircularBuffer(10); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + + Assert.IsTrue(buf.Put( 1 )); + Assert.AreEqual( 1, buf.Size ); + Assert.AreEqual( 1, buf.Get() ); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + } + + [Test] + public void BlockPutGet() + { + CircularBuffer buf = new CircularBuffer(10); + byte[] arr = {1,2,3,4,5,6,7,8,9,10}; + Assert.AreEqual( 10, buf.Put(arr,0,10) ); + Assert.AreEqual( 10, buf.Size ); + Assert.IsFalse( buf.Put(11) ); + Assert.AreEqual( 1, buf.Get() ); + Assert.IsTrue( buf.Put(11) ); + + byte[] arr2 = (byte[])arr.Clone(); + Assert.AreEqual( 9, buf.Get(arr2,1,9) ); + Assert.IsTrue( Utils.byteArrEqual(arr,arr2) ); + } + + #endregion + } + + [TestFixture] + public class ChecksumTests + { + #region CRC32 Tests + [Test] + public void CRC32_Null() + { + CRC32Checksum crc32 = new CRC32Checksum(); + Assert.AreEqual( 0, crc32.Value ); + + crc32 = new CRC32Checksum(1); + Assert.AreEqual( 1, crc32.Value ); + + crc32 = new CRC32Checksum(556); + Assert.AreEqual( 556, crc32.Value ); + } + + [Test] + public void CRC32_Data() + { + CRC32Checksum crc32 = new CRC32Checksum(); + byte[] data = { 1,2,3,4,5,6,7 }; + crc32.Update(data); + Assert.AreEqual( 0x70e46888, crc32.Value ); + + crc32 = new CRC32Checksum(); + crc32.Update("penguin"); + Assert.AreEqual( 0x0e5c1a120, crc32.Value ); + + crc32 = new CRC32Checksum(1); + crc32.Update("penguin"); + Assert.AreEqual(0x43b6aa94, crc32.Value); + + } + #endregion + + #region Adler tests + + [Test] + public void Adler_Null() + { + AdlerChecksum adler = new AdlerChecksum(); + Assert.AreEqual(0, adler.Value); + + adler = new AdlerChecksum(1); + Assert.AreEqual( 1, adler.Value ); + + adler = new AdlerChecksum(556); + Assert.AreEqual( 556, adler.Value ); + } + + [Test] + public void Adler_Data() + { + AdlerChecksum adler = new AdlerChecksum(1); + byte[] data = { 1,2,3,4,5,6,7 }; + adler.Update(data); + Assert.AreEqual( 0x5b001d, adler.Value ); + + adler = new AdlerChecksum(); + adler.Update("penguin"); + Assert.AreEqual(0x0bcf02f6, adler.Value ); + + adler = new AdlerChecksum(1); + adler.Update("penguin"); + Assert.AreEqual(0x0bd602f7, adler.Value); + + } + #endregion + } + + [TestFixture] + public class InfoTests + { + #region Info tests + [Test] + public void Info_Version() + { + Info info = new Info(); + Assert.AreEqual("1.2.3", Info.Version); + Assert.AreEqual(32, info.SizeOfUInt); + Assert.AreEqual(32, info.SizeOfULong); + Assert.AreEqual(32, info.SizeOfPointer); + Assert.AreEqual(32, info.SizeOfOffset); + } + #endregion + } + + [TestFixture] + public class DeflateInflateTests + { + #region Deflate tests + [Test] + public void Deflate_Init() + { + using (Deflater def = new Deflater(CompressLevel.Default)) + { + } + } + + private ArrayList compressedData = new ArrayList(); + private uint adler1; + + private ArrayList uncompressedData = new ArrayList(); + private uint adler2; + + public void CDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + compressedData.Add(data[i+startIndex]); + } + + [Test] + public void Deflate_Compress() + { + compressedData.Clear(); + + byte[] testData = new byte[35000]; + for (int i = 0; i < testData.Length; ++i) + testData[i] = 5; + + using (Deflater def = new Deflater((CompressLevel)5)) + { + def.DataAvailable += new DataAvailableHandler(CDataAvail); + def.Add(testData); + def.Finish(); + adler1 = def.Checksum; + } + } + #endregion + + #region Inflate tests + [Test] + public void Inflate_Init() + { + using (Inflater inf = new Inflater()) + { + } + } + + private void DDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + uncompressedData.Add(data[i+startIndex]); + } + + [Test] + public void Inflate_Expand() + { + uncompressedData.Clear(); + + using (Inflater inf = new Inflater()) + { + inf.DataAvailable += new DataAvailableHandler(DDataAvail); + inf.Add((byte[])compressedData.ToArray(typeof(byte))); + inf.Finish(); + adler2 = inf.Checksum; + } + Assert.AreEqual( adler1, adler2 ); + } + #endregion + } + + [TestFixture] + public class GZipStreamTests + { + #region GZipStream test + [Test] + public void GZipStream_WriteRead() + { + using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best)) + { + BinaryWriter writer = new BinaryWriter(gzOut); + writer.Write("hi there"); + writer.Write(Math.PI); + writer.Write(42); + } + + using (GZipStream gzIn = new GZipStream("gzstream.gz")) + { + BinaryReader reader = new BinaryReader(gzIn); + string s = reader.ReadString(); + Assert.AreEqual("hi there",s); + double d = reader.ReadDouble(); + Assert.AreEqual(Math.PI, d); + int i = reader.ReadInt32(); + Assert.AreEqual(42,i); + } + + } + #endregion + } +} + +#endif \ No newline at end of file diff --git a/win32/3rdparty/zlib/contrib/dotzlib/LICENSE_1_0.txt b/win32/3rdparty/zlib/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 000000000..30aac2cf4 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/win32/3rdparty/zlib/contrib/dotzlib/readme.txt b/win32/3rdparty/zlib/contrib/dotzlib/readme.txt new file mode 100644 index 000000000..210f4b001 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/dotzlib/readme.txt @@ -0,0 +1,58 @@ +This directory contains a .Net wrapper class library for the ZLib1.dll + +The wrapper includes support for inflating/deflating memory buffers, +.Net streaming wrappers for the gz streams part of zlib, and wrappers +for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples. + +Directory structure: +-------------------- + +LICENSE_1_0.txt - License file. +readme.txt - This file. +DotZLib.chm - Class library documentation +DotZLib.build - NAnt build file +DotZLib.sln - Microsoft Visual Studio 2003 solution file + +DotZLib\*.cs - Source files for the class library + +Unit tests: +----------- +The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher. +To include unit tests in the build, define nunit before building. + + +Build instructions: +------------------- + +1. Using Visual Studio.Net 2003: + Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll) + will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on + you are building the release or debug version of the library. Check + DotZLib/UnitTests.cs for instructions on how to include unit tests in the + build. + +2. Using NAnt: + Open a command prompt with access to the build environment and run nant + in the same directory as the DotZLib.build file. + You can define 2 properties on the nant command-line to control the build: + debug={true|false} to toggle between release/debug builds (default=true). + nunit={true|false} to include or esclude unit tests (default=true). + Also the target clean will remove binaries. + Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release + or ./DotZLib/bin/debug, depending on whether you are building the release + or debug version of the library. + + Examples: + nant -D:debug=false -D:nunit=false + will build a release mode version of the library without unit tests. + nant + will build a debug version of the library with unit tests + nant clean + will remove all previously built files. + + +--------------------------------- +Copyright (c) Henrik Ravn 2004 + +Use, modification and distribution are subject to the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/win32/3rdparty/zlib/contrib/infback9/README b/win32/3rdparty/zlib/contrib/infback9/README new file mode 100644 index 000000000..e75ed1329 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/README @@ -0,0 +1 @@ +See infback9.h for what this is and how to use it. diff --git a/win32/3rdparty/zlib/contrib/infback9/infback9.c b/win32/3rdparty/zlib/contrib/infback9/infback9.c new file mode 100644 index 000000000..f5ddde67d --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/infback9.c @@ -0,0 +1,608 @@ +/* infback9.c -- inflate deflate64 data using a call-back interface + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infback9.h" +#include "inftree9.h" +#include "inflate9.h" + +#define WSIZE 65536UL + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + window is a user-supplied window and output buffer that is 64K bytes. + */ +int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) +z_stream FAR *strm; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + state->window = window; + return Z_OK; +} + +/* + Build and output length and distance decoding tables for fixed code + decoding. + */ +#ifdef MAKEFIXED +#include + +void makefixed9(void) +{ + unsigned sym, bits, low, size; + code *next, *lenfix, *distfix; + struct inflate_state state; + code fixed[544]; + + /* literal/length table */ + sym = 0; + while (sym < 144) state.lens[sym++] = 8; + while (sym < 256) state.lens[sym++] = 9; + while (sym < 280) state.lens[sym++] = 7; + while (sym < 288) state.lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work); + + /* distance table */ + sym = 0; + while (sym < 32) state.lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work); + + /* write tables */ + puts(" /* inffix9.h -- table for decoding deflate64 fixed codes"); + puts(" * Generated automatically by makefixed9()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits, + lenfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 5) == 0) printf("\n "); + printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits, + distfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* Macros for inflateBack(): */ + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n <= 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = window; \ + left = WSIZE; \ + wrap = 1; \ + if (out(out_desc, put, (unsigned)left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) +z_stream FAR *strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have; /* available input */ + unsigned long left; /* available output */ + inflate_mode mode; /* current inflate mode */ + int lastblock; /* true if processing last block */ + int wrap; /* true if the window has wrapped */ + unsigned long write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned extra; /* extra bits needed */ + unsigned long length; /* literal or length of data to copy */ + unsigned long offset; /* distance back to copy string from */ + unsigned long copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +#include "inffix9.h" + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + mode = TYPE; + lastblock = 0; + write = 0; + wrap = 0; + window = state->window; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = window; + left = WSIZE; + lencode = Z_NULL; + distcode = Z_NULL; + + /* Inflate until end of block marked as last */ + for (;;) + switch (mode) { + case TYPE: + /* determine and dispatch block type */ + if (lastblock) { + BYTEBITS(); + mode = DONE; + break; + } + NEEDBITS(3); + lastblock = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + lastblock ? " (last)" : "")); + mode = STORED; + break; + case 1: /* fixed block */ + lencode = lenfix; + lenbits = 9; + distcode = distfix; + distbits = 5; + Tracev((stderr, "inflate: fixed codes block%s\n", + lastblock ? " (last)" : "")); + mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + lastblock ? " (last)" : "")); + mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + mode = BAD; + break; + } + length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %lu\n", + length)); + INITBITS(); + + /* copy stored block from input to output */ + while (length != 0) { + copy = length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); + if (state->nlen > 286) { + strm->msg = (char *)"too many length symbols"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 7; + ret = inflate_table9(CODES, state->lens, 19, &(state->next), + &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = lencode[BITS(lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 9; + ret = inflate_table9(LENS, state->lens, state->nlen, + &(state->next), &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + mode = BAD; + break; + } + distcode = (code const FAR *)(state->next); + distbits = 6; + ret = inflate_table9(DISTS, state->lens + state->nlen, + state->ndist, &(state->next), &(distbits), + state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + mode = LEN; + + case LEN: + /* get a literal, length, or end-of-block code */ + for (;;) { + this = lencode[BITS(lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + length = (unsigned)this.val; + + /* process literal */ + if (this.op == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + ROOM(); + *put++ = (unsigned char)(length); + left--; + mode = LEN; + break; + } + + /* process end of block */ + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + mode = TYPE; + break; + } + + /* invalid code */ + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + extra = (unsigned)(this.op) & 31; + if (extra != 0) { + NEEDBITS(extra); + length += BITS(extra); + DROPBITS(extra); + } + Tracevv((stderr, "inflate: length %lu\n", length)); + + /* get distance code */ + for (;;) { + this = distcode[BITS(distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + mode = BAD; + break; + } + offset = (unsigned)this.val; + + /* get distance extra bits, if any */ + extra = (unsigned)(this.op) & 15; + if (extra != 0) { + NEEDBITS(extra); + offset += BITS(extra); + DROPBITS(extra); + } + if (offset > WSIZE - (wrap ? 0: left)) { + strm->msg = (char *)"invalid distance too far back"; + mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %lu\n", offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = WSIZE - offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - offset; + copy = left; + } + if (copy > length) copy = length; + length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < WSIZE) { + if (out(out_desc, window, (unsigned)(WSIZE - left))) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBack9End(strm) +z_stream FAR *strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/win32/3rdparty/zlib/contrib/infback9/infback9.h b/win32/3rdparty/zlib/contrib/infback9/infback9.h new file mode 100644 index 000000000..1073c0a38 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/infback9.h @@ -0,0 +1,37 @@ +/* infback9.h -- header for using inflateBack9 functions + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * This header file and associated patches provide a decoder for PKWare's + * undocumented deflate64 compression method (method 9). Use with infback9.c, + * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported. + * This should be compiled with zlib, since it uses zutil.h and zutil.o. + * This code has not yet been tested on 16-bit architectures. See the + * comments in zlib.h for inflateBack() usage. These functions are used + * identically, except that there is no windowBits parameter, and a 64K + * window must be provided. Also if int's are 16 bits, then a zero for + * the third parameter of the "out" function actually means 65536UL. + * zlib.h must be included before this header file. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); +ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define inflateBack9Init(strm, window) \ + inflateBack9Init_((strm), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef __cplusplus +} +#endif diff --git a/win32/3rdparty/zlib/contrib/infback9/inffix9.h b/win32/3rdparty/zlib/contrib/infback9/inffix9.h new file mode 100644 index 000000000..ee5671d2d --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/inffix9.h @@ -0,0 +1,107 @@ + /* inffix9.h -- table for decoding deflate64 fixed codes + * Generated automatically by makefixed9(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112}, + {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160}, + {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88}, + {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208}, + {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136}, + {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227}, + {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232}, + {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124}, + {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184}, + {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82}, + {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196}, + {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130}, + {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148}, + {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106}, + {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244}, + {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118}, + {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172}, + {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94}, + {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220}, + {130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131}, + {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97}, + {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226}, + {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121}, + {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178}, + {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85}, + {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202}, + {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133}, + {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154}, + {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109}, + {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250}, + {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115}, + {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166}, + {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91}, + {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214}, + {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139}, + {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0}, + {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103}, + {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238}, + {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127}, + {0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80}, + {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193}, + {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128}, + {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145}, + {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104}, + {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241}, + {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116}, + {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169}, + {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92}, + {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217}, + {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140}, + {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163}, + {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98}, + {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122}, + {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181}, + {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86}, + {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205}, + {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134}, + {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157}, + {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253}, + {96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113}, + {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163}, + {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89}, + {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211}, + {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137}, + {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3}, + {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101}, + {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235}, + {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125}, + {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187}, + {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83}, + {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199}, + {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151}, + {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107}, + {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247}, + {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119}, + {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175}, + {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95}, + {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223}, + {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143}, + {0,8,79},{0,9,255} + }; + + static const code distfix[32] = { + {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5}, + {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513}, + {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129}, + {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145}, + {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4}, + {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073}, + {134,5,193},{142,5,49153} + }; diff --git a/win32/3rdparty/zlib/contrib/infback9/inflate9.h b/win32/3rdparty/zlib/contrib/infback9/inflate9.h new file mode 100644 index 000000000..ee9a79394 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/inflate9.h @@ -0,0 +1,47 @@ +/* inflate9.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + TYPE, /* i: waiting for type bits, including last-flag bit */ + STORED, /* i: waiting for stored size (length and complement) */ + TABLE, /* i: waiting for dynamic block table lengths */ + LEN, /* i: waiting for length/lit code */ + DONE, /* finished check, done -- remain here until reset */ + BAD /* got a data error -- remain here until reset */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD mode -- not shown for clarity) + + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or DONE + STORED -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LEN or TYPE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + /* sliding window */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/win32/3rdparty/zlib/contrib/infback9/inftree9.c b/win32/3rdparty/zlib/contrib/infback9/inftree9.c new file mode 100644 index 000000000..0993f7564 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/inftree9.c @@ -0,0 +1,323 @@ +/* inftree9.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftree9.h" + +#define MAXBITS 15 + +const char inflate9_copyright[] = + " inflate9 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table9(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, + 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, + 131, 163, 195, 227, 3, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, + 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, + 133, 133, 133, 133, 144, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, + 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, + 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153}; + static const unsigned short dext[32] = { /* Distance codes 0..31 extra */ + 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 141, 141, 142, 142}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) return -1; /* no codes! */ + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + curr = root; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/win32/3rdparty/zlib/contrib/infback9/inftree9.h b/win32/3rdparty/zlib/contrib/infback9/inftree9.h new file mode 100644 index 000000000..a268084ee --- /dev/null +++ b/win32/3rdparty/zlib/contrib/infback9/inftree9.h @@ -0,0 +1,55 @@ +/* inftree9.h -- header to use inftree9.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 100eeeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/win32/3rdparty/zlib/contrib/inflate86/inffas86.c b/win32/3rdparty/zlib/contrib/inflate86/inffas86.c new file mode 100644 index 000000000..6da76358c --- /dev/null +++ b/win32/3rdparty/zlib/contrib/inflate86/inffas86.c @@ -0,0 +1,1157 @@ +/* inffas86.c is a hand tuned assembler version of + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } ar; + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->write; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) + __asm__ __volatile__ ( +" leaq %0, %%rax\n" +" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ +" movq %%rsp, (%%rax)\n" +" movq %%rax, %%rsp\n" /* make rsp point to &ar */ +" movq 16(%%rsp), %%rsi\n" /* rsi = in */ +" movq 32(%%rsp), %%rdi\n" /* rdi = out */ +" movq 24(%%rsp), %%r9\n" /* r9 = last */ +" movq 48(%%rsp), %%r10\n" /* r10 = end */ +" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ +" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ +" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ +" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ +" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ +" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ + /* r14d = len */ + /* r15d = dist */ +" cld\n" +" cmpq %%rdi, %%r10\n" +" je .L_one_time\n" /* if only one decode left */ +" cmpq %%rsi, %%r9\n" +" je .L_one_time\n" +" jmp .L_do_loop\n" + +".L_one_time:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code_one_time\n" + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ +" jmp .L_get_length_code_one_time\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpq %%rdi, %%r10\n" +" jbe .L_break_loop\n" +" cmpq %%rsi, %%r9\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_length_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" movq %%r12, %%r8\n" /* r8 = lmask */ +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" + +".L_get_length_code_one_time:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%r14d\n" /* len = this */ +" shrl $16, %%r14d\n" /* len = this.val */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" movq %%r13, %%r8\n" /* r8 = dmask */ +" cmpb $32, %%bl\n" +" ja .L_get_distance_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_distance_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%r15d\n" /* dist = this */ +" shrl $16, %%r15d\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ +" movq %%rdi, %%rax\n" +" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ + +" cmpl %%r15d, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%rsi), %%al\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ +" je .L_check_window\n" + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movb -1(%%rdi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +".L_set_two:\n" +" rep stosw\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r14d, %%eax\n" /* eax += len */ +" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r15d, %%eax\n" /* eax += dist */ +" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" /* ecx = nbytes */ +" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ +" negl %%ecx\n" /* nbytes = -nbytes */ + +" cmpl %%r15d, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 96(%%rsp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%r14d\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 96(%%rsp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" movl 92(%%rsp), %%esi\n" /* from = wsize */ +" addq 56(%%rsp), %%rsi\n" /* from += window */ +" addq %%rax, %%rsi\n" /* from += write */ +" subq %%rcx, %%rsi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" movq 56(%%rsp), %%rsi\n" /* rsi = window */ +" addq %%rax, %%rsi\n" +" subq %%rcx, %%rsi\n" /* from += write - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" /* ecx = len */ +" rep movsb\n" + +" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl $4, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 116(%%rsp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movq %%rsi, 16(%%rsp)\n" /* in */ +" movq %%rdi, 32(%%rsp)\n" /* out */ +" movl %%ebx, 88(%%rsp)\n" /* bits */ +" movq %%rdx, 80(%%rsp)\n" /* hold */ +" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ +" movq 8(%%rsp), %%rbp\n" +" movq %%rax, %%rsp\n" + : + : "m" (ar) + : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" + ); +#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" movl %%esp, (%%eax)\n" /* save esp, ebp */ +" movl %%ebp, 4(%%eax)\n" +" movl %%eax, %%esp\n" +" movl 8(%%esp), %%esi\n" /* esi = in */ +" movl 16(%%esp), %%edi\n" /* edi = out */ +" movl 40(%%esp), %%edx\n" /* edx = hold */ +" movl 44(%%esp), %%ebx\n" /* ebx = bits */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpl %%edi, 24(%%esp)\n" /* out < end */ +" jbe .L_break_loop\n" +" cmpl %%esi, 12(%%esp)\n" /* in < last */ +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 64(%%esp)\n" /* save len */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 60(%%esp), %%eax\n" /* eax = dmask */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 20(%%esp)\n" +" je .L_check_window\n" /* out == beg, if outside window */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movb -1(%%edi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +".L_set_two:\n" +" rep stosw\n" +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 64(%%esp), %%eax\n" /* eax += len */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += dist */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 48(%%esp), %%eax\n" /* eax = wsize */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 28(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 52(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 52(%%esp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 48(%%esp), %%esi\n" /* from += wsize */ +" addl %%eax, %%esi\n" /* from += write */ +" subl %%ecx, %%esi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 28(%%esp), %%esi\n" /* from = window */ +" movl 52(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 8(%%esp), %%esi\n" +" movl $4, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 72(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 8(%%esp)\n" /* save in */ +" movl %%edi, 16(%%esp)\n" /* save out */ +" movl %%ebx, 44(%%esp)\n" /* save bits */ +" movl %%edx, 40(%%esp)\n" /* save hold */ +" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ +" movl (%%esp), %%esp\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); +#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) + __asm { + lea eax, ar + mov [eax], esp /* save esp, ebp */ + mov [eax+4], ebp + mov esp, eax + mov esi, [esp+8] /* esi = in */ + mov edi, [esp+16] /* edi = out */ + mov edx, [esp+40] /* edx = hold */ + mov ebx, [esp+44] /* ebx = bits */ + mov ebp, [esp+32] /* ebp = lcode */ + + cld + jmp L_do_loop + +ALIGN 4 +L_while_test: + cmp [esp+24], edi + jbe L_break_loop + cmp [esp+12], esi + jbe L_break_loop + +L_do_loop: + cmp bl, 15 + ja L_get_length_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_length_code: + mov eax, [esp+56] /* eax = lmask */ + and eax, edx /* eax &= hold */ + mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah /* cl = this.bits */ + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base /* if (op != 0) 45.7% */ + + shr eax, 16 /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov ecx, eax /* len = this */ + shr ecx, 16 /* len = this.val */ + mov [esp+64], ecx /* save len */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + and cl, 15 /* op &= 15 */ + jz L_decode_distance /* if (!op) */ + cmp bl, cl + jae L_add_bits_to_len /* if (op <= bits) */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + shr edx, cl + add [esp+64], eax /* len += hold & mask[op] */ + +L_decode_distance: + cmp bl, 15 + ja L_get_distance_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_distance_code: + mov eax, [esp+60] /* eax = dmask */ + mov ecx, [esp+36] /* ecx = dcode */ + and eax, edx /* eax &= hold */ + mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ + +L_dodist: + mov ebp, eax /* dist = this */ + shr ebp, 16 /* dist = this.val */ + mov cl, ah + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + mov cl, al /* cl = this.op */ + + test al, 16 /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 /* op &= 15 */ + jz L_check_dist_one + cmp bl, cl + jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax /* (1 << op) - 1 */ + and eax, edx /* eax &= hold */ + shr edx, cl + add ebp, eax /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov [esp+8], esi /* save in so from can use it's reg */ + mov eax, edi + sub eax, [esp+20] /* nbytes = out - beg */ + + cmp eax, ebp + jb L_clip_window /* if (dist > nbytes) 4.2% */ + + mov ecx, [esp+64] /* ecx = len */ + mov esi, edi + sub esi, ebp /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two + + rep movsw + mov al, [esi] + mov [edi], al + inc edi + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_copy_two: + rep movsw + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp ebp, 1 /* if dist 1, is a memset */ + jne L_check_window + cmp [esp+20], edi + je L_check_window /* out == beg, if outside window */ + + mov ecx, [esp+64] /* ecx = len */ + mov al, [edi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [edi], al /* memset out with from[-1] */ + inc edi + +L_set_two: + rep stosw + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, [esp+64] /* eax += len */ + mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, ebp /* eax += dist */ + mov ecx, [esp+36] /* ecx = dcode */ + mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax + mov eax, [esp+48] /* eax = wsize */ + neg ecx /* nbytes = -nbytes */ + mov esi, [esp+28] /* from = window */ + + cmp eax, ebp + jb L_invalid_distance_too_far /* if (dist > wsize) */ + + add ecx, ebp /* nbytes = dist - nbytes */ + cmp dword ptr [esp+52], 0 + jne L_wrap_around_window /* if (write != 0) */ + + sub eax, ecx + add esi, eax /* from += wsize - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [esp+52] /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window /* if (write >= nbytes) */ + + add esi, [esp+48] /* from += wsize */ + add esi, eax /* from += write */ + sub esi, ecx /* from -= nbytes */ + sub ecx, eax /* nbytes -= write */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, [esp+28] /* from = window */ + mov ecx, [esp+52] /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + add esi, eax + sub esi, ecx /* from += write - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_do_copy: + mov ecx, eax + rep movsb + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [esp+72], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [esp+72], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [esp+72], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov esi, [esp+4] + mov dword ptr [esp+72], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [esp+72], 0 + +L_break_loop_with_status: +/* put in, out, bits, and hold back into ar and pop esp */ + mov [esp+8], esi /* save in */ + mov [esp+16], edi /* save out */ + mov [esp+44], ebx /* save bits */ + mov [esp+40], edx /* save hold */ + mov ebp, [esp+4] /* restore esp, ebp */ + mov esp, [esp] + } +#else +#error "x86 architecture not defined" +#endif + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + diff --git a/win32/3rdparty/zlib/contrib/inflate86/inffast.S b/win32/3rdparty/zlib/contrib/inflate86/inffast.S new file mode 100644 index 000000000..2245a2905 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/inflate86/inffast.S @@ -0,0 +1,1368 @@ +/* + * inffast.S is a hand tuned assembler version of: + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * This version (Jan-23-2003) of inflate_fast was coded and tested under + * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that + * machine, I found that gzip style archives decompressed about 20% faster than + * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will + * depend on how large of a buffer is used for z_stream.next_in & next_out + * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in + * stream processing I/O and crc32/addler32. In my case, this routine used + * 70% of the cpu time and crc32 used 20%. + * + * I am confident that this version will work in the general case, but I have + * not tested a wide variety of datasets or a wide variety of platforms. + * + * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. + * It should be a runtime flag instead of compile time flag... + * + * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. + * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code + * is compiled. Without either option, runtime detection is enabled. Runtime + * detection should work on all modern cpus and the recomended algorithm (flip + * ID bit on eflags and then use the cpuid instruction) is used in many + * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 + * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o + * inffast.obj generates a COFF object which can then be linked with MSVC++ + * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. + * + * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and + * slower than compiler generated code). Adjusted cpuid check to use the MMX + * code only for Pentiums < P4 until I have more data on the P4. Speed + * improvment is only about 15% on the Athlon when compared with code generated + * with MSVC++. Not sure yet, but I think the P4 will also be slower using the + * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and + * have less latency than MMX ops. Added code to buffer the last 11 bytes of + * the input stream since the MMX code grabs bits in chunks of 32, which + * differs from the inffast.c algorithm. I don't think there would have been + * read overruns where a page boundary was crossed (a segfault), but there + * could have been overruns when next_in ends on unaligned memory (unintialized + * memory read). + * + * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C + * version of the non-MMX code so that it doesn't depend on zstrm and zstate + * structure offsets which are hard coded in this file. This was last tested + * with zlib-1.2.0 which is currently in beta testing, newer versions of this + * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and + * http://www.charm.net/~christop/zlib/ + */ + + +/* + * if you have underscore linking problems (_inflate_fast undefined), try + * using -DGAS_COFF + */ +#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) + +#if defined( WIN32 ) || defined( __CYGWIN__ ) +#define GAS_COFF /* windows object format */ +#else +#define GAS_ELF +#endif + +#endif /* ! GAS_COFF && ! GAS_ELF */ + + +#if defined( GAS_COFF ) + +/* coff externals have underscores */ +#define inflate_fast _inflate_fast +#define inflate_fast_use_mmx _inflate_fast_use_mmx + +#endif /* GAS_COFF */ + + +.file "inffast.S" + +.globl inflate_fast + +.text +.align 4,0 +.L_invalid_literal_length_code_msg: +.string "invalid literal/length code" + +.align 4,0 +.L_invalid_distance_code_msg: +.string "invalid distance code" + +.align 4,0 +.L_invalid_distance_too_far_msg: +.string "invalid distance too far back" + +#if ! defined( NO_MMX ) +.align 4,0 +.L_mask: /* mask[N] = ( 1 << N ) - 1 */ +.long 0 +.long 1 +.long 3 +.long 7 +.long 15 +.long 31 +.long 63 +.long 127 +.long 255 +.long 511 +.long 1023 +.long 2047 +.long 4095 +.long 8191 +.long 16383 +.long 32767 +.long 65535 +.long 131071 +.long 262143 +.long 524287 +.long 1048575 +.long 2097151 +.long 4194303 +.long 8388607 +.long 16777215 +.long 33554431 +.long 67108863 +.long 134217727 +.long 268435455 +.long 536870911 +.long 1073741823 +.long 2147483647 +.long 4294967295 +#endif /* NO_MMX */ + +.text + +/* + * struct z_stream offsets, in zlib.h + */ +#define next_in_strm 0 /* strm->next_in */ +#define avail_in_strm 4 /* strm->avail_in */ +#define next_out_strm 12 /* strm->next_out */ +#define avail_out_strm 16 /* strm->avail_out */ +#define msg_strm 24 /* strm->msg */ +#define state_strm 28 /* strm->state */ + +/* + * struct inflate_state offsets, in inflate.h + */ +#define mode_state 0 /* state->mode */ +#define wsize_state 32 /* state->wsize */ +#define write_state 40 /* state->write */ +#define window_state 44 /* state->window */ +#define hold_state 48 /* state->hold */ +#define bits_state 52 /* state->bits */ +#define lencode_state 68 /* state->lencode */ +#define distcode_state 72 /* state->distcode */ +#define lenbits_state 76 /* state->lenbits */ +#define distbits_state 80 /* state->distbits */ + +/* + * inflate_fast's activation record + */ +#define local_var_size 64 /* how much local space for vars */ +#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ +#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ + +/* + * offsets for local vars on stack + */ +#define out 60 /* unsigned char* */ +#define window 56 /* unsigned char* */ +#define wsize 52 /* unsigned int */ +#define write 48 /* unsigned int */ +#define in 44 /* unsigned char* */ +#define beg 40 /* unsigned char* */ +#define buf 28 /* char[ 12 ] */ +#define len 24 /* unsigned int */ +#define last 20 /* unsigned char* */ +#define end 16 /* unsigned char* */ +#define dcode 12 /* code* */ +#define lcode 8 /* code* */ +#define dmask 4 /* unsigned int */ +#define lmask 0 /* unsigned int */ + +/* + * typedef enum inflate_mode consts, in inflate.h + */ +#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ +#define INFLATE_MODE_BAD 26 + + +#if ! defined( USE_MMX ) && ! defined( NO_MMX ) + +#define RUN_TIME_MMX + +#define CHECK_MMX 1 +#define DO_USE_MMX 2 +#define DONT_USE_MMX 3 + +.globl inflate_fast_use_mmx + +.data + +.align 4,0 +inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ +.long CHECK_MMX + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast_use_mmx,@object +.size inflate_fast_use_mmx,4 +#endif + +#endif /* RUN_TIME_MMX */ + +#if defined( GAS_COFF ) +/* coff info: scl 2 = extern, type 32 = function */ +.def inflate_fast; .scl 2; .type 32; .endef +#endif + +.text + +.align 32,0x90 +inflate_fast: + pushl %edi + pushl %esi + pushl %ebp + pushl %ebx + pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ + subl $local_var_size, %esp + cld + +#define strm_r %esi +#define state_r %edi + + movl strm_sp(%esp), strm_r + movl state_strm(strm_r), state_r + + /* in = strm->next_in; + * out = strm->next_out; + * last = in + strm->avail_in - 11; + * beg = out - (start - strm->avail_out); + * end = out + (strm->avail_out - 257); + */ + movl avail_in_strm(strm_r), %edx + movl next_in_strm(strm_r), %eax + + addl %eax, %edx /* avail_in += next_in */ + subl $11, %edx /* avail_in -= 11 */ + + movl %eax, in(%esp) + movl %edx, last(%esp) + + movl start_sp(%esp), %ebp + movl avail_out_strm(strm_r), %ecx + movl next_out_strm(strm_r), %ebx + + subl %ecx, %ebp /* start -= avail_out */ + negl %ebp /* start = -start */ + addl %ebx, %ebp /* start += next_out */ + + subl $257, %ecx /* avail_out -= 257 */ + addl %ebx, %ecx /* avail_out += out */ + + movl %ebx, out(%esp) + movl %ebp, beg(%esp) + movl %ecx, end(%esp) + + /* wsize = state->wsize; + * write = state->write; + * window = state->window; + * hold = state->hold; + * bits = state->bits; + * lcode = state->lencode; + * dcode = state->distcode; + * lmask = ( 1 << state->lenbits ) - 1; + * dmask = ( 1 << state->distbits ) - 1; + */ + + movl lencode_state(state_r), %eax + movl distcode_state(state_r), %ecx + + movl %eax, lcode(%esp) + movl %ecx, dcode(%esp) + + movl $1, %eax + movl lenbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, lmask(%esp) + + movl $1, %eax + movl distbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, dmask(%esp) + + movl wsize_state(state_r), %eax + movl write_state(state_r), %ecx + movl window_state(state_r), %edx + + movl %eax, wsize(%esp) + movl %ecx, write(%esp) + movl %edx, window(%esp) + + movl hold_state(state_r), %ebp + movl bits_state(state_r), %ebx + +#undef strm_r +#undef state_r + +#define in_r %esi +#define from_r %esi +#define out_r %edi + + movl in(%esp), in_r + movl last(%esp), %ecx + cmpl in_r, %ecx + ja .L_align_long /* if in < last */ + + addl $11, %ecx /* ecx = &in[ avail_in ] */ + subl in_r, %ecx /* ecx = avail_in */ + movl $12, %eax + subl %ecx, %eax /* eax = 12 - avail_in */ + leal buf(%esp), %edi + rep movsb /* memcpy( buf, in, avail_in ) */ + movl %eax, %ecx + xorl %eax, %eax + rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ + leal buf(%esp), in_r /* in = buf */ + movl in_r, last(%esp) /* last = in, do just one iteration */ + jmp .L_is_aligned + + /* align in_r on long boundary */ +.L_align_long: + testl $3, in_r + jz .L_is_aligned + xorl %eax, %eax + movb (in_r), %al + incl in_r + movl %ebx, %ecx + addl $8, %ebx + shll %cl, %eax + orl %eax, %ebp + jmp .L_align_long + +.L_is_aligned: + movl out(%esp), out_r + +#if defined( NO_MMX ) + jmp .L_do_loop +#endif + +#if defined( USE_MMX ) + jmp .L_init_mmx +#endif + +/*** Runtime MMX check ***/ + +#if defined( RUN_TIME_MMX ) +.L_check_mmx: + cmpl $DO_USE_MMX, inflate_fast_use_mmx + je .L_init_mmx + ja .L_do_loop /* > 2 */ + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushf + movl (%esp), %eax /* copy eflags to eax */ + xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) + * to see if cpu supports cpuid... + * ID bit method not supported by NexGen but + * bios may load a cpuid instruction and + * cpuid may be disabled on Cyrix 5-6x86 */ + popf + pushf + popl %edx /* copy new eflags to edx */ + xorl %eax, %edx /* test if ID bit is flipped */ + jz .L_dont_use_mmx /* not flipped if zero */ + xorl %eax, %eax + cpuid + cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ + jne .L_dont_use_mmx + cmpl $0x6c65746e, %ecx + jne .L_dont_use_mmx + cmpl $0x49656e69, %edx + jne .L_dont_use_mmx + movl $1, %eax + cpuid /* get cpu features */ + shrl $8, %eax + andl $15, %eax + cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ + jne .L_dont_use_mmx + testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ + jnz .L_use_mmx + jmp .L_dont_use_mmx +.L_use_mmx: + movl $DO_USE_MMX, inflate_fast_use_mmx + jmp .L_check_mmx_pop +.L_dont_use_mmx: + movl $DONT_USE_MMX, inflate_fast_use_mmx +.L_check_mmx_pop: + popl %edx + popl %ecx + popl %ebx + popl %eax + jmp .L_check_mmx +#endif + + +/*** Non-MMX code ***/ + +#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) + +#define hold_r %ebp +#define bits_r %bl +#define bitslong_r %ebx + +.align 32,0x90 +.L_while_test: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * do { + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = lcode[hold & lmask] + */ + cmpb $15, bits_r + ja .L_get_length_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_length_code: + movl lmask(%esp), %edx /* edx = lmask */ + movl lcode(%esp), %ecx /* ecx = lcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * dolen: + * bits -= this.bits; + * hold >>= this.bits + */ + movb %ah, %cl /* cl = this.bits */ + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* check if op is a literal + * if (op == 0) { + * PUP(out) = this.val; + * } + */ + testb %al, %al + jnz .L_test_for_length_base /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test + +.L_test_for_length_base: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len + * + * else if (op & 16) { + * len = this.val + * op &= 15 + * if (op) { + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * len += hold & mask[op]; + * bits -= op; + * hold >>= op; + * } + */ +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + movb %al, %cl + + testb $16, %al + jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + andb $15, %cl /* op &= 15 */ + jz .L_save_len /* if (!op) */ + cmpb %cl, bits_r + jae .L_add_bits_to_len /* if (op <= bits) */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_len: + movl $1, %eax + shll %cl, %eax + decl %eax + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, len_r /* len += hold & mask[op] */ + +.L_save_len: + movl len_r, len(%esp) /* save len */ +#undef len_r + +.L_decode_distance: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = dcode[hold & dmask]; + * dodist: + * bits -= this.bits; + * hold >>= this.bits; + * op = this.op; + */ + + cmpb $15, bits_r + ja .L_get_distance_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_distance_code: + movl dmask(%esp), %edx /* edx = dmask */ + movl dcode(%esp), %ecx /* ecx = dcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ + +#define dist_r %edx +.L_dodist: + movl %eax, dist_r /* dist = this */ + shrl $16, dist_r /* dist = this.val */ + movb %ah, %cl + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* if (op & 16) { + * dist = this.val + * op &= 15 + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * dist += hold & mask[op]; + * bits -= op; + * hold >>= op; + */ + movb %al, %cl /* cl = this.op */ + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist + andb $15, %cl /* op &= 15 */ + jz .L_check_dist_one + cmpb %cl, bits_r + jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_dist: + movl $1, %eax + shll %cl, %eax + decl %eax /* (1 << op) - 1 */ + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ + jmp .L_check_window + +.L_check_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * nbytes = out - beg; + * if (dist <= nbytes) { + * from = out - dist; + * do { + * PUP(out) = PUP(from); + * } while (--len > 0) { + * } + */ + + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window /* if (dist > nbytes) 4.2% */ + + movl len(%esp), %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +.align 16,0x90 +.L_check_dist_one: + cmpl $1, dist_r + jne .L_check_window + cmpl out_r, beg(%esp) + je .L_check_window + + decl out_r + movl len(%esp), %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + jmp .L_while_test + +.align 16,0x90 +.L_test_for_second_level_length: + /* else if ((op & 64) == 0) { + * this = lcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl lcode(%esp), %edx /* edx = lcode */ + movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ + jmp .L_dolen + +.align 16,0x90 +.L_test_for_second_level_dist: + /* else if ((op & 64) == 0) { + * this = dcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl dcode(%esp), %edx /* edx = dcode */ + movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ + jmp .L_dodist + +.align 16,0x90 +.L_clip_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * else { + * if (dist > wsize) { + * invalid distance + * } + * from = window; + * nbytes = dist - nbytes; + * if (write == 0) { + * from += wsize - nbytes; + */ +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = len + * + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define len_r %eax + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_wrap_around_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else if (write < nbytes) { + * from += wsize + write - nbytes; + * nbytes -= write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = window; + * nbytes = write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while(--nbytes); + * from = out - dist; + * } + * } + * } + */ +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_contiguous_in_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else { + * from += write - nbytes; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1: + /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out + * %eax = len + * + * while (len > 0) { + * PUP(out) = PUP(from); + * len--; + * } + * } + * } while (in < last && out < end); + */ +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +#undef len_r +#undef dist_r + +#endif /* NO_MMX || RUN_TIME_MMX */ + + +/*** MMX code ***/ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +.align 32,0x90 +.L_init_mmx: + emms + +#undef bits_r +#undef bitslong_r +#define bitslong_r %ebp +#define hold_mm %mm0 + movd %ebp, hold_mm + movl %ebx, bitslong_r + +#define used_mm %mm1 +#define dmask2_mm %mm2 +#define lmask2_mm %mm3 +#define lmask_mm %mm4 +#define dmask_mm %mm5 +#define tmp_mm %mm6 + + movd lmask(%esp), lmask_mm + movq lmask_mm, lmask2_mm + movd dmask(%esp), dmask_mm + movq dmask_mm, dmask2_mm + pxor used_mm, used_mm + movl lcode(%esp), %ebx /* ebx = lcode */ + jmp .L_do_loop_mmx + +.align 32,0x90 +.L_while_test_mmx: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_length_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_length_code_mmx: + pand hold_mm, lmask_mm + movd lmask_mm, %eax + movq lmask2_mm, lmask_mm + movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen_mmx: + movzbl %ah, %ecx /* ecx = this.bits */ + movd %ecx, used_mm + subl %ecx, bitslong_r /* bits -= this.bits */ + + testb %al, %al + jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test_mmx + +.L_test_for_length_base_mmx: +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + + testb $16, %al + jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ + andl $15, %eax /* op &= 15 */ + jz .L_decode_distance_mmx /* if (!op) */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm + movd hold_mm, %ecx + subl %eax, bitslong_r + andl .L_mask(,%eax,4), %ecx + addl %ecx, len_r /* len += hold & mask[op] */ + +.L_decode_distance_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_dist_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_dist_code_mmx: + movl dcode(%esp), %ebx /* ebx = dcode */ + pand hold_mm, dmask_mm + movd dmask_mm, %eax + movq dmask2_mm, dmask_mm + movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ + +.L_dodist_mmx: +#define dist_r %ebx + movzbl %ah, %ecx /* ecx = this.bits */ + movl %eax, dist_r + shrl $16, dist_r /* dist = this.val */ + subl %ecx, bitslong_r /* bits -= this.bits */ + movd %ecx, used_mm + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist_mmx + andl $15, %eax /* op &= 15 */ + jz .L_check_dist_one_mmx + +.L_add_bits_to_dist_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm /* save bit length of current op */ + movd hold_mm, %ecx /* get the next bits on input stream */ + subl %eax, bitslong_r /* bits -= op bits */ + andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ + addl %ecx, dist_r /* dist += hold & mask[op] */ + +.L_check_window_mmx: + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ + + movl len_r, %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_check_dist_one_mmx: + cmpl $1, dist_r + jne .L_check_window_mmx + cmpl out_r, beg(%esp) + je .L_check_window_mmx + + decl out_r + movl len_r, %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_test_for_second_level_length_mmx: + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + addl len_r, %ecx + movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dolen_mmx + +.align 16,0x90 +.L_test_for_second_level_dist_mmx: + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + movl dcode(%esp), %eax /* ecx = dcode */ + addl dist_r, %ecx + movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dodist_mmx + +.align 16,0x90 +.L_clip_window_mmx: +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window_mmx /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_wrap_around_window_mmx: +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_contiguous_in_window_mmx: +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1_mmx: +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +#undef hold_r +#undef bitslong_r + +#endif /* USE_MMX || RUN_TIME_MMX */ + + +/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ + +.L_invalid_distance_code: + /* else { + * strm->msg = "invalid distance code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_distance_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_test_for_end_of_block: + /* else if (op & 32) { + * state->mode = TYPE; + * break; + * } + */ + testb $32, %al + jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ + + movl $0, %ecx + movl $INFLATE_MODE_TYPE, %edx + jmp .L_update_stream_state + +.L_invalid_literal_length_code: + /* else { + * strm->msg = "invalid literal/length code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_literal_length_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_invalid_distance_too_far: + /* strm->msg = "invalid distance too far back"; + * state->mode = BAD; + */ + movl in(%esp), in_r /* from_r has in's reg, put in back */ + movl $.L_invalid_distance_too_far_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_update_stream_state: + /* set strm->msg = %ecx, strm->state->mode = %edx */ + movl strm_sp(%esp), %eax + testl %ecx, %ecx /* if (msg != NULL) */ + jz .L_skip_msg + movl %ecx, msg_strm(%eax) /* strm->msg = msg */ +.L_skip_msg: + movl state_strm(%eax), %eax /* state = strm->state */ + movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ + jmp .L_break_loop + +.align 32,0x90 +.L_break_loop: + +/* + * Regs: + * + * bits = %ebp when mmx, and in %ebx when non-mmx + * hold = %hold_mm when mmx, and in %ebp when non-mmx + * in = %esi + * out = %edi + */ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_next_in + +#endif /* RUN_TIME_MMX */ + + movl %ebp, %ebx + +.L_update_next_in: + +#endif + +#define strm_r %eax +#define state_r %edx + + /* len = bits >> 3; + * in -= len; + * bits -= len << 3; + * hold &= (1U << bits) - 1; + * state->hold = hold; + * state->bits = bits; + * strm->next_in = in; + * strm->next_out = out; + */ + movl strm_sp(%esp), strm_r + movl %ebx, %ecx + movl state_strm(strm_r), state_r + shrl $3, %ecx + subl %ecx, in_r + shll $3, %ecx + subl %ecx, %ebx + movl out_r, next_out_strm(strm_r) + movl %ebx, bits_state(state_r) + movl %ebx, %ecx + + leal buf(%esp), %ebx + cmpl %ebx, last(%esp) + jne .L_buf_not_used /* if buf != last */ + + subl %ebx, in_r /* in -= buf */ + movl next_in_strm(strm_r), %ebx + movl %ebx, last(%esp) /* last = strm->next_in */ + addl %ebx, in_r /* in += strm->next_in */ + movl avail_in_strm(strm_r), %ebx + subl $11, %ebx + addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ + +.L_buf_not_used: + movl in_r, next_in_strm(strm_r) + + movl $1, %ebx + shll %cl, %ebx + decl %ebx + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_hold + +#endif /* RUN_TIME_MMX */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ebp + + emms + +.L_update_hold: + +#endif /* USE_MMX || RUN_TIME_MMX */ + + andl %ebx, %ebp + movl %ebp, hold_state(state_r) + +#define last_r %ebx + + /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ + movl last(%esp), last_r + cmpl in_r, last_r + jbe .L_last_is_smaller /* if (in >= last) */ + + subl in_r, last_r /* last -= in */ + addl $11, last_r /* last += 11 */ + movl last_r, avail_in_strm(strm_r) + jmp .L_fixup_out +.L_last_is_smaller: + subl last_r, in_r /* in -= last */ + negl in_r /* in = -in */ + addl $11, in_r /* in += 11 */ + movl in_r, avail_in_strm(strm_r) + +#undef last_r +#define end_r %ebx + +.L_fixup_out: + /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ + movl end(%esp), end_r + cmpl out_r, end_r + jbe .L_end_is_smaller /* if (out >= end) */ + + subl out_r, end_r /* end -= out */ + addl $257, end_r /* end += 257 */ + movl end_r, avail_out_strm(strm_r) + jmp .L_done +.L_end_is_smaller: + subl end_r, out_r /* out -= end */ + negl out_r /* out = -out */ + addl $257, out_r /* out += 257 */ + movl out_r, avail_out_strm(strm_r) + +#undef end_r +#undef strm_r +#undef state_r + +.L_done: + addl $local_var_size, %esp + popf + popl %ebx + popl %ebp + popl %esi + popl %edi + ret + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast,@function +.size inflate_fast,.-inflate_fast +#endif diff --git a/win32/3rdparty/zlib/contrib/iostream/test.cpp b/win32/3rdparty/zlib/contrib/iostream/test.cpp new file mode 100644 index 000000000..7d265b3b5 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream/test.cpp @@ -0,0 +1,24 @@ + +#include "zfstream.h" + +int main() { + + // Construct a stream object with this filebuffer. Anything sent + // to this stream will go to standard out. + gzofstream os( 1, ios::out ); + + // This text is getting compressed and sent to stdout. + // To prove this, run 'test | zcat'. + os << "Hello, Mommy" << endl; + + os << setcompressionlevel( Z_NO_COMPRESSION ); + os << "hello, hello, hi, ho!" << endl; + + setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) + << "I'm compressing again" << endl; + + os.close(); + + return 0; + +} diff --git a/win32/3rdparty/zlib/contrib/iostream/zfstream.cpp b/win32/3rdparty/zlib/contrib/iostream/zfstream.cpp new file mode 100644 index 000000000..d0cd85faa --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream/zfstream.cpp @@ -0,0 +1,329 @@ + +#include "zfstream.h" + +gzfilebuf::gzfilebuf() : + file(NULL), + mode(0), + own_file_descriptor(0) +{ } + +gzfilebuf::~gzfilebuf() { + + sync(); + if ( own_file_descriptor ) + close(); + +} + +gzfilebuf *gzfilebuf::open( const char *name, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzopen(name, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 1; + + return this; + +} + +gzfilebuf *gzfilebuf::attach( int file_descriptor, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 0; + + return this; + +} + +gzfilebuf *gzfilebuf::close() { + + if ( is_open() ) { + + sync(); + gzclose( file ); + file = NULL; + + } + + return this; + +} + +int gzfilebuf::setcompressionlevel( int comp_level ) { + + return gzsetparams(file, comp_level, -2); + +} + +int gzfilebuf::setcompressionstrategy( int comp_strategy ) { + + return gzsetparams(file, -2, comp_strategy); + +} + + +streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { + + return streampos(EOF); + +} + +int gzfilebuf::underflow() { + + // If the file hasn't been opened for reading, error. + if ( !is_open() || !(mode & ios::in) ) + return EOF; + + // if a buffer doesn't exists, allocate one. + if ( !base() ) { + + if ( (allocate()) == EOF ) + return EOF; + setp(0,0); + + } else { + + if ( in_avail() ) + return (unsigned char) *gptr(); + + if ( out_waiting() ) { + if ( flushbuf() == EOF ) + return EOF; + } + + } + + // Attempt to fill the buffer. + + int result = fillbuf(); + if ( result == EOF ) { + // disable get area + setg(0,0,0); + return EOF; + } + + return (unsigned char) *gptr(); + +} + +int gzfilebuf::overflow( int c ) { + + if ( !is_open() || !(mode & ios::out) ) + return EOF; + + if ( !base() ) { + if ( allocate() == EOF ) + return EOF; + setg(0,0,0); + } else { + if (in_avail()) { + return EOF; + } + if (out_waiting()) { + if (flushbuf() == EOF) + return EOF; + } + } + + int bl = blen(); + setp( base(), base() + bl); + + if ( c != EOF ) { + + *pptr() = c; + pbump(1); + + } + + return 0; + +} + +int gzfilebuf::sync() { + + if ( !is_open() ) + return EOF; + + if ( out_waiting() ) + return flushbuf(); + + return 0; + +} + +int gzfilebuf::flushbuf() { + + int n; + char *q; + + q = pbase(); + n = pptr() - q; + + if ( gzwrite( file, q, n) < n ) + return EOF; + + setp(0,0); + + return 0; + +} + +int gzfilebuf::fillbuf() { + + int required; + char *p; + + p = base(); + + required = blen(); + + int t = gzread( file, p, required ); + + if ( t <= 0) return EOF; + + setg( base(), base(), base()+t); + + return t; + +} + +gzfilestream_common::gzfilestream_common() : + ios( gzfilestream_common::rdbuf() ) +{ } + +gzfilestream_common::~gzfilestream_common() +{ } + +void gzfilestream_common::attach( int fd, int io_mode ) { + + if ( !buffer.attach( fd, io_mode) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::open( const char *name, int io_mode ) { + + if ( !buffer.open( name, io_mode ) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::close() { + + if ( !buffer.close() ) + clear( ios::failbit | ios::badbit ); + +} + +gzfilebuf *gzfilestream_common::rdbuf() +{ + return &buffer; +} + +gzifstream::gzifstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzifstream::gzifstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzifstream::gzifstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzifstream::~gzifstream() { } + +gzofstream::gzofstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzofstream::gzofstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzofstream::gzofstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzofstream::~gzofstream() { } diff --git a/win32/3rdparty/zlib/contrib/iostream/zfstream.h b/win32/3rdparty/zlib/contrib/iostream/zfstream.h new file mode 100644 index 000000000..ed79098a3 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream/zfstream.h @@ -0,0 +1,128 @@ + +#ifndef zfstream_h +#define zfstream_h + +#include +#include "zlib.h" + +class gzfilebuf : public streambuf { + +public: + + gzfilebuf( ); + virtual ~gzfilebuf(); + + gzfilebuf *open( const char *name, int io_mode ); + gzfilebuf *attach( int file_descriptor, int io_mode ); + gzfilebuf *close(); + + int setcompressionlevel( int comp_level ); + int setcompressionstrategy( int comp_strategy ); + + inline int is_open() const { return (file !=NULL); } + + virtual streampos seekoff( streamoff, ios::seek_dir, int ); + + virtual int sync(); + +protected: + + virtual int underflow(); + virtual int overflow( int = EOF ); + +private: + + gzFile file; + short mode; + short own_file_descriptor; + + int flushbuf(); + int fillbuf(); + +}; + +class gzfilestream_common : virtual public ios { + + friend class gzifstream; + friend class gzofstream; + friend gzofstream &setcompressionlevel( gzofstream &, int ); + friend gzofstream &setcompressionstrategy( gzofstream &, int ); + +public: + virtual ~gzfilestream_common(); + + void attach( int fd, int io_mode ); + void open( const char *name, int io_mode ); + void close(); + +protected: + gzfilestream_common(); + +private: + gzfilebuf *rdbuf(); + + gzfilebuf buffer; + +}; + +class gzifstream : public gzfilestream_common, public istream { + +public: + + gzifstream(); + gzifstream( const char *name, int io_mode = ios::in ); + gzifstream( int fd, int io_mode = ios::in ); + + virtual ~gzifstream(); + +}; + +class gzofstream : public gzfilestream_common, public ostream { + +public: + + gzofstream(); + gzofstream( const char *name, int io_mode = ios::out ); + gzofstream( int fd, int io_mode = ios::out ); + + virtual ~gzofstream(); + +}; + +template class gzomanip { + friend gzofstream &operator<<(gzofstream &, const gzomanip &); +public: + gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } +private: + gzofstream &(*func)(gzofstream &, T); + T val; +}; + +template gzofstream &operator<<(gzofstream &s, const gzomanip &m) +{ + return (*m.func)(s, m.val); +} + +inline gzofstream &setcompressionlevel( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionlevel(l); + return s; +} + +inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionstrategy(l); + return s; +} + +inline gzomanip setcompressionlevel(int l) +{ + return gzomanip(&setcompressionlevel,l); +} + +inline gzomanip setcompressionstrategy(int l) +{ + return gzomanip(&setcompressionstrategy,l); +} + +#endif diff --git a/win32/3rdparty/zlib/contrib/iostream2/zstream.h b/win32/3rdparty/zlib/contrib/iostream2/zstream.h new file mode 100644 index 000000000..43d2332b7 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream2/zstream.h @@ -0,0 +1,307 @@ +/* + * + * Copyright (c) 1997 + * Christian Michelsen Research AS + * Advanced Computing + * Fantoftvegen 38, 5036 BERGEN, Norway + * http://www.cmr.no + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Christian Michelsen Research AS makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef ZSTREAM__H +#define ZSTREAM__H + +/* + * zstream.h - C++ interface to the 'zlib' general purpose compression library + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(_WIN32) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +class zstringlen { +public: + zstringlen(class izstream&); + zstringlen(class ozstream&, const char*); + size_t value() const { return val.word; } +private: + struct Val { unsigned char byte; size_t word; } val; +}; + +// ----------------------------- izstream ----------------------------- + +class izstream +{ + public: + izstream() : m_fp(0) {} + izstream(FILE* fp) : m_fp(0) { open(fp); } + izstream(const char* name) : m_fp(0) { open(name); } + ~izstream() { close(); } + + /* Opens a gzip (.gz) file for reading. + * open() can be used to read a file which is not in gzip format; + * in this case read() will directly read from the file without + * decompression. errno can be checked to distinguish two error + * cases (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name) { + if (m_fp) close(); + m_fp = ::gzopen(name, "rb"); + } + + void open(FILE* fp) { + SET_BINARY_MODE(fp); + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), "rb"); + } + + /* Flushes all pending input if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + int r = ::gzclose(m_fp); + m_fp = 0; return r; + } + + /* Binary read the given number of bytes from the compressed file. + */ + int read(void* buf, size_t len) { + return ::gzread(m_fp, buf, len); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + private: + gzFile m_fp; +}; + +/* + * Binary read the given (array of) object(s) from the compressed file. + * If the input file was not in gzip format, read() copies the objects number + * of bytes into the buffer. + * returns the number of uncompressed bytes actually read + * (0 for end of file, -1 for error). + */ +template +inline int read(izstream& zs, T* x, Items items) { + return ::gzread(zs.fp(), x, items*sizeof(T)); +} + +/* + * Binary input with the '>' operator. + */ +template +inline izstream& operator>(izstream& zs, T& x) { + ::gzread(zs.fp(), &x, sizeof(T)); + return zs; +} + + +inline zstringlen::zstringlen(izstream& zs) { + zs > val.byte; + if (val.byte == 255) zs > val.word; + else val.word = val.byte; +} + +/* + * Read length of string + the string with the '>' operator. + */ +inline izstream& operator>(izstream& zs, char* x) { + zstringlen len(zs); + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return zs; +} + +inline char* read_string(izstream& zs) { + zstringlen len(zs); + char* x = new char[len.value()+1]; + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return x; +} + +// ----------------------------- ozstream ----------------------------- + +class ozstream +{ + public: + ozstream() : m_fp(0), m_os(0) { + } + ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(fp, level); + } + ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(name, level); + } + ~ozstream() { + close(); + } + + /* Opens a gzip (.gz) file for writing. + * The compression level parameter should be in 0..9 + * errno can be checked to distinguish two error cases + * (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzopen(name, mode); + } + + /* open from a FILE pointer. + */ + void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { + SET_BINARY_MODE(fp); + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), mode); + } + + /* Flushes all pending output if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + if (m_os) { + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = 0; + } + int r = ::gzclose(m_fp); m_fp = 0; return r; + } + + /* Binary write the given number of bytes into the compressed file. + */ + int write(const void* buf, size_t len) { + return ::gzwrite(m_fp, (voidp) buf, len); + } + + /* Flushes all pending output into the compressed file. The parameter + * _flush is as in the deflate() function. The return value is the zlib + * error number (see function gzerror below). flush() returns Z_OK if + * the flush_ parameter is Z_FINISH and all output could be flushed. + * flush() should be called only when strictly necessary because it can + * degrade compression. + */ + int flush(int _flush) { + os_flush(); + return ::gzflush(m_fp, _flush); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + ostream& os() { + if (m_os == 0) m_os = new ostrstream; + return *m_os; + } + + void os_flush() { + if (m_os && m_os->pcount()>0) { + ostrstream* oss = new ostrstream; + oss->fill(m_os->fill()); + oss->flags(m_os->flags()); + oss->precision(m_os->precision()); + oss->width(m_os->width()); + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = oss; + } + } + + private: + gzFile m_fp; + ostrstream* m_os; +}; + +/* + * Binary write the given (array of) object(s) into the compressed file. + * returns the number of uncompressed bytes actually written + * (0 in case of error). + */ +template +inline int write(ozstream& zs, const T* x, Items items) { + return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); +} + +/* + * Binary output with the '<' operator. + */ +template +inline ozstream& operator<(ozstream& zs, const T& x) { + ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); + return zs; +} + +inline zstringlen::zstringlen(ozstream& zs, const char* x) { + val.byte = 255; val.word = ::strlen(x); + if (val.word < 255) zs < (val.byte = val.word); + else zs < val; +} + +/* + * Write length of string + the string with the '<' operator. + */ +inline ozstream& operator<(ozstream& zs, const char* x) { + zstringlen len(zs, x); + ::gzwrite(zs.fp(), (voidp) x, len.value()); + return zs; +} + +#ifdef _MSC_VER +inline ozstream& operator<(ozstream& zs, char* const& x) { + return zs < (const char*) x; +} +#endif + +/* + * Ascii write with the << operator; + */ +template +inline ostream& operator<<(ozstream& zs, const T& x) { + zs.os_flush(); + return zs.os() << x; +} + +#endif diff --git a/win32/3rdparty/zlib/contrib/iostream2/zstream_test.cpp b/win32/3rdparty/zlib/contrib/iostream2/zstream_test.cpp new file mode 100644 index 000000000..6273f62d6 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream2/zstream_test.cpp @@ -0,0 +1,25 @@ +#include "zstream.h" +#include +#include +#include + +void main() { + char h[256] = "Hello"; + char* g = "Goodbye"; + ozstream out("temp.gz"); + out < "This works well" < h < g; + out.close(); + + izstream in("temp.gz"); // read it back + char *x = read_string(in), *y = new char[256], z[256]; + in > y > z; + in.close(); + cout << x << endl << y << endl << z << endl; + + out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results + out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; + out << z << endl << y << endl << x << endl; + out << 1.1234567890123456789 << endl; + + delete[] x; delete[] y; +} diff --git a/win32/3rdparty/zlib/contrib/iostream3/README b/win32/3rdparty/zlib/contrib/iostream3/README new file mode 100644 index 000000000..f7b319ab9 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream3/README @@ -0,0 +1,35 @@ +These classes provide a C++ stream interface to the zlib library. It allows you +to do things like: + + gzofstream outf("blah.gz"); + outf << "These go into the gzip file " << 123 << endl; + +It does this by deriving a specialized stream buffer for gzipped files, which is +the way Stroustrup would have done it. :-> + +The gzifstream and gzofstream classes were originally written by Kevin Ruland +and made available in the zlib contrib/iostream directory. The older version still +compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of +this version. + +The new classes are as standard-compliant as possible, closely following the +approach of the standard library's fstream classes. It compiles under gcc versions +3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard +library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs +from the previous one in the following respects: +- added showmanyc +- added setbuf, with support for unbuffered output via setbuf(0,0) +- a few bug fixes of stream behavior +- gzipped output file opened with default compression level instead of maximum level +- setcompressionlevel()/strategy() members replaced by single setcompression() + +The code is provided "as is", with the permission to use, copy, modify, distribute +and sell it for any purpose without fee. + +Ludwig Schwardt + + +DSP Lab +Electrical & Electronic Engineering Department +University of Stellenbosch +South Africa diff --git a/win32/3rdparty/zlib/contrib/iostream3/TODO b/win32/3rdparty/zlib/contrib/iostream3/TODO new file mode 100644 index 000000000..7032f97be --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream3/TODO @@ -0,0 +1,17 @@ +Possible upgrades to gzfilebuf: + +- The ability to do putback (e.g. putbackfail) + +- The ability to seek (zlib supports this, but could be slow/tricky) + +- Simultaneous read/write access (does it make sense?) + +- Support for ios_base::ate open mode + +- Locale support? + +- Check public interface to see which calls give problems + (due to dependence on library internals) + +- Override operator<<(ostream&, gzfilebuf*) to allow direct copying + of stream buffer to stream ( i.e. os << is.rdbuf(); ) diff --git a/win32/3rdparty/zlib/contrib/iostream3/test.cc b/win32/3rdparty/zlib/contrib/iostream3/test.cc new file mode 100644 index 000000000..94235334f --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream3/test.cc @@ -0,0 +1,50 @@ +/* + * Test program for gzifstream and gzofstream + * + * by Ludwig Schwardt + * original version by Kevin Ruland + */ + +#include "zfstream.h" +#include // for cout + +int main() { + + gzofstream outf; + gzifstream inf; + char buf[80]; + + outf.open("test1.txt.gz"); + outf << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + + std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; + inf.open("test1.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + outf.rdbuf()->pubsetbuf(0,0); + outf.open("test2.txt.gz"); + outf << setcompression(Z_NO_COMPRESSION) + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form"; + + std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n"; + inf.rdbuf()->pubsetbuf(0,0); + inf.open("test2.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + return 0; + +} diff --git a/win32/3rdparty/zlib/contrib/iostream3/zfstream.cc b/win32/3rdparty/zlib/contrib/iostream3/zfstream.cc new file mode 100644 index 000000000..94eb93344 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream3/zfstream.cc @@ -0,0 +1,479 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#include "zfstream.h" +#include // for strcpy, strcat, strlen (mode strings) +#include // for BUFSIZ + +// Internal buffer sizes (default and "unbuffered" versions) +#define BIGBUFSIZE BUFSIZ +#define SMALLBUFSIZE 1 + +/*****************************************************************************/ + +// Default constructor +gzfilebuf::gzfilebuf() +: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), + buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) +{ + // No buffers to start with + this->disable_buffer(); +} + +// Destructor +gzfilebuf::~gzfilebuf() +{ + // Sync output buffer and close only if responsible for file + // (i.e. attached streams should be left open at this stage) + this->sync(); + if (own_fd) + this->close(); + // Make sure internal buffer is deallocated + this->disable_buffer(); +} + +// Set compression level and strategy +int +gzfilebuf::setcompression(int comp_level, + int comp_strategy) +{ + return gzsetparams(file, comp_level, comp_strategy); +} + +// Open gzipped file +gzfilebuf* +gzfilebuf::open(const char *name, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to open file + if ((file = gzopen(name, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = true; + return this; +} + +// Attach to gzipped file +gzfilebuf* +gzfilebuf::attach(int fd, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzdopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to attach to file + if ((file = gzdopen(fd, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = false; + return this; +} + +// Close gzipped file +gzfilebuf* +gzfilebuf::close() +{ + // Fail immediately if no file is open + if (!this->is_open()) + return NULL; + // Assume success + gzfilebuf* retval = this; + // Attempt to sync and close gzipped file + if (this->sync() == -1) + retval = NULL; + if (gzclose(file) < 0) + retval = NULL; + // File is now gone anyway (postcondition [27.8.1.3.8]) + file = NULL; + own_fd = false; + // Destroy internal buffer if it exists + this->disable_buffer(); + return retval; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Convert int open mode to mode string +bool +gzfilebuf::open_mode(std::ios_base::openmode mode, + char* c_mode) const +{ + bool testb = mode & std::ios_base::binary; + bool testi = mode & std::ios_base::in; + bool testo = mode & std::ios_base::out; + bool testt = mode & std::ios_base::trunc; + bool testa = mode & std::ios_base::app; + + // Check for valid flag combinations - see [27.8.1.3.2] (Table 92) + // Original zfstream hardcoded the compression level to maximum here... + // Double the time for less than 1% size improvement seems + // excessive though - keeping it at the default level + // To change back, just append "9" to the next three mode strings + if (!testi && testo && !testt && !testa) + strcpy(c_mode, "w"); + if (!testi && testo && !testt && testa) + strcpy(c_mode, "a"); + if (!testi && testo && testt && !testa) + strcpy(c_mode, "w"); + if (testi && !testo && !testt && !testa) + strcpy(c_mode, "r"); + // No read/write mode yet +// if (testi && testo && !testt && !testa) +// strcpy(c_mode, "r+"); +// if (testi && testo && testt && !testa) +// strcpy(c_mode, "w+"); + + // Mode string should be empty for invalid combination of flags + if (strlen(c_mode) == 0) + return false; + if (testb) + strcat(c_mode, "b"); + return true; +} + +// Determine number of characters in internal get buffer +std::streamsize +gzfilebuf::showmanyc() +{ + // Calls to underflow will fail if file not opened for reading + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return -1; + // Make sure get area is in use + if (this->gptr() && (this->gptr() < this->egptr())) + return std::streamsize(this->egptr() - this->gptr()); + else + return 0; +} + +// Fill get area from gzipped file +gzfilebuf::int_type +gzfilebuf::underflow() +{ + // If something is left in the get area by chance, return it + // (this shouldn't normally happen, as underflow is only supposed + // to be called when gptr >= egptr, but it serves as error check) + if (this->gptr() && (this->gptr() < this->egptr())) + return traits_type::to_int_type(*(this->gptr())); + + // If the file hasn't been opened for reading, produce error + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return traits_type::eof(); + + // Attempt to fill internal buffer from gzipped file + // (buffer must be guaranteed to exist...) + int bytes_read = gzread(file, buffer, buffer_size); + // Indicates error or EOF + if (bytes_read <= 0) + { + // Reset get area + this->setg(buffer, buffer, buffer); + return traits_type::eof(); + } + // Make all bytes read from file available as get area + this->setg(buffer, buffer, buffer + bytes_read); + + // Return next character in get area + return traits_type::to_int_type(*(this->gptr())); +} + +// Write put area to gzipped file +gzfilebuf::int_type +gzfilebuf::overflow(int_type c) +{ + // Determine whether put area is in use + if (this->pbase()) + { + // Double-check pointer range + if (this->pptr() > this->epptr() || this->pptr() < this->pbase()) + return traits_type::eof(); + // Add extra character to buffer if not EOF + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *(this->pptr()) = traits_type::to_char_type(c); + this->pbump(1); + } + // Number of characters to write to file + int bytes_to_write = this->pptr() - this->pbase(); + // Overflow doesn't fail if nothing is to be written + if (bytes_to_write > 0) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // If gzipped file won't accept all bytes written to it, fail + if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) + return traits_type::eof(); + // Reset next pointer to point to pbase on success + this->pbump(-bytes_to_write); + } + } + // Write extra character to file if not EOF + else if (!traits_type::eq_int_type(c, traits_type::eof())) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // Impromptu char buffer (allows "unbuffered" output) + char_type last_char = traits_type::to_char_type(c); + // If gzipped file won't accept this character, fail + if (gzwrite(file, &last_char, 1) != 1) + return traits_type::eof(); + } + + // If you got here, you have succeeded (even if c was EOF) + // The return value should therefore be non-EOF + if (traits_type::eq_int_type(c, traits_type::eof())) + return traits_type::not_eof(c); + else + return c; +} + +// Assign new buffer +std::streambuf* +gzfilebuf::setbuf(char_type* p, + std::streamsize n) +{ + // First make sure stuff is sync'ed, for safety + if (this->sync() == -1) + return NULL; + // If buffering is turned off on purpose via setbuf(0,0), still allocate one... + // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at + // least a buffer of size 1 (very inefficient though, therefore make it bigger?) + // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems) + if (!p || !n) + { + // Replace existing buffer (if any) with small internal buffer + this->disable_buffer(); + buffer = NULL; + buffer_size = 0; + own_buffer = true; + this->enable_buffer(); + } + else + { + // Replace existing buffer (if any) with external buffer + this->disable_buffer(); + buffer = p; + buffer_size = n; + own_buffer = false; + this->enable_buffer(); + } + return this; +} + +// Write put area to gzipped file (i.e. ensures that put area is empty) +int +gzfilebuf::sync() +{ + return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Allocate internal buffer +void +gzfilebuf::enable_buffer() +{ + // If internal buffer required, allocate one + if (own_buffer && !buffer) + { + // Check for buffered vs. "unbuffered" + if (buffer_size > 0) + { + // Allocate internal buffer + buffer = new char_type[buffer_size]; + // Get area starts empty and will be expanded by underflow as need arises + this->setg(buffer, buffer, buffer); + // Setup entire internal buffer as put area. + // The one-past-end pointer actually points to the last element of the buffer, + // so that overflow(c) can safely add the extra character c to the sequence. + // These pointers remain in place for the duration of the buffer + this->setp(buffer, buffer + buffer_size - 1); + } + else + { + // Even in "unbuffered" case, (small?) get buffer is still required + buffer_size = SMALLBUFSIZE; + buffer = new char_type[buffer_size]; + this->setg(buffer, buffer, buffer); + // "Unbuffered" means no put buffer + this->setp(0, 0); + } + } + else + { + // If buffer already allocated, reset buffer pointers just to make sure no + // stale chars are lying around + this->setg(buffer, buffer, buffer); + this->setp(buffer, buffer + buffer_size - 1); + } +} + +// Destroy internal buffer +void +gzfilebuf::disable_buffer() +{ + // If internal buffer exists, deallocate it + if (own_buffer && buffer) + { + // Preserve unbuffered status by zeroing size + if (!this->pbase()) + buffer_size = 0; + delete[] buffer; + buffer = NULL; + this->setg(0, 0, 0); + this->setp(0, 0); + } + else + { + // Reset buffer pointers to initial state if external buffer exists + this->setg(buffer, buffer, buffer); + if (buffer) + this->setp(buffer, buffer + buffer_size - 1); + else + this->setp(0, 0); + } +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzifstream::gzifstream() +: std::istream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzifstream::gzifstream(const char* name, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzifstream::gzifstream(int fd, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzifstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzifstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzifstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzofstream::gzofstream() +: std::ostream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzofstream::gzofstream(const char* name, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzofstream::gzofstream(int fd, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzofstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzofstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzofstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} diff --git a/win32/3rdparty/zlib/contrib/iostream3/zfstream.h b/win32/3rdparty/zlib/contrib/iostream3/zfstream.h new file mode 100644 index 000000000..8574479ae --- /dev/null +++ b/win32/3rdparty/zlib/contrib/iostream3/zfstream.h @@ -0,0 +1,466 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#ifndef ZFSTREAM_H +#define ZFSTREAM_H + +#include // not iostream, since we don't need cin/cout +#include +#include "zlib.h" + +/*****************************************************************************/ + +/** + * @brief Gzipped file stream buffer class. + * + * This class implements basic_filebuf for gzipped files. It doesn't yet support + * seeking (allowed by zlib but slow/limited), putback and read/write access + * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard + * file streambuf. +*/ +class gzfilebuf : public std::streambuf +{ +public: + // Default constructor. + gzfilebuf(); + + // Destructor. + virtual + ~gzfilebuf(); + + /** + * @brief Set compression level and strategy on the fly. + * @param comp_level Compression level (see zlib.h for allowed values) + * @param comp_strategy Compression strategy (see zlib.h for allowed values) + * @return Z_OK on success, Z_STREAM_ERROR otherwise. + * + * Unfortunately, these parameters cannot be modified separately, as the + * previous zfstream version assumed. Since the strategy is seldom changed, + * it can default and setcompression(level) then becomes like the old + * setcompressionlevel(level). + */ + int + setcompression(int comp_level, + int comp_strategy = Z_DEFAULT_STRATEGY); + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() const { return (file != NULL); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + open(const char* name, + std::ios_base::openmode mode); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + attach(int fd, + std::ios_base::openmode mode); + + /** + * @brief Close gzipped file. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + close(); + +protected: + /** + * @brief Convert ios open mode int to mode string used by zlib. + * @return True if valid mode flag combination. + */ + bool + open_mode(std::ios_base::openmode mode, + char* c_mode) const; + + /** + * @brief Number of characters available in stream buffer. + * @return Number of characters. + * + * This indicates number of characters in get area of stream buffer. + * These characters can be read without accessing the gzipped file. + */ + virtual std::streamsize + showmanyc(); + + /** + * @brief Fill get area from gzipped file. + * @return First character in get area on success, EOF on error. + * + * This actually reads characters from gzipped file to stream + * buffer. Always buffered. + */ + virtual int_type + underflow(); + + /** + * @brief Write put area to gzipped file. + * @param c Extra character to add to buffer contents. + * @return Non-EOF on success, EOF on error. + * + * This actually writes characters in stream buffer to + * gzipped file. With unbuffered output this is done one + * character at a time. + */ + virtual int_type + overflow(int_type c = traits_type::eof()); + + /** + * @brief Installs external stream buffer. + * @param p Pointer to char buffer. + * @param n Size of external buffer. + * @return @c this on success, NULL on failure. + * + * Call setbuf(0,0) to enable unbuffered output. + */ + virtual std::streambuf* + setbuf(char_type* p, + std::streamsize n); + + /** + * @brief Flush stream buffer to file. + * @return 0 on success, -1 on error. + * + * This calls underflow(EOF) to do the job. + */ + virtual int + sync(); + +// +// Some future enhancements +// +// virtual int_type uflow(); +// virtual int_type pbackfail(int_type c = traits_type::eof()); +// virtual pos_type +// seekoff(off_type off, +// std::ios_base::seekdir way, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); +// virtual pos_type +// seekpos(pos_type sp, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); + +private: + /** + * @brief Allocate internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that a proper internal buffer exists if it is required. If the + * buffer already exists or is external, the buffer pointers will be + * reset to their original state. + */ + void + enable_buffer(); + + /** + * @brief Destroy internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that the internal buffer is deallocated if it exists. In any + * case, it will also reset the buffer pointers. + */ + void + disable_buffer(); + + /** + * Underlying file pointer. + */ + gzFile file; + + /** + * Mode in which file was opened. + */ + std::ios_base::openmode io_mode; + + /** + * @brief True if this object owns file descriptor. + * + * This makes the class responsible for closing the file + * upon destruction. + */ + bool own_fd; + + /** + * @brief Stream buffer. + * + * For simplicity this remains allocated on the free store for the + * entire life span of the gzfilebuf object, unless replaced by setbuf. + */ + char_type* buffer; + + /** + * @brief Stream buffer size. + * + * Defaults to system default buffer size (typically 8192 bytes). + * Modified by setbuf. + */ + std::streamsize buffer_size; + + /** + * @brief True if this object owns stream buffer. + * + * This makes the class responsible for deleting the buffer + * upon destruction. + */ + bool own_buffer; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file input stream class. + * + * This class implements ifstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzifstream : public std::istream +{ +public: + // Default constructor + gzifstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ifstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream class. + * + * This class implements ofstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzofstream : public std::ostream +{ +public: + // Default constructor + gzofstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ofstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream manipulator class. + * + * This class defines a two-argument manipulator for gzofstream. It is used + * as base for the setcompression(int,int) manipulator. +*/ +template + class gzomanip2 + { + public: + // Allows insertor to peek at internals + template + friend gzofstream& + operator<<(gzofstream&, + const gzomanip2&); + + // Constructor + gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), + T1 v1, + T2 v2); + private: + // Underlying manipulator function + gzofstream& + (*func)(gzofstream&, T1, T2); + + // Arguments for manipulator function + T1 val1; + T2 val2; + }; + +/*****************************************************************************/ + +// Manipulator function thunks through to stream buffer +inline gzofstream& +setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) +{ + (gzs.rdbuf())->setcompression(l, s); + return gzs; +} + +// Manipulator constructor stores arguments +template + inline + gzomanip2::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), + T1 v1, + T2 v2) + : func(f), val1(v1), val2(v2) + { } + +// Insertor applies underlying manipulator function to stream +template + inline gzofstream& + operator<<(gzofstream& s, const gzomanip2& m) + { return (*m.func)(s, m.val1, m.val2); } + +// Insert this onto stream to simplify setting of compression level +inline gzomanip2 +setcompression(int l, int s = Z_DEFAULT_STRATEGY) +{ return gzomanip2(&setcompression, l, s); } + +#endif // ZFSTREAM_H diff --git a/win32/3rdparty/zlib/contrib/masm686/match.asm b/win32/3rdparty/zlib/contrib/masm686/match.asm new file mode 100644 index 000000000..4b03a71ab --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masm686/match.asm @@ -0,0 +1,413 @@ + +; match.asm -- Pentium-Pro optimized version of longest_match() +; +; Updated for zlib 1.1.3 and converted to MASM 6.1x +; Copyright (C) 2000 Dan Higdon +; and Chuck Walbourn +; Corrections by Cosmin Truta +; +; This is free software; you can redistribute it and/or modify it +; under the terms of the GNU General Public License. + +; Based on match.S +; Written for zlib 1.1.2 +; Copyright (C) 1998 Brian Raiter +; +; Modified by Gilles Vollant (2005) for add gzhead and gzindex + + .686P + .MODEL FLAT + +;=========================================================================== +; EQUATES +;=========================================================================== + +MAX_MATCH EQU 258 +MIN_MATCH EQU 3 +MIN_LOOKAHEAD EQU (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8 EQU ((MAX_MATCH + 7) AND (NOT 7)) + +;=========================================================================== +; STRUCTURES +;=========================================================================== + +; This STRUCT assumes a 4-byte alignment + +DEFLATE_STATE STRUCT +ds_strm dd ? +ds_status dd ? +ds_pending_buf dd ? +ds_pending_buf_size dd ? +ds_pending_out dd ? +ds_pending dd ? +ds_wrap dd ? +; gzhead and gzindex are added in zlib 1.2.2.2 (see deflate.h) +ds_gzhead dd ? +ds_gzindex dd ? +ds_data_type db ? +ds_method db ? + db ? ; padding + db ? ; padding +ds_last_flush dd ? +ds_w_size dd ? ; used +ds_w_bits dd ? +ds_w_mask dd ? ; used +ds_window dd ? ; used +ds_window_size dd ? +ds_prev dd ? ; used +ds_head dd ? +ds_ins_h dd ? +ds_hash_size dd ? +ds_hash_bits dd ? +ds_hash_mask dd ? +ds_hash_shift dd ? +ds_block_start dd ? +ds_match_length dd ? ; used +ds_prev_match dd ? ; used +ds_match_available dd ? +ds_strstart dd ? ; used +ds_match_start dd ? ; used +ds_lookahead dd ? ; used +ds_prev_length dd ? ; used +ds_max_chain_length dd ? ; used +ds_max_laxy_match dd ? +ds_level dd ? +ds_strategy dd ? +ds_good_match dd ? ; used +ds_nice_match dd ? ; used + +; Don't need anymore of the struct for match +DEFLATE_STATE ENDS + +;=========================================================================== +; CODE +;=========================================================================== +_TEXT SEGMENT + +;--------------------------------------------------------------------------- +; match_init +;--------------------------------------------------------------------------- + ALIGN 4 +PUBLIC _match_init +_match_init PROC + ; no initialization needed + ret +_match_init ENDP + +;--------------------------------------------------------------------------- +; uInt longest_match(deflate_state *deflatestate, IPos curmatch) +;--------------------------------------------------------------------------- + ALIGN 4 + +PUBLIC _longest_match +_longest_match PROC + +; Since this code uses EBP for a scratch register, the stack frame must +; be manually constructed and referenced relative to the ESP register. + +; Stack image +; Variables +chainlenwmask = 0 ; high word: current chain len + ; low word: s->wmask +window = 4 ; local copy of s->window +windowbestlen = 8 ; s->window + bestlen +scanend = 12 ; last two bytes of string +scanstart = 16 ; first two bytes of string +scanalign = 20 ; dword-misalignment of string +nicematch = 24 ; a good enough match size +bestlen = 28 ; size of best match so far +scan = 32 ; ptr to string wanting match +varsize = 36 ; number of bytes (also offset to last saved register) + +; Saved Registers (actually pushed into place) +ebx_save = 36 +edi_save = 40 +esi_save = 44 +ebp_save = 48 + +; Parameters +retaddr = 52 +deflatestate = 56 +curmatch = 60 + +; Save registers that the compiler may be using + push ebp + push edi + push esi + push ebx + +; Allocate local variable space + sub esp,varsize + +; Retrieve the function arguments. ecx will hold cur_match +; throughout the entire function. edx will hold the pointer to the +; deflate_state structure during the function's setup (before +; entering the main loop). + + mov edx, [esp+deflatestate] +ASSUME edx:PTR DEFLATE_STATE + + mov ecx, [esp+curmatch] + +; uInt wmask = s->w_mask; +; unsigned chain_length = s->max_chain_length; +; if (s->prev_length >= s->good_match) { +; chain_length >>= 2; +; } + + mov eax, [edx].ds_prev_length + mov ebx, [edx].ds_good_match + cmp eax, ebx + mov eax, [edx].ds_w_mask + mov ebx, [edx].ds_max_chain_length + jl SHORT LastMatchGood + shr ebx, 2 +LastMatchGood: + +; chainlen is decremented once beforehand so that the function can +; use the sign flag instead of the zero flag for the exit test. +; It is then shifted into the high word, to make room for the wmask +; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + mov [esp+chainlenwmask], ebx + +; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx].ds_nice_match + mov ebx, [edx].ds_lookahead + cmp ebx, eax + jl SHORT LookaheadLess + mov ebx, eax +LookaheadLess: + mov [esp+nicematch], ebx + +;/* register Bytef *scan = s->window + s->strstart; */ + + mov esi, [edx].ds_window + mov [esp+window], esi + mov ebp, [edx].ds_strstart + lea edi, [esi+ebp] + mov [esp+scan],edi + +;/* Determine how many bytes the scan ptr is off from being */ +;/* dword-aligned. */ + + mov eax, edi + neg eax + and eax, 3 + mov [esp+scanalign], eax + +;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +;/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + mov eax, [edx].ds_w_size + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg SHORT LimitPositive + xor ebp, ebp +LimitPositive: + +;/* int best_len = s->prev_length; */ + + mov eax, [edx].ds_prev_length + mov [esp+bestlen], eax + +;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ + + add esi, eax + mov [esp+windowbestlen], esi + +;/* register ush scan_start = *(ushf*)scan; */ +;/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +;/* Posf *prev = s->prev; */ + + movzx ebx, WORD PTR[edi] + mov [esp+scanstart], ebx + movzx ebx, WORD PTR[eax+edi-1] + mov [esp+scanend], ebx + mov edi, [edx].ds_prev + +;/* Jump into the main loop. */ + + mov edx, [esp+chainlenwmask] + jmp SHORT LoopEntry + +;/* do { +; * match = s->window + cur_match; +; * if (*(ushf*)(match+best_len-1) != scan_end || +; * *(ushf*)match != scan_start) continue; +; * [...] +; * } while ((cur_match = prev[cur_match & wmask]) > limit +; * && --chain_length != 0); +; * +; * Here is the inner loop of the function. The function will spend the +; * majority of its time in this loop, and majority of that time will +; * be spent in the first ten instructions. +; * +; * Within this loop: +; * %ebx = scanend +; * %ecx = curmatch +; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +; * %esi = windowbestlen - i.e., (window + bestlen) +; * %edi = prev +; * %ebp = limit +; */ + + ALIGN 4 +LookupLoop: + and ecx, edx + movzx ecx, WORD PTR[edi+ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 000010000H + js LeaveNow + +LoopEntry: + movzx eax, WORD PTR[esi+ecx-1] + cmp eax, ebx + jnz SHORT LookupLoop + + mov eax, [esp+window] + movzx eax, WORD PTR[eax+ecx] + cmp eax, [esp+scanstart] + jnz SHORT LookupLoop + +;/* Store the current value of chainlen. */ + + mov [esp+chainlenwmask], edx + +;/* Point %edi to the string under scrutiny, and %esi to the string we */ +;/* are hoping to match it up with. In actuality, %esi and %edi are */ +;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +;/* initialized to -(MAX_MATCH_8 - scanalign). */ + + mov esi, [esp+window] + mov edi, [esp+scan] + add esi, ecx + mov eax, [esp+scanalign] + mov edx, -MAX_MATCH_8 + lea edi, [edi+eax+MAX_MATCH_8] + lea esi, [esi+eax+MAX_MATCH_8] + +;/* Test the strings for equality, 8 bytes at a time. At the end, +; * adjust %edx so that it is offset to the exact byte that mismatched. +; * +; * We already know at this point that the first three bytes of the +; * strings match each other, and they can be safely passed over before +; * starting the compare loop. So what this code does is skip over 0-3 +; * bytes, as much as necessary in order to dword-align the %edi +; * pointer. (%esi will still be misaligned three times out of four.) +; * +; * It should be confessed that this loop usually does not represent +; * much of the total running time. Replacing it with a more +; * straightforward "rep cmpsb" would not drastically degrade +; * performance. +; */ + +LoopCmps: + mov eax, DWORD PTR[esi+edx] + xor eax, DWORD PTR[edi+edx] + jnz SHORT LeaveLoopCmps + + mov eax, DWORD PTR[esi+edx+4] + xor eax, DWORD PTR[edi+edx+4] + jnz SHORT LeaveLoopCmps4 + + add edx, 8 + jnz SHORT LoopCmps + jmp LenMaximum + ALIGN 4 + +LeaveLoopCmps4: + add edx, 4 + +LeaveLoopCmps: + test eax, 00000FFFFH + jnz SHORT LenLower + + add edx, 2 + shr eax, 16 + +LenLower: + sub al, 1 + adc edx, 0 + +;/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +;/* then automatically accept it as the best possible match and leave. */ + + lea eax, [edi+edx] + mov edi, [esp+scan] + sub eax, edi + cmp eax, MAX_MATCH + jge SHORT LenMaximum + +;/* If the length of the match is not longer than the best match we */ +;/* have so far, then forget it and return to the lookup loop. */ + + mov edx, [esp+deflatestate] + mov ebx, [esp+bestlen] + cmp eax, ebx + jg SHORT LongerMatch + mov esi, [esp+windowbestlen] + mov edi, [edx].ds_prev + mov ebx, [esp+scanend] + mov edx, [esp+chainlenwmask] + jmp LookupLoop + ALIGN 4 + +;/* s->match_start = cur_match; */ +;/* best_len = len; */ +;/* if (len >= nice_match) break; */ +;/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: + mov ebx, [esp+nicematch] + mov [esp+bestlen], eax + mov [edx].ds_match_start, ecx + cmp eax, ebx + jge SHORT LeaveNow + mov esi, [esp+window] + add esi, eax + mov [esp+windowbestlen], esi + movzx ebx, WORD PTR[edi+eax-1] + mov edi, [edx].ds_prev + mov [esp+scanend], ebx + mov edx, [esp+chainlenwmask] + jmp LookupLoop + ALIGN 4 + +;/* Accept the current string, with the maximum possible length. */ + +LenMaximum: + mov edx, [esp+deflatestate] + mov DWORD PTR[esp+bestlen], MAX_MATCH + mov [edx].ds_match_start, ecx + +;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +;/* return s->lookahead; */ + +LeaveNow: + mov edx, [esp+deflatestate] + mov ebx, [esp+bestlen] + mov eax, [edx].ds_lookahead + cmp ebx, eax + jg SHORT LookaheadRet + mov eax, ebx +LookaheadRet: + +; Restore the stack and return from whence we came. + + add esp, varsize + pop ebx + pop esi + pop edi + pop ebp + ret + +_longest_match ENDP + +_TEXT ENDS +END diff --git a/win32/3rdparty/zlib/contrib/masmx64/bld_ml64.bat b/win32/3rdparty/zlib/contrib/masmx64/bld_ml64.bat new file mode 100644 index 000000000..8f9343d0a --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx64/bld_ml64.bat @@ -0,0 +1,2 @@ +ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/win32/3rdparty/zlib/contrib/masmx64/gvmat64.asm b/win32/3rdparty/zlib/contrib/masmx64/gvmat64.asm new file mode 100644 index 000000000..790d65554 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx64/gvmat64.asm @@ -0,0 +1,513 @@ +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); /* current match */ + +; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-2005 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for infozip Zip, I use option: +; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm +; +; to compile this file for zLib, I use option: +; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm +; Be carrefull to adapt zlib1222add below to your version of zLib +; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change +; value of zlib1222add later) +; +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005 and Windows 2003 server DDK +; +; (you can get Windows 2003 server DDK with ml64 and cl for AMD64 from +; http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) +; + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ +.code +longest_match PROC + + +;LocalVarsSize equ 88 + LocalVarsSize equ 72 + +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp + + chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len + ; low word: s->wmask +;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 +;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 +;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w +;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx +;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 +;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d +;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 +IFDEF INFOZIP +ELSE + nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size +ENDIF + +save_rdi equ rsp + 24 - LocalVarsSize +save_rsi equ rsp + 32 - LocalVarsSize +save_rbx equ rsp + 40 - LocalVarsSize +save_rbp equ rsp + 48 - LocalVarsSize +save_r12 equ rsp + 56 - LocalVarsSize +save_r13 equ rsp + 64 - LocalVarsSize +;save_r14 equ rsp + 72 - LocalVarsSize +;save_r15 equ rsp + 80 - LocalVarsSize + + + +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure + + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + +IFDEF INFOZIP + +_DATA SEGMENT +COMM window_size:DWORD +; WMask ; 7fff +COMM window:BYTE:010040H +COMM prev:WORD:08000H +; MatchLen : unused +; PrevMatch : unused +COMM strstart:DWORD +COMM match_start:DWORD +; Lookahead : ignore +COMM prev_length:DWORD ; PrevLen +COMM max_chain_length:DWORD +COMM good_match:DWORD +COMM nice_match:DWORD +prev_ad equ OFFSET prev +window_ad equ OFFSET window +nicematch equ nice_match +_DATA ENDS +WMask equ 07fffh + +ELSE + + IFNDEF zlib1222add + zlib1222add equ 8 + ENDIF +dsWSize equ 56+zlib1222add+(zlib1222add/2) +dsWMask equ 64+zlib1222add+(zlib1222add/2) +dsWindow equ 72+zlib1222add +dsPrev equ 88+zlib1222add +dsMatchLen equ 128+zlib1222add +dsPrevMatch equ 132+zlib1222add +dsStrStart equ 140+zlib1222add +dsMatchStart equ 144+zlib1222add +dsLookahead equ 148+zlib1222add +dsPrevLen equ 152+zlib1222add +dsMaxChainLen equ 156+zlib1222add +dsGoodMatch equ 172+zlib1222add +dsNiceMatch equ 176+zlib1222add + +window_size equ [ rcx + dsWSize] +WMask equ [ rcx + dsWMask] +window_ad equ [ rcx + dsWindow] +prev_ad equ [ rcx + dsPrev] +strstart equ [ rcx + dsStrStart] +match_start equ [ rcx + dsMatchStart] +Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip +prev_length equ [ rcx + dsPrevLen] +max_chain_length equ [ rcx + dsMaxChainLen] +good_match equ [ rcx + dsGoodMatch] +nice_match equ [ rcx + dsNiceMatch] +ENDIF + +; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + + + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) + +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx + + mov [save_rdi],rdi + mov [save_rsi],rsi + mov [save_rbx],rbx + mov [save_rbp],rbp +IFDEF INFOZIP + mov r8d,ecx +ELSE + mov r8d,edx +ENDIF + mov [save_r12],r12 + mov [save_r13],r13 +; mov [save_r14],r14 +; mov [save_r15],r15 + + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +;;; on zlib only +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + +IFDEF INFOZIP + mov [chainlenwmask], ebx +; on infozip nice_match = [nice_match] +ELSE + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d +ENDIF + +;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; +IFDEF INFOZIP + mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) +ELSE + mov eax, window_size + sub eax, MIN_LOOKAHEAD +ENDIF + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +;;; int best_len = s->prev_length; + + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 + jmp LookupLoopIsZero + + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + jnz LookupLoop1 + + +;;; Store the current value of chainlen. + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + lea rsi,[r8+r10] + mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + jmp short LoopCmps +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0000FFFFh + jnz LenLower + + test eax,0ffffffffh + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + jnz LenLower + +LenLower32: + shr eax,16 + add rdx,2 +LenLower: sub al, 1 + adc rdx, 0 +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// + + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + jge LeaveNow + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: +IFDEF INFOZIP + mov eax,r11d +ELSE + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d +ENDIF + +;;; Restore the stack and return from whence we came. + + + mov rsi,[save_rsi] + mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] +; mov r14,[save_r14] +; mov r15,[save_r15] + + + ret 0 +; please don't remove this string ! +; Your can freely use gvmat64 in any free or commercial app +; but it is far better don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 +longest_match ENDP + +match_init PROC + ret 0 +match_init ENDP + + +END diff --git a/win32/3rdparty/zlib/contrib/masmx64/inffas8664.c b/win32/3rdparty/zlib/contrib/masmx64/inffas8664.c new file mode 100644 index 000000000..3af764de9 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx64/inffas8664.c @@ -0,0 +1,186 @@ +/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding + * version for AMD64 on Windows using Microsoft C compiler + * + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant + * + * inffas8664.c call function inffas8664fnc in inffasx64.asm + * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + * + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ + + + + typedef struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } type_ar; +#ifdef ASMINF + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + type_ar ar; + void inffas8664fnc(struct inffast_ar * par); + + + +#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->write; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + inffas8664fnc(&ar); + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = (unsigned long)ar.hold; + state->bits = ar.bits; + return; +} + +#endif diff --git a/win32/3rdparty/zlib/contrib/masmx64/inffasx64.asm b/win32/3rdparty/zlib/contrib/masmx64/inffasx64.asm new file mode 100644 index 000000000..b5d93a272 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx64/inffasx64.asm @@ -0,0 +1,392 @@ +; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding +; version for AMD64 on Windows using Microsoft C compiler +; +; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c +; inffasx64.asm is called by inffas8664.c, which contain more info. + + +; to compile this file, I use option +; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK +; +; (you can get Windows 2003 server DDK with ml64 and cl.exe for AMD64 from +; http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) +; + +.code +inffas8664fnc PROC + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + + mov [rsp-8],rsi + mov [rsp-16],rdi + mov [rsp-24],r12 + mov [rsp-32],r13 + mov [rsp-40],r14 + mov [rsp-48],r15 + mov [rsp-56],rbx + + mov rax,rcx + + mov [rax+8], rbp ; /* save regs rbp and rsp */ + mov [rax], rsp + + mov rsp, rax ; /* make rsp point to &ar */ + + mov rsi, [rsp+16] ; /* rsi = in */ + mov rdi, [rsp+32] ; /* rdi = out */ + mov r9, [rsp+24] ; /* r9 = last */ + mov r10, [rsp+48] ; /* r10 = end */ + mov rbp, [rsp+64] ; /* rbp = lcode */ + mov r11, [rsp+72] ; /* r11 = dcode */ + mov rdx, [rsp+80] ; /* rdx = hold */ + mov ebx, [rsp+88] ; /* ebx = bits */ + mov r12d, [rsp+100] ; /* r12d = lmask */ + mov r13d, [rsp+104] ; /* r13d = dmask */ + ; /* r14d = len */ + ; /* r15d = dist */ + + + cld + cmp r10, rdi + je L_one_time ; /* if only one decode left */ + cmp r9, rsi + + jne L_do_loop + + +L_one_time: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code_one_time + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + jmp L_get_length_code_one_time + +ALIGN 4 +L_while_test: + cmp r10, rdi + jbe L_break_loop + cmp r9, rsi + jbe L_break_loop + +L_do_loop: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_length_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + mov r8, r12 ; /* r8 = lmask */ + shr eax, 16 ; /* output this.val char */ + stosb + +L_get_length_code_one_time: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + shr eax, 16 ; /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov r14d, eax ; /* len = this */ + shr r14d, 16 ; /* len = this.val */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ + and cl, 15 ; /* op &= 15 */ + jz L_decode_distance ; /* if (!op) */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r14d, eax ; /* len += hold & mask[op] */ + +L_decode_distance: + mov r8, r13 ; /* r8 = dmask */ + cmp bl, 32 + ja L_get_distance_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_distance_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ + +L_dodist: + mov r15d, eax ; /* dist = this */ + shr r15d, 16 ; /* dist = this.val */ + mov cl, ah + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + mov cl, al ; /* cl = this.op */ + + test al, 16 ; /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 ; /* op &= 15 */ + jz L_check_dist_one + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax ; /* (1 << op) - 1 */ + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov r8, rsi ; /* save in so from can use it's reg */ + mov rax, rdi + sub rax, [rsp+40] ; /* nbytes = out - beg */ + + cmp eax, r15d + jb L_clip_window ; /* if (dist > nbytes) 4.2% */ + + mov ecx, r14d ; /* ecx = len */ + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two ; /* if len % 2 == 0 */ + + rep movsw + mov al, [rsi] + mov [rdi], al + inc rdi + + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +L_copy_two: + rep movsw + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp r15d, 1 ; /* if dist 1, is a memset */ + jne L_check_window + cmp [rsp+40], rdi ; /* if out == beg, outside window */ + je L_check_window + + mov ecx, r14d ; /* ecx = len */ + mov al, [rdi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [rdi], al + inc rdi + +L_set_two: + rep stosw + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r14d ; /* eax += len */ + mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r15d ; /* eax += dist */ + mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax ; /* ecx = nbytes */ + mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ + neg ecx ; /* nbytes = -nbytes */ + + cmp eax, r15d + jb L_invalid_distance_too_far ; /* if (dist > wsize) */ + + add ecx, r15d ; /* nbytes = dist - nbytes */ + cmp dword ptr [rsp+96], 0 + jne L_wrap_around_window ; /* if (write != 0) */ + + mov rsi, [rsp+56] ; /* from = window */ + sub eax, ecx ; /* eax -= nbytes */ + add rsi, rax ; /* from += wsize - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp r14d, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* eax -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = &out[ -dist ] */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [rsp+96] ; /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window ; /* if (write >= nbytes) */ + + mov esi, [rsp+92] ; /* from = wsize */ + add rsi, [rsp+56] ; /* from += window */ + add rsi, rax ; /* from += write */ + sub rsi, rcx ; /* from -= nbytes */ + sub ecx, eax ; /* nbytes -= write */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, [rsp+56] ; /* from = window */ + mov ecx, [rsp+96] ; /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + mov rsi, [rsp+56] ; /* rsi = window */ + add rsi, rax + sub rsi, rcx ; /* from += write - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy ; /* if (nbytes >= len) */ + +ALIGN 4 +L_do_copy: + mov ecx, eax ; /* ecx = len */ + rep movsb + + mov rsi, r8 ; /* move in back to %esi, toss from */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [rsp+116], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [rsp+116], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [rsp+116], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov dword ptr [rsp+116], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [rsp+116], 0 + +L_break_loop_with_status: +; /* put in, out, bits, and hold back into ar and pop esp */ + mov [rsp+16], rsi ; /* in */ + mov [rsp+32], rdi ; /* out */ + mov [rsp+88], ebx ; /* bits */ + mov [rsp+80], rdx ; /* hold */ + + mov rax, [rsp] ; /* restore rbp and rsp */ + mov rbp, [rsp+8] + mov rsp, rax + + + + mov rsi,[rsp-8] + mov rdi,[rsp-16] + mov r12,[rsp-24] + mov r13,[rsp-32] + mov r14,[rsp-40] + mov r15,[rsp-48] + mov rbx,[rsp-56] + + ret 0 +; : +; : "m" (ar) +; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", +; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +; ); + +inffas8664fnc ENDP +;_TEXT ENDS +END diff --git a/win32/3rdparty/zlib/contrib/masmx64/readme.txt b/win32/3rdparty/zlib/contrib/masmx64/readme.txt new file mode 100644 index 000000000..ee03115c5 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx64/readme.txt @@ -0,0 +1,28 @@ +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), +for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. + +gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits + assembly optimized version from Jean-loup Gailly original longest_match function + +inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing + original function from Mark Adler + +Use instructions +---------------- +Copy these files into the zlib source directory. + +define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, +and inffasx64.obj and gvmat64.obj as object to link. + + +Build instructions +------------------ +run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) + +ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK + +You can get Windows 2003 server DDK with ml64 and cl for AMD64 from + http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/win32/3rdparty/zlib/contrib/masmx86/bld_ml32.bat b/win32/3rdparty/zlib/contrib/masmx86/bld_ml32.bat new file mode 100644 index 000000000..99144d07a --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx86/bld_ml32.bat @@ -0,0 +1,2 @@ +ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/win32/3rdparty/zlib/contrib/masmx86/gvmat32.asm b/win32/3rdparty/zlib/contrib/masmx86/gvmat32.asm new file mode 100644 index 000000000..874bb2d48 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx86/gvmat32.asm @@ -0,0 +1,972 @@ +; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant. +; File written by Gilles Vollant, by modifiying the longest_match +; from Jean-loup Gailly in deflate.c +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; this file contain two implementation of longest_match +; +; longest_match_7fff : written 1996 by Gilles Vollant optimized for +; first Pentium. Assume s->w_mask == 0x7fff +; longest_match_686 : written by Brian raiter (1998), optimized for Pentium Pro +; +; for using an seembly version of longest_match, you need define ASMV in project +; There is two way in using gvmat32.asm +; +; A) Suggested method +; if you want include both longest_match_7fff and longest_match_686 +; compile the asm file running +; ml /coff /Zi /Flgvmat32.lst /c gvmat32.asm +; and include gvmat32c.c in your project +; if you have an old cpu (386,486 or first Pentium) and s->w_mask==0x7fff, +; longest_match_7fff will be used +; if you have a more modern CPU (Pentium Pro, II and higher) +; longest_match_686 will be used +; on old cpu with s->w_mask!=0x7fff, longest_match_686 will be used, +; but this is not a sitation you'll find often +; +; B) Alternative +; if you are not interresed in old cpu performance and want the smaller +; binaries possible +; +; compile the asm file running +; ml /coff /Zi /c /Flgvmat32.lst /DNOOLDPENTIUMCODE gvmat32.asm +; and do not include gvmat32c.c in your project (ou define also +; NOOLDPENTIUMCODE) +; +; note : as I known, longest_match_686 is very faster than longest_match_7fff +; on pentium Pro/II/III, faster (but less) in P4, but it seem +; longest_match_7fff can be faster (very very litte) on AMD Athlon64/K8 +; +; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 + +;uInt longest_match_7fff(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ + + NbStack equ 76 + cur_match equ dword ptr[esp+NbStack-0] + str_s equ dword ptr[esp+NbStack-4] +; 5 dword on top (ret,ebp,esi,edi,ebx) + adrret equ dword ptr[esp+NbStack-8] + pushebp equ dword ptr[esp+NbStack-12] + pushedi equ dword ptr[esp+NbStack-16] + pushesi equ dword ptr[esp+NbStack-20] + pushebx equ dword ptr[esp+NbStack-24] + + chain_length equ dword ptr [esp+NbStack-28] + limit equ dword ptr [esp+NbStack-32] + best_len equ dword ptr [esp+NbStack-36] + window equ dword ptr [esp+NbStack-40] + prev equ dword ptr [esp+NbStack-44] + scan_start equ word ptr [esp+NbStack-48] + wmask equ dword ptr [esp+NbStack-52] + match_start_ptr equ dword ptr [esp+NbStack-56] + nice_match equ dword ptr [esp+NbStack-60] + scan equ dword ptr [esp+NbStack-64] + + windowlen equ dword ptr [esp+NbStack-68] + match_start equ dword ptr [esp+NbStack-72] + strend equ dword ptr [esp+NbStack-76] + NbStackAdd equ (NbStack-24) + + .386p + + name gvmatch + .MODEL FLAT + + + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + zlib1222add equ 8 + +; Note : these value are good with a 8 bytes boundary pack structure + dep_chain_length equ 74h+zlib1222add + dep_window equ 30h+zlib1222add + dep_strstart equ 64h+zlib1222add + dep_prev_length equ 70h+zlib1222add + dep_nice_match equ 88h+zlib1222add + dep_w_size equ 24h+zlib1222add + dep_prev equ 38h+zlib1222add + dep_w_mask equ 2ch+zlib1222add + dep_good_match equ 84h+zlib1222add + dep_match_start equ 68h+zlib1222add + dep_lookahead equ 6ch+zlib1222add + + +_TEXT segment + +IFDEF NOUNDERLINE + IFDEF NOOLDPENTIUMCODE + public longest_match + public match_init + ELSE + public longest_match_7fff + public cpudetect32 + public longest_match_686 + ENDIF +ELSE + IFDEF NOOLDPENTIUMCODE + public _longest_match + public _match_init + ELSE + public _longest_match_7fff + public _cpudetect32 + public _longest_match_686 + ENDIF +ENDIF + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + + +IFNDEF NOOLDPENTIUMCODE +IFDEF NOUNDERLINE +longest_match_7fff proc near +ELSE +_longest_match_7fff proc near +ENDIF + + mov edx,[esp+4] + + + + push ebp + push edi + push esi + push ebx + + sub esp,NbStackAdd + +; initialize or check the variables used in match.asm. + mov ebp,edx + +; chain_length = s->max_chain_length +; if (prev_length>=good_match) chain_length >>= 2 + mov edx,[ebp+dep_chain_length] + mov ebx,[ebp+dep_prev_length] + cmp [ebp+dep_good_match],ebx + ja noshr + shr edx,2 +noshr: +; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop + inc edx + mov edi,[ebp+dep_nice_match] + mov chain_length,edx + mov eax,[ebp+dep_lookahead] + cmp eax,edi +; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + jae nolookaheadnicematch + mov edi,eax +nolookaheadnicematch: +; best_len = s->prev_length + mov best_len,ebx + +; window = s->window + mov esi,[ebp+dep_window] + mov ecx,[ebp+dep_strstart] + mov window,esi + + mov nice_match,edi +; scan = window + strstart + add esi,ecx + mov scan,esi +; dx = *window + mov dx,word ptr [esi] +; bx = *(window+best_len-1) + mov bx,word ptr [esi+ebx-1] + add esi,MAX_MATCH-1 +; scan_start = *scan + mov scan_start,dx +; strend = scan + MAX_MATCH-1 + mov strend,esi +; bx = scan_end = *(window+best_len-1) + +; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov esi,[ebp+dep_w_size] + sub esi,MIN_LOOKAHEAD +; here esi = MAX_DIST(s) + sub ecx,esi + ja nodist + xor ecx,ecx +nodist: + mov limit,ecx + +; prev = s->prev + mov edx,[ebp+dep_prev] + mov prev,edx + +; + mov edx,dword ptr [ebp+dep_match_start] + mov bp,scan_start + mov eax,cur_match + mov match_start,edx + + mov edx,window + mov edi,edx + add edi,best_len + mov esi,prev + dec edi +; windowlen = window + best_len -1 + mov windowlen,edi + + jmp beginloop2 + align 4 + +; here, in the loop +; eax = ax = cur_match +; ecx = limit +; bx = scan_end +; bp = scan_start +; edi = windowlen (window + best_len -1) +; esi = prev + + +;// here; chain_length <=16 +normalbeg0add16: + add chain_length,16 + jz exitloop +normalbeg0: + cmp word ptr[edi+eax],bx + je normalbeg2noroll +rcontlabnoroll: +; cur_match = prev[cur_match & wmask] + and eax,7fffh + mov ax,word ptr[esi+eax*2] +; if cur_match > limit, go to exitloop + cmp ecx,eax + jnb exitloop +; if --chain_length != 0, go to exitloop + dec chain_length + jnz normalbeg0 + jmp exitloop + +normalbeg2noroll: +; if (scan_start==*(cur_match+window)) goto normalbeg2 + cmp bp,word ptr[edx+eax] + jne rcontlabnoroll + jmp normalbeg2 + +contloop3: + mov edi,windowlen + +; cur_match = prev[cur_match & wmask] + and eax,7fffh + mov ax,word ptr[esi+eax*2] +; if cur_match > limit, go to exitloop + cmp ecx,eax +jnbexitloopshort1: + jnb exitloop +; if --chain_length != 0, go to exitloop + + +; begin the main loop +beginloop2: + sub chain_length,16+1 +; if chain_length <=16, don't use the unrolled loop + jna normalbeg0add16 + +do16: + cmp word ptr[edi+eax],bx + je normalbeg2dc0 + +maccn MACRO lab + and eax,7fffh + mov ax,word ptr[esi+eax*2] + cmp ecx,eax + jnb exitloop + cmp word ptr[edi+eax],bx + je lab + ENDM + +rcontloop0: + maccn normalbeg2dc1 + +rcontloop1: + maccn normalbeg2dc2 + +rcontloop2: + maccn normalbeg2dc3 + +rcontloop3: + maccn normalbeg2dc4 + +rcontloop4: + maccn normalbeg2dc5 + +rcontloop5: + maccn normalbeg2dc6 + +rcontloop6: + maccn normalbeg2dc7 + +rcontloop7: + maccn normalbeg2dc8 + +rcontloop8: + maccn normalbeg2dc9 + +rcontloop9: + maccn normalbeg2dc10 + +rcontloop10: + maccn short normalbeg2dc11 + +rcontloop11: + maccn short normalbeg2dc12 + +rcontloop12: + maccn short normalbeg2dc13 + +rcontloop13: + maccn short normalbeg2dc14 + +rcontloop14: + maccn short normalbeg2dc15 + +rcontloop15: + and eax,7fffh + mov ax,word ptr[esi+eax*2] + cmp ecx,eax + jnb exitloop + + sub chain_length,16 + ja do16 + jmp normalbeg0add16 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +normbeg MACRO rcontlab,valsub +; if we are here, we know that *(match+best_len-1) == scan_end + cmp bp,word ptr[edx+eax] +; if (match != scan_start) goto rcontlab + jne rcontlab +; calculate the good chain_length, and we'll compare scan and match string + add chain_length,16-valsub + jmp iseq + ENDM + + +normalbeg2dc11: + normbeg rcontloop11,11 + +normalbeg2dc12: + normbeg short rcontloop12,12 + +normalbeg2dc13: + normbeg short rcontloop13,13 + +normalbeg2dc14: + normbeg short rcontloop14,14 + +normalbeg2dc15: + normbeg short rcontloop15,15 + +normalbeg2dc10: + normbeg rcontloop10,10 + +normalbeg2dc9: + normbeg rcontloop9,9 + +normalbeg2dc8: + normbeg rcontloop8,8 + +normalbeg2dc7: + normbeg rcontloop7,7 + +normalbeg2dc6: + normbeg rcontloop6,6 + +normalbeg2dc5: + normbeg rcontloop5,5 + +normalbeg2dc4: + normbeg rcontloop4,4 + +normalbeg2dc3: + normbeg rcontloop3,3 + +normalbeg2dc2: + normbeg rcontloop2,2 + +normalbeg2dc1: + normbeg rcontloop1,1 + +normalbeg2dc0: + normbeg rcontloop0,0 + + +; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end + +normalbeg2: + mov edi,window + + cmp bp,word ptr[edi+eax] + jne contloop3 ; if *(ushf*)match != scan_start, continue + +iseq: +; if we are here, we know that *(match+best_len-1) == scan_end +; and (match == scan_start) + + mov edi,edx + mov esi,scan ; esi = scan + add edi,eax ; edi = window + cur_match = match + + mov edx,[esi+3] ; compare manually dword at match+3 + xor edx,[edi+3] ; and scan +3 + + jz begincompare ; if equal, go to long compare + +; we will determine the unmatch byte and calculate len (in esi) + or dl,dl + je eq1rr + mov esi,3 + jmp trfinval +eq1rr: + or dx,dx + je eq1 + + mov esi,4 + jmp trfinval +eq1: + and edx,0ffffffh + jz eq11 + mov esi,5 + jmp trfinval +eq11: + mov esi,6 + jmp trfinval + +begincompare: + ; here we now scan and match begin same + add edi,6 + add esi,6 + mov ecx,(MAX_MATCH-(2+4))/4 ; scan for at most MAX_MATCH bytes + repe cmpsd ; loop until mismatch + + je trfin ; go to trfin if not unmatch +; we determine the unmatch byte + sub esi,4 + mov edx,[edi-4] + xor edx,[esi] + + or dl,dl + jnz trfin + inc esi + + or dx,dx + jnz trfin + inc esi + + and edx,0ffffffh + jnz trfin + inc esi + +trfin: + sub esi,scan ; esi = len +trfinval: +; here we have finised compare, and esi contain len of equal string + cmp esi,best_len ; if len > best_len, go newbestlen + ja short newbestlen +; now we restore edx, ecx and esi, for the big loop + mov esi,prev + mov ecx,limit + mov edx,window + jmp contloop3 + +newbestlen: + mov best_len,esi ; len become best_len + + mov match_start,eax ; save new position as match_start + cmp esi,nice_match ; if best_len >= nice_match, exit + jae exitloop + mov ecx,scan + mov edx,window ; restore edx=window + add ecx,esi + add esi,edx + + dec esi + mov windowlen,esi ; windowlen = window + best_len-1 + mov bx,[ecx-1] ; bx = *(scan+best_len-1) = scan_end + +; now we restore ecx and esi, for the big loop : + mov esi,prev + mov ecx,limit + jmp contloop3 + +exitloop: +; exit : s->match_start=match_start + mov ebx,match_start + mov ebp,str_s + mov ecx,best_len + mov dword ptr [ebp+dep_match_start],ebx + mov eax,dword ptr [ebp+dep_lookahead] + cmp ecx,eax + ja minexlo + mov eax,ecx +minexlo: +; return min(best_len,s->lookahead) + +; restore stack and register ebx,esi,edi,ebp + add esp,NbStackAdd + + pop ebx + pop esi + pop edi + pop ebp + ret +InfoAuthor: +; please don't remove this string ! +; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary! + db 0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah + + + +IFDEF NOUNDERLINE +longest_match_7fff endp +ELSE +_longest_match_7fff endp +ENDIF + + +IFDEF NOUNDERLINE +cpudetect32 proc near +ELSE +_cpudetect32 proc near +ENDIF + + push ebx + + pushfd ; push original EFLAGS + pop eax ; get original EFLAGS + mov ecx, eax ; save original EFLAGS + xor eax, 40000h ; flip AC bit in EFLAGS + push eax ; save new EFLAGS value on stack + popfd ; replace current EFLAGS value + pushfd ; get new EFLAGS + pop eax ; store new EFLAGS in EAX + xor eax, ecx ; cant toggle AC bit, processor=80386 + jz end_cpu_is_386 ; jump if 80386 processor + push ecx + popfd ; restore AC bit in EFLAGS first + + pushfd + pushfd + pop ecx + + mov eax, ecx ; get original EFLAGS + xor eax, 200000h ; flip ID bit in EFLAGS + push eax ; save new EFLAGS value on stack + popfd ; replace current EFLAGS value + pushfd ; get new EFLAGS + pop eax ; store new EFLAGS in EAX + popfd ; restore original EFLAGS + xor eax, ecx ; cant toggle ID bit, + je is_old_486 ; processor=old + + mov eax,1 + db 0fh,0a2h ;CPUID + +exitcpudetect: + pop ebx + ret + +end_cpu_is_386: + mov eax,0300h + jmp exitcpudetect + +is_old_486: + mov eax,0400h + jmp exitcpudetect + +IFDEF NOUNDERLINE +cpudetect32 endp +ELSE +_cpudetect32 endp +ENDIF +ENDIF + +MAX_MATCH equ 258 +MIN_MATCH equ 3 +MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) + + +;;; stack frame offsets + +chainlenwmask equ esp + 0 ; high word: current chain len + ; low word: s->wmask +window equ esp + 4 ; local copy of s->window +windowbestlen equ esp + 8 ; s->window + bestlen +scanstart equ esp + 16 ; first two bytes of string +scanend equ esp + 12 ; last two bytes of string +scanalign equ esp + 20 ; dword-misalignment of string +nicematch equ esp + 24 ; a good enough match size +bestlen equ esp + 28 ; size of best match so far +scan equ esp + 32 ; ptr to string wanting match + +LocalVarsSize equ 36 +; saved ebx byte esp + 36 +; saved edi byte esp + 40 +; saved esi byte esp + 44 +; saved ebp byte esp + 48 +; return address byte esp + 52 +deflatestate equ esp + 56 ; the function arguments +curmatch equ esp + 60 + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +dsWSize equ 36+zlib1222add +dsWMask equ 44+zlib1222add +dsWindow equ 48+zlib1222add +dsPrev equ 56+zlib1222add +dsMatchLen equ 88+zlib1222add +dsPrevMatch equ 92+zlib1222add +dsStrStart equ 100+zlib1222add +dsMatchStart equ 104+zlib1222add +dsLookahead equ 108+zlib1222add +dsPrevLen equ 112+zlib1222add +dsMaxChainLen equ 116+zlib1222add +dsGoodMatch equ 132+zlib1222add +dsNiceMatch equ 136+zlib1222add + + +;;; match.asm -- Pentium-Pro-optimized version of longest_match() +;;; Written for zlib 1.1.2 +;;; Copyright (C) 1998 Brian Raiter +;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html +;;; +;;; This is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License. + +;GLOBAL _longest_match, _match_init + + +;SECTION .text + +;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) + +;_longest_match: +IFDEF NOOLDPENTIUMCODE + IFDEF NOUNDERLINE + longest_match proc near + ELSE + _longest_match proc near + ENDIF +ELSE + IFDEF NOUNDERLINE + longest_match_686 proc near + ELSE + _longest_match_686 proc near + ENDIF +ENDIF + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + push ebp + push edi + push esi + push ebx + sub esp, LocalVarsSize + +;;; Retrieve the function arguments. ecx will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + + mov edx, [deflatestate] + mov ecx, [curmatch] + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov eax, [edx + dsPrevLen] + mov ebx, [edx + dsGoodMatch] + cmp eax, ebx + mov eax, [edx + dsWMask] + mov ebx, [edx + dsMaxChainLen] + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + mov [chainlenwmask], ebx + +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx + dsNiceMatch] + mov ebx, [edx + dsLookahead] + cmp ebx, eax + jl LookaheadLess + mov ebx, eax +LookaheadLess: mov [nicematch], ebx + +;;; register Bytef *scan = s->window + s->strstart; + + mov esi, [edx + dsWindow] + mov [window], esi + mov ebp, [edx + dsStrStart] + lea edi, [esi + ebp] + mov [scan], edi + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov eax, edi + neg eax + and eax, 3 + mov [scanalign], eax + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov eax, [edx + dsWSize] + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg LimitPositive + xor ebp, ebp +LimitPositive: + +;;; int best_len = s->prev_length; + + mov eax, [edx + dsPrevLen] + mov [bestlen], eax + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + add esi, eax + mov [windowbestlen], esi + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx ebx, word ptr [edi] + mov [scanstart], ebx + movzx ebx, word ptr [edi + eax - 1] + mov [scanend], ebx + mov edi, [edx + dsPrev] + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + jmp short LoopEntry + +align 4 + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; ecx = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and ecx, edx + movzx ecx, word ptr [edi + ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow +LoopEntry: movzx eax, word ptr [esi + ecx - 1] + cmp eax, ebx + jnz LookupLoop + mov eax, [window] + movzx eax, word ptr [eax + ecx] + cmp eax, [scanstart] + jnz LookupLoop + +;;; Store the current value of chainlen. + + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + mov esi, [window] + mov edi, [scan] + add esi, ecx + mov eax, [scanalign] + mov edx, 0fffffef8h; -(MAX_MATCH_8) + lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] + lea esi, [esi + eax + 0108h] ;MAX_MATCH_8] + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust edx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (esi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + +LoopCmps: + mov eax, [esi + edx] + xor eax, [edi + edx] + jnz LeaveLoopCmps + mov eax, [esi + edx + 4] + xor eax, [edi + edx + 4] + jnz LeaveLoopCmps4 + add edx, 8 + jnz LoopCmps + jmp short LenMaximum +LeaveLoopCmps4: add edx, 4 +LeaveLoopCmps: test eax, 0000FFFFh + jnz LenLower + add edx, 2 + shr eax, 16 +LenLower: sub al, 1 + adc edx, 0 + +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea eax, [edi + edx] + mov edi, [scan] + sub eax, edi + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. + + mov edx, [deflatestate] + mov ebx, [bestlen] + cmp eax, ebx + jg LongerMatch + mov esi, [windowbestlen] + mov edi, [edx + dsPrev] + mov ebx, [scanend] + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: mov ebx, [nicematch] + mov [bestlen], eax + mov [edx + dsMatchStart], ecx + cmp eax, ebx + jge LeaveNow + mov esi, [window] + add esi, eax + mov [windowbestlen], esi + movzx ebx, word ptr [edi + eax - 1] + mov edi, [edx + dsPrev] + mov [scanend], ebx + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: mov edx, [deflatestate] + mov dword ptr [bestlen], MAX_MATCH + mov [edx + dsMatchStart], ecx + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: + mov edx, [deflatestate] + mov ebx, [bestlen] + mov eax, [edx + dsLookahead] + cmp ebx, eax + jg LookaheadRet + mov eax, ebx +LookaheadRet: + +;;; Restore the stack and return from whence we came. + + add esp, LocalVarsSize + pop ebx + pop esi + pop edi + pop ebp + + ret +; please don't remove this string ! +; Your can freely use gvmat32 in any free or commercial app if you don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah + + +IFDEF NOOLDPENTIUMCODE + IFDEF NOUNDERLINE + longest_match endp + ELSE + _longest_match endp + ENDIF + + IFDEF NOUNDERLINE + match_init proc near + ret + match_init endp + ELSE + _match_init proc near + ret + _match_init endp + ENDIF +ELSE + IFDEF NOUNDERLINE + longest_match_686 endp + ELSE + _longest_match_686 endp + ENDIF +ENDIF + +_TEXT ends +end diff --git a/win32/3rdparty/zlib/contrib/masmx86/gvmat32c.c b/win32/3rdparty/zlib/contrib/masmx86/gvmat32c.c new file mode 100644 index 000000000..7ad2b2794 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx86/gvmat32c.c @@ -0,0 +1,62 @@ +/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86 + * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant. + * File written by Gilles Vollant, by modifiying the longest_match + * from Jean-loup Gailly in deflate.c + * it prepare all parameters and call the assembly longest_match_gvasm + * longest_match execute standard C code is wmask != 0x7fff + * (assembly code is faster with a fixed wmask) + * + * Read comment at beginning of gvmat32.asm for more information + */ + +#if defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) +#include "deflate.h" + +/* if your C compiler don't add underline before function name, + define ADD_UNDERLINE_ASMFUNC */ +#ifdef ADD_UNDERLINE_ASMFUNC +#define longest_match_7fff _longest_match_7fff +#define longest_match_686 _longest_match_686 +#define cpudetect32 _cpudetect32 +#endif + + +unsigned long cpudetect32(); + +uInt longest_match_c( + deflate_state *s, + IPos cur_match); /* current match */ + + +uInt longest_match_7fff( + deflate_state *s, + IPos cur_match); /* current match */ + +uInt longest_match_686( + deflate_state *s, + IPos cur_match); /* current match */ + + +static uInt iIsPPro=2; + +void match_init () +{ + iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0; +} + +uInt longest_match( + deflate_state *s, + IPos cur_match) /* current match */ +{ + if (iIsPPro!=0) + return longest_match_686(s,cur_match); + + if (s->w_mask != 0x7fff) + return longest_match_686(s,cur_match); + + /* now ((s->w_mask == 0x7fff) && (iIsPPro==0)) */ + return longest_match_7fff(s,cur_match); +} + + +#endif /* defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) */ diff --git a/win32/3rdparty/zlib/contrib/masmx86/inffas32.asm b/win32/3rdparty/zlib/contrib/masmx86/inffas32.asm new file mode 100644 index 000000000..4a205125e --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx86/inffas32.asm @@ -0,0 +1,1083 @@ +;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding +; * +; * inffas32.asm is derivated from inffas86.c, with translation of assembly code +; * +; * Copyright (C) 1995-2003 Mark Adler +; * For conditions of distribution and use, see copyright notice in zlib.h +; * +; * Copyright (C) 2003 Chris Anderson +; * Please use the copyright conditions above. +; * +; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from +; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at +; * the moment. I have successfully compiled and tested this code with gcc2.96, +; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S +; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX +; * enabled. I will attempt to merge the MMX code into this version. Newer +; * versions of this and inffast.S can be found at +; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ +; * +; * 2005 : modification by Gilles Vollant +; */ +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; +; compile with command line option +; ml /coff /Zi /c /Flinffas32.lst inffas32.asm + +; if you define NO_GZIP (see inflate.h), compile with +; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm + + +; zlib122sup is 0 fort zlib 1.2.2.1 and lower +; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head +; in inflate_state in inflate.h) +zlib1222sup equ 8 + + +IFDEF GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 +ELSE + IFNDEF NO_GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 + ELSE + INFLATE_MODE_TYPE equ 3 + INFLATE_MODE_BAD equ 17 + ENDIF +ENDIF + + +; 75 "inffast.S" +;FILE "inffast.S" + +;;;GLOBAL _inflate_fast + +;;;SECTION .text + + + + .586p + .mmx + + name inflate_fast_x86 + .MODEL FLAT + +_DATA segment +inflate_fast_use_mmx: + dd 1 + + +_TEXT segment +PUBLIC _inflate_fast + +ALIGN 4 +_inflate_fast: + jmp inflate_fast_entry + + + +ALIGN 4 + db 'Fast decoding Code from Chris Anderson' + db 0 + +ALIGN 4 +invalid_literal_length_code_msg: + db 'invalid literal/length code' + db 0 + +ALIGN 4 +invalid_distance_code_msg: + db 'invalid distance code' + db 0 + +ALIGN 4 +invalid_distance_too_far_msg: + db 'invalid distance too far back' + db 0 + + +ALIGN 4 +inflate_fast_mask: +dd 0 +dd 1 +dd 3 +dd 7 +dd 15 +dd 31 +dd 63 +dd 127 +dd 255 +dd 511 +dd 1023 +dd 2047 +dd 4095 +dd 8191 +dd 16383 +dd 32767 +dd 65535 +dd 131071 +dd 262143 +dd 524287 +dd 1048575 +dd 2097151 +dd 4194303 +dd 8388607 +dd 16777215 +dd 33554431 +dd 67108863 +dd 134217727 +dd 268435455 +dd 536870911 +dd 1073741823 +dd 2147483647 +dd 4294967295 + + +mode_state equ 0 ;/* state->mode */ +wsize_state equ (32+zlib1222sup) ;/* state->wsize */ +write_state equ (36+4+zlib1222sup) ;/* state->write */ +window_state equ (40+4+zlib1222sup) ;/* state->window */ +hold_state equ (44+4+zlib1222sup) ;/* state->hold */ +bits_state equ (48+4+zlib1222sup) ;/* state->bits */ +lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ +distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ +lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ +distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ + + +;;SECTION .text +; 205 "inffast.S" +;GLOBAL inflate_fast_use_mmx + +;SECTION .data + + +; GLOBAL inflate_fast_use_mmx:object +;.size inflate_fast_use_mmx, 4 +; 226 "inffast.S" +;SECTION .text + +ALIGN 4 +inflate_fast_entry: + push edi + push esi + push ebp + push ebx + pushfd + sub esp,64 + cld + + + + + mov esi, [esp+88] + mov edi, [esi+28] + + + + + + + + mov edx, [esi+4] + mov eax, [esi+0] + + add edx,eax + sub edx,11 + + mov [esp+44],eax + mov [esp+20],edx + + mov ebp, [esp+92] + mov ecx, [esi+16] + mov ebx, [esi+12] + + sub ebp,ecx + neg ebp + add ebp,ebx + + sub ecx,257 + add ecx,ebx + + mov [esp+60],ebx + mov [esp+40],ebp + mov [esp+16],ecx +; 285 "inffast.S" + mov eax, [edi+lencode_state] + mov ecx, [edi+distcode_state] + + mov [esp+8],eax + mov [esp+12],ecx + + mov eax,1 + mov ecx, [edi+lenbits_state] + shl eax,cl + dec eax + mov [esp+0],eax + + mov eax,1 + mov ecx, [edi+distbits_state] + shl eax,cl + dec eax + mov [esp+4],eax + + mov eax, [edi+wsize_state] + mov ecx, [edi+write_state] + mov edx, [edi+window_state] + + mov [esp+52],eax + mov [esp+48],ecx + mov [esp+56],edx + + mov ebp, [edi+hold_state] + mov ebx, [edi+bits_state] +; 321 "inffast.S" + mov esi, [esp+44] + mov ecx, [esp+20] + cmp ecx,esi + ja L_align_long + + add ecx,11 + sub ecx,esi + mov eax,12 + sub eax,ecx + lea edi, [esp+28] + rep movsb + mov ecx,eax + xor eax,eax + rep stosb + lea esi, [esp+28] + mov [esp+20],esi + jmp L_is_aligned + + +L_align_long: + test esi,3 + jz L_is_aligned + xor eax,eax + mov al, [esi] + inc esi + mov ecx,ebx + add ebx,8 + shl eax,cl + or ebp,eax + jmp L_align_long + +L_is_aligned: + mov edi, [esp+60] +; 366 "inffast.S" +L_check_mmx: + cmp dword ptr [inflate_fast_use_mmx],2 + je L_init_mmx + ja L_do_loop + + push eax + push ebx + push ecx + push edx + pushfd + mov eax, [esp] + xor dword ptr [esp],0200000h + + + + + popfd + pushfd + pop edx + xor edx,eax + jz L_dont_use_mmx + xor eax,eax + cpuid + cmp ebx,0756e6547h + jne L_dont_use_mmx + cmp ecx,06c65746eh + jne L_dont_use_mmx + cmp edx,049656e69h + jne L_dont_use_mmx + mov eax,1 + cpuid + shr eax,8 + and eax,15 + cmp eax,6 + jne L_dont_use_mmx + test edx,0800000h + jnz L_use_mmx + jmp L_dont_use_mmx +L_use_mmx: + mov dword ptr [inflate_fast_use_mmx],2 + jmp L_check_mmx_pop +L_dont_use_mmx: + mov dword ptr [inflate_fast_use_mmx],3 +L_check_mmx_pop: + pop edx + pop ecx + pop ebx + pop eax + jmp L_check_mmx +; 426 "inffast.S" +ALIGN 4 +L_do_loop: +; 437 "inffast.S" + cmp bl,15 + ja L_get_length_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_length_code: + mov edx, [esp+0] + mov ecx, [esp+8] + and edx,ebp + mov eax, [ecx+edx*4] + +L_dolen: + + + + + + + mov cl,ah + sub bl,ah + shr ebp,cl + + + + + + + test al,al + jnz L_test_for_length_base + + shr eax,16 + stosb + +L_while_test: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop + jmp L_break_loop + +L_test_for_length_base: +; 502 "inffast.S" + mov edx,eax + shr edx,16 + mov cl,al + + test al,16 + jz L_test_for_second_level_length + and cl,15 + jz L_save_len + cmp bl,cl + jae L_add_bits_to_len + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_len: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + +L_save_len: + mov [esp+24],edx + + +L_decode_distance: +; 549 "inffast.S" + cmp bl,15 + ja L_get_distance_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_distance_code: + mov edx, [esp+4] + mov ecx, [esp+12] + and edx,ebp + mov eax, [ecx+edx*4] + + +L_dodist: + mov edx,eax + shr edx,16 + mov cl,ah + sub bl,ah + shr ebp,cl +; 584 "inffast.S" + mov cl,al + + test al,16 + jz L_test_for_second_level_dist + and cl,15 + jz L_check_dist_one + cmp bl,cl + jae L_add_bits_to_dist + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_dist: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + jmp L_check_window + +L_check_window: +; 625 "inffast.S" + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,edx + jb L_clip_window + + mov ecx, [esp+24] + mov esi,edi + sub esi,edx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp edx,1 + jne L_check_window + cmp [esp+40],edi + je L_check_window + + dec edi + mov ecx, [esp+24] + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + + + + + test al,64 + jnz L_test_for_end_of_block + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + + + + + test al,64 + jnz L_invalid_distance_code + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+12] + mov eax, [edx+eax*4] + jmp L_dodist + +ALIGN 4 +L_clip_window: +; 721 "inffast.S" + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,edx + jb L_invalid_distance_too_far + + add ecx,edx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window + + sub eax,ecx + add esi,eax +; 749 "inffast.S" + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_wrap_around_window: +; 793 "inffast.S" + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_contiguous_in_window: +; 836 "inffast.S" + add esi,eax + sub esi,ecx + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + +L_do_copy1: +; 862 "inffast.S" + mov ecx,eax + rep movsb + + mov esi, [esp+44] + jmp L_while_test +; 878 "inffast.S" +ALIGN 4 +L_init_mmx: + emms + + + + + + movd mm0,ebp + mov ebp,ebx +; 896 "inffast.S" + movd mm4,[esp+0] + movq mm3,mm4 + movd mm5,[esp+4] + movq mm2,mm5 + pxor mm1,mm1 + mov ebx, [esp+8] + jmp L_do_loop_mmx + +ALIGN 4 +L_do_loop_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_length_code_mmx + + movd mm6,ebp + movd mm7,[esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_length_code_mmx: + pand mm4,mm0 + movd eax,mm4 + movq mm4,mm3 + mov eax, [ebx+eax*4] + +L_dolen_mmx: + movzx ecx,ah + movd mm1,ecx + sub ebp,ecx + + test al,al + jnz L_test_for_length_base_mmx + + shr eax,16 + stosb + +L_while_test_mmx: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop_mmx + jmp L_break_loop + +L_test_for_length_base_mmx: + + mov edx,eax + shr edx,16 + + test al,16 + jz L_test_for_second_level_length_mmx + and eax,15 + jz L_decode_distance_mmx + + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add edx,ecx + +L_decode_distance_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_dist_code_mmx + + movd mm6,ebp + movd mm7,[esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_dist_code_mmx: + mov ebx, [esp+12] + pand mm5,mm0 + movd eax,mm5 + movq mm5,mm2 + mov eax, [ebx+eax*4] + +L_dodist_mmx: + + movzx ecx,ah + mov ebx,eax + shr ebx,16 + sub ebp,ecx + movd mm1,ecx + + test al,16 + jz L_test_for_second_level_dist_mmx + and eax,15 + jz L_check_dist_one_mmx + +L_add_bits_to_dist_mmx: + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add ebx,ecx + +L_check_window_mmx: + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,ebx + jb L_clip_window_mmx + + mov ecx,edx + mov esi,edi + sub esi,ebx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_check_dist_one_mmx: + cmp ebx,1 + jne L_check_window_mmx + cmp [esp+40],edi + je L_check_window_mmx + + dec edi + mov ecx,edx + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_test_for_second_level_length_mmx: + test al,64 + jnz L_test_for_end_of_block + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + add ecx,edx + mov eax, [ebx+ecx*4] + jmp L_dolen_mmx + +ALIGN 4 +L_test_for_second_level_dist_mmx: + test al,64 + jnz L_invalid_distance_code + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + mov eax, [esp+12] + add ecx,ebx + mov eax, [eax+ecx*4] + jmp L_dodist_mmx + +ALIGN 4 +L_clip_window_mmx: + + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,ebx + jb L_invalid_distance_too_far + + add ecx,ebx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window_mmx + + sub eax,ecx + add esi,eax + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_wrap_around_window_mmx: + + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window_mmx + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_contiguous_in_window_mmx: + + add esi,eax + sub esi,ecx + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + +L_do_copy1_mmx: + + + mov ecx,edx + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx +; 1174 "inffast.S" +L_invalid_distance_code: + + + + + + mov ecx, invalid_distance_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_test_for_end_of_block: + + + + + + test al,32 + jz L_invalid_literal_length_code + + mov ecx,0 + mov edx,INFLATE_MODE_TYPE + jmp L_update_stream_state + +L_invalid_literal_length_code: + + + + + + mov ecx, invalid_literal_length_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_invalid_distance_too_far: + + + + mov esi, [esp+44] + mov ecx, invalid_distance_too_far_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_update_stream_state: + + mov eax, [esp+88] + test ecx,ecx + jz L_skip_msg + mov [eax+24],ecx +L_skip_msg: + mov eax, [eax+28] + mov [eax+mode_state],edx + jmp L_break_loop + +ALIGN 4 +L_break_loop: +; 1243 "inffast.S" + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_next_in + + + + mov ebx,ebp + +L_update_next_in: +; 1266 "inffast.S" + mov eax, [esp+88] + mov ecx,ebx + mov edx, [eax+28] + shr ecx,3 + sub esi,ecx + shl ecx,3 + sub ebx,ecx + mov [eax+12],edi + mov [edx+bits_state],ebx + mov ecx,ebx + + lea ebx, [esp+28] + cmp [esp+20],ebx + jne L_buf_not_used + + sub esi,ebx + mov ebx, [eax+0] + mov [esp+20],ebx + add esi,ebx + mov ebx, [eax+4] + sub ebx,11 + add [esp+20],ebx + +L_buf_not_used: + mov [eax+0],esi + + mov ebx,1 + shl ebx,cl + dec ebx + + + + + + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_hold + + + + psrlq mm0,mm1 + movd ebp,mm0 + + emms + +L_update_hold: + + + + and ebp,ebx + mov [edx+hold_state],ebp + + + + + mov ebx, [esp+20] + cmp ebx,esi + jbe L_last_is_smaller + + sub ebx,esi + add ebx,11 + mov [eax+4],ebx + jmp L_fixup_out +L_last_is_smaller: + sub esi,ebx + neg esi + add esi,11 + mov [eax+4],esi + + + + +L_fixup_out: + + mov ebx, [esp+16] + cmp ebx,edi + jbe L_end_is_smaller + + sub ebx,edi + add ebx,257 + mov [eax+16],ebx + jmp L_done +L_end_is_smaller: + sub edi,ebx + neg edi + add edi,257 + mov [eax+16],edi + + + + + +L_done: + add esp,64 + popfd + pop ebx + pop ebp + pop esi + pop edi + ret + +_TEXT ends +end diff --git a/win32/3rdparty/zlib/contrib/masmx86/mkasm.bat b/win32/3rdparty/zlib/contrib/masmx86/mkasm.bat new file mode 100644 index 000000000..70a51f837 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx86/mkasm.bat @@ -0,0 +1,3 @@ +cl /DASMV /I..\.. /O2 /c gvmat32c.c +ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/win32/3rdparty/zlib/contrib/masmx86/readme.txt b/win32/3rdparty/zlib/contrib/masmx86/readme.txt new file mode 100644 index 000000000..7b57167b7 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/masmx86/readme.txt @@ -0,0 +1,21 @@ + +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(). + + +Use instructions +---------------- +Copy these files into the zlib source directory, then run the +appropriate makefile, as suggested below. + + +Build instructions +------------------ +* With Microsoft C and MASM: +nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="gvmat32c.obj gvmat32.obj inffas32.obj" + +* With Borland C and TASM: +make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="gvmat32c.obj gvmat32.obj inffas32.obj" OBJPA="+gvmat32c.obj+gvmat32.obj+inffas32.obj" + diff --git a/win32/3rdparty/zlib/contrib/minizip/ChangeLogUnzip b/win32/3rdparty/zlib/contrib/minizip/ChangeLogUnzip new file mode 100644 index 000000000..50ca6a9e0 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/ChangeLogUnzip @@ -0,0 +1,67 @@ +Change in 1.01e (12 feb 05) +- Fix in zipOpen2 for globalcomment (Rolf Kalbermatter) +- Fix possible memory leak in unzip.c (Zoran Stevanovic) + +Change in 1.01b (20 may 04) +- Integrate patch from Debian package (submited by Mark Brown) +- Add tools mztools from Xavier Roche + +Change in 1.01 (8 may 04) +- fix buffer overrun risk in unzip.c (Xavier Roche) +- fix a minor buffer insecurity in minizip.c (Mike Whittaker) + +Change in 1.00: (10 sept 03) +- rename to 1.00 +- cosmetic code change + +Change in 0.22: (19 May 03) +- crypting support (unless you define NOCRYPT) +- append file in existing zipfile + +Change in 0.21: (10 Mar 03) +- bug fixes + +Change in 0.17: (27 Jan 02) +- bug fixes + +Change in 0.16: (19 Jan 02) +- Support of ioapi for virtualize zip file access + +Change in 0.15: (19 Mar 98) +- fix memory leak in minizip.c + +Change in 0.14: (10 Mar 98) +- fix bugs in minizip.c sample for zipping big file +- fix problem in month in date handling +- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for + comment handling + +Change in 0.13: (6 Mar 98) +- fix bugs in zip.c +- add real minizip sample + +Change in 0.12: (4 Mar 98) +- add zip.c and zip.h for creates .zip file +- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly) +- fix miniunz.c for file without specific record for directory + +Change in 0.11: (3 Mar 98) +- fix bug in unzGetCurrentFileInfo for get extra field and comment +- enhance miniunz sample, remove the bad unztst.c sample + +Change in 0.10: (2 Mar 98) +- fix bug in unzReadCurrentFile +- rename unzip* to unz* function and structure +- remove Windows-like hungary notation variable name +- modify some structure in unzip.h +- add somes comment in source +- remove unzipGetcCurrentFile function +- replace ZUNZEXPORT by ZEXPORT +- add unzGetLocalExtrafield for get the local extrafield info +- add a new sample, miniunz.c + +Change in 0.4: (25 Feb 98) +- suppress the type unzipFileInZip. + Only on file in the zipfile can be open at the same time +- fix somes typo in code +- added tm_unz structure in unzip_file_info (date/time in readable format) diff --git a/win32/3rdparty/zlib/contrib/minizip/crypt.h b/win32/3rdparty/zlib/contrib/minizip/crypt.h new file mode 100644 index 000000000..622f4bc2e --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/crypt.h @@ -0,0 +1,132 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) + const char *passwd; /* password string */ + unsigned char *buf; /* where to write header */ + int bufSize; + unsigned long* pkeys; + const unsigned long* pcrc_32_tab; + unsigned long crcForCrypting; +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/win32/3rdparty/zlib/contrib/minizip/ioapi.c b/win32/3rdparty/zlib/contrib/minizip/ioapi.c new file mode 100644 index 000000000..f1bee23e6 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/ioapi.c @@ -0,0 +1,177 @@ +/* ioapi.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include +#include +#include + +#include "zlib.h" +#include "ioapi.h" + + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +voidpf ZCALLBACK fopen_file_func OF(( + voidpf opaque, + const char* filename, + int mode)); + +uLong ZCALLBACK fread_file_func OF(( + voidpf opaque, + voidpf stream, + void* buf, + uLong size)); + +uLong ZCALLBACK fwrite_file_func OF(( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size)); + +long ZCALLBACK ftell_file_func OF(( + voidpf opaque, + voidpf stream)); + +long ZCALLBACK fseek_file_func OF(( + voidpf opaque, + voidpf stream, + uLong offset, + int origin)); + +int ZCALLBACK fclose_file_func OF(( + voidpf opaque, + voidpf stream)); + +int ZCALLBACK ferror_file_func OF(( + voidpf opaque, + voidpf stream)); + + +voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) + voidpf opaque; + const char* filename; + int mode; +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + + +uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + + +uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + const void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +long ZCALLBACK ftell_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + +long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) + voidpf opaque; + voidpf stream; + uLong offset; + int origin; +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + fseek((FILE *)stream, offset, fseek_origin); + return ret; +} + +int ZCALLBACK fclose_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +int ZCALLBACK ferror_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/win32/3rdparty/zlib/contrib/minizip/ioapi.h b/win32/3rdparty/zlib/contrib/minizip/ioapi.h new file mode 100644 index 000000000..7d457baab --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/ioapi.h @@ -0,0 +1,75 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#ifndef _ZLIBIOAPI_H +#define _ZLIBIOAPI_H + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#define ZCALLBACK CALLBACK +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + + + +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/win32/3rdparty/zlib/contrib/minizip/iowin32.c b/win32/3rdparty/zlib/contrib/minizip/iowin32.c new file mode 100644 index 000000000..a9b5f7839 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/iowin32.c @@ -0,0 +1,270 @@ +/* iowin32.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + This IO API version uses the Win32 API (for Microsoft Windows) + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include + +#include "zlib.h" +#include "ioapi.h" +#include "iowin32.h" + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (0xFFFFFFFF) +#endif + +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + +voidpf ZCALLBACK win32_open_file_func OF(( + voidpf opaque, + const char* filename, + int mode)); + +uLong ZCALLBACK win32_read_file_func OF(( + voidpf opaque, + voidpf stream, + void* buf, + uLong size)); + +uLong ZCALLBACK win32_write_file_func OF(( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size)); + +long ZCALLBACK win32_tell_file_func OF(( + voidpf opaque, + voidpf stream)); + +long ZCALLBACK win32_seek_file_func OF(( + voidpf opaque, + voidpf stream, + uLong offset, + int origin)); + +int ZCALLBACK win32_close_file_func OF(( + voidpf opaque, + voidpf stream)); + +int ZCALLBACK win32_error_file_func OF(( + voidpf opaque, + voidpf stream)); + +typedef struct +{ + HANDLE hf; + int error; +} WIN32FILE_IOWIN; + +voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode) + voidpf opaque; + const char* filename; + int mode; +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = 0; + voidpf ret=NULL; + + dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0; + + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + { + dwDesiredAccess = GENERIC_READ; + dwCreationDisposition = OPEN_EXISTING; + dwShareMode = FILE_SHARE_READ; + } + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + { + dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + dwCreationDisposition = OPEN_EXISTING; + } + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + { + dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + dwCreationDisposition = CREATE_ALWAYS; + } + + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, + dwCreationDisposition, dwFlagsAndAttributes, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + hFile = NULL; + + if (hFile != NULL) + { + WIN32FILE_IOWIN w32fiow; + w32fiow.hf = hFile; + w32fiow.error = 0; + ret = malloc(sizeof(WIN32FILE_IOWIN)); + if (ret==NULL) + CloseHandle(hFile); + else *((WIN32FILE_IOWIN*)ret) = w32fiow; + } + return ret; +} + + +uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + void* buf; + uLong size; +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + if (!ReadFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + + return ret; +} + + +uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + const void* buf; + uLong size; +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile !=NULL) + if (!WriteFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + + return ret; +} + +long ZCALLBACK win32_tell_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + long ret=-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); + if (dwSet == INVALID_SET_FILE_POINTER) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=(long)dwSet; + } + return ret; +} + +long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin) + voidpf opaque; + voidpf stream; + uLong offset; + int origin; +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + + long ret=-1; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile != NULL) + { + DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); + if (dwSet == INVALID_SET_FILE_POINTER) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +int ZCALLBACK win32_close_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret=-1; + + if (stream!=NULL) + { + HANDLE hFile; + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + CloseHandle(hFile); + ret=0; + } + free(stream); + } + return ret; +} + +int ZCALLBACK win32_error_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret=-1; + if (stream!=NULL) + { + ret = ((WIN32FILE_IOWIN*)stream) -> error; + } + return ret; +} + +void fill_win32_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = win32_open_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell_file = win32_tell_file_func; + pzlib_filefunc_def->zseek_file = win32_seek_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque=NULL; +} diff --git a/win32/3rdparty/zlib/contrib/minizip/iowin32.h b/win32/3rdparty/zlib/contrib/minizip/iowin32.h new file mode 100644 index 000000000..a3a437adf --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/iowin32.h @@ -0,0 +1,21 @@ +/* iowin32.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + This IO API version uses the Win32 API (for Microsoft Windows) + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#ifdef __cplusplus +} +#endif diff --git a/win32/3rdparty/zlib/contrib/minizip/miniunz.c b/win32/3rdparty/zlib/contrib/minizip/miniunz.c new file mode 100644 index 000000000..f59993888 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/miniunz.c @@ -0,0 +1,585 @@ +/* + miniunz.c + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + + +#include +#include +#include +#include +#include +#include + +#ifdef unix +# include +# include +#else +# include +# include +#endif + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +#ifdef WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +#ifdef unix + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef WIN32 + ret = mkdir(dirname); +#else +#ifdef unix + ret = mkdir (dirname,0775); +#endif +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info gi; + int err; + + err = unzGetGlobalInfo (uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i0) + ratio = (file_info.compressed_size*100)/file_info.uncompressed_size; + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + string_method="Unkn. "; + + printf("%7lu %6s%c%7lu %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + file_info.uncompressed_size,string_method, + charCrypt, + file_info.compressed_size, + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=fopen(write_filename,"wb"); + + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=fopen(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo (uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i +#include +#include +#include +#include +#include + +#ifdef unix +# include +# include +# include +# include +#else +# include +# include +#endif + +#include "zip.h" + +#ifdef WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif + + + +#define WRITEBUFFERSIZE (16384) +#define MAXFILENAME (256) + +#ifdef WIN32 +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret = 0; + { + FILETIME ftLocal; + HANDLE hFind; + WIN32_FIND_DATA ff32; + + hFind = FindFirstFile(f,&ff32); + if (hFind != INVALID_HANDLE_VALUE) + { + FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); + FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); + FindClose(hFind); + ret = 1; + } + } + return ret; +} +#else +#ifdef unix +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret=0; + struct stat s; /* results of stat() */ + struct tm* filedate; + time_t tm_t=0; + + if (strcmp(f,"-")!=0) + { + char name[MAXFILENAME+1]; + int len = strlen(f); + if (len > MAXFILENAME) + len = MAXFILENAME; + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + + if (name[len - 1] == '/') + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (stat(name,&s)==0) + { + tm_t = s.st_mtime; + ret = 1; + } + } + filedate = localtime(&tm_t); + + tmzip->tm_sec = filedate->tm_sec; + tmzip->tm_min = filedate->tm_min; + tmzip->tm_hour = filedate->tm_hour; + tmzip->tm_mday = filedate->tm_mday; + tmzip->tm_mon = filedate->tm_mon ; + tmzip->tm_year = filedate->tm_year; + + return ret; +} +#else +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + return 0; +} +#endif +#endif + + + + +int check_exist_file(filename) + const char* filename; +{ + FILE* ftestexist; + int ret = 1; + ftestexist = fopen(filename,"rb"); + if (ftestexist==NULL) + ret = 0; + else + fclose(ftestexist); + return ret; +} + +void do_banner() +{ + printf("MiniZip 1.01b, demo of zLib + Zip package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] file.zip [files_to_add]\n\n" \ + " -o Overwrite existing file.zip\n" \ + " -a Append to existing file.zip\n" \ + " -0 Store only\n" \ + " -1 Compress faster\n" \ + " -9 Compress better\n\n"); +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = fopen(filenameinzip,"rb"); + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %x\n",filenameinzip,calculate_crc); + return err; +} + +int main(argc,argv) + int argc; + char *argv[]; +{ + int i; + int opt_overwrite=0; + int opt_compress_level=Z_DEFAULT_COMPRESSION; + int zipfilenamearg = 0; + char filename_try[MAXFILENAME+16]; + int zipok; + int err=0; + int size_buf=0; + void* buf=NULL; + const char* password=NULL; + + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i='0') && (c<='9')) + opt_compress_level = c-'0'; + + if (((c=='p') || (c=='P')) && (i+1='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + if (rep=='N') + zipok = 0; + if (rep=='A') + opt_overwrite = 2; + } + } + + if (zipok==1) + { + zipFile zf; + int errclose; +# ifdef USEWIN32IOAPI + zlib_filefunc_def ffunc; + fill_win32_filefunc(&ffunc); + zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); +# else + zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0); +# endif + + if (zf == NULL) + { + printf("error opening %s\n",filename_try); + err= ZIP_ERRNO; + } + else + printf("creating %s\n",filename_try); + + for (i=zipfilenamearg+1;(i='0') || (argv[i][1]<='9'))) && + (strlen(argv[i]) == 2))) + { + FILE * fin; + int size_read; + const char* filenameinzip = argv[i]; + zip_fileinfo zi; + unsigned long crcFile=0; + + zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = + zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; + zi.dosDate = 0; + zi.internal_fa = 0; + zi.external_fa = 0; + filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); + +/* + err = zipOpenNewFileInZip(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL / * comment * /, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + err = zipOpenNewFileInZip3(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL /* comment*/, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level,0, + /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + password,crcFile); + + if (err != ZIP_OK) + printf("error in opening %s in zipfile\n",filenameinzip); + else + { + fin = fopen(filenameinzip,"rb"); + if (fin==NULL) + { + err=ZIP_ERRNO; + printf("error in opening %s for reading\n",filenameinzip); + } + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + { + err = zipWriteInFileInZip (zf,buf,size_read); + if (err<0) + { + printf("error in writing %s in the zipfile\n", + filenameinzip); + } + + } + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + if (err<0) + err=ZIP_ERRNO; + else + { + err = zipCloseFileInZip(zf); + if (err!=ZIP_OK) + printf("error in closing %s in the zipfile\n", + filenameinzip); + } + } + } + errclose = zipClose(zf,NULL); + if (errclose != ZIP_OK) + printf("error in closing %s\n",filename_try); + } + else + { + do_help(); + } + + free(buf); + return 0; +} diff --git a/win32/3rdparty/zlib/contrib/minizip/mztools.c b/win32/3rdparty/zlib/contrib/minizip/mztools.c new file mode 100644 index 000000000..8a50ee439 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/mztools.c @@ -0,0 +1,281 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) + +extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) +const char* file; +const char* fileOut; +const char* fileOutTmp; +uLong* nRecovered; +uLong* bytesRecovered; +{ + int err = Z_OK; + FILE* fpZip = fopen(file, "rb"); + FILE* fpOut = fopen(fileOut, "wb"); + FILE* fpOutCD = fopen(fileOutTmp, "wb"); + if (fpZip != NULL && fpOut != NULL) { + int entries = 0; + uLong totalBytes = 0; + char header[30]; + char filename[256]; + char extra[1024]; + int offset = 0; + int offsetCD = 0; + while ( fread(header, 1, 30, fpZip) == 30 ) { + int currentOffset = offset; + + /* File entry */ + if (READ_32(header) == 0x04034b50) { + unsigned int version = READ_16(header + 4); + unsigned int gpflag = READ_16(header + 6); + unsigned int method = READ_16(header + 8); + unsigned int filetime = READ_16(header + 10); + unsigned int filedate = READ_16(header + 12); + unsigned int crc = READ_32(header + 14); /* crc */ + unsigned int cpsize = READ_32(header + 18); /* compressed size */ + unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ + unsigned int fnsize = READ_16(header + 26); /* file name length */ + unsigned int extsize = READ_16(header + 28); /* extra field length */ + filename[0] = extra[0] = '\0'; + + /* Header */ + if (fwrite(header, 1, 30, fpOut) == 30) { + offset += 30; + } else { + err = Z_ERRNO; + break; + } + + /* Filename */ + if (fnsize > 0) { + if (fread(filename, 1, fnsize, fpZip) == fnsize) { + if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { + offset += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fread(extra, 1, extsize, fpZip) == extsize) { + if (fwrite(extra, 1, extsize, fpOut) == extsize) { + offset += extsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } + + /* Data */ + { + int dataSize = cpsize; + if (dataSize == 0) { + dataSize = uncpsize; + } + if (dataSize > 0) { + char* data = malloc(dataSize); + if (data != NULL) { + if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { + if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { + offset += dataSize; + totalBytes += dataSize; + } else { + err = Z_ERRNO; + } + } else { + err = Z_ERRNO; + } + free(data); + if (err != Z_OK) { + break; + } + } else { + err = Z_MEM_ERROR; + break; + } + } + } + + /* Central directory entry */ + { + char header[46]; + char* comment = ""; + int comsize = (int) strlen(comment); + WRITE_32(header, 0x02014b50); + WRITE_16(header + 4, version); + WRITE_16(header + 6, version); + WRITE_16(header + 8, gpflag); + WRITE_16(header + 10, method); + WRITE_16(header + 12, filetime); + WRITE_16(header + 14, filedate); + WRITE_32(header + 16, crc); + WRITE_32(header + 20, cpsize); + WRITE_32(header + 24, uncpsize); + WRITE_16(header + 28, fnsize); + WRITE_16(header + 30, extsize); + WRITE_16(header + 32, comsize); + WRITE_16(header + 34, 0); /* disk # */ + WRITE_16(header + 36, 0); /* int attrb */ + WRITE_32(header + 38, 0); /* ext attrb */ + WRITE_32(header + 42, currentOffset); + /* Header */ + if (fwrite(header, 1, 46, fpOutCD) == 46) { + offsetCD += 46; + + /* Filename */ + if (fnsize > 0) { + if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { + offsetCD += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { + offsetCD += extsize; + } else { + err = Z_ERRNO; + break; + } + } + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { + offsetCD += comsize; + } else { + err = Z_ERRNO; + break; + } + } + + + } else { + err = Z_ERRNO; + break; + } + } + + /* Success */ + entries++; + + } else { + break; + } + } + + /* Final central directory */ + { + int entriesZip = entries; + char header[22]; + char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; + int comsize = (int) strlen(comment); + if (entriesZip > 0xffff) { + entriesZip = 0xffff; + } + WRITE_32(header, 0x06054b50); + WRITE_16(header + 4, 0); /* disk # */ + WRITE_16(header + 6, 0); /* disk # */ + WRITE_16(header + 8, entriesZip); /* hack */ + WRITE_16(header + 10, entriesZip); /* hack */ + WRITE_32(header + 12, offsetCD); /* size of CD */ + WRITE_32(header + 16, offset); /* offset to CD */ + WRITE_16(header + 20, comsize); /* comment */ + + /* Header */ + if (fwrite(header, 1, 22, fpOutCD) == 22) { + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { + err = Z_ERRNO; + } + } + + } else { + err = Z_ERRNO; + } + } + + /* Final merge (file + central directory) */ + fclose(fpOutCD); + if (err == Z_OK) { + fpOutCD = fopen(fileOutTmp, "rb"); + if (fpOutCD != NULL) { + int nRead; + char buffer[8192]; + while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { + if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { + err = Z_ERRNO; + break; + } + } + fclose(fpOutCD); + } + } + + /* Close */ + fclose(fpZip); + fclose(fpOut); + + /* Wipe temporary file */ + (void)remove(fileOutTmp); + + /* Number of recovered entries */ + if (err == Z_OK) { + if (nRecovered != NULL) { + *nRecovered = entries; + } + if (bytesRecovered != NULL) { + *bytesRecovered = totalBytes; + } + } + } else { + err = Z_STREAM_ERROR; + } + return err; +} diff --git a/win32/3rdparty/zlib/contrib/minizip/mztools.h b/win32/3rdparty/zlib/contrib/minizip/mztools.h new file mode 100644 index 000000000..eee78dc56 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/mztools.h @@ -0,0 +1,31 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* Repair a ZIP file (missing central directory) + file: file to recover + fileOut: output file after recovery + fileOutTmp: temporary file name used for recovery +*/ +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, + uLong* nRecovered, + uLong* bytesRecovered); + +#endif diff --git a/win32/3rdparty/zlib/contrib/minizip/unzip.c b/win32/3rdparty/zlib/contrib/minizip/unzip.c new file mode 100644 index 000000000..9ad4766d8 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/unzip.c @@ -0,0 +1,1598 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + Read unzip.h for more info +*/ + +/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of +compatibility with older software. The following is from the original crypt.c. Code +woven in by Terry Thorsen 1/2003. +*/ +/* + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + */ + +/* + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + */ + + +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile;/* relative offset of local header 4 bytes */ +} unz_file_info_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + uLong offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + uLong pos_local_extrafield; /* position in the local extra field in read*/ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be decompressed */ + uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip_read_info_s; + + +/* unz_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + uLong num_file; /* number of the current file in the zipfile*/ + uLong pos_in_central_dir; /* pos of the current file in the central dir*/ + uLong current_file_ok; /* flag about the usability of the current file*/ + uLong central_pos; /* position of the beginning of the central dir*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file in zip*/ + unz_file_info_internal cur_file_info_internal; /* private info about it*/ + file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; +# endif +} unz_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unzlocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unzlocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unzlocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) + const char *path; + zlib_filefunc_def* pzlib_filefunc_def; +{ + unz_s us; + unz_s *s; + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&us.z_filefunc); + else + us.z_filefunc = *pzlib_filefunc_def; + + us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + if (ZSEEK(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (ZSEEK(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + + if ((err==UNZ_OK) && (extraField!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } + else + lSeek+=file_info.size_file_extra; + + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info cur_file_infoSaved; + unz_file_info_internal cur_file_info_internalSaved; + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; // offset in file + uLong num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGoToFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) + unzFile file; + int* method; + int* level; + int raw; + const char* password; +{ + int err=UNZ_OK; + uInt iSizeVar; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, + &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s*) + ALLOC(sizeof(file_in_zip_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_DEFLATED) && + (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=1; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (file) + unzFile file; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (file, password) + unzFile file; + const char* password; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) + unzFile file; + int* method; + int* level; + int raw; +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ + int err=UNZ_OK; + unz_s* s; + uLong uReadThis ; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern uLong ZEXPORT unzGetOffset (file) + unzFile file; +{ + unz_s* s; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern int ZEXPORT unzSetOffset (file, pos) + unzFile file; + uLong pos; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} diff --git a/win32/3rdparty/zlib/contrib/minizip/unzip.h b/win32/3rdparty/zlib/contrib/minizip/unzip.h new file mode 100644 index 000000000..b247937c8 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/unzip.h @@ -0,0 +1,354 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/win32/3rdparty/zlib/contrib/minizip/zip.c b/win32/3rdparty/zlib/contrib/minizip/zip.c new file mode 100644 index 000000000..7fbe00274 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/zip.c @@ -0,0 +1,1219 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.01e, February 12th, 2005 + + 27 Dec 2004 Rolf Kalbermatter + Modification to zipOpen2 to support globalComment retrieval. + + Copyright (C) 1998-2005 Gilles Vollant + + Read zip.h for more info +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] = + " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignement */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + uLong pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralheader; /* size of the central header for cur file */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile_info; + +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile_info ci; /* info on the file curretly writing */ + + uLong begin_pos; /* position of the beginning of the zipfile */ + uLong add_position_when_writting_offset; + uLong number_entry; +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif +} zip_internal; + + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(ldi) + linkedlist_datablock_internal* ldi; +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(ll) + linkedlist_data* ll; +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(ll) + linkedlist_data* ll; +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(ll,buf,len) + linkedlist_data* ll; + const void* buf; + uLong len; +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 or 4 (byte, short or long) +*/ + +local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, uLong x, int nbByte)); +local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong x; + int nbByte; +{ + unsigned char buf[4]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); +local void ziplocal_putValue_inmemory (dest, x, nbByte) + void* dest; + uLong x; + int nbByte; +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) + const tm_zip* ptm; + uLong dosDate; +{ + uLong year = (uLong)ptm->tm_year; + if (year>1980) + year-=1980; + else if (year>80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int ziplocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int ziplocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int ziplocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong ziplocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + +/************************************************************/ +extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) + const char *pathname; + int append; + zipcharpc* globalcomment; + zlib_filefunc_def* pzlib_filefunc_def; +{ + zip_internal ziinit; + zip_internal* zi; + int err=ZIP_OK; + + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&ziinit.z_filefunc); + else + ziinit.z_filefunc = *pzlib_filefunc_def; + + ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) + (ziinit.z_filefunc.opaque, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writting_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + zi = (zip_internal*)ALLOC(sizeof(zip_internal)); + if (zi==NULL) + { + ZCLOSE(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory */ + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry; + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong size_comment; + + central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); + if (central_pos==0) + err=ZIP_ERRNO; + + if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* zipfile global comment length */ + if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((central_pos0) + { + ziinit.globalcomment = ALLOC(size_comment+1); + if (ziinit.globalcomment) + { + size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); + ziinit.globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - + (offset_central_dir+size_central_dir); + ziinit.add_position_when_writting_offset = byte_before_the_zipfile; + + { + uLong size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, + offset_central_dir + byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + uLong read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&ziinit.central_dir,buf_read, + (uLong)read_this); + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + ziinit.begin_pos = byte_before_the_zipfile; + ziinit.number_entry = number_entry_CD; + + if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, + offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen (pathname, append) + const char *pathname; + int append; +{ + return zipOpen2(pathname,append,NULL,NULL); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting) + zipFile file; + const char* filename; + const zip_fileinfo* zipfi; + const void* extrafield_local; + uInt size_extrafield_local; + const void* extrafield_global; + uInt size_extrafield_global; + const char* comment; + int method; + int level; + int raw; + int windowBits; + int memLevel; + int strategy; + const char* password; + uLong crcForCrypting; +{ + zip_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; + + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); + } + + zi->ci.flag = 0; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if ((level==2)) + zi->ci.flag |= 4; + if ((level==1)) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + + size_extrafield_global + size_comment; + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); + + ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); + ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + /* write the local header */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); + + if ((err==ZIP_OK) && (size_filename>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + + if ((err==ZIP_OK) && (size_extrafield_local>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) + !=size_extrafield_local) + err = ZIP_ERRNO; + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, + Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = 1; + } +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw) + zipFile file; + const char* filename; + const zip_fileinfo* zipfi; + const void* extrafield_local; + uInt size_extrafield_local; + const void* extrafield_global; + uInt size_extrafield_global; + const char* comment; + int method; + int level; + int raw; +{ + return zipOpenNewFileInZip3 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level) + zipFile file; + const char* filename; + const zip_fileinfo* zipfi; + const void* extrafield_local; + uInt size_extrafield_local; + const void* extrafield_global; + uInt size_extrafield_global; + const char* comment; + int method; + int level; +{ + return zipOpenNewFileInZip2 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0); +} + +local int zipFlushWriteBuffer(zi) + zip_internal* zi; +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, + zi->ci.buffered_data[i],t); +#endif + } + if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) + !=zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + zi->ci.pos_in_buffered_data = 0; + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (file, buf, len) + zipFile file; + const void* buf; + unsigned len; +{ + zip_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.stream.next_in = (void*)buf; + zi->ci.stream.avail_in = len; + zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + for (i=0;ici.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) + zipFile file; + uLong uncompressed_size; + uLong crc32; +{ + zip_internal* zi; + uLong compressed_size; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + err=deflateEnd(&zi->ci.stream); + zi->ci.stream_initialised = 0; + } + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = (uLong)zi->ci.stream.total_in; + } + compressed_size = (uLong)zi->ci.stream.total_out; +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + ziplocal_putValue_inmemory(zi->ci.central_header+20, + compressed_size,4); /*compr size*/ + if (zi->ci.stream.data_type == Z_ASCII) + ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + ziplocal_putValue_inmemory(zi->ci.central_header+24, + uncompressed_size,4); /*uncompr size*/ + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, + (uLong)zi->ci.size_centralheader); + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); + if (ZSEEK(zi->z_filefunc,zi->filestream, + zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if (err==ZIP_OK) /* compressed size, unknown */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + + if (ZSEEK(zi->z_filefunc,zi->filestream, + cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (file) + zipFile file; +{ + return zipCloseFileInZipRaw (file,0,0); +} + +extern int ZEXPORT zipClose (file, global_comment) + zipFile file; + const char* global_comment; +{ + zip_internal* zi; + int err = 0; + uLong size_centraldir = 0; + uLong centraldir_pos_inzip; + uInt size_global_comment; + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + if (global_comment==NULL) + size_global_comment = 0; + else + size_global_comment = (uInt)strlen(global_comment); + + centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream, + ldi->data,ldi->filled_in_this_block) + !=ldi->filled_in_this_block ) + err = ZIP_ERRNO; + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_datablock(zi->central_dir.first_block); + + if (err==ZIP_OK) /* Magic End */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + + if (err==ZIP_OK) /* size of the central directory */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the + starting disk number */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, + (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); + + if (err==ZIP_OK) /* zipfile comment length */ + err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if ((err==ZIP_OK) && (size_global_comment>0)) + if (ZWRITE(zi->z_filefunc,zi->filestream, + global_comment,size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + + if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} diff --git a/win32/3rdparty/zlib/contrib/minizip/zip.h b/win32/3rdparty/zlib/contrib/minizip/zip.h new file mode 100644 index 000000000..acacce83b --- /dev/null +++ b/win32/3rdparty/zlib/contrib/minizip/zip.h @@ -0,0 +1,235 @@ +/* zip.h -- IO for compress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow creates .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + For uncompress .zip file, look at unzip.h + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.html for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _zip_H +#define _zip_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCtypting)); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCtypting : crc of file to compress (needed for crypting) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); +/* + Close the current file in the zipfile, for fiel opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip_H */ diff --git a/win32/3rdparty/zlib/contrib/pascal/example.pas b/win32/3rdparty/zlib/contrib/pascal/example.pas new file mode 100644 index 000000000..5518b36a7 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/pascal/example.pas @@ -0,0 +1,599 @@ +(* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Pascal translation + * Copyright (C) 1998 by Jacques Nomssi Nzali. + * For conditions of distribution and use, see copyright notice in readme.txt + * + * Adaptation to the zlibpas interface + * Copyright (C) 2003 by Cosmin Truta. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +program example; + +{$DEFINE TEST_COMPRESS} +{DO NOT $DEFINE TEST_GZIO} +{$DEFINE TEST_DEFLATE} +{$DEFINE TEST_INFLATE} +{$DEFINE TEST_FLUSH} +{$DEFINE TEST_SYNC} +{$DEFINE TEST_DICT} + +uses SysUtils, zlibpas; + +const TESTFILE = 'foo.gz'; + +(* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + *) +const hello: PChar = 'hello, hello!'; + +const dictionary: PChar = 'hello'; + +var dictId: LongInt; (* Adler32 value of the dictionary *) + +procedure CHECK_ERR(err: Integer; msg: String); +begin + if err <> Z_OK then + begin + WriteLn(msg, ' error: ', err); + Halt(1); + end; +end; + +procedure EXIT_ERR(const msg: String); +begin + WriteLn('Error: ', msg); + Halt(1); +end; + +(* =========================================================================== + * Test compress and uncompress + *) +{$IFDEF TEST_COMPRESS} +procedure test_compress(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + err := compress(compr, comprLen, hello, len); + CHECK_ERR(err, 'compress'); + + StrCopy(PChar(uncompr), 'garbage'); + + err := uncompress(uncompr, uncomprLen, compr, comprLen); + CHECK_ERR(err, 'uncompress'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad uncompress') + else + WriteLn('uncompress(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test read/write of .gz files + *) +{$IFDEF TEST_GZIO} +procedure test_gzio(const fname: PChar; (* compressed file name *) + uncompr: Pointer; + uncomprLen: LongInt); +var err: Integer; + len: Integer; + zfile: gzFile; + pos: LongInt; +begin + len := StrLen(hello)+1; + + zfile := gzopen(fname, 'wb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + gzputc(zfile, 'h'); + if gzputs(zfile, 'ello') <> 4 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$IFDEF GZ_FORMAT_STRING} + if gzprintf(zfile, ', %s!', 'hello') <> 8 then + begin + WriteLn('gzprintf err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ELSE} + if gzputs(zfile, ', hello!') <> 8 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ENDIF} + gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *) + gzclose(zfile); + + zfile := gzopen(fname, 'rb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + + StrCopy(PChar(uncompr), 'garbage'); + + if gzread(zfile, uncompr, uncomprLen) <> len then + begin + WriteLn('gzread err: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello) <> 0 then + begin + WriteLn('bad gzread: ', PChar(uncompr)); + Halt(1); + end + else + WriteLn('gzread(): ', PChar(uncompr)); + + pos := gzseek(zfile, -8, SEEK_CUR); + if (pos <> 6) or (gztell(zfile) <> pos) then + begin + WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile)); + Halt(1); + end; + + if gzgetc(zfile) <> ' ' then + begin + WriteLn('gzgetc error'); + Halt(1); + end; + + if gzungetc(' ', zfile) <> ' ' then + begin + WriteLn('gzungetc error'); + Halt(1); + end; + + gzgets(zfile, PChar(uncompr), uncomprLen); + uncomprLen := StrLen(PChar(uncompr)); + if uncomprLen <> 7 then (* " hello!" *) + begin + WriteLn('gzgets err after gzseek: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello + 6) <> 0 then + begin + WriteLn('bad gzgets after gzseek'); + Halt(1); + end + else + WriteLn('gzgets() after gzseek: ', PChar(uncompr)); + + gzclose(zfile); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with small buffers + *) +{$IFDEF TEST_DEFLATE} +procedure test_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + + while (c_stream.total_in <> len) and + (c_stream.total_out < comprLen) do + begin + c_stream.avail_out := 1; { force small buffers } + c_stream.avail_in := 1; + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + end; + + (* Finish the stream, still forcing small buffers: *) + while TRUE do + begin + c_stream.avail_out := 1; + err := deflate(c_stream, Z_FINISH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'deflate'); + end; + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with small buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_inflate(compr: Pointer; comprLen : LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 0; + d_stream.next_out := uncompr; + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while (d_stream.total_out < uncomprLen) and + (d_stream.total_in < comprLen) do + begin + d_stream.avail_out := 1; (* force small buffers *) + d_stream.avail_in := 1; + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate') + else + WriteLn('inflate(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with large buffers and dynamic change of compression level + *) +{$IFDEF TEST_DEFLATE} +procedure test_large_deflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_SPEED); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + (* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + *) + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + if c_stream.avail_in <> 0 then + EXIT_ERR('deflate not greedy'); + + (* Feed in already compressed data and switch to no compression: *) + deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in := compr; + c_stream.avail_in := Integer(comprLen div 2); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + (* Switch back to compressing mode: *) + deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with large buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_large_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while TRUE do + begin + d_stream.next_out := uncompr; (* discard the output *) + d_stream.avail_out := Integer(uncomprLen); + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'large inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then + begin + WriteLn('bad large inflate: ', d_stream.total_out); + Halt(1); + end + else + WriteLn('large_inflate(): OK'); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with full flush + *) +{$IFDEF TEST_FLUSH} +procedure test_flush(compr: Pointer; var comprLen : LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: Integer; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + c_stream.avail_in := 3; + c_stream.avail_out := Integer(comprLen); + err := deflate(c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, 'deflate'); + + Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *) + c_stream.avail_in := len - 3; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + CHECK_ERR(err, 'deflate'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); + + comprLen := c_stream.total_out; +end; +{$ENDIF} + +(* =========================================================================== + * Test inflateSync() + *) +{$IFDEF TEST_SYNC} +procedure test_sync(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 2; (* just read the zlib header *) + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + inflate(d_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'inflate'); + + d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *) + err := inflateSync(d_stream); (* but skip the damaged part *) + CHECK_ERR(err, 'inflateSync'); + + err := inflate(d_stream, Z_FINISH); + if err <> Z_DATA_ERROR then + EXIT_ERR('inflate should report DATA_ERROR'); + (* Because of incorrect adler32 *) + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + WriteLn('after inflateSync(): hel', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary)); + CHECK_ERR(err, 'deflateSetDictionary'); + + dictId := c_stream.adler; + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + c_stream.next_in := hello; + c_stream.avail_in := StrLen(hello)+1; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with a preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + while TRUE do + begin + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + if err = Z_NEED_DICT then + begin + if d_stream.adler <> dictId then + EXIT_ERR('unexpected dictionary'); + err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary)); + end; + CHECK_ERR(err, 'inflate with dict'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate with dict') + else + WriteLn('inflate with dictionary: ', PChar(uncompr)); +end; +{$ENDIF} + +var compr, uncompr: Pointer; + comprLen, uncomprLen: LongInt; + +begin + if zlibVersion^ <> ZLIB_VERSION[1] then + EXIT_ERR('Incompatible zlib version'); + + WriteLn('zlib version: ', zlibVersion); + WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags])); + + comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *) + uncomprLen := comprLen; + GetMem(compr, comprLen); + GetMem(uncompr, uncomprLen); + if (compr = NIL) or (uncompr = NIL) then + EXIT_ERR('Out of memory'); + (* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + *) + FillChar(compr^, comprLen, 0); + FillChar(uncompr^, uncomprLen, 0); + + {$IFDEF TEST_COMPRESS} + WriteLn('** Testing compress'); + test_compress(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_GZIO} + WriteLn('** Testing gzio'); + if ParamCount >= 1 then + test_gzio(ParamStr(1), uncompr, uncomprLen) + else + test_gzio(TESTFILE, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with small buffers'); + test_deflate(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with small buffers'); + test_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with large buffers'); + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with large buffers'); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_FLUSH} + WriteLn('** Testing deflate with full flush'); + test_flush(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_SYNC} + WriteLn('** Testing inflateSync'); + test_sync(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + comprLen := uncomprLen; + + {$IFDEF TEST_DICT} + WriteLn('** Testing deflate and inflate with preset dictionary'); + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + FreeMem(compr, comprLen); + FreeMem(uncompr, uncomprLen); +end. diff --git a/win32/3rdparty/zlib/contrib/pascal/readme.txt b/win32/3rdparty/zlib/contrib/pascal/readme.txt new file mode 100644 index 000000000..60e87c8a3 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/pascal/readme.txt @@ -0,0 +1,76 @@ + +This directory contains a Pascal (Delphi, Kylix) interface to the +zlib data compression library. + + +Directory listing +================= + +zlibd32.mak makefile for Borland C++ +example.pas usage example of zlib +zlibpas.pas the Pascal interface to zlib +readme.txt this file + + +Compatibility notes +=================== + +- Although the name "zlib" would have been more normal for the + zlibpas unit, this name is already taken by Borland's ZLib unit. + This is somehow unfortunate, because that unit is not a genuine + interface to the full-fledged zlib functionality, but a suite of + class wrappers around zlib streams. Other essential features, + such as checksums, are missing. + It would have been more appropriate for that unit to have a name + like "ZStreams", or something similar. + +- The C and zlib-supplied types int, uInt, long, uLong, etc. are + translated directly into Pascal types of similar sizes (Integer, + LongInt, etc.), to avoid namespace pollution. In particular, + there is no conversion of unsigned int into a Pascal unsigned + integer. The Word type is non-portable and has the same size + (16 bits) both in a 16-bit and in a 32-bit environment, unlike + Integer. Even if there is a 32-bit Cardinal type, there is no + real need for unsigned int in zlib under a 32-bit environment. + +- Except for the callbacks, the zlib function interfaces are + assuming the calling convention normally used in Pascal + (__pascal for DOS and Windows16, __fastcall for Windows32). + Since the cdecl keyword is used, the old Turbo Pascal does + not work with this interface. + +- The gz* function interfaces are not translated, to avoid + interfacing problems with the C runtime library. Besides, + gzprintf(gzFile file, const char *format, ...) + cannot be translated into Pascal. + + +Legal issues +============ + +The zlibpas interface is: + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler. + Copyright (C) 1998 by Bob Dellaca. + Copyright (C) 2003 by Cosmin Truta. + +The example program is: + Copyright (C) 1995-2003 by Jean-loup Gailly. + Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali. + Copyright (C) 2003 by Cosmin Truta. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + diff --git a/win32/3rdparty/zlib/contrib/pascal/zlibd32.mak b/win32/3rdparty/zlib/contrib/pascal/zlibd32.mak new file mode 100644 index 000000000..88fafa0b1 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/pascal/zlibd32.mak @@ -0,0 +1,93 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj +OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj +OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/win32/3rdparty/zlib/contrib/pascal/zlibpas.pas b/win32/3rdparty/zlib/contrib/pascal/zlibpas.pas new file mode 100644 index 000000000..836848c2b --- /dev/null +++ b/win32/3rdparty/zlib/contrib/pascal/zlibpas.pas @@ -0,0 +1,236 @@ +(* zlibpas -- Pascal interface to the zlib data compression library + * + * Copyright (C) 2003 Cosmin Truta. + * Derived from original sources by Bob Dellaca. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +unit zlibpas; + +interface + +const + ZLIB_VERSION = '1.2.3'; + +type + alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; + cdecl; + free_func = procedure(opaque, address: Pointer); + cdecl; + + in_func = function(opaque: Pointer; var buf: PByte): Integer; + cdecl; + out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer; + cdecl; + + z_streamp = ^z_stream; + z_stream = packed record + next_in: PChar; (* next input byte *) + avail_in: Integer; (* number of bytes available at next_in *) + total_in: LongInt; (* total nb of input bytes read so far *) + + next_out: PChar; (* next output byte should be put there *) + avail_out: Integer; (* remaining free space at next_out *) + total_out: LongInt; (* total nb of bytes output so far *) + + msg: PChar; (* last error message, NULL if no error *) + state: Pointer; (* not visible by applications *) + + zalloc: alloc_func; (* used to allocate the internal state *) + zfree: free_func; (* used to free the internal state *) + opaque: Pointer; (* private data object passed to zalloc and zfree *) + + data_type: Integer; (* best guess about the data type: ascii or binary *) + adler: LongInt; (* adler32 value of the uncompressed data *) + reserved: LongInt; (* reserved for future use *) + end; + +(* constants *) +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = -1; + Z_STREAM_ERROR = -2; + Z_DATA_ERROR = -3; + Z_MEM_ERROR = -4; + Z_BUF_ERROR = -5; + Z_VERSION_ERROR = -6; + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = -1; + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + +(* basic functions *) +function zlibVersion: PChar; +function deflateInit(var strm: z_stream; level: Integer): Integer; +function deflate(var strm: z_stream; flush: Integer): Integer; +function deflateEnd(var strm: z_stream): Integer; +function inflateInit(var strm: z_stream): Integer; +function inflate(var strm: z_stream; flush: Integer): Integer; +function inflateEnd(var strm: z_stream): Integer; + +(* advanced functions *) +function deflateInit2(var strm: z_stream; level, method, windowBits, + memLevel, strategy: Integer): Integer; +function deflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function deflateCopy(var dest, source: z_stream): Integer; +function deflateReset(var strm: z_stream): Integer; +function deflateParams(var strm: z_stream; level, strategy: Integer): Integer; +function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt; +function deflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +function inflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function inflateSync(var strm: z_stream): Integer; +function inflateCopy(var dest, source: z_stream): Integer; +function inflateReset(var strm: z_stream): Integer; +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer; + out_fn: out_func; out_desc: Pointer): Integer; +function inflateBackEnd(var strm: z_stream): Integer; +function zlibCompileFlags: LongInt; + +(* utility functions *) +function compress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; +function compress2(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt; + level: Integer): Integer; +function compressBound(sourceLen: LongInt): LongInt; +function uncompress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; + +(* checksum functions *) +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; +function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt; + +(* various hacks, don't look :) *) +function deflateInit_(var strm: z_stream; level: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit_(var strm: z_stream; const version: PChar; + stream_size: Integer): Integer; +function deflateInit2_(var strm: z_stream; + level, method, windowBits, memLevel, strategy: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit2_(var strm: z_stream; windowBits: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateBackInit_(var strm: z_stream; + windowBits: Integer; window: PChar; + const version: PChar; stream_size: Integer): Integer; + + +implementation + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +function adler32; external; +function compress; external; +function compress2; external; +function compressBound; external; +function crc32; external; +function deflate; external; +function deflateBound; external; +function deflateCopy; external; +function deflateEnd; external; +function deflateInit_; external; +function deflateInit2_; external; +function deflateParams; external; +function deflatePrime; external; +function deflateReset; external; +function deflateSetDictionary; external; +function inflate; external; +function inflateBack; external; +function inflateBackEnd; external; +function inflateBackInit_; external; +function inflateCopy; external; +function inflateEnd; external; +function inflateInit_; external; +function inflateInit2_; external; +function inflateReset; external; +function inflateSetDictionary; external; +function inflateSync; external; +function uncompress; external; +function zlibCompileFlags; external; +function zlibVersion; external; + +function deflateInit(var strm: z_stream; level: Integer): Integer; +begin + Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream)); +end; + +function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel, + strategy: Integer): Integer; +begin + Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit(var strm: z_stream): Integer; +begin + Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +begin + Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +begin + Result := inflateBackInit_(strm, windowBits, window, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + GetMem(Result, Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + +end. diff --git a/win32/3rdparty/zlib/contrib/puff/README b/win32/3rdparty/zlib/contrib/puff/README new file mode 100644 index 000000000..bbc4cb595 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/puff/README @@ -0,0 +1,63 @@ +Puff -- A Simple Inflate +3 Mar 2003 +Mark Adler +madler@alumni.caltech.edu + +What this is -- + +puff.c provides the routine puff() to decompress the deflate data format. It +does so more slowly than zlib, but the code is about one-fifth the size of the +inflate code in zlib, and written to be very easy to read. + +Why I wrote this -- + +puff.c was written to document the deflate format unambiguously, by virtue of +being working C code. It is meant to supplement RFC 1951, which formally +describes the deflate format. I have received many questions on details of the +deflate format, and I hope that reading this code will answer those questions. +puff.c is heavily commented with details of the deflate format, especially +those little nooks and cranies of the format that might not be obvious from a +specification. + +puff.c may also be useful in applications where code size or memory usage is a +very limited resource, and speed is not as important. + +How to use it -- + +Well, most likely you should just be reading puff.c and using zlib for actual +applications, but if you must ... + +Include puff.h in your code, which provides this prototype: + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ + +Then you can call puff() to decompress a deflate stream that is in memory in +its entirety at source, to a sufficiently sized block of memory for the +decompressed data at dest. puff() is the only external symbol in puff.c The +only C library functions that puff.c needs are setjmp() and longjmp(), which +are used to simplify error checking in the code to improve readabilty. puff.c +does no memory allocation, and uses less than 2K bytes off of the stack. + +If destlen is not enough space for the uncompressed data, then inflate will +return an error without writing more than destlen bytes. Note that this means +that in order to decompress the deflate data successfully, you need to know +the size of the uncompressed data ahead of time. + +If needed, puff() can determine the size of the uncompressed data with no +output space. This is done by passing dest equal to (unsigned char *)0. Then +the initial value of *destlen is ignored and *destlen is set to the length of +the uncompressed data. So if the size of the uncompressed data is not known, +then two passes of puff() can be used--first to determine the size, and second +to do the actual inflation after allocating the appropriate memory. Not +pretty, but it works. (This is one of the reasons you should be using zlib.) + +The deflate format is self-terminating. If the deflate stream does not end +in *sourcelen bytes, puff() will return an error without reading at or past +endsource. + +On return, *sourcelen is updated to the amount of input data consumed, and +*destlen is updated to the size of the uncompressed data. See the comments +in puff.c for the possible return codes for puff(). diff --git a/win32/3rdparty/zlib/contrib/puff/puff.c b/win32/3rdparty/zlib/contrib/puff/puff.c new file mode 100644 index 000000000..ce0cc405e --- /dev/null +++ b/win32/3rdparty/zlib/contrib/puff/puff.c @@ -0,0 +1,837 @@ +/* + * puff.c + * Copyright (C) 2002-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 1.8, 9 Jan 2004 + * + * puff.c is a simple inflate written to be an unambiguous way to specify the + * deflate format. It is not written for speed but rather simplicity. As a + * side benefit, this code might actually be useful when small code is more + * important than speed, such as bootstrap applications. For typical deflate + * data, zlib's inflate() is about four times as fast as puff(). zlib's + * inflate compiles to around 20K on my machine, whereas puff.c compiles to + * around 4K on my machine (a PowerPC using GNU cc). If the faster decode() + * function here is used, then puff() is only twice as slow as zlib's + * inflate(). + * + * All dynamically allocated memory comes from the stack. The stack required + * is less than 2K bytes. This code is compatible with 16-bit int's and + * assumes that long's are at least 32 bits. puff.c uses the short data type, + * assumed to be 16 bits, for arrays in order to to conserve memory. The code + * works whether integers are stored big endian or little endian. + * + * In the comments below are "Format notes" that describe the inflate process + * and document some of the less obvious aspects of the format. This source + * code is meant to supplement RFC 1951, which formally describes the deflate + * format: + * + * http://www.zlib.org/rfc-deflate.html + */ + +/* + * Change history: + * + * 1.0 10 Feb 2002 - First version + * 1.1 17 Feb 2002 - Clarifications of some comments and notes + * - Update puff() dest and source pointers on negative + * errors to facilitate debugging deflators + * - Remove longest from struct huffman -- not needed + * - Simplify offs[] index in construct() + * - Add input size and checking, using longjmp() to + * maintain easy readability + * - Use short data type for large arrays + * - Use pointers instead of long to specify source and + * destination sizes to avoid arbitrary 4 GB limits + * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), + * but leave simple version for readabilty + * - Make sure invalid distances detected if pointers + * are 16 bits + * - Fix fixed codes table error + * - Provide a scanning mode for determining size of + * uncompressed data + * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Jean-loup] + * - Add a puff.h file for the interface + * - Add braces in puff() for else do [Jean-loup] + * - Use indexes instead of pointers for readability + * 1.4 31 Mar 2002 - Simplify construct() code set check + * - Fix some comments + * - Add FIXLCODES #define + * 1.5 6 Apr 2002 - Minor comment fixes + * 1.6 7 Aug 2002 - Minor format changes + * 1.7 3 Mar 2003 - Added test code for distribution + * - Added zlib-like license + * 1.8 9 Jan 2004 - Added some comments on no distance codes case + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "puff.h" /* prototype for puff() */ + +#define local static /* for local function definitions */ +#define NIL ((unsigned char *)0) /* for no output option */ + +/* + * Maximums for allocations and loops. It is not useful to change these -- + * they are fixed by the deflate format. + */ +#define MAXBITS 15 /* maximum bits in a code */ +#define MAXLCODES 286 /* maximum number of literal/length codes */ +#define MAXDCODES 30 /* maximum number of distance codes */ +#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */ +#define FIXLCODES 288 /* number of fixed literal/length codes */ + +/* input and output state */ +struct state { + /* output state */ + unsigned char *out; /* output buffer */ + unsigned long outlen; /* available space at out */ + unsigned long outcnt; /* bytes written to out so far */ + + /* input state */ + unsigned char *in; /* input buffer */ + unsigned long inlen; /* available input at in */ + unsigned long incnt; /* bytes read so far */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + long val; /* bit accumulator (can use up to 20 bits) */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->incnt == s->inlen) longjmp(s->env, 1); /* out of input */ + val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */ + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = (int)(val >> need); + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return (int)(val & ((1L << need) - 1)); +} + +/* + * Process a stored block. + * + * Format notes: + * + * - After the two-bit stored block type (00), the stored block length and + * stored bytes are byte-aligned for fast copying. Therefore any leftover + * bits in the byte that has the last bit of the type, as many as seven, are + * discarded. The value of the discarded bits are not defined and should not + * be checked against any expectation. + * + * - The second inverted copy of the stored block length does not have to be + * checked, but it's probably a good idea to do so anyway. + * + * - A stored block can have zero length. This is sometimes used to byte-align + * subsets of the compressed data for random access or partial recovery. + */ +local int stored(struct state *s) +{ + unsigned len; /* length of stored block */ + + /* discard leftover bits from current byte (assumes s->bitcnt < 8) */ + s->bitbuf = 0; + s->bitcnt = 0; + + /* get length and check against its one's complement */ + if (s->incnt + 4 > s->inlen) return 2; /* not enough input */ + len = s->in[s->incnt++]; + len |= s->in[s->incnt++] << 8; + if (s->in[s->incnt++] != (~len & 0xff) || + s->in[s->incnt++] != ((~len >> 8) & 0xff)) + return -2; /* didn't match complement! */ + + /* copy len bytes from in to out */ + if (s->incnt + len > s->inlen) return 2; /* not enough input */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; /* not enough output space */ + while (len--) + s->out[s->outcnt++] = s->in[s->incnt++]; + } + else { /* just scanning */ + s->outcnt += len; + s->incnt += len; + } + + /* done with a valid stored block */ + return 0; +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -9 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. A table-based decoding + * scheme (as used in zlib) does not need to do this reversal. + * + * - The first code for the shortest length is all zeros. Subsequent codes of + * the same length are simply integer increments of the previous code. When + * moving up a length, a zero bit is appended to the code. For a complete + * code, the last code of the longest length will be all ones. + * + * - Incomplete codes are handled by this decoder, since they are permitted + * in the deflate format. See the format notes for fixed() and dynamic(). + */ +#ifdef SLOW +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + + code = first = index = 0; + for (len = 1; len <= MAXBITS; len++) { + code |= bits(s, 1); /* get next bit */ + count = h->count[len]; + if (code < first + count) /* if length len, return symbol */ + return h->symbol[index + (code - first)]; + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + } + return -9; /* ran out of codes */ +} + +/* + * A faster version of decode() for real applications of this code. It's not + * as readable, but it makes puff() twice as fast. And it only makes the code + * a few percent larger. + */ +#else /* !SLOW */ +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= bitbuf & 1; + bitbuf >>= 1; + count = *next++; + if (code < first + count) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s->incnt == s->inlen) longjmp(s->env, 1); /* out of input */ + bitbuf = s->in[s->incnt++]; + if (left > 8) left = 8; + } + return -9; /* ran out of codes */ +} +#endif /* SLOW */ + +/* + * Given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + * + * Not used by decode(), but used for error checking, h->count[0] is the number + * of the n symbols not in the code. So n - h->count[0] is the number of + * codes. This is useful for checking for incomplete codes that have more than + * one symbol, which is an error in a dynamic block. + * + * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS + * This is assured by the construction of the length arrays in dynamic() and + * fixed() and is not verified by construct(). + * + * Format notes: + * + * - Permitted and expected examples of incomplete codes are one of the fixed + * codes and any code with a single symbol which in deflate is coded as one + * bit instead of zero bits. See the format notes for fixed() and dynamic(). + * + * - Within a given code length, the symbols are kept in ascending order for + * the code bits definition. + */ +local int construct(struct huffman *h, short *length, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode literal/length and distance codes until an end-of-block code. + * + * Format notes: + * + * - Compressed data that is after the block type if fixed or after the code + * description if dynamic is a combination of literals and length/distance + * pairs terminated by and end-of-block code. Literals are simply Huffman + * coded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - Literals, lengths, and the end-of-block code are combined into a single + * code of up to 286 symbols. They are 256 literals (0..255), 29 length + * symbols (257..285), and the end-of-block symbol (256). + * + * - There are 256 possible lengths (3..258), and so 29 symbols are not enough + * to represent all of those. Lengths 3..10 and 258 are in fact represented + * by just a length symbol. Lengths 11..257 are represented as a symbol and + * some number of extra bits that are added as an integer to the base length + * of the length symbol. The number of extra bits is determined by the base + * length symbol. These are in the static arrays below, lens[] for the base + * lengths and lext[] for the corresponding number of extra bits. + * + * - The reason that 258 gets its own symbol is that the longest length is used + * often in highly redundant files. Note that 258 can also be coded as the + * base value 227 plus the maximum extra value of 31. While a good deflate + * should never do this, it is not an error, and should be decoded properly. + * + * - If a length is decoded, including its extra bits if any, then it is + * followed a distance code. There are up to 30 distance symbols. Again + * there are many more possible distances (1..32768), so extra bits are added + * to a base value represented by the symbol. The distances 1..4 get their + * own symbol, but the rest require extra bits. The base distances and + * corresponding number of extra bits are below in the static arrays dist[] + * and dext[]. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 258 + * simply copies the last byte 258 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. You should not use memcpy() since its behavior is not + * defined for overlapped arrays. You should not use memmove() or bcopy() + * since though their behavior -is- defined for overlapping arrays, it is + * defined to do the wrong thing in this case. + */ +local int codes(struct state *s, + struct huffman *lencode, + struct huffman *distcode) +{ + int symbol; /* decoded symbol */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + static const short lens[29] = { /* Size base for length codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; + static const short lext[29] = { /* Extra bits for length codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; + static const short dists[30] = { /* Offset base for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; + static const short dext[30] = { /* Extra bits for distance codes 0..29 */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + + /* decode literals and length/distance pairs */ + do { + symbol = decode(s, lencode); + if (symbol < 0) return symbol; /* invalid symbol */ + if (symbol < 256) { /* literal: symbol is the byte */ + /* write out the literal */ + if (s->out != NIL) { + if (s->outcnt == s->outlen) return 1; + s->out[s->outcnt] = symbol; + } + s->outcnt++; + } + else if (symbol > 256) { /* length */ + /* get and compute length */ + symbol -= 257; + if (symbol >= 29) return -9; /* invalid fixed code */ + len = lens[symbol] + bits(s, lext[symbol]); + + /* get and check distance */ + symbol = decode(s, distcode); + if (symbol < 0) return symbol; /* invalid symbol */ + dist = dists[symbol] + bits(s, dext[symbol]); + if (dist > s->outcnt) + return -10; /* distance too far back */ + + /* copy length bytes from distance bytes back */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) return 1; + while (len--) { + s->out[s->outcnt] = s->out[s->outcnt - dist]; + s->outcnt++; + } + } + else + s->outcnt += len; + } + } while (symbol != 256); /* end of block symbol */ + + /* done with a valid fixed or dynamic block */ + return 0; +} + +/* + * Process a fixed codes block. + * + * Format notes: + * + * - This block type can be useful for compressing small amounts of data for + * which the size of the code descriptions in a dynamic block exceeds the + * benefit of custom codes for that block. For fixed codes, no bits are + * spent on code descriptions. Instead the code lengths for literal/length + * codes and distance codes are fixed. The specific lengths for each symbol + * can be seen in the "for" loops below. + * + * - The literal/length code is complete, but has two symbols that are invalid + * and should result in an error if received. This cannot be implemented + * simply as an incomplete code since those two symbols are in the "middle" + * of the code. They are eight bits long and the longest literal/length\ + * code is nine bits. Therefore the code must be constructed with those + * symbols, and the invalid symbols must be detected after decoding. + * + * - The fixed distance codes also have two invalid symbols that should result + * in an error if received. Since all of the distance codes are the same + * length, this can be implemented as an incomplete code. Then the invalid + * codes are detected while decoding. + */ +local int fixed(struct state *s) +{ + static int virgin = 1; + static short lencnt[MAXBITS+1], lensym[FIXLCODES]; + static short distcnt[MAXBITS+1], distsym[MAXDCODES]; + static struct huffman lencode = {lencnt, lensym}; + static struct huffman distcode = {distcnt, distsym}; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + int symbol; + short lengths[FIXLCODES]; + + /* literal/length table */ + for (symbol = 0; symbol < 144; symbol++) + lengths[symbol] = 8; + for (; symbol < 256; symbol++) + lengths[symbol] = 9; + for (; symbol < 280; symbol++) + lengths[symbol] = 7; + for (; symbol < FIXLCODES; symbol++) + lengths[symbol] = 8; + construct(&lencode, lengths, FIXLCODES); + + /* distance table */ + for (symbol = 0; symbol < MAXDCODES; symbol++) + lengths[symbol] = 5; + construct(&distcode, lengths, MAXDCODES); + + /* do this just once */ + virgin = 0; + } + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Process a dynamic codes block. + * + * Format notes: + * + * - A dynamic block starts with a description of the literal/length and + * distance codes for that block. New dynamic blocks allow the compressor to + * rapidly adapt to changing data with new codes optimized for that data. + * + * - The codes used by the deflate format are "canonical", which means that + * the actual bits of the codes are generated in an unambiguous way simply + * from the number of bits in each code. Therefore the code descriptions + * are simply a list of code lengths for each symbol. + * + * - The code lengths are stored in order for the symbols, so lengths are + * provided for each of the literal/length symbols, and for each of the + * distance symbols. + * + * - If a symbol is not used in the block, this is represented by a zero as + * as the code length. This does not mean a zero-length code, but rather + * that no code should be created for this symbol. There is no way in the + * deflate format to represent a zero-length code. + * + * - The maximum number of bits in a code is 15, so the possible lengths for + * any code are 1..15. + * + * - The fact that a length of zero is not permitted for a code has an + * interesting consequence. Normally if only one symbol is used for a given + * code, then in fact that code could be represented with zero bits. However + * in deflate, that code has to be at least one bit. So for example, if + * only a single distance base symbol appears in a block, then it will be + * represented by a single code of length one, in particular one 0 bit. This + * is an incomplete code, since if a 1 bit is received, it has no meaning, + * and should result in an error. So incomplete distance codes of one symbol + * should be permitted, and the receipt of invalid codes should be handled. + * + * - It is also possible to have a single literal/length code, but that code + * must be the end-of-block code, since every dynamic block has one. This + * is not the most efficient way to create an empty block (an empty fixed + * block is fewer bits), but it is allowed by the format. So incomplete + * literal/length codes of one symbol should also be permitted. + * + * - If there are only literal codes and no lengths, then there are no distance + * codes. This is represented by one distance code with zero bits. + * + * - The list of up to 286 length/literal lengths and up to 30 distance lengths + * are themselves compressed using Huffman codes and run-length encoding. In + * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means + * that length, and the symbols 16, 17, and 18 are run-length instructions. + * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 + * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols + * are common, hence the special coding for zero lengths. + * + * - The symbols for 0..18 are Huffman coded, and so that code must be + * described first. This is simply a sequence of up to 19 three-bit values + * representing no code (0) or the code length for that symbol (1..7). + * + * - A dynamic block starts with three fixed-size counts from which is computed + * the number of literal/length code lengths, the number of distance code + * lengths, and the number of code length code lengths (ok, you come up with + * a better name!) in the code descriptions. For the literal/length and + * distance codes, lengths after those provided are considered zero, i.e. no + * code. The code length code lengths are received in a permuted order (see + * the order[] array below) to make a short code length code length list more + * likely. As it turns out, very short and very long codes are less likely + * to be seen in a dynamic code description, hence what may appear initially + * to be a peculiar ordering. + * + * - Given the number of literal/length code lengths (nlen) and distance code + * lengths (ndist), then they are treated as one long list of nlen + ndist + * code lengths. Therefore run-length coding can and often does cross the + * boundary between the two sets of lengths. + * + * - So to summarize, the code description at the start of a dynamic block is + * three counts for the number of code lengths for the literal/length codes, + * the distance codes, and the code length codes. This is followed by the + * code length code lengths, three bits each. This is used to construct the + * code length code which is used to read the remainder of the lengths. Then + * the literal/length code lengths and distance lengths are read as a single + * set of lengths using the code length codes. Codes are constructed from + * the resulting two sets of lengths, and then finally you can start + * decoding actual compressed data in the block. + * + * - For reference, a "typical" size for the code description in a dynamic + * block is around 80 bytes. + */ +local int dynamic(struct state *s) +{ + int nlen, ndist, ncode; /* number of lengths in descriptor */ + int index; /* index of lengths[] */ + int err; /* construct() return value */ + short lengths[MAXCODES]; /* descriptor code lengths */ + short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */ + short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */ + struct huffman lencode = {lencnt, lensym}; /* length code */ + struct huffman distcode = {distcnt, distsym}; /* distance code */ + static const short order[19] = /* permutation of code length codes */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* get number of lengths in each table, check lengths */ + nlen = bits(s, 5) + 257; + ndist = bits(s, 5) + 1; + ncode = bits(s, 4) + 4; + if (nlen > MAXLCODES || ndist > MAXDCODES) + return -3; /* bad counts */ + + /* read code length code lengths (really), missing lengths are zero */ + for (index = 0; index < ncode; index++) + lengths[order[index]] = bits(s, 3); + for (; index < 19; index++) + lengths[order[index]] = 0; + + /* build huffman table for code lengths codes (use lencode temporarily) */ + err = construct(&lencode, lengths, 19); + if (err != 0) return -4; /* require complete code set here */ + + /* read length/literal and distance code length tables */ + index = 0; + while (index < nlen + ndist) { + int symbol; /* decoded value */ + int len; /* last length to repeat */ + + symbol = decode(s, &lencode); + if (symbol < 16) /* length in 0..15 */ + lengths[index++] = symbol; + else { /* repeat instruction */ + len = 0; /* assume repeating zeros */ + if (symbol == 16) { /* repeat last length 3..6 times */ + if (index == 0) return -5; /* no last length! */ + len = lengths[index - 1]; /* last length */ + symbol = 3 + bits(s, 2); + } + else if (symbol == 17) /* repeat zero 3..10 times */ + symbol = 3 + bits(s, 3); + else /* == 18, repeat zero 11..138 times */ + symbol = 11 + bits(s, 7); + if (index + symbol > nlen + ndist) + return -6; /* too many lengths! */ + while (symbol--) /* repeat last or zero symbol times */ + lengths[index++] = len; + } + } + + /* build huffman table for literal/length codes */ + err = construct(&lencode, lengths, nlen); + if (err < 0 || (err > 0 && nlen - lencode.count[0] != 1)) + return -7; /* only allow incomplete codes if just one code */ + + /* build huffman table for distance codes */ + err = construct(&distcode, lengths + nlen, ndist); + if (err < 0 || (err > 0 && ndist - distcode.count[0] != 1)) + return -8; /* only allow incomplete codes if just one code */ + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Inflate source to dest. On return, destlen and sourcelen are updated to the + * size of the uncompressed data and the size of the deflate data respectively. + * On success, the return value of puff() is zero. If there is an error in the + * source data, i.e. it is not in the deflate format, then a negative value is + * returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. In that case, destlen and + * sourcelen are not updated to facilitate retrying from the beginning with the + * provision of more input data or more output space. In the case of invalid + * inflate data (a negative error), the dest and source pointers are updated to + * facilitate the debugging of deflators. + * + * puff() also has a mode to determine the size of the uncompressed output with + * no output written. For this dest must be (unsigned char *)0. In this case, + * the input value of *destlen is ignored, and on return *destlen is set to the + * size of the uncompressed output. + * + * The return codes are: + * + * 2: available inflate data did not terminate + * 1: output space exhausted before completing inflate + * 0: successful inflate + * -1: invalid block type (type == 3) + * -2: stored block length did not match one's complement + * -3: dynamic block code description: too many length or distance codes + * -4: dynamic block code description: code lengths codes incomplete + * -5: dynamic block code description: repeat lengths with no first length + * -6: dynamic block code description: repeat more than specified lengths + * -7: dynamic block code description: invalid literal/length code lengths + * -8: dynamic block code description: invalid distance code lengths + * -9: invalid literal/length or distance code in fixed or dynamic block + * -10: distance is too far back in fixed or dynamic block + * + * Format notes: + * + * - Three bits are read for each block to determine the kind of block and + * whether or not it is the last block. Then the block is decoded and the + * process repeated if it was not the last block. + * + * - The leftover bits in the last byte of the deflate data after the last + * block (if it was a fixed or dynamic block) are undefined and have no + * expected values to check. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen) /* amount of input available */ +{ + struct state s; /* input/output state */ + int last, type; /* block information */ + int err; /* return value */ + + /* initialize output state */ + s.out = dest; + s.outlen = *destlen; /* ignored if dest is NIL */ + s.outcnt = 0; + + /* initialize input state */ + s.in = source; + s.inlen = *sourcelen; + s.incnt = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp() */ + err = 2; /* then skip do-loop, return error */ + else { + /* process blocks until last block or error */ + do { + last = bits(&s, 1); /* one if last block */ + type = bits(&s, 2); /* block type 0..3 */ + err = type == 0 ? stored(&s) : + (type == 1 ? fixed(&s) : + (type == 2 ? dynamic(&s) : + -1)); /* type == 3, invalid */ + if (err != 0) break; /* return with error */ + } while (!last); + } + + /* update the lengths and return */ + if (err <= 0) { + *destlen = s.outcnt; + *sourcelen = s.incnt; + } + return err; +} + +#ifdef TEST +/* Example of how to use puff() */ +#include +#include +#include +#include + +local unsigned char *yank(char *name, unsigned long *len) +{ + unsigned long size; + unsigned char *buf; + FILE *in; + struct stat s; + + *len = 0; + if (stat(name, &s)) return NULL; + if ((s.st_mode & S_IFMT) != S_IFREG) return NULL; + size = (unsigned long)(s.st_size); + if (size == 0 || (off_t)size != s.st_size) return NULL; + in = fopen(name, "r"); + if (in == NULL) return NULL; + buf = malloc(size); + if (buf != NULL && fread(buf, 1, size, in) != size) { + free(buf); + buf = NULL; + } + fclose(in); + *len = size; + return buf; +} + +int main(int argc, char **argv) +{ + int ret; + unsigned char *source; + unsigned long len, sourcelen, destlen; + + if (argc < 2) return 2; + source = yank(argv[1], &len); + if (source == NULL) return 2; + sourcelen = len; + ret = puff(NIL, &destlen, source, &sourcelen); + if (ret) + printf("puff() failed with return code %d\n", ret); + else { + printf("puff() succeeded uncompressing %lu bytes\n", destlen); + if (sourcelen < len) printf("%lu compressed bytes unused\n", + len - sourcelen); + } + free(source); + return ret; +} +#endif diff --git a/win32/3rdparty/zlib/contrib/puff/puff.h b/win32/3rdparty/zlib/contrib/puff/puff.h new file mode 100644 index 000000000..ef612520b --- /dev/null +++ b/win32/3rdparty/zlib/contrib/puff/puff.h @@ -0,0 +1,31 @@ +/* puff.h + Copyright (C) 2002, 2003 Mark Adler, all rights reserved + version 1.7, 3 Mar 2002 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * See puff.c for purpose and usage. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ diff --git a/win32/3rdparty/zlib/contrib/testzlib/testzlib.c b/win32/3rdparty/zlib/contrib/testzlib/testzlib.c new file mode 100644 index 000000000..e5574f45e --- /dev/null +++ b/win32/3rdparty/zlib/contrib/testzlib/testzlib.c @@ -0,0 +1,275 @@ +#include +#include +#include + +#include "zlib.h" + + +void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) +{ + R->HighPart = A.HighPart - B.HighPart; + if (A.LowPart >= B.LowPart) + R->LowPart = A.LowPart - B.LowPart; + else + { + R->LowPart = A.LowPart - B.LowPart; + R->HighPart --; + } +} + +#ifdef _M_X64 +// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc +unsigned __int64 __rdtsc(void); +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + // printf("rdtsc = %I64x\n",__rdtsc()); + pbeginTime64->QuadPart=__rdtsc(); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres; + unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); + LIres.QuadPart=res; + // printf("rdtsc = %I64x\n",__rdtsc()); + return LIres; +} +#else +#ifdef _M_IX86 +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ + DWORD dwEdx,dwEax; + _asm + { + rdtsc + mov dwEax,eax + mov dwEdx,edx + } + pbeginTime64->LowPart=dwEax; + pbeginTime64->HighPart=dwEdx; +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + myGetRDTSC32(pbeginTime64); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres,endTime64; + myGetRDTSC32(&endTime64); + + LIres.LowPart=LIres.HighPart=0; + MyDoMinus64(&LIres,endTime64,beginTime64); + return LIres; +} +#else +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER lr; + lr.QuadPart=0; + return lr; +} +#endif +#endif + +void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) +{ + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) + { + pbeginTime64->LowPart = GetTickCount(); + pbeginTime64->HighPart = 0; + } +} + +DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER endTime64,ticksPerSecond,ticks; + DWORDLONG ticksShifted,tickSecShifted; + DWORD dwLog=16+0; + DWORD dwRet; + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) + dwRet = (GetTickCount() - beginTime64.LowPart)*1; + else + { + MyDoMinus64(&ticks,endTime64,beginTime64); + QueryPerformanceFrequency(&ticksPerSecond); + + + { + ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); + tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); + + } + + dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); + dwRet *=1; + } + return dwRet; +} + +int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr) +{ + FILE* stream; + void* ptr; + int retVal=1; + stream=fopen(filename, "rb"); + if (stream==NULL) + return 0; + + fseek(stream,0,SEEK_END); + + *plFileSize=ftell(stream); + fseek(stream,0,SEEK_SET); + ptr=malloc((*plFileSize)+1); + if (ptr==NULL) + retVal=0; + else + { + if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) + retVal=0; + } + fclose(stream); + *pFilePtr=ptr; + return retVal; +} + +int main(int argc, char *argv[]) +{ + int BlockSizeCompress=0x8000; + int BlockSizeUncompress=0x8000; + int cprLevel=Z_DEFAULT_COMPRESSION ; + long lFileSize; + unsigned char* FilePtr; + long lBufferSizeCpr; + long lBufferSizeUncpr; + long lCompressedSize=0; + unsigned char* CprPtr; + unsigned char* UncprPtr; + long lSizeCpr,lSizeUncpr; + DWORD dwGetTick,dwMsecQP; + LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; + + if (argc<=1) + { + printf("run TestZlib [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); + return 0; + } + + if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) + { + printf("error reading %s\n",argv[1]); + return 1; + } + else printf("file %s read, %u bytes\n",argv[1],lFileSize); + + if (argc>=3) + BlockSizeCompress=atol(argv[2]); + + if (argc>=4) + BlockSizeUncompress=atol(argv[3]); + + if (argc>=5) + cprLevel=(int)atol(argv[4]); + + lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; + lBufferSizeUncpr = lBufferSizeCpr; + + CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lFileSize; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + deflateInit(&zcpr,cprLevel); + + zcpr.next_in = FilePtr; + zcpr.next_out = CprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); + zcpr.avail_out = BlockSizeCompress; + ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeCpr=zcpr.total_out; + deflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total compress size = %u, in %u step\n",lSizeCpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); + UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lSizeCpr; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + inflateInit(&zcpr); + + zcpr.next_in = CprPtr; + zcpr.next_out = UncprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); + zcpr.avail_out = BlockSizeUncompress; + ret=inflate(&zcpr,Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeUncpr=zcpr.total_out; + inflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + if (lSizeUncpr==lFileSize) + { + if (memcmp(FilePtr,UncprPtr,lFileSize)==0) + printf("compare ok\n"); + + } + + return 0; +} diff --git a/win32/3rdparty/zlib/contrib/testzlib/testzlib.txt b/win32/3rdparty/zlib/contrib/testzlib/testzlib.txt new file mode 100644 index 000000000..62258f149 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/testzlib/testzlib.txt @@ -0,0 +1,10 @@ +To build testzLib with Visual Studio 2005: + +copy to a directory file from : +- root of zLib tree +- contrib/testzlib +- contrib/masmx86 +- contrib/masmx64 +- contrib/vstudio/vc7 + +and open testzlib8.sln \ No newline at end of file diff --git a/win32/3rdparty/zlib/contrib/untgz/Makefile.msc b/win32/3rdparty/zlib/contrib/untgz/Makefile.msc new file mode 100644 index 000000000..77b860221 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/untgz/Makefile.msc @@ -0,0 +1,17 @@ +CC=cl +CFLAGS=-MD + +untgz.exe: untgz.obj ..\..\zlib.lib + $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib + +untgz.obj: untgz.c ..\..\zlib.h + $(CC) $(CFLAGS) -c -I..\.. untgz.c + +..\..\zlib.lib: + cd ..\.. + $(MAKE) -f win32\makefile.msc + cd contrib\untgz + +clean: + -del untgz.obj + -del untgz.exe diff --git a/win32/3rdparty/zlib/contrib/untgz/untgz.c b/win32/3rdparty/zlib/contrib/untgz/untgz.c new file mode 100644 index 000000000..2c391e598 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/untgz/untgz.c @@ -0,0 +1,674 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +#include +#include +#include +#include +#include + +#include "zlib.h" + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + +int tar (gzFile in,int action,int arg,int argc,char **argv) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + case DIRTYPE: + if (action == TGZ_LIST) + printf(" %s %s\n",strtime(&tartime),fname); + if (action == TGZ_EXTRACT) + { + makedir(fname); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (matchname(arg,argc,argv,fname)) + { + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory */ + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname); + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + +int main(int argc,char **argv) +{ + int action = TGZ_EXTRACT; + int arg = 1; + char *TGZfile; + gzFile *f; + + prog = strrchr(argv[0],'\\'); + if (prog == NULL) + { + prog = strrchr(argv[0],'/'); + if (prog == NULL) + { + prog = strrchr(argv[0],':'); + if (prog == NULL) + prog = argv[0]; + else + prog++; + } + else + prog++; + } + else + prog++; + + if (argc == 1) + help(0); + + if (strcmp(argv[arg],"-l") == 0) + { + action = TGZ_LIST; + if (argc == ++arg) + help(0); + } + else if (strcmp(argv[arg],"-h") == 0) + { + help(0); + } + + if ((TGZfile = TGZfname(argv[arg])) == NULL) + TGZnotfound(argv[arg]); + + ++arg; + if ((action == TGZ_LIST) && (arg != argc)) + help(1); + +/* + * Process the TGZ file + */ + switch(action) + { + case TGZ_LIST: + case TGZ_EXTRACT: + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + exit(tar(f, action, arg, argc, argv)); + break; + + default: + error("Unknown option"); + exit(1); + } + + return 0; +} diff --git a/win32/3rdparty/zlib/contrib/vstudio/readme.txt b/win32/3rdparty/zlib/contrib/vstudio/readme.txt new file mode 100644 index 000000000..16159f9cd --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/readme.txt @@ -0,0 +1,73 @@ +Building instructions for the DLL versions of Zlib 1.2.3 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 7.0/7.1, and Visual C++ . + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + + +Build instructions for Visual Studio 7.x (32 bits) +-------------------------------------------------- +- Uncompress current zlib, including all contrib/* files +- Download the crtdll library from + http://www.winimage.com/zLibDll/crtdll.zip + Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc7. +- Open contrib\vstudio\vc7\zlibvc.sln with Microsoft Visual C++ 7.x + (Visual Studio .Net 2002 or 2003). + +Build instructions for Visual Studio 2005 (32 bits or 64 bits) +-------------------------------------------------------------- +- Uncompress current zlib, including all contrib/* files +- For 32 bits only: download the crtdll library from + http://www.winimage.com/zLibDll/crtdll.zip + Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc8. +- Open contrib\vstudio\vc8\zlibvc.sln with Microsoft Visual C++ 8.0 + +Build instructions for Visual Studio 2005 64 bits, PSDK compiler +---------------------------------------------------------------- +at the time of writing this text file, Visual Studio 2005 (and + Microsoft Visual C++ 8.0) is on the beta 2 stage. +Using you can get the free 64 bits compiler from Platform SDK, + which is NOT a beta, and compile using the Visual studio 2005 IDE +see http://www.winimage.com/misc/sdk64onvs2005/ for instruction + +- Uncompress current zlib, including all contrib/* files +- start Visual Studio 2005 from a platform SDK command prompt, using + the /useenv switch +- Open contrib\vstudio\vc8\zlibvc.sln with Microsoft Visual C++ 8.0 + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/miniunz.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc7/miniunz.vcproj new file mode 100644 index 000000000..ad5117c84 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/miniunz.vcproj @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/minizip.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc7/minizip.vcproj new file mode 100644 index 000000000..fb5b6320d --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/minizip.vcproj @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/testzlib.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc7/testzlib.vcproj new file mode 100644 index 000000000..97bc3e8c8 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/testzlib.vcproj @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/zlib.rc b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlib.rc new file mode 100644 index 000000000..72cb8b4c3 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1,2,3,0 + PRODUCTVERSION 1,2,3,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", "1.2.3.0\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlib.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2003 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibstat.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibstat.vcproj new file mode 100644 index 000000000..766d7a4d6 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibstat.vcproj @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.def b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.def new file mode 100644 index 000000000..a40e71541 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.def @@ -0,0 +1,92 @@ + +VERSION 1.23 + +HEAPSIZE 1048576,8192 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.sln b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.sln new file mode 100644 index 000000000..927b42b7b --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.sln @@ -0,0 +1,78 @@ +Microsoft Visual Studio Solution File, Format Version 7.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testZlibDll", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}" +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ConfigName.0 = Debug + ConfigName.1 = Release + ConfigName.2 = ReleaseAxp + ConfigName.3 = ReleaseWithoutAsm + ConfigName.4 = ReleaseWithoutCrtdll + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseAxp.ActiveCfg = ReleaseAxp|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseAxp.Build.0 = ReleaseAxp|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutCrtdll.ActiveCfg = ReleaseAxp|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutCrtdll.Build.0 = ReleaseAxp|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseAxp.ActiveCfg = ReleaseAxp|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseAxp.Build.0 = ReleaseAxp|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutCrtdll.ActiveCfg = ReleaseWithoutCrtdll|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutCrtdll.Build.0 = ReleaseWithoutCrtdll|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseAxp.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseAxp.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutCrtdll.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseAxp.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseAxp.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Debug.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Debug.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Release.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Release.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseAxp.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseAxp.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutAsm.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutAsm.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutCrtdll.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.vcproj new file mode 100644 index 000000000..8533b4947 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc7/zlibvc.vcproj @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/miniunz.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc8/miniunz.vcproj new file mode 100644 index 000000000..4af53e8a3 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/miniunz.vcproj @@ -0,0 +1,566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/minizip.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc8/minizip.vcproj new file mode 100644 index 000000000..85f64c4d2 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/minizip.vcproj @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/testzlib.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc8/testzlib.vcproj new file mode 100644 index 000000000..68c353991 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/testzlib.vcproj @@ -0,0 +1,948 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/testzlibdll.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc8/testzlibdll.vcproj new file mode 100644 index 000000000..f38ab5e08 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/testzlibdll.vcproj @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/zlib.rc b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlib.rc new file mode 100644 index 000000000..72cb8b4c3 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1,2,3,0 + PRODUCTVERSION 1,2,3,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", "1.2.3.0\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlib.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2003 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibstat.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibstat.vcproj new file mode 100644 index 000000000..fb97037ac --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibstat.vcproj @@ -0,0 +1,870 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.def b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.def new file mode 100644 index 000000000..a40e71541 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.def @@ -0,0 +1,92 @@ + +VERSION 1.23 + +HEAPSIZE 1048576,8192 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.sln b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.sln new file mode 100644 index 000000000..a815a5549 --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.sln @@ -0,0 +1,144 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Itanium + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.vcproj b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.vcproj new file mode 100644 index 000000000..e717011df --- /dev/null +++ b/win32/3rdparty/zlib/contrib/vstudio/vc8/zlibvc.vcproj @@ -0,0 +1,1219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/3rdparty/zlib/crc32.c b/win32/3rdparty/zlib/crc32.c new file mode 100644 index 000000000..f658a9ef5 --- /dev/null +++ b/win32/3rdparty/zlib/crc32.c @@ -0,0 +1,423 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/win32/3rdparty/zlib/crc32.h b/win32/3rdparty/zlib/crc32.h new file mode 100644 index 000000000..8053b6117 --- /dev/null +++ b/win32/3rdparty/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/win32/3rdparty/zlib/deflate.c b/win32/3rdparty/zlib/deflate.c new file mode 100644 index 000000000..29ce1f64a --- /dev/null +++ b/win32/3rdparty/zlib/deflate.c @@ -0,0 +1,1736 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +#if 0 +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt run; /* length of run */ + uInt max; /* maximum length of run */ + uInt prev; /* byte at distance one to match */ + Bytef *scan; /* scan for end of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + run = 0; + if (s->strstart > 0) { /* if there is a previous byte, that is */ + max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + scan = s->window + s->strstart - 1; + prev = *scan++; + do { + if (*scan++ != prev) + break; + } while (++run < max); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (run >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, run); + _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); + s->lookahead -= run; + s->strstart += run; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif diff --git a/win32/3rdparty/zlib/deflate.h b/win32/3rdparty/zlib/deflate.h new file mode 100644 index 000000000..05a5ab3a2 --- /dev/null +++ b/win32/3rdparty/zlib/deflate.h @@ -0,0 +1,331 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/win32/3rdparty/zlib/example.c b/win32/3rdparty/zlib/example.c new file mode 100644 index 000000000..6c8a0ee76 --- /dev/null +++ b/win32/3rdparty/zlib/example.c @@ -0,0 +1,565 @@ +/* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2004 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include +#include "zlib.h" + +#ifdef STDC +# include +# include +#endif + +#if defined(VMS) || defined(RISCOS) +# define TESTFILE "foo-gz" +#else +# define TESTFILE "foo.gz" +#endif + +#define CHECK_ERR(err, msg) { \ + if (err != Z_OK) { \ + fprintf(stderr, "%s error: %d\n", msg, err); \ + exit(1); \ + } \ +} + +const char hello[] = "hello, hello!"; +/* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + */ + +const char dictionary[] = "hello"; +uLong dictId; /* Adler32 value of the dictionary */ + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); +void test_deflate OF((Byte *compr, uLong comprLen)); +void test_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_deflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_flush OF((Byte *compr, uLong *comprLen)); +void test_sync OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_dict_deflate OF((Byte *compr, uLong comprLen)); +void test_dict_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Test compress() and uncompress() + */ +void test_compress(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + uLong len = (uLong)strlen(hello)+1; + + err = compress(compr, &comprLen, (const Bytef*)hello, len); + CHECK_ERR(err, "compress"); + + strcpy((char*)uncompr, "garbage"); + + err = uncompress(uncompr, &uncomprLen, compr, comprLen); + CHECK_ERR(err, "uncompress"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad uncompress\n"); + exit(1); + } else { + printf("uncompress(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test read/write of .gz files + */ +void test_gzio(fname, uncompr, uncomprLen) + const char *fname; /* compressed file name */ + Byte *uncompr; + uLong uncomprLen; +{ +#ifdef NO_GZCOMPRESS + fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); +#else + int err; + int len = (int)strlen(hello)+1; + gzFile file; + z_off_t pos; + + file = gzopen(fname, "wb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + gzputc(file, 'h'); + if (gzputs(file, "ello") != 4) { + fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); + exit(1); + } + if (gzprintf(file, ", %s!", "hello") != 8) { + fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); + exit(1); + } + gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ + gzclose(file); + + file = gzopen(fname, "rb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + strcpy((char*)uncompr, "garbage"); + + if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { + fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); + exit(1); + } else { + printf("gzread(): %s\n", (char*)uncompr); + } + + pos = gzseek(file, -8L, SEEK_CUR); + if (pos != 6 || gztell(file) != pos) { + fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", + (long)pos, (long)gztell(file)); + exit(1); + } + + if (gzgetc(file) != ' ') { + fprintf(stderr, "gzgetc error\n"); + exit(1); + } + + if (gzungetc(' ', file) != ' ') { + fprintf(stderr, "gzungetc error\n"); + exit(1); + } + + gzgets(file, (char*)uncompr, (int)uncomprLen); + if (strlen((char*)uncompr) != 7) { /* " hello!" */ + fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello + 6)) { + fprintf(stderr, "bad gzgets after gzseek\n"); + exit(1); + } else { + printf("gzgets() after gzseek: %s\n", (char*)uncompr); + } + + gzclose(file); +#endif +} + +/* =========================================================================== + * Test deflate() with small buffers + */ +void test_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uLong len = (uLong)strlen(hello)+1; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (Bytef*)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = deflate(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with small buffers + */ +void test_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 0; + d_stream.next_out = uncompr; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { + d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate\n"); + exit(1); + } else { + printf("inflate(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test deflate() with large buffers and dynamic change of compression level + */ +void test_large_deflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_SPEED); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + /* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + */ + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + if (c_stream.avail_in != 0) { + fprintf(stderr, "deflate not greedy\n"); + exit(1); + } + + /* Feed in already compressed data and switch to no compression: */ + deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in = compr; + c_stream.avail_in = (uInt)comprLen/2; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + /* Switch back to compressing mode: */ + deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with large buffers + */ +void test_large_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + for (;;) { + d_stream.next_out = uncompr; /* discard the output */ + d_stream.avail_out = (uInt)uncomprLen; + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "large inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (d_stream.total_out != 2*uncomprLen + comprLen/2) { + fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); + exit(1); + } else { + printf("large_inflate(): OK\n"); + } +} + +/* =========================================================================== + * Test deflate() with full flush + */ +void test_flush(compr, comprLen) + Byte *compr; + uLong *comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uInt len = (uInt)strlen(hello)+1; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (Bytef*)hello; + c_stream.next_out = compr; + c_stream.avail_in = 3; + c_stream.avail_out = (uInt)*comprLen; + err = deflate(&c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, "deflate"); + + compr[3]++; /* force an error in first compressed block */ + c_stream.avail_in = len - 3; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + CHECK_ERR(err, "deflate"); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + *comprLen = c_stream.total_out; +} + +/* =========================================================================== + * Test inflateSync() + */ +void test_sync(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 2; /* just read the zlib header */ + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + inflate(&d_stream, Z_NO_FLUSH); + CHECK_ERR(err, "inflate"); + + d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ + err = inflateSync(&d_stream); /* but skip the damaged part */ + CHECK_ERR(err, "inflateSync"); + + err = inflate(&d_stream, Z_FINISH); + if (err != Z_DATA_ERROR) { + fprintf(stderr, "inflate should report DATA_ERROR\n"); + /* Because of incorrect adler32 */ + exit(1); + } + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + printf("after inflateSync(): hel%s\n", (char *)uncompr); +} + +/* =========================================================================== + * Test deflate() with preset dictionary + */ +void test_dict_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + err = deflateSetDictionary(&c_stream, + (const Bytef*)dictionary, sizeof(dictionary)); + CHECK_ERR(err, "deflateSetDictionary"); + + dictId = c_stream.adler; + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + c_stream.next_in = (Bytef*)hello; + c_stream.avail_in = (uInt)strlen(hello)+1; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with a preset dictionary + */ +void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + for (;;) { + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + if (err == Z_NEED_DICT) { + if (d_stream.adler != dictId) { + fprintf(stderr, "unexpected dictionary"); + exit(1); + } + err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, + sizeof(dictionary)); + } + CHECK_ERR(err, "inflate with dict"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate with dict\n"); + exit(1); + } else { + printf("inflate with dictionary: %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Usage: example [output.gz [input.gz]] + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + Byte *compr, *uncompr; + uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ + uLong uncomprLen = comprLen; + static const char* myVersion = ZLIB_VERSION; + + if (zlibVersion()[0] != myVersion[0]) { + fprintf(stderr, "incompatible zlib version\n"); + exit(1); + + } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { + fprintf(stderr, "warning: different zlib version\n"); + } + + printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", + ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); + + compr = (Byte*)calloc((uInt)comprLen, 1); + uncompr = (Byte*)calloc((uInt)uncomprLen, 1); + /* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + */ + if (compr == Z_NULL || uncompr == Z_NULL) { + printf("out of memory\n"); + exit(1); + } + test_compress(compr, comprLen, uncompr, uncomprLen); + + test_gzio((argc > 1 ? argv[1] : TESTFILE), + uncompr, uncomprLen); + + test_deflate(compr, comprLen); + test_inflate(compr, comprLen, uncompr, uncomprLen); + + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + + test_flush(compr, &comprLen); + test_sync(compr, comprLen, uncompr, uncomprLen); + comprLen = uncomprLen; + + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + return 0; +} diff --git a/win32/3rdparty/zlib/examples/README.examples b/win32/3rdparty/zlib/examples/README.examples new file mode 100644 index 000000000..5632d7a4c --- /dev/null +++ b/win32/3rdparty/zlib/examples/README.examples @@ -0,0 +1,42 @@ +This directory contains examples of the use of zlib. + +fitblk.c + compress just enough input to nearly fill a requested output size + - zlib isn't designed to do this, but fitblk does it anyway + +gun.c + uncompress a gzip file + - illustrates the use of inflateBack() for high speed file-to-file + decompression using call-back functions + - is approximately twice as fast as gzip -d + - also provides Unix uncompress functionality, again twice as fast + +gzappend.c + append to a gzip file + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of deflatePrime() to start at any bit + +gzjoin.c + join gzip files without recalculating the crc or recompressing + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of crc32_combine() + +gzlog.c +gzlog.h + efficiently maintain a message log file in gzip format + - illustrates use of raw deflate and Z_SYNC_FLUSH + - illustrates use of gzip header extra field + +zlib_how.html + painfully comprehensive description of zpipe.c (see below) + - describes in excruciating detail the use of deflate() and inflate() + +zpipe.c + reads and writes zlib streams from stdin to stdout + - illustrates the proper use of deflate() and inflate() + - deeply commented in zlib_how.html (see above) + +zran.c + index a zlib or gzip stream and randomly access it + - illustrates the use of Z_BLOCK, inflatePrime(), and + inflateSetDictionary() to provide random access diff --git a/win32/3rdparty/zlib/examples/fitblk.c b/win32/3rdparty/zlib/examples/fitblk.c new file mode 100644 index 000000000..c61de5c99 --- /dev/null +++ b/win32/3rdparty/zlib/examples/fitblk.c @@ -0,0 +1,233 @@ +/* fitblk.c: example of fitting compressed output to a specified size + Not copyrighted -- provided to the public domain + Version 1.1 25 November 2004 Mark Adler */ + +/* Version history: + 1.0 24 Nov 2004 First version + 1.1 25 Nov 2004 Change deflateInit2() to deflateInit() + Use fixed-size, stack-allocated raw buffers + Simplify code moving compression to subroutines + Use assert() for internal errors + Add detailed description of approach + */ + +/* Approach to just fitting a requested compressed size: + + fitblk performs three compression passes on a portion of the input + data in order to determine how much of that input will compress to + nearly the requested output block size. The first pass generates + enough deflate blocks to produce output to fill the requested + output size plus a specfied excess amount (see the EXCESS define + below). The last deflate block may go quite a bit past that, but + is discarded. The second pass decompresses and recompresses just + the compressed data that fit in the requested plus excess sized + buffer. The deflate process is terminated after that amount of + input, which is less than the amount consumed on the first pass. + The last deflate block of the result will be of a comparable size + to the final product, so that the header for that deflate block and + the compression ratio for that block will be about the same as in + the final product. The third compression pass decompresses the + result of the second step, but only the compressed data up to the + requested size minus an amount to allow the compressed stream to + complete (see the MARGIN define below). That will result in a + final compressed stream whose length is less than or equal to the + requested size. Assuming sufficient input and a requested size + greater than a few hundred bytes, the shortfall will typically be + less than ten bytes. + + If the input is short enough that the first compression completes + before filling the requested output size, then that compressed + stream is return with no recompression. + + EXCESS is chosen to be just greater than the shortfall seen in a + two pass approach similar to the above. That shortfall is due to + the last deflate block compressing more efficiently with a smaller + header on the second pass. EXCESS is set to be large enough so + that there is enough uncompressed data for the second pass to fill + out the requested size, and small enough so that the final deflate + block of the second pass will be close in size to the final deflate + block of the third and final pass. MARGIN is chosen to be just + large enough to assure that the final compression has enough room + to complete in all cases. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +/* print nastygram and leave */ +local void quit(char *why) +{ + fprintf(stderr, "fitblk abort: %s\n", why); + exit(1); +} + +#define RAWLEN 4096 /* intermediate uncompressed buffer size */ + +/* compress from file to def until provided buffer is full or end of + input reached; return last deflate() return value, or Z_ERRNO if + there was read error on the file */ +local int partcompress(FILE *in, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + def->avail_in = fread(raw, 1, RAWLEN, in); + if (ferror(in)) + return Z_ERRNO; + def->next_in = raw; + if (feof(in)) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (def->avail_out != 0 && flush == Z_NO_FLUSH); + return ret; +} + +/* recompress from inf's input to def's output; the input for inf and + the output for def are set in those structures before calling; + return last deflate() return value, or Z_MEM_ERROR if inflate() + was not able to allocate enough memory when it needed to */ +local int recompress(z_streamp inf, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + /* decompress */ + inf->avail_out = RAWLEN; + inf->next_out = raw; + ret = inflate(inf, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR && + ret != Z_NEED_DICT); + if (ret == Z_MEM_ERROR) + return ret; + + /* compress what was decompresed until done or no room */ + def->avail_in = RAWLEN - inf->avail_out; + def->next_in = raw; + if (inf->avail_out != 0) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (ret != Z_STREAM_END && def->avail_out != 0); + return ret; +} + +#define EXCESS 256 /* empirically determined stream overage */ +#define MARGIN 8 /* amount to back off for completion */ + +/* compress from stdin to fixed-size block on stdout */ +int main(int argc, char **argv) +{ + int ret; /* return code */ + unsigned size; /* requested fixed output block size */ + unsigned have; /* bytes written by deflate() call */ + unsigned char *blk; /* intermediate and final stream */ + unsigned char *tmp; /* close to desired size stream */ + z_stream def, inf; /* zlib deflate and inflate states */ + + /* get requested output size */ + if (argc != 2) + quit("need one argument: size of output block"); + ret = strtol(argv[1], argv + 1, 10); + if (argv[1][0] != 0) + quit("argument must be a number"); + if (ret < 8) /* 8 is minimum zlib stream size */ + quit("need positive size of 8 or greater"); + size = (unsigned)ret; + + /* allocate memory for buffers and compression engine */ + blk = malloc(size + EXCESS); + def.zalloc = Z_NULL; + def.zfree = Z_NULL; + def.opaque = Z_NULL; + ret = deflateInit(&def, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK || blk == NULL) + quit("out of memory"); + + /* compress from stdin until output full, or no more input */ + def.avail_out = size + EXCESS; + def.next_out = blk; + ret = partcompress(stdin, &def); + if (ret == Z_ERRNO) + quit("error reading input"); + + /* if it all fit, then size was undersubscribed -- done! */ + if (ret == Z_STREAM_END && def.avail_out >= EXCESS) { + /* write block to stdout */ + have = size + EXCESS - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (all input)\n", + size - have, size); + return 0; + } + + /* it didn't all fit -- set up for recompression */ + inf.zalloc = Z_NULL; + inf.zfree = Z_NULL; + inf.opaque = Z_NULL; + inf.avail_in = 0; + inf.next_in = Z_NULL; + ret = inflateInit(&inf); + tmp = malloc(size + EXCESS); + if (ret != Z_OK || tmp == NULL) + quit("out of memory"); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do first recompression close to the right amount */ + inf.avail_in = size + EXCESS; + inf.next_in = blk; + def.avail_out = size + EXCESS; + def.next_out = tmp; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + + /* set up for next reocmpression */ + ret = inflateReset(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do second and final recompression (third compression) */ + inf.avail_in = size - MARGIN; /* assure stream will complete */ + inf.next_in = tmp; + def.avail_out = size; + def.next_out = blk; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */ + + /* done -- write block to stdout */ + have = size - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + free(tmp); + ret = inflateEnd(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (%lu input)\n", + size - have, size, def.total_in); + return 0; +} diff --git a/win32/3rdparty/zlib/examples/gun.c b/win32/3rdparty/zlib/examples/gun.c new file mode 100644 index 000000000..bfec590a0 --- /dev/null +++ b/win32/3rdparty/zlib/examples/gun.c @@ -0,0 +1,693 @@ +/* gun.c -- simple gunzip to give an example of the use of inflateBack() + * Copyright (C) 2003, 2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.3 12 June 2005 Mark Adler */ + +/* Version history: + 1.0 16 Feb 2003 First version for testing of inflateBack() + 1.1 21 Feb 2005 Decompress concatenated gzip streams + Remove use of "this" variable (C++ keyword) + Fix return value for in() + Improve allocation failure checking + Add typecasting for void * structures + Add -h option for command version and usage + Add a bunch of comments + 1.2 20 Mar 2005 Add Unix compress (LZW) decompression + Copy file attributes from input file to output file + 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] + */ + +/* + gun [ -t ] [ name ... ] + + decompresses the data in the named gzip files. If no arguments are given, + gun will decompress from stdin to stdout. The names must end in .gz, -gz, + .z, -z, _z, or .Z. The uncompressed data will be written to a file name + with the suffix stripped. On success, the original file is deleted. On + failure, the output file is deleted. For most failures, the command will + continue to process the remaining names on the command line. A memory + allocation failure will abort the command. If -t is specified, then the + listed files or stdin will be tested as gzip files for integrity (without + checking for a proper suffix), no output will be written, and no files + will be deleted. + + Like gzip, gun allows concatenated gzip streams and will decompress them, + writing all of the uncompressed data to the output. Unlike gzip, gun allows + an empty file on input, and will produce no error writing an empty output + file. + + gun will also decompress files made by Unix compress, which uses LZW + compression. These files are automatically detected by virtue of their + magic header bytes. Since the end of Unix compress stream is marked by the + end-of-file, they cannot be concantenated. If a Unix compress stream is + encountered in an input file, it is the last stream in that file. + + Like gunzip and uncompress, the file attributes of the orignal compressed + file are maintained in the final uncompressed file, to the extent that the + user permissions allow it. + + On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version + 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the + LZW decompression provided by gun is about twice as fast as the standard + Unix uncompress command. + */ + +/* external functions and related types and constants */ +#include /* fprintf() */ +#include /* malloc(), free() */ +#include /* strerror(), strcmp(), strlen(), memcpy() */ +#include /* errno */ +#include /* open() */ +#include /* read(), write(), close(), chown(), unlink() */ +#include +#include /* stat(), chmod() */ +#include /* utime() */ +#include "zlib.h" /* inflateBackInit(), inflateBack(), */ + /* inflateBackEnd(), crc32() */ + +/* function declaration */ +#define local static + +/* buffer constants */ +#define SIZE 32768U /* input and output buffer sizes */ +#define PIECE 16384 /* limits i/o chunks for 16-bit int case */ + +/* structure for infback() to pass to input function in() -- it maintains the + input file and a buffer of size SIZE */ +struct ind { + int infile; + unsigned char *inbuf; +}; + +/* Load input buffer, assumed to be empty, and return bytes loaded and a + pointer to them. read() is called until the buffer is full, or until it + returns end-of-file or error. Return 0 on error. */ +local unsigned in(void *in_desc, unsigned char **buf) +{ + int ret; + unsigned len; + unsigned char *next; + struct ind *me = (struct ind *)in_desc; + + next = me->inbuf; + *buf = next; + len = 0; + do { + ret = PIECE; + if ((unsigned)ret > SIZE - len) + ret = (int)(SIZE - len); + ret = (int)read(me->infile, next, ret); + if (ret == -1) { + len = 0; + break; + } + next += ret; + len += ret; + } while (ret != 0 && len < SIZE); + return len; +} + +/* structure for infback() to pass to output function out() -- it maintains the + output file, a running CRC-32 check on the output and the total number of + bytes output, both for checking against the gzip trailer. (The length in + the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and + the output is greater than 4 GB.) */ +struct outd { + int outfile; + int check; /* true if checking crc and total */ + unsigned long crc; + unsigned long total; +}; + +/* Write output buffer and update the CRC-32 and total bytes written. write() + is called until all of the output is written or an error is encountered. + On success out() returns 0. For a write failure, out() returns 1. If the + output file descriptor is -1, then nothing is written. + */ +local int out(void *out_desc, unsigned char *buf, unsigned len) +{ + int ret; + struct outd *me = (struct outd *)out_desc; + + if (me->check) { + me->crc = crc32(me->crc, buf, len); + me->total += len; + } + if (me->outfile != -1) + do { + ret = PIECE; + if ((unsigned)ret > len) + ret = (int)len; + ret = (int)write(me->outfile, buf, ret); + if (ret == -1) + return 1; + buf += ret; + len -= ret; + } while (len != 0); + return 0; +} + +/* next input byte macro for use inside lunpipe() and gunpipe() */ +#define NEXT() (have ? 0 : (have = in(indp, &next)), \ + last = have ? (have--, (int)(*next++)) : -1) + +/* memory for gunpipe() and lunpipe() -- + the first 256 entries of prefix[] and suffix[] are never used, could + have offset the index, but it's faster to waste the memory */ +unsigned char inbuf[SIZE]; /* input buffer */ +unsigned char outbuf[SIZE]; /* output buffer */ +unsigned short prefix[65536]; /* index to LZW prefix string */ +unsigned char suffix[65536]; /* one-character LZW suffix */ +unsigned char match[65280 + 2]; /* buffer for reversed match or gzip + 32K sliding window */ + +/* throw out what's left in the current bits byte buffer (this is a vestigial + aspect of the compressed data format derived from an implementation that + made use of a special VAX machine instruction!) */ +#define FLUSHCODE() \ + do { \ + left = 0; \ + rem = 0; \ + if (chunk > have) { \ + chunk -= have; \ + have = 0; \ + if (NEXT() == -1) \ + break; \ + chunk--; \ + if (chunk > have) { \ + chunk = have = 0; \ + break; \ + } \ + } \ + have -= chunk; \ + next += chunk; \ + chunk = 0; \ + } while (0) + +/* Decompress a compress (LZW) file from indp to outfile. The compress magic + header (two bytes) has already been read and verified. There are have bytes + of buffered input at next. strm is used for passing error information back + to gunpipe(). + + lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of + file, read error, or write error (a write error indicated by strm->next_in + not equal to Z_NULL), or Z_DATA_ERROR for invalid input. + */ +local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, + int outfile, z_stream *strm) +{ + int last; /* last byte read by NEXT(), or -1 if EOF */ + int chunk; /* bytes left in current chunk */ + int left; /* bits left in rem */ + unsigned rem; /* unused bits from input */ + int bits; /* current bits per code */ + unsigned code; /* code, table traversal index */ + unsigned mask; /* mask for current bits codes */ + int max; /* maximum bits per code for this stream */ + int flags; /* compress flags, then block compress flag */ + unsigned end; /* last valid entry in prefix/suffix tables */ + unsigned temp; /* current code */ + unsigned prev; /* previous code */ + unsigned final; /* last character written for previous code */ + unsigned stack; /* next position for reversed string */ + unsigned outcnt; /* bytes in output buffer */ + struct outd outd; /* output structure */ + + /* set up output */ + outd.outfile = outfile; + outd.check = 0; + + /* process remainder of compress header -- a flags byte */ + flags = NEXT(); + if (last == -1) + return Z_BUF_ERROR; + if (flags & 0x60) { + strm->msg = (char *)"unknown lzw flags set"; + return Z_DATA_ERROR; + } + max = flags & 0x1f; + if (max < 9 || max > 16) { + strm->msg = (char *)"lzw bits out of range"; + return Z_DATA_ERROR; + } + if (max == 9) /* 9 doesn't really mean 9 */ + max = 10; + flags &= 0x80; /* true if block compress */ + + /* clear table */ + bits = 9; + mask = 0x1ff; + end = flags ? 256 : 255; + + /* set up: get first 9-bit code, which is the first decompressed byte, but + don't create a table entry until the next code */ + if (NEXT() == -1) /* no compressed data is ok */ + return Z_OK; + final = prev = (unsigned)last; /* low 8 bits of code */ + if (NEXT() == -1) /* missing a bit */ + return Z_BUF_ERROR; + if (last & 1) { /* code must be < 256 */ + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + rem = (unsigned)last >> 1; /* remaining 7 bits */ + left = 7; + chunk = bits - 2; /* 7 bytes left in this chunk */ + outbuf[0] = (unsigned char)final; /* write first decompressed byte */ + outcnt = 1; + + /* decode codes */ + stack = 0; + for (;;) { + /* if the table will be full after this, increment the code size */ + if (end >= mask && bits < max) { + FLUSHCODE(); + bits++; + mask <<= 1; + mask++; + } + + /* get a code of length bits */ + if (chunk == 0) /* decrement chunk modulo bits */ + chunk = bits; + code = rem; /* low bits of code */ + if (NEXT() == -1) { /* EOF is end of compressed data */ + /* write remaining buffered output */ + if (outcnt && out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + return Z_OK; + } + code += (unsigned)last << left; /* middle (or high) bits of code */ + left += 8; + chunk--; + if (bits > left) { /* need more bits */ + if (NEXT() == -1) /* can't end in middle of code */ + return Z_BUF_ERROR; + code += (unsigned)last << left; /* high bits of code */ + left += 8; + chunk--; + } + code &= mask; /* mask to current code length */ + left -= bits; /* number of unused bits */ + rem = (unsigned)last >> (8 - left); /* unused bits from last byte */ + + /* process clear code (256) */ + if (code == 256 && flags) { + FLUSHCODE(); + bits = 9; /* initialize bits and mask */ + mask = 0x1ff; + end = 255; /* empty table */ + continue; /* get next code */ + } + + /* special code to reuse last match */ + temp = code; /* save the current code */ + if (code > end) { + /* Be picky on the allowed code here, and make sure that the code + we drop through (prev) will be a valid index so that random + input does not cause an exception. The code != end + 1 check is + empirically derived, and not checked in the original uncompress + code. If this ever causes a problem, that check could be safely + removed. Leaving this check in greatly improves gun's ability + to detect random or corrupted input after a compress header. + In any case, the prev > end check must be retained. */ + if (code != end + 1 || prev > end) { + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + match[stack++] = (unsigned char)final; + code = prev; + } + + /* walk through linked list to generate output in reverse order */ + while (code >= 256) { + match[stack++] = suffix[code]; + code = prefix[code]; + } + match[stack++] = (unsigned char)code; + final = code; + + /* link new table entry */ + if (end < mask) { + end++; + prefix[end] = (unsigned short)prev; + suffix[end] = (unsigned char)final; + } + + /* set previous code for next iteration */ + prev = temp; + + /* write output in forward order */ + while (stack > SIZE - outcnt) { + while (outcnt < SIZE) + outbuf[outcnt++] = match[--stack]; + if (out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + outcnt = 0; + } + do { + outbuf[outcnt++] = match[--stack]; + } while (stack); + + /* loop for next code with final and prev as the last match, rem and + left provide the first 0..7 bits of the next code, end is the last + valid table entry */ + } +} + +/* Decompress a gzip file from infile to outfile. strm is assumed to have been + successfully initialized with inflateBackInit(). The input file may consist + of a series of gzip streams, in which case all of them will be decompressed + to the output file. If outfile is -1, then the gzip stream(s) integrity is + checked and nothing is written. + + The return value is a zlib error code: Z_MEM_ERROR if out of memory, + Z_DATA_ERROR if the header or the compressed data is invalid, or if the + trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends + prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip + stream) follows a valid gzip stream. + */ +local int gunpipe(z_stream *strm, int infile, int outfile) +{ + int ret, first, last; + unsigned have, flags, len; + unsigned char *next; + struct ind ind, *indp; + struct outd outd; + + /* setup input buffer */ + ind.infile = infile; + ind.inbuf = inbuf; + indp = &ind; + + /* decompress concatenated gzip streams */ + have = 0; /* no input data read in yet */ + first = 1; /* looking for first gzip header */ + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + for (;;) { + /* look for the two magic header bytes for a gzip stream */ + if (NEXT() == -1) { + ret = Z_OK; + break; /* empty gzip stream is ok */ + } + if (last != 31 || (NEXT() != 139 && last != 157)) { + strm->msg = (char *)"incorrect header check"; + ret = first ? Z_DATA_ERROR : Z_ERRNO; + break; /* not a gzip or compress header */ + } + first = 0; /* next non-header is junk */ + + /* process a compress (LZW) file -- can't be concatenated after this */ + if (last == 157) { + ret = lunpipe(have, next, indp, outfile, strm); + break; + } + + /* process remainder of gzip header */ + ret = Z_BUF_ERROR; + if (NEXT() != 8) { /* only deflate method allowed */ + if (last == -1) break; + strm->msg = (char *)"unknown compression method"; + ret = Z_DATA_ERROR; + break; + } + flags = NEXT(); /* header flags */ + NEXT(); /* discard mod time, xflgs, os */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); + NEXT(); + if (last == -1) break; + if (flags & 0xe0) { + strm->msg = (char *)"unknown header flags set"; + ret = Z_DATA_ERROR; + break; + } + if (flags & 4) { /* extra field */ + len = NEXT(); + len += (unsigned)(NEXT()) << 8; + if (last == -1) break; + while (len > have) { + len -= have; + have = 0; + if (NEXT() == -1) break; + len--; + } + if (last == -1) break; + have -= len; + next += len; + } + if (flags & 8) /* file name */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 16) /* comment */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + if (last == -1) break; + + /* set up output */ + outd.outfile = outfile; + outd.check = 1; + outd.crc = crc32(0L, Z_NULL, 0); + outd.total = 0; + + /* decompress data to output */ + strm->next_in = next; + strm->avail_in = have; + ret = inflateBack(strm, in, indp, out, &outd); + if (ret != Z_STREAM_END) break; + next = strm->next_in; + have = strm->avail_in; + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + + /* check trailer */ + ret = Z_BUF_ERROR; + if (NEXT() != (outd.crc & 0xff) || + NEXT() != ((outd.crc >> 8) & 0xff) || + NEXT() != ((outd.crc >> 16) & 0xff) || + NEXT() != ((outd.crc >> 24) & 0xff)) { + /* crc error */ + if (last != -1) { + strm->msg = (char *)"incorrect data check"; + ret = Z_DATA_ERROR; + } + break; + } + if (NEXT() != (outd.total & 0xff) || + NEXT() != ((outd.total >> 8) & 0xff) || + NEXT() != ((outd.total >> 16) & 0xff) || + NEXT() != ((outd.total >> 24) & 0xff)) { + /* length error */ + if (last != -1) { + strm->msg = (char *)"incorrect length check"; + ret = Z_DATA_ERROR; + } + break; + } + + /* go back and look for another gzip stream */ + } + + /* clean up and return */ + return ret; +} + +/* Copy file attributes, from -> to, as best we can. This is best effort, so + no errors are reported. The mode bits, including suid, sgid, and the sticky + bit are copied (if allowed), the owner's user id and group id are copied + (again if allowed), and the access and modify times are copied. */ +local void copymeta(char *from, char *to) +{ + struct stat was; + struct utimbuf when; + + /* get all of from's Unix meta data, return if not a regular file */ + if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG) + return; + + /* set to's mode bits, ignore errors */ + (void)chmod(to, was.st_mode & 07777); + + /* copy owner's user and group, ignore errors */ + (void)chown(to, was.st_uid, was.st_gid); + + /* copy access and modify times, ignore errors */ + when.actime = was.st_atime; + when.modtime = was.st_mtime; + (void)utime(to, &when); +} + +/* Decompress the file inname to the file outnname, of if test is true, just + decompress without writing and check the gzip trailer for integrity. If + inname is NULL or an empty string, read from stdin. If outname is NULL or + an empty string, write to stdout. strm is a pre-initialized inflateBack + structure. When appropriate, copy the file attributes from inname to + outname. + + gunzip() returns 1 if there is an out-of-memory error or an unexpected + return code from gunpipe(). Otherwise it returns 0. + */ +local int gunzip(z_stream *strm, char *inname, char *outname, int test) +{ + int ret; + int infile, outfile; + + /* open files */ + if (inname == NULL || *inname == 0) { + inname = "-"; + infile = 0; /* stdin */ + } + else { + infile = open(inname, O_RDONLY, 0); + if (infile == -1) { + fprintf(stderr, "gun cannot open %s\n", inname); + return 0; + } + } + if (test) + outfile = -1; + else if (outname == NULL || *outname == 0) { + outname = "-"; + outfile = 1; /* stdout */ + } + else { + outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (outfile == -1) { + close(infile); + fprintf(stderr, "gun cannot create %s\n", outname); + return 0; + } + } + errno = 0; + + /* decompress */ + ret = gunpipe(strm, infile, outfile); + if (outfile > 2) close(outfile); + if (infile > 2) close(infile); + + /* interpret result */ + switch (ret) { + case Z_OK: + case Z_ERRNO: + if (infile > 2 && outfile > 2) { + copymeta(inname, outname); /* copy attributes */ + unlink(inname); + } + if (ret == Z_ERRNO) + fprintf(stderr, "gun warning: trailing garbage ignored in %s\n", + inname); + break; + case Z_DATA_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg); + break; + case Z_MEM_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + case Z_BUF_ERROR: + if (outfile > 2) unlink(outname); + if (strm->next_in != Z_NULL) { + fprintf(stderr, "gun write error on %s: %s\n", + outname, strerror(errno)); + } + else if (errno) { + fprintf(stderr, "gun read error on %s: %s\n", + inname, strerror(errno)); + } + else { + fprintf(stderr, "gun unexpected end of file on %s\n", + inname); + } + break; + default: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun internal error--aborting\n"); + return 1; + } + return 0; +} + +/* Process the gun command line arguments. See the command syntax near the + beginning of this source file. */ +int main(int argc, char **argv) +{ + int ret, len, test; + char *outname; + unsigned char *window; + z_stream strm; + + /* initialize inflateBack state for repeated use */ + window = match; /* reuse LZW match buffer */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = inflateBackInit(&strm, 15, window); + if (ret != Z_OK) { + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + } + + /* decompress each file to the same name with the suffix removed */ + argc--; + argv++; + test = 0; + if (argc && strcmp(*argv, "-h") == 0) { + fprintf(stderr, "gun 1.3 (12 Jun 2005)\n"); + fprintf(stderr, "Copyright (c) 2005 Mark Adler\n"); + fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); + return 0; + } + if (argc && strcmp(*argv, "-t") == 0) { + test = 1; + argc--; + argv++; + } + if (argc) + do { + if (test) + outname = NULL; + else { + len = (int)strlen(*argv); + if (strcmp(*argv + len - 3, ".gz") == 0 || + strcmp(*argv + len - 3, "-gz") == 0) + len -= 3; + else if (strcmp(*argv + len - 2, ".z") == 0 || + strcmp(*argv + len - 2, "-z") == 0 || + strcmp(*argv + len - 2, "_z") == 0 || + strcmp(*argv + len - 2, ".Z") == 0) + len -= 2; + else { + fprintf(stderr, "gun error: no gz type on %s--skipping\n", + *argv); + continue; + } + outname = malloc(len + 1); + if (outname == NULL) { + fprintf(stderr, "gun out of memory error--aborting\n"); + ret = 1; + break; + } + memcpy(outname, *argv, len); + outname[len] = 0; + } + ret = gunzip(&strm, *argv, outname, test); + if (outname != NULL) free(outname); + if (ret) break; + } while (argv++, --argc); + else + ret = gunzip(&strm, NULL, NULL, test); + + /* clean up */ + inflateBackEnd(&strm); + return ret; +} diff --git a/win32/3rdparty/zlib/examples/gzappend.c b/win32/3rdparty/zlib/examples/gzappend.c new file mode 100644 index 000000000..e9e878e11 --- /dev/null +++ b/win32/3rdparty/zlib/examples/gzappend.c @@ -0,0 +1,500 @@ +/* gzappend -- command to append to a gzip file + + Copyright (C) 2003 Mark Adler, all rights reserved + version 1.1, 4 Nov 2003 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 19 Oct 2003 - First version + * 1.1 4 Nov 2003 - Expand and clarify some comments and notes + * - Add version and copyright to help + * - Send help to stdout instead of stderr + * - Add some preemptive typecasts + * - Add L to constants in lseek() calls + * - Remove some debugging information in error messages + * - Use new data_type definition for zlib 1.2.1 + * - Simplfy and unify file operations + * - Finish off gzip file in gztack() + * - Use deflatePrime() instead of adding empty blocks + * - Keep gzip file clean on appended file read errors + * - Use in-place rotate instead of auxiliary buffer + * (Why you ask? Because it was fun to write!) + */ + +/* + gzappend takes a gzip file and appends to it, compressing files from the + command line or data from stdin. The gzip file is written to directly, to + avoid copying that file, in case it's large. Note that this results in the + unfriendly behavior that if gzappend fails, the gzip file is corrupted. + + This program was written to illustrate the use of the new Z_BLOCK option of + zlib 1.2.x's inflate() function. This option returns from inflate() at each + block boundary to facilitate locating and modifying the last block bit at + the start of the final deflate block. Also whether using Z_BLOCK or not, + another required feature of zlib 1.2.x is that inflate() now provides the + number of unusued bits in the last input byte used. gzappend will not work + with versions of zlib earlier than 1.2.1. + + gzappend first decompresses the gzip file internally, discarding all but + the last 32K of uncompressed data, and noting the location of the last block + bit and the number of unused bits in the last byte of the compressed data. + The gzip trailer containing the CRC-32 and length of the uncompressed data + is verified. This trailer will be later overwritten. + + Then the last block bit is cleared by seeking back in the file and rewriting + the byte that contains it. Seeking forward, the last byte of the compressed + data is saved along with the number of unused bits to initialize deflate. + + A deflate process is initialized, using the last 32K of the uncompressed + data from the gzip file to initialize the dictionary. If the total + uncompressed data was less than 32K, then all of it is used to initialize + the dictionary. The deflate output bit buffer is also initialized with the + last bits from the original deflate stream. From here on, the data to + append is simply compressed using deflate, and written to the gzip file. + When that is complete, the new CRC-32 and uncompressed length are written + as the trailer of the gzip file. + */ + +#include +#include +#include +#include +#include +#include "zlib.h" + +#define local static +#define LGCHUNK 14 +#define CHUNK (1U << LGCHUNK) +#define DSIZE 32768U + +/* print an error message and terminate with extreme prejudice */ +local void bye(char *msg1, char *msg2) +{ + fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2); + exit(1); +} + +/* return the greatest common divisor of a and b using Euclid's algorithm, + modified to be fast when one argument much greater than the other, and + coded to avoid unnecessary swapping */ +local unsigned gcd(unsigned a, unsigned b) +{ + unsigned c; + + while (a && b) + if (a > b) { + c = b; + while (a - c >= c) + c <<= 1; + a -= c; + } + else { + c = a; + while (b - c >= c) + c <<= 1; + b -= c; + } + return a + b; +} + +/* rotate list[0..len-1] left by rot positions, in place */ +local void rotate(unsigned char *list, unsigned len, unsigned rot) +{ + unsigned char tmp; + unsigned cycles; + unsigned char *start, *last, *to, *from; + + /* normalize rot and handle degenerate cases */ + if (len < 2) return; + if (rot >= len) rot %= len; + if (rot == 0) return; + + /* pointer to last entry in list */ + last = list + (len - 1); + + /* do simple left shift by one */ + if (rot == 1) { + tmp = *list; + memcpy(list, list + 1, len - 1); + *last = tmp; + return; + } + + /* do simple right shift by one */ + if (rot == len - 1) { + tmp = *last; + memmove(list + 1, list, len - 1); + *list = tmp; + return; + } + + /* otherwise do rotate as a set of cycles in place */ + cycles = gcd(len, rot); /* number of cycles */ + do { + start = from = list + cycles; /* start index is arbitrary */ + tmp = *from; /* save entry to be overwritten */ + for (;;) { + to = from; /* next step in cycle */ + from += rot; /* go right rot positions */ + if (from > last) from -= len; /* (pointer better not wrap) */ + if (from == start) break; /* all but one shifted */ + *to = *from; /* shift left */ + } + *to = tmp; /* complete the circle */ + } while (--cycles); +} + +/* structure for gzip file read operations */ +typedef struct { + int fd; /* file descriptor */ + int size; /* 1 << size is bytes in buf */ + unsigned left; /* bytes available at next */ + unsigned char *buf; /* buffer */ + unsigned char *next; /* next byte in buffer */ + char *name; /* file name for error messages */ +} file; + +/* reload buffer */ +local int readin(file *in) +{ + int len; + + len = read(in->fd, in->buf, 1 << in->size); + if (len == -1) bye("error reading ", in->name); + in->left = (unsigned)len; + in->next = in->buf; + return len; +} + +/* read from file in, exit if end-of-file */ +local int readmore(file *in) +{ + if (readin(in) == 0) bye("unexpected end of ", in->name); + return 0; +} + +#define read1(in) (in->left == 0 ? readmore(in) : 0, \ + in->left--, *(in->next)++) + +/* skip over n bytes of in */ +local void skip(file *in, unsigned n) +{ + unsigned bypass; + + if (n > in->left) { + n -= in->left; + bypass = n & ~((1U << in->size) - 1); + if (bypass) { + if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1) + bye("seeking ", in->name); + n -= bypass; + } + readmore(in); + if (n > in->left) + bye("unexpected end of ", in->name); + } + in->left -= n; + in->next += n; +} + +/* read a four-byte unsigned integer, little-endian, from in */ +unsigned long read4(file *in) +{ + unsigned long val; + + val = read1(in); + val += (unsigned)read1(in) << 8; + val += (unsigned long)read1(in) << 16; + val += (unsigned long)read1(in) << 24; + return val; +} + +/* skip over gzip header */ +local void gzheader(file *in) +{ + int flags; + unsigned n; + + if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file"); + if (read1(in) != 8) bye("unknown compression method in", in->name); + flags = read1(in); + if (flags & 0xe0) bye("unknown header flags set in", in->name); + skip(in, 6); + if (flags & 4) { + n = read1(in); + n += (unsigned)(read1(in)) << 8; + skip(in, n); + } + if (flags & 8) while (read1(in) != 0) ; + if (flags & 16) while (read1(in) != 0) ; + if (flags & 2) skip(in, 2); +} + +/* decompress gzip file "name", return strm with a deflate stream ready to + continue compression of the data in the gzip file, and return a file + descriptor pointing to where to write the compressed data -- the deflate + stream is initialized to compress using level "level" */ +local int gzscan(char *name, z_stream *strm, int level) +{ + int ret, lastbit, left, full; + unsigned have; + unsigned long crc, tot; + unsigned char *window; + off_t lastoff, end; + file gz; + + /* open gzip file */ + gz.name = name; + gz.fd = open(name, O_RDWR, 0); + if (gz.fd == -1) bye("cannot open ", name); + gz.buf = malloc(CHUNK); + if (gz.buf == NULL) bye("out of memory", ""); + gz.size = LGCHUNK; + gz.left = 0; + + /* skip gzip header */ + gzheader(&gz); + + /* prepare to decompress */ + window = malloc(DSIZE); + if (window == NULL) bye("out of memory", ""); + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = inflateInit2(strm, -15); + if (ret != Z_OK) bye("out of memory", " or library mismatch"); + + /* decompress the deflate stream, saving append information */ + lastbit = 0; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + left = 0; + strm->avail_in = gz.left; + strm->next_in = gz.next; + crc = crc32(0L, Z_NULL, 0); + have = full = 0; + do { + /* if needed, get more input */ + if (strm->avail_in == 0) { + readmore(&gz); + strm->avail_in = gz.left; + strm->next_in = gz.next; + } + + /* set up output to next available section of sliding window */ + strm->avail_out = DSIZE - have; + strm->next_out = window + have; + + /* inflate and check for errors */ + ret = inflate(strm, Z_BLOCK); + if (ret == Z_STREAM_ERROR) bye("internal stream error!", ""); + if (ret == Z_MEM_ERROR) bye("out of memory", ""); + if (ret == Z_DATA_ERROR) + bye("invalid compressed data--format violated in", name); + + /* update crc and sliding window pointer */ + crc = crc32(crc, window + have, DSIZE - have - strm->avail_out); + if (strm->avail_out) + have = DSIZE - strm->avail_out; + else { + have = 0; + full = 1; + } + + /* process end of block */ + if (strm->data_type & 128) { + if (strm->data_type & 64) + left = strm->data_type & 0x1f; + else { + lastbit = strm->data_type & 0x1f; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in; + } + } + } while (ret != Z_STREAM_END); + inflateEnd(strm); + gz.left = strm->avail_in; + gz.next = strm->next_in; + + /* save the location of the end of the compressed data */ + end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + + /* check gzip trailer and save total for deflate */ + if (crc != read4(&gz)) + bye("invalid compressed data--crc mismatch in ", name); + tot = strm->total_out; + if ((tot & 0xffffffffUL) != read4(&gz)) + bye("invalid compressed data--length mismatch in", name); + + /* if not at end of file, warn */ + if (gz.left || readin(&gz)) + fprintf(stderr, + "gzappend warning: junk at end of gzip file overwritten\n"); + + /* clear last block bit */ + lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + *gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7))); + lseek(gz.fd, -1L, SEEK_CUR); + if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name); + + /* if window wrapped, build dictionary from window by rotating */ + if (full) { + rotate(window, DSIZE, have); + have = DSIZE; + } + + /* set up deflate stream with window, crc, total_in, and leftover bits */ + ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + if (ret != Z_OK) bye("out of memory", ""); + deflateSetDictionary(strm, window, have); + strm->adler = crc; + strm->total_in = tot; + if (left) { + lseek(gz.fd, --end, SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + deflatePrime(strm, 8 - left, *gz.buf); + } + lseek(gz.fd, end, SEEK_SET); + + /* clean up and return */ + free(window); + free(gz.buf); + return gz.fd; +} + +/* append file "name" to gzip file gd using deflate stream strm -- if last + is true, then finish off the deflate stream at the end */ +local void gztack(char *name, int gd, z_stream *strm, int last) +{ + int fd, len, ret; + unsigned left; + unsigned char *in, *out; + + /* open file to compress and append */ + fd = 0; + if (name != NULL) { + fd = open(name, O_RDONLY, 0); + if (fd == -1) + fprintf(stderr, "gzappend warning: %s not found, skipping ...\n", + name); + } + + /* allocate buffers */ + in = fd == -1 ? NULL : malloc(CHUNK); + out = malloc(CHUNK); + if (out == NULL) bye("out of memory", ""); + + /* compress input file and append to gzip file */ + do { + /* get more input */ + len = fd == -1 ? 0 : read(fd, in, CHUNK); + if (len == -1) { + fprintf(stderr, + "gzappend warning: error reading %s, skipping rest ...\n", + name); + len = 0; + } + strm->avail_in = (unsigned)len; + strm->next_in = in; + if (len) strm->adler = crc32(strm->adler, in, (unsigned)len); + + /* compress and write all available output */ + do { + strm->avail_out = CHUNK; + strm->next_out = out; + ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH); + left = CHUNK - strm->avail_out; + while (left) { + len = write(gd, out + CHUNK - strm->avail_out - left, left); + if (len == -1) bye("writing gzip file", ""); + left -= (unsigned)len; + } + } while (strm->avail_out == 0 && ret != Z_STREAM_END); + } while (len != 0); + + /* write trailer after last entry */ + if (last) { + deflateEnd(strm); + out[0] = (unsigned char)(strm->adler); + out[1] = (unsigned char)(strm->adler >> 8); + out[2] = (unsigned char)(strm->adler >> 16); + out[3] = (unsigned char)(strm->adler >> 24); + out[4] = (unsigned char)(strm->total_in); + out[5] = (unsigned char)(strm->total_in >> 8); + out[6] = (unsigned char)(strm->total_in >> 16); + out[7] = (unsigned char)(strm->total_in >> 24); + len = 8; + do { + ret = write(gd, out + 8 - len, len); + if (ret == -1) bye("writing gzip file", ""); + len -= ret; + } while (len); + close(gd); + } + + /* clean up and return */ + free(out); + if (in != NULL) free(in); + if (fd > 0) close(fd); +} + +/* process the compression level option if present, scan the gzip file, and + append the specified files, or append the data from stdin if no other file + names are provided on the command line -- the gzip file must be writable + and seekable */ +int main(int argc, char **argv) +{ + int gd, level; + z_stream strm; + + /* ignore command name */ + argv++; + + /* provide usage if no arguments */ + if (*argv == NULL) { + printf("gzappend 1.1 (4 Nov 2003) Copyright (C) 2003 Mark Adler\n"); + printf( + "usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n"); + return 0; + } + + /* set compression level */ + level = Z_DEFAULT_COMPRESSION; + if (argv[0][0] == '-') { + if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0) + bye("invalid compression level", ""); + level = argv[0][1] - '0'; + if (*++argv == NULL) bye("no gzip file name after options", ""); + } + + /* prepare to append to gzip file */ + gd = gzscan(*argv++, &strm, level); + + /* append files on command line, or from stdin if none */ + if (*argv == NULL) + gztack(NULL, gd, &strm, 1); + else + do { + gztack(*argv, gd, &strm, argv[1] == NULL); + } while (*++argv != NULL); + return 0; +} diff --git a/win32/3rdparty/zlib/examples/gzjoin.c b/win32/3rdparty/zlib/examples/gzjoin.c new file mode 100644 index 000000000..129347ce3 --- /dev/null +++ b/win32/3rdparty/zlib/examples/gzjoin.c @@ -0,0 +1,448 @@ +/* gzjoin -- command to join gzip files into one gzip file + + Copyright (C) 2004 Mark Adler, all rights reserved + version 1.0, 11 Dec 2004 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 11 Dec 2004 - First version + * 1.1 12 Jun 2005 - Changed ssize_t to long for portability + */ + +/* + gzjoin takes one or more gzip files on the command line and writes out a + single gzip file that will uncompress to the concatenation of the + uncompressed data from the individual gzip files. gzjoin does this without + having to recompress any of the data and without having to calculate a new + crc32 for the concatenated uncompressed data. gzjoin does however have to + decompress all of the input data in order to find the bits in the compressed + data that need to be modified to concatenate the streams. + + gzjoin does not do an integrity check on the input gzip files other than + checking the gzip header and decompressing the compressed data. They are + otherwise assumed to be complete and correct. + + Each joint between gzip files removes at least 18 bytes of previous trailer + and subsequent header, and inserts an average of about three bytes to the + compressed data in order to connect the streams. The output gzip file + has a minimal ten-byte gzip header with no file name or modification time. + + This program was written to illustrate the use of the Z_BLOCK option of + inflate() and the crc32_combine() function. gzjoin will not compile with + versions of zlib earlier than 1.2.3. + */ + +#include /* fputs(), fprintf(), fwrite(), putc() */ +#include /* exit(), malloc(), free() */ +#include /* open() */ +#include /* close(), read(), lseek() */ +#include "zlib.h" + /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */ + +#define local static + +/* exit with an error (return a value to allow use in an expression) */ +local int bail(char *why1, char *why2) +{ + fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2); + exit(1); + return 0; +} + +/* -- simple buffered file input with access to the buffer -- */ + +#define CHUNK 32768 /* must be a power of two and fit in unsigned */ + +/* bin buffered input file type */ +typedef struct { + char *name; /* name of file for error messages */ + int fd; /* file descriptor */ + unsigned left; /* bytes remaining at next */ + unsigned char *next; /* next byte to read */ + unsigned char *buf; /* allocated buffer of length CHUNK */ +} bin; + +/* close a buffered file and free allocated memory */ +local void bclose(bin *in) +{ + if (in != NULL) { + if (in->fd != -1) + close(in->fd); + if (in->buf != NULL) + free(in->buf); + free(in); + } +} + +/* open a buffered file for input, return a pointer to type bin, or NULL on + failure */ +local bin *bopen(char *name) +{ + bin *in; + + in = malloc(sizeof(bin)); + if (in == NULL) + return NULL; + in->buf = malloc(CHUNK); + in->fd = open(name, O_RDONLY, 0); + if (in->buf == NULL || in->fd == -1) { + bclose(in); + return NULL; + } + in->left = 0; + in->next = in->buf; + in->name = name; + return in; +} + +/* load buffer from file, return -1 on read error, 0 or 1 on success, with + 1 indicating that end-of-file was reached */ +local int bload(bin *in) +{ + long len; + + if (in == NULL) + return -1; + if (in->left != 0) + return 0; + in->next = in->buf; + do { + len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left); + if (len < 0) + return -1; + in->left += (unsigned)len; + } while (len != 0 && in->left < CHUNK); + return len == 0 ? 1 : 0; +} + +/* get a byte from the file, bail if end of file */ +#define bget(in) (in->left ? 0 : bload(in), \ + in->left ? (in->left--, *(in->next)++) : \ + bail("unexpected end of file on ", in->name)) + +/* get a four-byte little-endian unsigned integer from file */ +local unsigned long bget4(bin *in) +{ + unsigned long val; + + val = bget(in); + val += (unsigned long)(bget(in)) << 8; + val += (unsigned long)(bget(in)) << 16; + val += (unsigned long)(bget(in)) << 24; + return val; +} + +/* skip bytes in file */ +local void bskip(bin *in, unsigned skip) +{ + /* check pointer */ + if (in == NULL) + return; + + /* easy case -- skip bytes in buffer */ + if (skip <= in->left) { + in->left -= skip; + in->next += skip; + return; + } + + /* skip what's in buffer, discard buffer contents */ + skip -= in->left; + in->left = 0; + + /* seek past multiples of CHUNK bytes */ + if (skip > CHUNK) { + unsigned left; + + left = skip & (CHUNK - 1); + if (left == 0) { + /* exact number of chunks: seek all the way minus one byte to check + for end-of-file with a read */ + lseek(in->fd, skip - 1, SEEK_CUR); + if (read(in->fd, in->buf, 1) != 1) + bail("unexpected end of file on ", in->name); + return; + } + + /* skip the integral chunks, update skip with remainder */ + lseek(in->fd, skip - left, SEEK_CUR); + skip = left; + } + + /* read more input and skip remainder */ + bload(in); + if (skip > in->left) + bail("unexpected end of file on ", in->name); + in->left -= skip; + in->next += skip; +} + +/* -- end of buffered input functions -- */ + +/* skip the gzip header from file in */ +local void gzhead(bin *in) +{ + int flags; + + /* verify gzip magic header and compression method */ + if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8) + bail(in->name, " is not a valid gzip file"); + + /* get and verify flags */ + flags = bget(in); + if ((flags & 0xe0) != 0) + bail("unknown reserved bits set in ", in->name); + + /* skip modification time, extra flags, and os */ + bskip(in, 6); + + /* skip extra field if present */ + if (flags & 4) { + unsigned len; + + len = bget(in); + len += (unsigned)(bget(in)) << 8; + bskip(in, len); + } + + /* skip file name if present */ + if (flags & 8) + while (bget(in) != 0) + ; + + /* skip comment if present */ + if (flags & 16) + while (bget(in) != 0) + ; + + /* skip header crc if present */ + if (flags & 2) + bskip(in, 2); +} + +/* write a four-byte little-endian unsigned integer to out */ +local void put4(unsigned long val, FILE *out) +{ + putc(val & 0xff, out); + putc((val >> 8) & 0xff, out); + putc((val >> 16) & 0xff, out); + putc((val >> 24) & 0xff, out); +} + +/* Load up zlib stream from buffered input, bail if end of file */ +local void zpull(z_streamp strm, bin *in) +{ + if (in->left == 0) + bload(in); + if (in->left == 0) + bail("unexpected end of file on ", in->name); + strm->avail_in = in->left; + strm->next_in = in->next; +} + +/* Write header for gzip file to out and initialize trailer. */ +local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out) +{ + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + *crc = crc32(0L, Z_NULL, 0); + *tot = 0; +} + +/* Copy the compressed data from name, zeroing the last block bit of the last + block if clr is true, and adding empty blocks as needed to get to a byte + boundary. If clr is false, then the last block becomes the last block of + the output, and the gzip trailer is written. crc and tot maintains the + crc and length (modulo 2^32) of the output for the trailer. The resulting + gzip file is written to out. gzinit() must be called before the first call + of gzcopy() to write the gzip header and to initialize crc and tot. */ +local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot, + FILE *out) +{ + int ret; /* return value from zlib functions */ + int pos; /* where the "last block" bit is in byte */ + int last; /* true if processing the last block */ + bin *in; /* buffered input file */ + unsigned char *start; /* start of compressed data in buffer */ + unsigned char *junk; /* buffer for uncompressed data -- discarded */ + z_off_t len; /* length of uncompressed data (support > 4 GB) */ + z_stream strm; /* zlib inflate stream */ + + /* open gzip file and skip header */ + in = bopen(name); + if (in == NULL) + bail("could not open ", name); + gzhead(in); + + /* allocate buffer for uncompressed data and initialize raw inflate + stream */ + junk = malloc(CHUNK); + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); + if (junk == NULL || ret != Z_OK) + bail("out of memory", ""); + + /* inflate and copy compressed data, clear last-block bit if requested */ + len = 0; + zpull(&strm, in); + start = strm.next_in; + last = start[0] & 1; + if (last && clr) + start[0] &= ~1; + strm.avail_out = 0; + for (;;) { + /* if input used and output done, write used input and get more */ + if (strm.avail_in == 0 && strm.avail_out != 0) { + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + + /* decompress -- return early when end-of-block reached */ + strm.avail_out = CHUNK; + strm.next_out = junk; + ret = inflate(&strm, Z_BLOCK); + switch (ret) { + case Z_MEM_ERROR: + bail("out of memory", ""); + case Z_DATA_ERROR: + bail("invalid compressed data in ", in->name); + } + + /* update length of uncompressed data */ + len += CHUNK - strm.avail_out; + + /* check for block boundary (only get this when block copied out) */ + if (strm.data_type & 128) { + /* if that was the last block, then done */ + if (last) + break; + + /* number of unused bits in last byte */ + pos = strm.data_type & 7; + + /* find the next last-block bit */ + if (pos != 0) { + /* next last-block bit is in last used byte */ + pos = 0x100 >> pos; + last = strm.next_in[-1] & pos; + if (last && clr) + strm.next_in[-1] &= ~pos; + } + else { + /* next last-block bit is in next unused byte */ + if (strm.avail_in == 0) { + /* don't have that byte yet -- get it */ + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + last = strm.next_in[0] & 1; + if (last && clr) + strm.next_in[0] &= ~1; + } + } + } + + /* update buffer with unused input */ + in->left = strm.avail_in; + in->next = strm.next_in; + + /* copy used input, write empty blocks to get to byte boundary */ + pos = strm.data_type & 7; + fwrite(start, 1, in->next - start - 1, out); + last = in->next[-1]; + if (pos == 0 || !clr) + /* already at byte boundary, or last file: write last byte */ + putc(last, out); + else { + /* append empty blocks to last byte */ + last &= ((0x100 >> pos) - 1); /* assure unused bits are zero */ + if (pos & 1) { + /* odd -- append an empty stored block */ + putc(last, out); + if (pos == 1) + putc(0, out); /* two more bits in block header */ + fwrite("\0\0\xff\xff", 1, 4, out); + } + else { + /* even -- append 1, 2, or 3 empty fixed blocks */ + switch (pos) { + case 6: + putc(last | 8, out); + last = 0; + case 4: + putc(last | 0x20, out); + last = 0; + case 2: + putc(last | 0x80, out); + putc(0, out); + } + } + } + + /* update crc and tot */ + *crc = crc32_combine(*crc, bget4(in), len); + *tot += (unsigned long)len; + + /* clean up */ + inflateEnd(&strm); + free(junk); + bclose(in); + + /* write trailer if this is the last gzip file */ + if (!clr) { + put4(*crc, out); + put4(*tot, out); + } +} + +/* join the gzip files on the command line, write result to stdout */ +int main(int argc, char **argv) +{ + unsigned long crc, tot; /* running crc and total uncompressed length */ + + /* skip command name */ + argc--; + argv++; + + /* show usage if no arguments */ + if (argc == 0) { + fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n", + stderr); + return 0; + } + + /* join gzip files on command line and write to stdout */ + gzinit(&crc, &tot, stdout); + while (argc--) + gzcopy(*argv++, argc, &crc, &tot, stdout); + + /* done */ + return 0; +} diff --git a/win32/3rdparty/zlib/examples/gzlog.c b/win32/3rdparty/zlib/examples/gzlog.c new file mode 100644 index 000000000..f71f817c8 --- /dev/null +++ b/win32/3rdparty/zlib/examples/gzlog.c @@ -0,0 +1,413 @@ +/* + * gzlog.c + * Copyright (C) 2004 Mark Adler + * For conditions of distribution and use, see copyright notice in gzlog.h + * version 1.0, 26 Nov 2004 + * + */ + +#include /* memcmp() */ +#include /* malloc(), free(), NULL */ +#include /* size_t, off_t */ +#include /* read(), close(), sleep(), ftruncate(), */ + /* lseek() */ +#include /* open() */ +#include /* flock() */ +#include "zlib.h" /* deflateInit2(), deflate(), deflateEnd() */ + +#include "gzlog.h" /* interface */ +#define local static + +/* log object structure */ +typedef struct { + int id; /* object identifier */ + int fd; /* log file descriptor */ + off_t extra; /* offset of extra "ap" subfield */ + off_t mark_off; /* offset of marked data */ + off_t last_off; /* offset of last block */ + unsigned long crc; /* uncompressed crc */ + unsigned long len; /* uncompressed length (modulo 2^32) */ + unsigned stored; /* length of current stored block */ +} gz_log; + +#define GZLOGID 19334 /* gz_log object identifier */ + +#define LOCK_RETRY 1 /* retry lock once a second */ +#define LOCK_PATIENCE 1200 /* try about twenty minutes before forcing */ + +/* acquire a lock on a file */ +local int lock(int fd) +{ + int patience; + + /* try to lock every LOCK_RETRY seconds for LOCK_PATIENCE seconds */ + patience = LOCK_PATIENCE; + do { + if (flock(fd, LOCK_EX + LOCK_NB) == 0) + return 0; + (void)sleep(LOCK_RETRY); + patience -= LOCK_RETRY; + } while (patience > 0); + + /* we've run out of patience -- give up */ + return -1; +} + +/* release lock */ +local void unlock(int fd) +{ + (void)flock(fd, LOCK_UN); +} + +/* release a log object */ +local void log_clean(gz_log *log) +{ + unlock(log->fd); + (void)close(log->fd); + free(log); +} + +/* read an unsigned long from a byte buffer little-endian */ +local unsigned long make_ulg(unsigned char *buf) +{ + int n; + unsigned long val; + + val = (unsigned long)(*buf++); + for (n = 8; n < 32; n += 8) + val += (unsigned long)(*buf++) << n; + return val; +} + +/* read an off_t from a byte buffer little-endian */ +local off_t make_off(unsigned char *buf) +{ + int n; + off_t val; + + val = (off_t)(*buf++); + for (n = 8; n < 64; n += 8) + val += (off_t)(*buf++) << n; + return val; +} + +/* write an unsigned long little-endian to byte buffer */ +local void dice_ulg(unsigned long val, unsigned char *buf) +{ + int n; + + for (n = 0; n < 4; n++) { + *buf++ = val & 0xff; + val >>= 8; + } +} + +/* write an off_t little-endian to byte buffer */ +local void dice_off(off_t val, unsigned char *buf) +{ + int n; + + for (n = 0; n < 8; n++) { + *buf++ = val & 0xff; + val >>= 8; + } +} + +/* initial, empty gzip file for appending */ +local char empty_gz[] = { + 0x1f, 0x8b, /* magic gzip id */ + 8, /* compression method is deflate */ + 4, /* there is an extra field */ + 0, 0, 0, 0, /* no modification time provided */ + 0, 0xff, /* no extra flags, no OS */ + 20, 0, 'a', 'p', 16, 0, /* extra field with "ap" subfield */ + 32, 0, 0, 0, 0, 0, 0, 0, /* offset of uncompressed data */ + 32, 0, 0, 0, 0, 0, 0, 0, /* offset of last block */ + 1, 0, 0, 0xff, 0xff, /* empty stored block (last) */ + 0, 0, 0, 0, /* crc */ + 0, 0, 0, 0 /* uncompressed length */ +}; + +/* initialize a log object with locking */ +void *gzlog_open(char *path) +{ + unsigned xlen; + unsigned char temp[20]; + unsigned sub_len; + int good; + gz_log *log; + + /* allocate log structure */ + log = malloc(sizeof(gz_log)); + if (log == NULL) + return NULL; + log->id = GZLOGID; + + /* open file, creating it if necessary, and locking it */ + log->fd = open(path, O_RDWR | O_CREAT, 0600); + if (log->fd < 0) { + free(log); + return NULL; + } + if (lock(log->fd)) { + close(log->fd); + free(log); + return NULL; + } + + /* if file is empty, write new gzip stream */ + if (lseek(log->fd, 0, SEEK_END) == 0) { + if (write(log->fd, empty_gz, sizeof(empty_gz)) != sizeof(empty_gz)) { + log_clean(log); + return NULL; + } + } + + /* check gzip header */ + (void)lseek(log->fd, 0, SEEK_SET); + if (read(log->fd, temp, 12) != 12 || temp[0] != 0x1f || + temp[1] != 0x8b || temp[2] != 8 || (temp[3] & 4) == 0) { + log_clean(log); + return NULL; + } + + /* process extra field to find "ap" sub-field */ + xlen = temp[10] + (temp[11] << 8); + good = 0; + while (xlen) { + if (xlen < 4 || read(log->fd, temp, 4) != 4) + break; + sub_len = temp[2]; + sub_len += temp[3] << 8; + xlen -= 4; + if (memcmp(temp, "ap", 2) == 0 && sub_len == 16) { + good = 1; + break; + } + if (xlen < sub_len) + break; + (void)lseek(log->fd, sub_len, SEEK_CUR); + xlen -= sub_len; + } + if (!good) { + log_clean(log); + return NULL; + } + + /* read in "ap" sub-field */ + log->extra = lseek(log->fd, 0, SEEK_CUR); + if (read(log->fd, temp, 16) != 16) { + log_clean(log); + return NULL; + } + log->mark_off = make_off(temp); + log->last_off = make_off(temp + 8); + + /* get crc, length of gzip file */ + (void)lseek(log->fd, log->last_off, SEEK_SET); + if (read(log->fd, temp, 13) != 13 || + memcmp(temp, "\001\000\000\377\377", 5) != 0) { + log_clean(log); + return NULL; + } + log->crc = make_ulg(temp + 5); + log->len = make_ulg(temp + 9); + + /* set up to write over empty last block */ + (void)lseek(log->fd, log->last_off + 5, SEEK_SET); + log->stored = 0; + return (void *)log; +} + +/* maximum amount to put in a stored block before starting a new one */ +#define MAX_BLOCK 16384 + +/* write a block to a log object */ +int gzlog_write(void *obj, char *data, size_t len) +{ + size_t some; + unsigned char temp[5]; + gz_log *log; + + /* check object */ + log = (gz_log *)obj; + if (log == NULL || log->id != GZLOGID) + return 1; + + /* write stored blocks until all of the input is written */ + do { + some = MAX_BLOCK - log->stored; + if (some > len) + some = len; + if (write(log->fd, data, some) != some) + return 1; + log->crc = crc32(log->crc, data, some); + log->len += some; + len -= some; + data += some; + log->stored += some; + + /* if the stored block is full, end it and start another */ + if (log->stored == MAX_BLOCK) { + (void)lseek(log->fd, log->last_off, SEEK_SET); + temp[0] = 0; + dice_ulg(log->stored + ((unsigned long)(~log->stored) << 16), + temp + 1); + if (write(log->fd, temp, 5) != 5) + return 1; + log->last_off = lseek(log->fd, log->stored, SEEK_CUR); + (void)lseek(log->fd, 5, SEEK_CUR); + log->stored = 0; + } + } while (len); + return 0; +} + +/* recompress the remaining stored deflate data in place */ +local int recomp(gz_log *log) +{ + z_stream strm; + size_t len, max; + unsigned char *in; + unsigned char *out; + unsigned char temp[16]; + + /* allocate space and read it all in (it's around 1 MB) */ + len = log->last_off - log->mark_off; + max = len + (len >> 12) + (len >> 14) + 11; + out = malloc(max); + if (out == NULL) + return 1; + in = malloc(len); + if (in == NULL) { + free(out); + return 1; + } + (void)lseek(log->fd, log->mark_off, SEEK_SET); + if (read(log->fd, in, len) != len) { + free(in); + free(out); + return 1; + } + + /* recompress in memory, decoding stored data as we go */ + /* note: this assumes that unsigned is four bytes or more */ + /* consider not making that assumption */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + if (deflateInit2(&strm, Z_BEST_COMPRESSION, Z_DEFLATED, -15, 8, + Z_DEFAULT_STRATEGY) != Z_OK) { + free(in); + free(out); + return 1; + } + strm.next_in = in; + strm.avail_out = max; + strm.next_out = out; + while (len >= 5) { + if (strm.next_in[0] != 0) + break; + strm.avail_in = strm.next_in[1] + (strm.next_in[2] << 8); + strm.next_in += 5; + len -= 5; + if (strm.avail_in != 0) { + if (len < strm.avail_in) + break; + len -= strm.avail_in; + (void)deflate(&strm, Z_NO_FLUSH); + if (strm.avail_in != 0 || strm.avail_out == 0) + break; + } + } + (void)deflate(&strm, Z_SYNC_FLUSH); + (void)deflateEnd(&strm); + free(in); + if (len != 0 || strm.avail_out == 0) { + free(out); + return 1; + } + + /* overwrite stored data with compressed data */ + (void)lseek(log->fd, log->mark_off, SEEK_SET); + len = max - strm.avail_out; + if (write(log->fd, out, len) != len) { + free(out); + return 1; + } + free(out); + + /* write last empty block, crc, and length */ + log->mark_off = log->last_off = lseek(log->fd, 0, SEEK_CUR); + temp[0] = 1; + dice_ulg(0xffffL << 16, temp + 1); + dice_ulg(log->crc, temp + 5); + dice_ulg(log->len, temp + 9); + if (write(log->fd, temp, 13) != 13) + return 1; + + /* truncate file to discard remaining stored data and old trailer */ + ftruncate(log->fd, lseek(log->fd, 0, SEEK_CUR)); + + /* update extra field to point to new last empty block */ + (void)lseek(log->fd, log->extra, SEEK_SET); + dice_off(log->mark_off, temp); + dice_off(log->last_off, temp + 8); + if (write(log->fd, temp, 16) != 16) + return 1; + return 0; +} + +/* maximum accumulation of stored blocks before compressing */ +#define MAX_STORED 1048576 + +/* close log object */ +int gzlog_close(void *obj) +{ + unsigned char temp[8]; + gz_log *log; + + /* check object */ + log = (gz_log *)obj; + if (log == NULL || log->id != GZLOGID) + return 1; + + /* go to start of most recent block being written */ + (void)lseek(log->fd, log->last_off, SEEK_SET); + + /* if some stuff was put there, update block */ + if (log->stored) { + temp[0] = 0; + dice_ulg(log->stored + ((unsigned long)(~log->stored) << 16), + temp + 1); + if (write(log->fd, temp, 5) != 5) + return 1; + log->last_off = lseek(log->fd, log->stored, SEEK_CUR); + } + + /* write last block (empty) */ + if (write(log->fd, "\001\000\000\377\377", 5) != 5) + return 1; + + /* write updated crc and uncompressed length */ + dice_ulg(log->crc, temp); + dice_ulg(log->len, temp + 4); + if (write(log->fd, temp, 8) != 8) + return 1; + + /* put offset of that last block in gzip extra block */ + (void)lseek(log->fd, log->extra + 8, SEEK_SET); + dice_off(log->last_off, temp); + if (write(log->fd, temp, 8) != 8) + return 1; + + /* if more than 1 MB stored, then time to compress it */ + if (log->last_off - log->mark_off > MAX_STORED) { + if (recomp(log)) + return 1; + } + + /* unlock and close file */ + log_clean(log); + return 0; +} diff --git a/win32/3rdparty/zlib/examples/gzlog.h b/win32/3rdparty/zlib/examples/gzlog.h new file mode 100644 index 000000000..a800bd539 --- /dev/null +++ b/win32/3rdparty/zlib/examples/gzlog.h @@ -0,0 +1,58 @@ +/* gzlog.h + Copyright (C) 2004 Mark Adler, all rights reserved + version 1.0, 26 Nov 2004 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + The gzlog object allows writing short messages to a gzipped log file, + opening the log file locked for small bursts, and then closing it. The log + object works by appending stored data to the gzip file until 1 MB has been + accumulated. At that time, the stored data is compressed, and replaces the + uncompressed data in the file. The log file is truncated to its new size at + that time. After closing, the log file is always valid gzip file that can + decompressed to recover what was written. + + A gzip header "extra" field contains two file offsets for appending. The + first points to just after the last compressed data. The second points to + the last stored block in the deflate stream, which is empty. All of the + data between those pointers is uncompressed. + */ + +/* Open a gzlog object, creating the log file if it does not exist. Return + NULL on error. Note that gzlog_open() could take a long time to return if + there is difficulty in locking the file. */ +void *gzlog_open(char *path); + +/* Write to a gzlog object. Return non-zero on error. This function will + simply write data to the file uncompressed. Compression of the data + will not occur until gzlog_close() is called. It is expected that + gzlog_write() is used for a short message, and then gzlog_close() is + called. If a large amount of data is to be written, then the application + should write no more than 1 MB at a time with gzlog_write() before + calling gzlog_close() and then gzlog_open() again. */ +int gzlog_write(void *log, char *data, size_t len); + +/* Close a gzlog object. Return non-zero on error. The log file is locked + until this function is called. This function will compress stored data + at the end of the gzip file if at least 1 MB has been accumulated. Note + that the file will not be a valid gzip file until this function completes. + */ +int gzlog_close(void *log); diff --git a/win32/3rdparty/zlib/examples/zlib_how.html b/win32/3rdparty/zlib/examples/zlib_how.html new file mode 100644 index 000000000..40998dbf0 --- /dev/null +++ b/win32/3rdparty/zlib/examples/zlib_how.html @@ -0,0 +1,523 @@ + + + + +zlib Usage Example + + + +

zlib Usage Example

+We often get questions about how the deflate() and inflate() functions should be used. +Users wonder when they should provide more input, when they should use more output, +what to do with a Z_BUF_ERROR, how to make sure the process terminates properly, and +so on. So for those who have read zlib.h (a few times), and +would like further edification, below is an annotated example in C of simple routines to compress and decompress +from an input file to an output file using deflate() and inflate() respectively. The +annotations are interspersed between lines of the code. So please read between the lines. +We hope this helps explain some of the intricacies of zlib. +

+Without further adieu, here is the program zpipe.c: +


+/* zpipe.c: example of proper use of zlib's inflate() and deflate()
+   Not copyrighted -- provided to the public domain
+   Version 1.2  9 November 2004  Mark Adler */
+
+/* Version history:
+   1.0  30 Oct 2004  First version
+   1.1   8 Nov 2004  Add void casting for unused return values
+                     Use switch statement for inflate() return values
+   1.2   9 Nov 2004  Add assertions to document zlib guarantees
+ */
+
+We now include the header files for the required definitions. From +stdio.h we use fopen(), fread(), fwrite(), +feof(), ferror(), and fclose() for file i/o, and +fputs() for error messages. From string.h we use +strcmp() for command line argument processing. +From assert.h we use the assert() macro. +From zlib.h +we use the basic compression functions deflateInit(), +deflate(), and deflateEnd(), and the basic decompression +functions inflateInit(), inflate(), and +inflateEnd(). +

+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include "zlib.h"
+
+CHUNK is simply the buffer size for feeding data to and pulling data +from the zlib routines. Larger buffer sizes would be more efficient, +especially for inflate(). If the memory is available, buffers sizes +on the order of 128K or 256K bytes should be used. +

+#define CHUNK 16384
+
+The def() routine compresses data from an input file to an output file. The output data +will be in the zlib format, which is different from the gzip or zip +formats. The zlib format has a very small header of only two bytes to identify it as +a zlib stream and to provide decoding information, and a four-byte trailer with a fast +check value to verify the integrity of the uncompressed data after decoding. +

+/* Compress from file source to file dest until EOF on source.
+   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_STREAM_ERROR if an invalid compression
+   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
+   version of the library linked do not match, or Z_ERRNO if there is
+   an error reading or writing the files. */
+int def(FILE *source, FILE *dest, int level)
+{
+
+Here are the local variables for def(). ret will be used for zlib +return codes. flush will keep track of the current flushing state for deflate(), +which is either no flushing, or flush to completion after the end of the input file is reached. +have is the amount of data returned from deflate(). The strm structure +is used to pass information to and from the zlib routines, and to maintain the +deflate() state. in and out are the input and output buffers for +deflate(). +

+    int ret, flush;
+    unsigned have;
+    z_stream strm;
+    char in[CHUNK];
+    char out[CHUNK];
+
+The first thing we do is to initialize the zlib state for compression using +deflateInit(). This must be done before the first use of deflate(). +The zalloc, zfree, and opaque fields in the strm +structure must be initialized before calling deflateInit(). Here they are +set to the zlib constant Z_NULL to request that zlib use +the default memory allocation routines. An application may also choose to provide +custom memory allocation routines here. deflateInit() will allocate on the +order of 256K bytes for the internal state. +(See zlib Technical Details.) +

+deflateInit() is called with a pointer to the structure to be initialized and +the compression level, which is an integer in the range of -1 to 9. Lower compression +levels result in faster execution, but less compression. Higher levels result in +greater compression, but slower execution. The zlib constant Z_DEFAULT_COMPRESSION, +equal to -1, +provides a good compromise between compression and speed and is equivalent to level 6. +Level 0 actually does no compression at all, and in fact expands the data slightly to produce +the zlib format (it is not a byte-for-byte copy of the input). +More advanced applications of zlib +may use deflateInit2() here instead. Such an application may want to reduce how +much memory will be used, at some price in compression. Or it may need to request a +gzip header and trailer instead of a zlib header and trailer, or raw +encoding with no header or trailer at all. +

+We must check the return value of deflateInit() against the zlib constant +Z_OK to make sure that it was able to +allocate memory for the internal state, and that the provided arguments were valid. +deflateInit() will also check that the version of zlib that the zlib.h +file came from matches the version of zlib actually linked with the program. This +is especially important for environments in which zlib is a shared library. +

+Note that an application can initialize multiple, independent zlib streams, which can +operate in parallel. The state information maintained in the structure allows the zlib +routines to be reentrant. +


+    /* allocate deflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    ret = deflateInit(&strm, level);
+    if (ret != Z_OK)
+        return ret;
+
+With the pleasantries out of the way, now we can get down to business. The outer do-loop +reads all of the input file and exits at the bottom of the loop once end-of-file is reached. +This loop contains the only call of deflate(). So we must make sure that all of the +input data has been processed and that all of the output data has been generated and consumed +before we fall out of the loop at the bottom. +

+    /* compress until end of file */
+    do {
+
+We start off by reading data from the input file. The number of bytes read is put directly +into avail_in, and a pointer to those bytes is put into next_in. We also +check to see if end-of-file on the input has been reached. If we are at the end of file, then flush is set to the +zlib constant Z_FINISH, which is later passed to deflate() to +indicate that this is the last chunk of input data to compress. We need to use feof() +to check for end-of-file as opposed to seeing if fewer than CHUNK bytes have been read. The +reason is that if the input file length is an exact multiple of CHUNK, we will miss +the fact that we got to the end-of-file, and not know to tell deflate() to finish +up the compressed stream. If we are not yet at the end of the input, then the zlib +constant Z_NO_FLUSH will be passed to deflate to indicate that we are still +in the middle of the uncompressed data. +

+If there is an error in reading from the input file, the process is aborted with +deflateEnd() being called to free the allocated zlib state before returning +the error. We wouldn't want a memory leak, now would we? deflateEnd() can be called +at any time after the state has been initialized. Once that's done, deflateInit() (or +deflateInit2()) would have to be called to start a new compression process. There is +no point here in checking the deflateEnd() return code. The deallocation can't fail. +


+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)deflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
+        strm.next_in = in;
+
+The inner do-loop passes our chunk of input data to deflate(), and then +keeps calling deflate() until it is done producing output. Once there is no more +new output, deflate() is guaranteed to have consumed all of the input, i.e., +avail_in will be zero. +

+        /* run deflate() on input until output buffer not full, finish
+           compression if all of source has been read in */
+        do {
+
+Output space is provided to deflate() by setting avail_out to the number +of available output bytes and next_out to a pointer to that space. +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we call the compression engine itself, deflate(). It takes as many of the +avail_in bytes at next_in as it can process, and writes as many as +avail_out bytes to next_out. Those counters and pointers are then +updated past the input data consumed and the output data written. It is the amount of +output space available that may limit how much input is consumed. +Hence the inner loop to make sure that +all of the input is consumed by providing more output space each time. Since avail_in +and next_in are updated by deflate(), we don't have to mess with those +between deflate() calls until it's all used up. +

+The parameters to deflate() are a pointer to the strm structure containing +the input and output information and the internal compression engine state, and a parameter +indicating whether and how to flush data to the output. Normally deflate will consume +several K bytes of input data before producing any output (except for the header), in order +to accumulate statistics on the data for optimum compression. It will then put out a burst of +compressed data, and proceed to consume more input before the next burst. Eventually, +deflate() +must be told to terminate the stream, complete the compression with provided input data, and +write out the trailer check value. deflate() will continue to compress normally as long +as the flush parameter is Z_NO_FLUSH. Once the Z_FINISH parameter is provided, +deflate() will begin to complete the compressed output stream. However depending on how +much output space is provided, deflate() may have to be called several times until it +has provided the complete compressed stream, even after it has consumed all of the input. The flush +parameter must continue to be Z_FINISH for those subsequent calls. +

+There are other values of the flush parameter that are used in more advanced applications. You can +force deflate() to produce a burst of output that encodes all of the input data provided +so far, even if it wouldn't have otherwise, for example to control data latency on a link with +compressed data. You can also ask that deflate() do that as well as erase any history up to +that point so that what follows can be decompressed independently, for example for random access +applications. Both requests will degrade compression by an amount depending on how often such +requests are made. +

+deflate() has a return value that can indicate errors, yet we do not check it here. Why +not? Well, it turns out that deflate() can do no wrong here. Let's go through +deflate()'s return values and dispense with them one by one. The possible values are +Z_OK, Z_STREAM_END, Z_STREAM_ERROR, or Z_BUF_ERROR. Z_OK +is, well, ok. Z_STREAM_END is also ok and will be returned for the last call of +deflate(). This is already guaranteed by calling deflate() with Z_FINISH +until it has no more output. Z_STREAM_ERROR is only possible if the stream is not +initialized properly, but we did initialize it properly. There is no harm in checking for +Z_STREAM_ERROR here, for example to check for the possibility that some +other part of the application inadvertently clobbered the memory containing the zlib state. +Z_BUF_ERROR will be explained further below, but +suffice it to say that this is simply an indication that deflate() could not consume +more input or produce more output. deflate() can be called again with more output space +or more available input, which it will be in this code. +


+            ret = deflate(&strm, flush);    /* no bad return value */
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+
+Now we compute how much output deflate() provided on the last call, which is the +difference between how much space was provided before the call, and how much output space +is still available after the call. Then that data, if any, is written to the output file. +We can then reuse the output buffer for the next call of deflate(). Again if there +is a file i/o error, we call deflateEnd() before returning to avoid a memory leak. +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)deflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop is repeated until the last deflate() call fails to fill the +provided output buffer. Then we know that deflate() has done as much as it can with +the provided input, and that all of that input has been consumed. We can then fall out of this +loop and reuse the input buffer. +

+The way we tell that deflate() has no more output is by seeing that it did not fill +the output buffer, leaving avail_out greater than zero. However suppose that +deflate() has no more output, but just so happened to exactly fill the output buffer! +avail_out is zero, and we can't tell that deflate() has done all it can. +As far as we know, deflate() +has more output for us. So we call it again. But now deflate() produces no output +at all, and avail_out remains unchanged as CHUNK. That deflate() call +wasn't able to do anything, either consume input or produce output, and so it returns +Z_BUF_ERROR. (See, I told you I'd cover this later.) However this is not a problem at +all. Now we finally have the desired indication that deflate() is really done, +and so we drop out of the inner loop to provide more input to deflate(). +

+With flush set to Z_FINISH, this final set of deflate() calls will +complete the output stream. Once that is done, subsequent calls of deflate() would return +Z_STREAM_ERROR if the flush parameter is not Z_FINISH, and do no more processing +until the state is reinitialized. +

+Some applications of zlib have two loops that call deflate() +instead of the single inner loop we have here. The first loop would call +without flushing and feed all of the data to deflate(). The second loop would call +deflate() with no more +data and the Z_FINISH parameter to complete the process. As you can see from this +example, that can be avoided by simply keeping track of the current flush state. +


+        } while (strm.avail_out == 0);
+        assert(strm.avail_in == 0);     /* all input will be used */
+
+Now we check to see if we have already processed all of the input file. That information was +saved in the flush variable, so we see if that was set to Z_FINISH. If so, +then we're done and we fall out of the outer loop. We're guaranteed to get Z_STREAM_END +from the last deflate() call, since we ran it until the last chunk of input was +consumed and all of the output was generated. +

+        /* done when last data in file processed */
+    } while (flush != Z_FINISH);
+    assert(ret == Z_STREAM_END);        /* stream will be complete */
+
+The process is complete, but we still need to deallocate the state to avoid a memory leak +(or rather more like a memory hemorrhage if you didn't do this). Then +finally we can return with a happy return value. +

+    /* clean up and return */
+    (void)deflateEnd(&strm);
+    return Z_OK;
+}
+
+Now we do the same thing for decompression in the inf() routine. inf() +decompresses what is hopefully a valid zlib stream from the input file and writes the +uncompressed data to the output file. Much of the discussion above for def() +applies to inf() as well, so the discussion here will focus on the differences between +the two. +

+/* Decompress from file source to file dest until stream ends or EOF.
+   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_DATA_ERROR if the deflate data is
+   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
+   the version of the library linked do not match, or Z_ERRNO if there
+   is an error reading or writing the files. */
+int inf(FILE *source, FILE *dest)
+{
+
+The local variables have the same functionality as they do for def(). The +only difference is that there is no flush variable, since inflate() +can tell from the zlib stream itself when the stream is complete. +

+    int ret;
+    unsigned have;
+    z_stream strm;
+    char in[CHUNK];
+    char out[CHUNK];
+
+The initialization of the state is the same, except that there is no compression level, +of course, and two more elements of the structure are initialized. avail_in +and next_in must be initialized before calling inflateInit(). This +is because the application has the option to provide the start of the zlib stream in +order for inflateInit() to have access to information about the compression +method to aid in memory allocation. In the current implementation of zlib +(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of +inflate() anyway. However those fields must be initialized since later versions +of zlib that provide more compression methods may take advantage of this interface. +In any case, no decompression is performed by inflateInit(), so the +avail_out and next_out fields do not need to be initialized before calling. +

+Here avail_in is set to zero and next_in is set to Z_NULL to +indicate that no input data is being provided. +


+    /* allocate inflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit(&strm);
+    if (ret != Z_OK)
+        return ret;
+
+The outer do-loop decompresses input until inflate() indicates +that it has reached the end of the compressed data and has produced all of the uncompressed +output. This is in contrast to def() which processes all of the input file. +If end-of-file is reached before the compressed data self-terminates, then the compressed +data is incomplete and an error is returned. +

+    /* decompress until deflate stream ends or end of file */
+    do {
+
+We read input data and set the strm structure accordingly. If we've reached the +end of the input file, then we leave the outer loop and report an error, since the +compressed data is incomplete. Note that we may read more data than is eventually consumed +by inflate(), if the input file continues past the zlib stream. +For applications where zlib streams are embedded in other data, this routine would +need to be modified to return the unused data, or at least indicate how much of the input +data was not used, so the application would know where to pick up after the zlib stream. +

+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)inflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        if (strm.avail_in == 0)
+            break;
+        strm.next_in = in;
+
+The inner do-loop has the same function it did in def(), which is to +keep calling inflate() until has generated all of the output it can with the +provided input. +

+        /* run inflate() on input until output buffer not full */
+        do {
+
+Just like in def(), the same output space is provided for each call of inflate(). +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we run the decompression engine itself. There is no need to adjust the flush parameter, since +the zlib format is self-terminating. The main difference here is that there are +return values that we need to pay attention to. Z_DATA_ERROR +indicates that inflate() detected an error in the zlib compressed data format, +which means that either the data is not a zlib stream to begin with, or that the data was +corrupted somewhere along the way since it was compressed. The other error to be processed is +Z_MEM_ERROR, which can occur since memory allocation is deferred until inflate() +needs it, unlike deflate(), whose memory is allocated at the start by deflateInit(). +

+Advanced applications may use +deflateSetDictionary() to prime deflate() with a set of likely data to improve the +first 32K or so of compression. This is noted in the zlib header, so inflate() +requests that that dictionary be provided before it can start to decompress. Without the dictionary, +correct decompression is not possible. For this routine, we have no idea what the dictionary is, +so the Z_NEED_DICT indication is converted to a Z_DATA_ERROR. +

+inflate() can also return Z_STREAM_ERROR, which should not be possible here, +but could be checked for as noted above for def(). Z_BUF_ERROR does not need to be +checked for here, for the same reasons noted for def(). Z_STREAM_END will be +checked for later. +


+            ret = inflate(&strm, Z_NO_FLUSH);
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+            switch (ret) {
+            case Z_NEED_DICT:
+                ret = Z_DATA_ERROR;     /* and fall through */
+            case Z_DATA_ERROR:
+            case Z_MEM_ERROR:
+                (void)inflateEnd(&strm);
+                return ret;
+            }
+
+The output of inflate() is handled identically to that of deflate(). +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)inflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop ends when inflate() has no more output as indicated +by not filling the output buffer, just as for deflate(). In this case, we cannot +assert that strm.avail_in will be zero, since the deflate stream may end before the file +does. +

+        } while (strm.avail_out == 0);
+
+The outer do-loop ends when inflate() reports that it has reached the +end of the input zlib stream, has completed the decompression and integrity +check, and has provided all of the output. This is indicated by the inflate() +return value Z_STREAM_END. The inner loop is guaranteed to leave ret +equal to Z_STREAM_END if the last chunk of the input file read contained the end +of the zlib stream. So if the return value is not Z_STREAM_END, the +loop continues to read more input. +

+        /* done when inflate() says it's done */
+    } while (ret != Z_STREAM_END);
+
+At this point, decompression successfully completed, or we broke out of the loop due to no +more data being available from the input file. If the last inflate() return value +is not Z_STREAM_END, then the zlib stream was incomplete and a data error +is returned. Otherwise, we return with a happy return value. Of course, inflateEnd() +is called first to avoid a memory leak. +

+    /* clean up and return */
+    (void)inflateEnd(&strm);
+    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
+}
+
+That ends the routines that directly use zlib. The following routines make this +a command-line program by running data through the above routines from stdin to +stdout, and handling any errors reported by def() or inf(). +

+zerr() is used to interpret the possible error codes from def() +and inf(), as detailed in their comments above, and print out an error message. +Note that these are only a subset of the possible return values from deflate() +and inflate(). +


+/* report a zlib or i/o error */
+void zerr(int ret)
+{
+    fputs("zpipe: ", stderr);
+    switch (ret) {
+    case Z_ERRNO:
+        if (ferror(stdin))
+            fputs("error reading stdin\n", stderr);
+        if (ferror(stdout))
+            fputs("error writing stdout\n", stderr);
+        break;
+    case Z_STREAM_ERROR:
+        fputs("invalid compression level\n", stderr);
+        break;
+    case Z_DATA_ERROR:
+        fputs("invalid or incomplete deflate data\n", stderr);
+        break;
+    case Z_MEM_ERROR:
+        fputs("out of memory\n", stderr);
+        break;
+    case Z_VERSION_ERROR:
+        fputs("zlib version mismatch!\n", stderr);
+    }
+}
+
+Here is the main() routine used to test def() and inf(). The +zpipe command is simply a compression pipe from stdin to stdout, if +no arguments are given, or it is a decompression pipe if zpipe -d is used. If any other +arguments are provided, no compression or decompression is performed. Instead a usage +message is displayed. Examples are zpipe < foo.txt > foo.txt.z to compress, and +zpipe -d < foo.txt.z > foo.txt to decompress. +

+/* compress or decompress from stdin to stdout */
+int main(int argc, char **argv)
+{
+    int ret;
+
+    /* do compression if no arguments */
+    if (argc == 1) {
+        ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* do decompression if -d specified */
+    else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
+        ret = inf(stdin, stdout);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* otherwise, report usage */
+    else {
+        fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
+        return 1;
+    }
+}
+
+
+Copyright (c) 2004 by Mark Adler
Last modified 13 November 2004
+ + diff --git a/win32/3rdparty/zlib/examples/zpipe.c b/win32/3rdparty/zlib/examples/zpipe.c new file mode 100644 index 000000000..26abb56a9 --- /dev/null +++ b/win32/3rdparty/zlib/examples/zpipe.c @@ -0,0 +1,191 @@ +/* zpipe.c: example of proper use of zlib's inflate() and deflate() + Not copyrighted -- provided to the public domain + Version 1.2 9 November 2004 Mark Adler */ + +/* Version history: + 1.0 30 Oct 2004 First version + 1.1 8 Nov 2004 Add void casting for unused return values + Use switch statement for inflate() return values + 1.2 9 Nov 2004 Add assertions to document zlib guarantees + 1.3 6 Apr 2005 Remove incorrect assertion in inf() + */ + +#include +#include +#include +#include "zlib.h" + +#define CHUNK 16384 + +/* Compress from file source to file dest until EOF on source. + def() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_STREAM_ERROR if an invalid compression + level is supplied, Z_VERSION_ERROR if the version of zlib.h and the + version of the library linked do not match, or Z_ERRNO if there is + an error reading or writing the files. */ +int def(FILE *source, FILE *dest, int level) +{ + int ret, flush; + unsigned have; + z_stream strm; + char in[CHUNK]; + char out[CHUNK]; + + /* allocate deflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = deflateInit(&strm, level); + if (ret != Z_OK) + return ret; + + /* compress until end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = in; + + /* run deflate() on input until output buffer not full, finish + compression if all of source has been read in */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = deflate(&strm, flush); /* no bad return value */ + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + assert(strm.avail_in == 0); /* all input will be used */ + + /* done when last data in file processed */ + } while (flush != Z_FINISH); + assert(ret == Z_STREAM_END); /* stream will be complete */ + + /* clean up and return */ + (void)deflateEnd(&strm); + return Z_OK; +} + +/* Decompress from file source to file dest until stream ends or EOF. + inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_DATA_ERROR if the deflate data is + invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and + the version of the library linked do not match, or Z_ERRNO if there + is an error reading or writing the files. */ +int inf(FILE *source, FILE *dest) +{ + int ret; + unsigned have; + z_stream strm; + char in[CHUNK]; + char out[CHUNK]; + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); + if (ret != Z_OK) + return ret; + + /* decompress until deflate stream ends or end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + if (strm.avail_in == 0) + break; + strm.next_in = in; + + /* run inflate() on input until output buffer not full */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void)inflateEnd(&strm); + return ret; + } + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + + /* done when inflate() says it's done */ + } while (ret != Z_STREAM_END); + + /* clean up and return */ + (void)inflateEnd(&strm); + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; +} + +/* report a zlib or i/o error */ +void zerr(int ret) +{ + fputs("zpipe: ", stderr); + switch (ret) { + case Z_ERRNO: + if (ferror(stdin)) + fputs("error reading stdin\n", stderr); + if (ferror(stdout)) + fputs("error writing stdout\n", stderr); + break; + case Z_STREAM_ERROR: + fputs("invalid compression level\n", stderr); + break; + case Z_DATA_ERROR: + fputs("invalid or incomplete deflate data\n", stderr); + break; + case Z_MEM_ERROR: + fputs("out of memory\n", stderr); + break; + case Z_VERSION_ERROR: + fputs("zlib version mismatch!\n", stderr); + } +} + +/* compress or decompress from stdin to stdout */ +int main(int argc, char **argv) +{ + int ret; + + /* do compression if no arguments */ + if (argc == 1) { + ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* do decompression if -d specified */ + else if (argc == 2 && strcmp(argv[1], "-d") == 0) { + ret = inf(stdin, stdout); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* otherwise, report usage */ + else { + fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); + return 1; + } +} diff --git a/win32/3rdparty/zlib/examples/zran.c b/win32/3rdparty/zlib/examples/zran.c new file mode 100644 index 000000000..8c7717eb2 --- /dev/null +++ b/win32/3rdparty/zlib/examples/zran.c @@ -0,0 +1,404 @@ +/* zran.c -- example of zlib/gzip stream indexing and random access + * Copyright (C) 2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.0 29 May 2005 Mark Adler */ + +/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() + for random access of a compressed file. A file containing a zlib or gzip + stream is provided on the command line. The compressed stream is decoded in + its entirety, and an index built with access points about every SPAN bytes + in the uncompressed output. The compressed file is left open, and can then + be read randomly, having to decompress on the average SPAN/2 uncompressed + bytes before getting to the desired block of data. + + An access point can be created at the start of any deflate block, by saving + the starting file offset and bit of that block, and the 32K bytes of + uncompressed data that precede that block. Also the uncompressed offset of + that block is saved to provide a referece for locating a desired starting + point in the uncompressed stream. build_index() works by decompressing the + input zlib or gzip stream a block at a time, and at the end of each block + deciding if enough uncompressed data has gone by to justify the creation of + a new access point. If so, that point is saved in a data structure that + grows as needed to accommodate the points. + + To use the index, an offset in the uncompressed data is provided, for which + the latest accees point at or preceding that offset is located in the index. + The input file is positioned to the specified location in the index, and if + necessary the first few bits of the compressed data is read from the file. + inflate is initialized with those bits and the 32K of uncompressed data, and + the decompression then proceeds until the desired offset in the file is + reached. Then the decompression continues to read the desired uncompressed + data from the file. + + Another approach would be to generate the index on demand. In that case, + requests for random access reads from the compressed data would try to use + the index, but if a read far enough past the end of the index is required, + then further index entries would be generated and added. + + There is some fair bit of overhead to starting inflation for the random + access, mainly copying the 32K byte dictionary. So if small pieces of the + file are being accessed, it would make sense to implement a cache to hold + some lookahead and avoid many calls to extract() for small lengths. + + Another way to build an index would be to use inflateCopy(). That would + not be constrained to have access points at block boundaries, but requires + more memory per access point, and also cannot be saved to file due to the + use of pointers in the state. The approach here allows for storage of the + index in a file. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +#define SPAN 1048576L /* desired distance between access points */ +#define WINSIZE 32768U /* sliding window size */ +#define CHUNK 16384 /* file input buffer size */ + +/* access point entry */ +struct point { + off_t out; /* corresponding offset in uncompressed data */ + off_t in; /* offset in input file of first full byte */ + int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ + unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ +}; + +/* access point list */ +struct access { + int have; /* number of list entries filled in */ + int size; /* number of list entries allocated */ + struct point *list; /* allocated list */ +}; + +/* Deallocate an index built by build_index() */ +local void free_index(struct access *index) +{ + if (index != NULL) { + free(index->list); + free(index); + } +} + +/* Add an entry to the access point list. If out of memory, deallocate the + existing list and return NULL. */ +local struct access *addpoint(struct access *index, int bits, + off_t in, off_t out, unsigned left, unsigned char *window) +{ + struct point *next; + + /* if list is empty, create it (start with eight points) */ + if (index == NULL) { + index = malloc(sizeof(struct access)); + if (index == NULL) return NULL; + index->list = malloc(sizeof(struct point) << 3); + if (index->list == NULL) { + free(index); + return NULL; + } + index->size = 8; + index->have = 0; + } + + /* if list is full, make it bigger */ + else if (index->have == index->size) { + index->size <<= 1; + next = realloc(index->list, sizeof(struct point) * index->size); + if (next == NULL) { + free_index(index); + return NULL; + } + index->list = next; + } + + /* fill in entry and increment how many we have */ + next = index->list + index->have; + next->bits = bits; + next->in = in; + next->out = out; + if (left) + memcpy(next->window, window + WINSIZE - left, left); + if (left < WINSIZE) + memcpy(next->window + left, window, WINSIZE - left); + index->have++; + + /* return list, possibly reallocated */ + return index; +} + +/* Make one entire pass through the compressed stream and build an index, with + access points about every span bytes of uncompressed output -- span is + chosen to balance the speed of random access against the memory requirements + of the list, about 32K bytes per access point. Note that data after the end + of the first zlib or gzip stream in the file is ignored. build_index() + returns the number of access points on success (>= 1), Z_MEM_ERROR for out + of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a + file read error. On success, *built points to the resulting index. */ +local int build_index(FILE *in, off_t span, struct access **built) +{ + int ret; + off_t totin, totout; /* our own total counters to avoid 4GB limit */ + off_t last; /* totout value of last access point */ + struct access *index; /* access points being generated */ + z_stream strm; + unsigned char input[CHUNK]; + unsigned char window[WINSIZE]; + + /* initialize inflate */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */ + if (ret != Z_OK) + return ret; + + /* inflate the input, maintain a sliding window, and build an index -- this + also validates the integrity of the compressed data using the check + information at the end of the gzip or zlib stream */ + totin = totout = last = 0; + index = NULL; /* will be allocated by first addpoint() */ + strm.avail_out = 0; + do { + /* get some compressed data from input file */ + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto build_index_error; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto build_index_error; + } + strm.next_in = input; + + /* process all of that, or until end of stream */ + do { + /* reset sliding window if necessary */ + if (strm.avail_out == 0) { + strm.avail_out = WINSIZE; + strm.next_out = window; + } + + /* inflate until out of input, output, or at end of block -- + update the total input and output counters */ + totin += strm.avail_in; + totout += strm.avail_out; + ret = inflate(&strm, Z_BLOCK); /* return at end of block */ + totin -= strm.avail_in; + totout -= strm.avail_out; + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto build_index_error; + if (ret == Z_STREAM_END) + break; + + /* if at end of block, consider adding an index entry (note that if + data_type indicates an end-of-block, then all of the + uncompressed data from that block has been delivered, and none + of the compressed data after that block has been consumed, + except for up to seven bits) -- the totout == 0 provides an + entry point after the zlib or gzip header, and assures that the + index always has at least one access point; we avoid creating an + access point after the last block by checking bit 6 of data_type + */ + if ((strm.data_type & 128) && !(strm.data_type & 64) && + (totout == 0 || totout - last > span)) { + index = addpoint(index, strm.data_type & 7, totin, + totout, strm.avail_out, window); + if (index == NULL) { + ret = Z_MEM_ERROR; + goto build_index_error; + } + last = totout; + } + } while (strm.avail_in != 0); + } while (ret != Z_STREAM_END); + + /* clean up and return index (release unused entries in list) */ + (void)inflateEnd(&strm); + index = realloc(index, sizeof(struct point) * index->have); + index->size = index->have; + *built = index; + return index->size; + + /* return error */ + build_index_error: + (void)inflateEnd(&strm); + if (index != NULL) + free_index(index); + return ret; +} + +/* Use the index to read len bytes from offset into buf, return bytes read or + negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past + the end of the uncompressed data, then extract() will return a value less + than len, indicating how much as actually read into buf. This function + should not return a data error unless the file was modified since the index + was generated. extract() may also return Z_ERRNO if there is an error on + reading or seeking the input file. */ +local int extract(FILE *in, struct access *index, off_t offset, + unsigned char *buf, int len) +{ + int ret, skip; + z_stream strm; + struct point *here; + unsigned char input[CHUNK]; + unsigned char discard[WINSIZE]; + + /* proceed only if something reasonable to do */ + if (len < 0) + return 0; + + /* find where in stream to start */ + here = index->list; + ret = index->have; + while (--ret && here[1].out <= offset) + here++; + + /* initialize file and inflate state to start there */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); /* raw inflate */ + if (ret != Z_OK) + return ret; + ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); + if (ret == -1) + goto extract_ret; + if (here->bits) { + ret = getc(in); + if (ret == -1) { + ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; + goto extract_ret; + } + (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); + } + (void)inflateSetDictionary(&strm, here->window, WINSIZE); + + /* skip uncompressed bytes until offset reached, then satisfy request */ + offset -= here->out; + strm.avail_in = 0; + skip = 1; /* while skipping to offset */ + do { + /* define where to put uncompressed data, and how much */ + if (offset == 0 && skip) { /* at offset now */ + strm.avail_out = len; + strm.next_out = buf; + skip = 0; /* only do this once */ + } + if (offset > WINSIZE) { /* skip WINSIZE bytes */ + strm.avail_out = WINSIZE; + strm.next_out = discard; + offset -= WINSIZE; + } + else if (offset != 0) { /* last skip */ + strm.avail_out = (unsigned)offset; + strm.next_out = discard; + offset = 0; + } + + /* uncompress until avail_out filled, or end of stream */ + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto extract_ret; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto extract_ret; + } + strm.next_in = input; + } + ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */ + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto extract_ret; + if (ret == Z_STREAM_END) + break; + } while (strm.avail_out != 0); + + /* if reach end of stream, then don't keep trying to get more */ + if (ret == Z_STREAM_END) + break; + + /* do until offset reached and requested data read, or stream ends */ + } while (skip); + + /* compute number of uncompressed bytes read after offset */ + ret = skip ? 0 : len - strm.avail_out; + + /* clean up and return bytes read or error */ + extract_ret: + (void)inflateEnd(&strm); + return ret; +} + +/* Demonstrate the use of build_index() and extract() by processing the file + provided on the command line, and the extracting 16K from about 2/3rds of + the way through the uncompressed output, and writing that to stdout. */ +int main(int argc, char **argv) +{ + int len; + off_t offset; + FILE *in; + struct access *index; + unsigned char buf[CHUNK]; + + /* open input file */ + if (argc != 2) { + fprintf(stderr, "usage: zran file.gz\n"); + return 1; + } + in = fopen(argv[1], "rb"); + if (in == NULL) { + fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); + return 1; + } + + /* build index */ + len = build_index(in, SPAN, &index); + if (len < 0) { + fclose(in); + switch (len) { + case Z_MEM_ERROR: + fprintf(stderr, "zran: out of memory\n"); + break; + case Z_DATA_ERROR: + fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); + break; + case Z_ERRNO: + fprintf(stderr, "zran: read error on %s\n", argv[1]); + break; + default: + fprintf(stderr, "zran: error %d while building index\n", len); + } + return 1; + } + fprintf(stderr, "zran: built index with %d access points\n", len); + + /* use index by reading some bytes from an arbitrary offset */ + offset = (index->list[index->have - 1].out << 1) / 3; + len = extract(in, index, offset, buf, CHUNK); + if (len < 0) + fprintf(stderr, "zran: extraction failed: %s error\n", + len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); + else { + fwrite(buf, 1, len, stdout); + fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); + } + + /* clean up and exit */ + free_index(index); + fclose(in); + return 0; +} diff --git a/win32/3rdparty/zlib/gzio.c b/win32/3rdparty/zlib/gzio.c new file mode 100644 index 000000000..7e90f4928 --- /dev/null +++ b/win32/3rdparty/zlib/gzio.c @@ -0,0 +1,1026 @@ +/* gzio.c -- IO on .gz files + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. + */ + +/* @(#) $Id$ */ + +#include + +#include "zutil.h" + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +#ifndef Z_BUFSIZE +# ifdef MAXSEG_64K +# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ +# else +# define Z_BUFSIZE 16384 +# endif +#endif +#ifndef Z_PRINTF_BUFSIZE +# define Z_PRINTF_BUFSIZE 4096 +#endif + +#ifdef __MVS__ +# pragma map (fdopen , "\174\174FDOPEN") + FILE *fdopen(int, const char *); +#endif + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern void free OF((voidpf ptr)); +#endif + +#define ALLOC(size) malloc(size) +#define TRYFREE(p) {if (p) free(p);} + +static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ + +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ + Byte *inbuf; /* input buffer */ + Byte *outbuf; /* output buffer */ + uLong crc; /* crc32 of uncompressed data */ + char *msg; /* error message */ + char *path; /* path name for debugging only */ + int transparent; /* 1 if input file is not a .gz file */ + char mode; /* 'w' or 'r' */ + z_off_t start; /* start of compressed data in file (header skipped) */ + z_off_t in; /* bytes into deflate or inflate */ + z_off_t out; /* bytes out of deflate or inflate */ + int back; /* one character push-back */ + int last; /* true if push-back is last character */ +} gz_stream; + + +local gzFile gz_open OF((const char *path, const char *mode, int fd)); +local int do_flush OF((gzFile file, int flush)); +local int get_byte OF((gz_stream *s)); +local void check_header OF((gz_stream *s)); +local int destroy OF((gz_stream *s)); +local void putLong OF((FILE *file, uLong x)); +local uLong getLong OF((gz_stream *s)); + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb"). The file is given either by file descriptor + or path name (if fd == -1). + gz_open returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +*/ +local gzFile gz_open (path, mode, fd) + const char *path; + const char *mode; + int fd; +{ + int err; + int level = Z_DEFAULT_COMPRESSION; /* compression level */ + int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ + char *p = (char*)mode; + gz_stream *s; + char fmode[80]; /* copy of mode, without the compression level */ + char *m = fmode; + + if (!path || !mode) return Z_NULL; + + s = (gz_stream *)ALLOC(sizeof(gz_stream)); + if (!s) return Z_NULL; + + s->stream.zalloc = (alloc_func)0; + s->stream.zfree = (free_func)0; + s->stream.opaque = (voidpf)0; + s->stream.next_in = s->inbuf = Z_NULL; + s->stream.next_out = s->outbuf = Z_NULL; + s->stream.avail_in = s->stream.avail_out = 0; + s->file = NULL; + s->z_err = Z_OK; + s->z_eof = 0; + s->in = 0; + s->out = 0; + s->back = EOF; + s->crc = crc32(0L, Z_NULL, 0); + s->msg = NULL; + s->transparent = 0; + + s->path = (char*)ALLOC(strlen(path)+1); + if (s->path == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + strcpy(s->path, path); /* do this early for debugging */ + + s->mode = '\0'; + do { + if (*p == 'r') s->mode = 'r'; + if (*p == 'w' || *p == 'a') s->mode = 'w'; + if (*p >= '0' && *p <= '9') { + level = *p - '0'; + } else if (*p == 'f') { + strategy = Z_FILTERED; + } else if (*p == 'h') { + strategy = Z_HUFFMAN_ONLY; + } else if (*p == 'R') { + strategy = Z_RLE; + } else { + *m++ = *p; /* copy the mode */ + } + } while (*p++ && m != fmode + sizeof(fmode)); + if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateInit2(&(s->stream), level, + Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); + /* windowBits is passed < 0 to suppress zlib header */ + + s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); +#endif + if (err != Z_OK || s->outbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } else { + s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); + + err = inflateInit2(&(s->stream), -MAX_WBITS); + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are + * present after the compressed stream. + */ + if (err != Z_OK || s->inbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } + s->stream.avail_out = Z_BUFSIZE; + + errno = 0; + s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); + + if (s->file == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + if (s->mode == 'w') { + /* Write a very simple .gz header: + */ + fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], + Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); + s->start = 10L; + /* We use 10L instead of ftell(s->file) to because ftell causes an + * fflush on some systems. This version of the library doesn't use + * start anyway in write mode, so this initialization is not + * necessary. + */ + } else { + check_header(s); /* skip the .gz header */ + s->start = ftell(s->file) - s->stream.avail_in; + } + + return (gzFile)s; +} + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. +*/ +gzFile ZEXPORT gzopen (path, mode) + const char *path; + const char *mode; +{ + return gz_open (path, mode, -1); +} + +/* =========================================================================== + Associate a gzFile with the file descriptor fd. fd is not dup'ed here + to mimic the behavio(u)r of fdopen. +*/ +gzFile ZEXPORT gzdopen (fd, mode) + int fd; + const char *mode; +{ + char name[46]; /* allow for up to 128-bit integers */ + + if (fd < 0) return (gzFile)Z_NULL; + sprintf(name, "", fd); /* for debugging */ + + return gz_open (name, mode, fd); +} + +/* =========================================================================== + * Update the compression level and strategy + */ +int ZEXPORT gzsetparams (file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + /* Make room to allow flushing */ + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + } + s->stream.avail_out = Z_BUFSIZE; + } + + return deflateParams (&(s->stream), level, strategy); +} + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ +local int get_byte(s) + gz_stream *s; +{ + if (s->z_eof) return EOF; + if (s->stream.avail_in == 0) { + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) s->z_err = Z_ERRNO; + return EOF; + } + s->stream.next_in = s->inbuf; + } + s->stream.avail_in--; + return *(s->stream.next_in)++; +} + +/* =========================================================================== + Check the gzip header of a gz_stream opened for reading. Set the stream + mode to transparent if the gzip magic header is not present; set s->err + to Z_DATA_ERROR if the magic header is present but the rest of the header + is incorrect. + IN assertion: the stream s has already been created sucessfully; + s->stream.avail_in is zero for the first time, but may be non-zero + for concatenated .gz files. +*/ +local void check_header(s) + gz_stream *s; +{ + int method; /* method byte */ + int flags; /* flags byte */ + uInt len; + int c; + + /* Assure two bytes in the buffer so we can peek ahead -- handle case + where first byte of header is at the end of the buffer after the last + gzip segment */ + len = s->stream.avail_in; + if (len < 2) { + if (len) s->inbuf[0] = s->stream.next_in[0]; + errno = 0; + len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); + if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; + s->stream.avail_in += len; + s->stream.next_in = s->inbuf; + if (s->stream.avail_in < 2) { + s->transparent = s->stream.avail_in; + return; + } + } + + /* Peek ahead to check the gzip magic header */ + if (s->stream.next_in[0] != gz_magic[0] || + s->stream.next_in[1] != gz_magic[1]) { + s->transparent = 1; + return; + } + s->stream.avail_in -= 2; + s->stream.next_in += 2; + + /* Check the rest of the gzip header */ + method = get_byte(s); + flags = get_byte(s); + if (method != Z_DEFLATED || (flags & RESERVED) != 0) { + s->z_err = Z_DATA_ERROR; + return; + } + + /* Discard time, xflags and OS code: */ + for (len = 0; len < 6; len++) (void)get_byte(s); + + if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ + len = (uInt)get_byte(s); + len += ((uInt)get_byte(s))<<8; + /* len is garbage if EOF but the loop below will quit anyway */ + while (len-- != 0 && get_byte(s) != EOF) ; + } + if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ + for (len = 0; len < 2; len++) (void)get_byte(s); + } + s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; +} + + /* =========================================================================== + * Cleanup then free the given gz_stream. Return a zlib error code. + Try freeing in the reverse order of allocations. + */ +local int destroy (s) + gz_stream *s; +{ + int err = Z_OK; + + if (!s) return Z_STREAM_ERROR; + + TRYFREE(s->msg); + + if (s->stream.state != NULL) { + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateEnd(&(s->stream)); +#endif + } else if (s->mode == 'r') { + err = inflateEnd(&(s->stream)); + } + } + if (s->file != NULL && fclose(s->file)) { +#ifdef ESPIPE + if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ +#endif + err = Z_ERRNO; + } + if (s->z_err < 0) err = s->z_err; + + TRYFREE(s->inbuf); + TRYFREE(s->outbuf); + TRYFREE(s->path); + TRYFREE(s); + return err; +} + +/* =========================================================================== + Reads the given number of uncompressed bytes from the compressed file. + gzread returns the number of bytes actually read (0 for end of file). +*/ +int ZEXPORT gzread (file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + Bytef *start = (Bytef*)buf; /* starting point for crc computation */ + Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ + + if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; + + if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; + if (s->z_err == Z_STREAM_END) return 0; /* EOF */ + + next_out = (Byte*)buf; + s->stream.next_out = (Bytef*)buf; + s->stream.avail_out = len; + + if (s->stream.avail_out && s->back != EOF) { + *next_out++ = s->back; + s->stream.next_out++; + s->stream.avail_out--; + s->back = EOF; + s->out++; + start++; + if (s->last) { + s->z_err = Z_STREAM_END; + return 1; + } + } + + while (s->stream.avail_out != 0) { + + if (s->transparent) { + /* Copy first the lookahead bytes: */ + uInt n = s->stream.avail_in; + if (n > s->stream.avail_out) n = s->stream.avail_out; + if (n > 0) { + zmemcpy(s->stream.next_out, s->stream.next_in, n); + next_out += n; + s->stream.next_out = next_out; + s->stream.next_in += n; + s->stream.avail_out -= n; + s->stream.avail_in -= n; + } + if (s->stream.avail_out > 0) { + s->stream.avail_out -= + (uInt)fread(next_out, 1, s->stream.avail_out, s->file); + } + len -= s->stream.avail_out; + s->in += len; + s->out += len; + if (len == 0) s->z_eof = 1; + return (int)len; + } + if (s->stream.avail_in == 0 && !s->z_eof) { + + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) { + s->z_err = Z_ERRNO; + break; + } + } + s->stream.next_in = s->inbuf; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = inflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + + if (s->z_err == Z_STREAM_END) { + /* Check CRC and original size */ + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + start = s->stream.next_out; + + if (getLong(s) != s->crc) { + s->z_err = Z_DATA_ERROR; + } else { + (void)getLong(s); + /* The uncompressed length returned by above getlong() may be + * different from s->out in case of concatenated .gz files. + * Check for such files: + */ + check_header(s); + if (s->z_err == Z_OK) { + inflateReset(&(s->stream)); + s->crc = crc32(0L, Z_NULL, 0); + } + } + } + if (s->z_err != Z_OK || s->z_eof) break; + } + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + + if (len == s->stream.avail_out && + (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) + return -1; + return (int)(len - s->stream.avail_out); +} + + +/* =========================================================================== + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ +int ZEXPORT gzgetc(file) + gzFile file; +{ + unsigned char c; + + return gzread(file, &c, 1) == 1 ? c : -1; +} + + +/* =========================================================================== + Push one byte back onto the stream. +*/ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; + s->back = c; + s->out--; + s->last = (s->z_err == Z_STREAM_END); + if (s->last) s->z_err = Z_OK; + s->z_eof = 0; + return c; +} + + +/* =========================================================================== + Reads bytes from the compressed file until len-1 characters are + read, or a newline character is read and transferred to buf, or an + end-of-file condition is encountered. The string is then terminated + with a null character. + gzgets returns buf, or Z_NULL in case of error. + + The current implementation is not optimized at all. +*/ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + char *b = buf; + if (buf == Z_NULL || len <= 0) return Z_NULL; + + while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; + *buf = '\0'; + return b == buf && len > 0 ? Z_NULL : b; +} + + +#ifndef NO_GZCOMPRESS +/* =========================================================================== + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of bytes actually written (0 in case of error). +*/ +int ZEXPORT gzwrite (file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.next_in = (Bytef*)buf; + s->stream.avail_in = len; + + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + break; + } + s->stream.avail_out = Z_BUFSIZE; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + if (s->z_err != Z_OK) break; + } + s->crc = crc32(s->crc, (const Bytef *)buf, len); + + return (int)(len - s->stream.avail_in); +} + + +/* =========================================================================== + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ +#ifdef STDC +#include + +int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) +{ + char buf[Z_PRINTF_BUFSIZE]; + va_list va; + int len; + + buf[sizeof(buf) - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(buf, format, va); + va_end(va); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = vsprintf(buf, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(buf, sizeof(buf), format, va); + va_end(va); + len = strlen(buf); +# else + len = vsnprintf(buf, sizeof(buf), format, va); + va_end(va); +# endif +#endif + if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, (unsigned)len); +} +#else /* not ANSI C */ + +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + char buf[Z_PRINTF_BUFSIZE]; + int len; + + buf[sizeof(buf) - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(buf); +# else + len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, len); +} +#endif + +/* =========================================================================== + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char cc = (unsigned char) c; /* required for big endian systems */ + + return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; +} + + +/* =========================================================================== + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ +int ZEXPORT gzputs(file, s) + gzFile file; + const char *s; +{ + return gzwrite(file, (char*)s, (unsigned)strlen(s)); +} + + +/* =========================================================================== + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. +*/ +local int do_flush (file, flush) + gzFile file; + int flush; +{ + uInt len; + int done = 0; + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.avail_in = 0; /* should be zero already anyway */ + + for (;;) { + len = Z_BUFSIZE - s->stream.avail_out; + + if (len != 0) { + if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { + s->z_err = Z_ERRNO; + return Z_ERRNO; + } + s->stream.next_out = s->outbuf; + s->stream.avail_out = Z_BUFSIZE; + } + if (done) break; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), flush); + s->out -= s->stream.avail_out; + + /* Ignore the second of two consecutive flushes: */ + if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); + + if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; + } + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + +int ZEXPORT gzflush (file, flush) + gzFile file; + int flush; +{ + gz_stream *s = (gz_stream*)file; + int err = do_flush (file, flush); + + if (err) return err; + fflush(s->file); + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} +#endif /* NO_GZCOMPRESS */ + +/* =========================================================================== + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error. + SEEK_END is not implemented, returns error. + In this version of the library, gzseek can be extremely slow. +*/ +z_off_t ZEXPORT gzseek (file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || whence == SEEK_END || + s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { + return -1L; + } + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return -1L; +#else + if (whence == SEEK_SET) { + offset -= s->in; + } + if (offset < 0) return -1L; + + /* At this point, offset is the number of zero bytes to write. */ + if (s->inbuf == Z_NULL) { + s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ + if (s->inbuf == Z_NULL) return -1L; + zmemzero(s->inbuf, Z_BUFSIZE); + } + while (offset > 0) { + uInt size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (uInt)offset; + + size = gzwrite(file, s->inbuf, size); + if (size == 0) return -1L; + + offset -= size; + } + return s->in; +#endif + } + /* Rest of function is for reading only */ + + /* compute absolute position */ + if (whence == SEEK_CUR) { + offset += s->out; + } + if (offset < 0) return -1L; + + if (s->transparent) { + /* map to fseek */ + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; + + s->in = s->out = offset; + return offset; + } + + /* For a negative seek, rewind and use positive seek */ + if (offset >= s->out) { + offset -= s->out; + } else if (gzrewind(file) < 0) { + return -1L; + } + /* offset is now the number of bytes to skip. */ + + if (offset != 0 && s->outbuf == Z_NULL) { + s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); + if (s->outbuf == Z_NULL) return -1L; + } + if (offset && s->back != EOF) { + s->back = EOF; + s->out++; + offset--; + if (s->last) s->z_err = Z_STREAM_END; + } + while (offset > 0) { + int size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (int)offset; + + size = gzread(file, s->outbuf, (uInt)size); + if (size <= 0) return -1L; + offset -= size; + } + return s->out; +} + +/* =========================================================================== + Rewinds input file. +*/ +int ZEXPORT gzrewind (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return -1; + + s->z_err = Z_OK; + s->z_eof = 0; + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + s->crc = crc32(0L, Z_NULL, 0); + if (!s->transparent) (void)inflateReset(&s->stream); + s->in = 0; + s->out = 0; + return fseek(s->file, s->start, SEEK_SET); +} + +/* =========================================================================== + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +*/ +z_off_t ZEXPORT gztell (file) + gzFile file; +{ + return gzseek(file, 0L, SEEK_CUR); +} + +/* =========================================================================== + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ +int ZEXPORT gzeof (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + /* With concatenated compressed files that can have embedded + * crc trailers, z_eof is no longer the only/best indicator of EOF + * on a gz_stream. Handle end-of-stream error explicitly here. + */ + if (s == NULL || s->mode != 'r') return 0; + if (s->z_eof) return 1; + return s->z_err == Z_STREAM_END; +} + +/* =========================================================================== + Returns 1 if reading and doing so transparently, otherwise zero. +*/ +int ZEXPORT gzdirect (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return 0; + return s->transparent; +} + +/* =========================================================================== + Outputs a long in LSB order to the given file +*/ +local void putLong (file, x) + FILE *file; + uLong x; +{ + int n; + for (n = 0; n < 4; n++) { + fputc((int)(x & 0xff), file); + x >>= 8; + } +} + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets z_err in case + of error. +*/ +local uLong getLong (s) + gz_stream *s; +{ + uLong x = (uLong)get_byte(s); + int c; + + x += ((uLong)get_byte(s))<<8; + x += ((uLong)get_byte(s))<<16; + c = get_byte(s); + if (c == EOF) s->z_err = Z_DATA_ERROR; + x += ((uLong)c)<<24; + return x; +} + +/* =========================================================================== + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. +*/ +int ZEXPORT gzclose (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return Z_STREAM_ERROR; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return Z_STREAM_ERROR; +#else + if (do_flush (file, Z_FINISH) != Z_OK) + return destroy((gz_stream*)file); + + putLong (s->file, s->crc); + putLong (s->file, (uLong)(s->in & 0xffffffff)); +#endif + } + return destroy((gz_stream*)file); +} + +#ifdef STDC +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +/* =========================================================================== + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ +const char * ZEXPORT gzerror (file, errnum) + gzFile file; + int *errnum; +{ + char *m; + gz_stream *s = (gz_stream*)file; + + if (s == NULL) { + *errnum = Z_STREAM_ERROR; + return (const char*)ERR_MSG(Z_STREAM_ERROR); + } + *errnum = s->z_err; + if (*errnum == Z_OK) return (const char*)""; + + m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); + + if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); + + TRYFREE(s->msg); + s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); + if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); + strcpy(s->msg, s->path); + strcat(s->msg, ": "); + strcat(s->msg, m); + return (const char*)s->msg; +} + +/* =========================================================================== + Clear the error and end-of-file flags, and do the same for the real file. +*/ +void ZEXPORT gzclearerr (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return; + if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; + s->z_eof = 0; + clearerr(s->file); +} diff --git a/win32/3rdparty/zlib/infback.c b/win32/3rdparty/zlib/infback.c new file mode 100644 index 000000000..455dbc9ee --- /dev/null +++ b/win32/3rdparty/zlib/infback.c @@ -0,0 +1,623 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->write = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + + /* process literal */ + if (this.op == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/win32/3rdparty/zlib/inffast.c b/win32/3rdparty/zlib/inffast.c new file mode 100644 index 000000000..bbee92ed1 --- /dev/null +++ b/win32/3rdparty/zlib/inffast.c @@ -0,0 +1,318 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/win32/3rdparty/zlib/inffast.h b/win32/3rdparty/zlib/inffast.h new file mode 100644 index 000000000..1e88d2d97 --- /dev/null +++ b/win32/3rdparty/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/win32/3rdparty/zlib/inffixed.h b/win32/3rdparty/zlib/inffixed.h new file mode 100644 index 000000000..75ed4b597 --- /dev/null +++ b/win32/3rdparty/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/win32/3rdparty/zlib/inflate.c b/win32/3rdparty/zlib/inflate.c new file mode 100644 index 000000000..792fdee8e --- /dev/null +++ b/win32/3rdparty/zlib/inflate.c @@ -0,0 +1,1368 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/win32/3rdparty/zlib/inflate.h b/win32/3rdparty/zlib/inflate.h new file mode 100644 index 000000000..07bd3e78a --- /dev/null +++ b/win32/3rdparty/zlib/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/win32/3rdparty/zlib/inftrees.c b/win32/3rdparty/zlib/inftrees.c new file mode 100644 index 000000000..8a9c13ff0 --- /dev/null +++ b/win32/3rdparty/zlib/inftrees.c @@ -0,0 +1,329 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/win32/3rdparty/zlib/inftrees.h b/win32/3rdparty/zlib/inftrees.h new file mode 100644 index 000000000..b1104c87e --- /dev/null +++ b/win32/3rdparty/zlib/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/win32/3rdparty/zlib/make_vms.com b/win32/3rdparty/zlib/make_vms.com new file mode 100644 index 000000000..c2a1fb54b --- /dev/null +++ b/win32/3rdparty/zlib/make_vms.com @@ -0,0 +1,461 @@ +$! make libz under VMS written by +$! Martin P.J. Zinser +$! +$! +$ on error then goto err_exit +$! +$! +$! Just some general constants... +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ SAY = "WRITE SYS$OUTPUT" +$! +$! Setup variables holding "config" information +$! +$ Make = "" +$ name = "Zlib" +$ version = "?.?.?" +$ v_string = "ZLIB_VERSION" +$ v_file = "zlib.h" +$ ccopt = "" +$ lopts = "" +$ linkonly = false +$ optfile = name + ".opt" +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$ axp = f$getsyi("HW_MODEL").ge.1024 +$ s_case = false +$! Check for MMK/MMS +$! +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$! +$! +$ gosub find_version +$! +$ gosub check_opts +$! +$! Look for the compiler used +$! +$ gosub check_compiler +$ if its_decc +$ then +$ ccopt = "/prefix=all" + ccopt +$ if f$trnlnm("SYS") .eqs. "" +$ then +$ if axp +$ then +$ define sys sys$library: +$ else +$ ccopt = "/decc" + ccopt +$ define sys decc$library_include: +$ endif +$ endif +$ endif +$ if its_vaxc .or. its_gnuc +$ then +$ if f$trnlnm("SYS").eqs."" then define sys sys$library: +$ endif +$! +$! Build the thing plain or with mms +$! +$ write sys$output "Compiling Zlib sources ..." +$ if make.eqs."" +$ then +$ dele example.obj;*,minigzip.obj;* +$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - + adler32.c zlib.h zconf.h +$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - + compress.c zlib.h zconf.h +$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - + crc32.c zlib.h zconf.h +$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - + deflate.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" - + gzio.c zutil.h zlib.h zconf.h +$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - + infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - + inffast.c zutil.h zlib.h zconf.h inffast.h +$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - + inflate.c zutil.h zlib.h zconf.h infblock.h +$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - + inftrees.c zutil.h zlib.h zconf.h inftrees.h +$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - + trees.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - + uncompr.c zlib.h zconf.h +$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - + zutil.c zutil.h zlib.h zconf.h +$ write sys$output "Building Zlib ..." +$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ +$ write sys$output "Building example..." +$ CALL MAKE example.OBJ "CC ''CCOPT' example" - + example.c zlib.h zconf.h +$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb +$ if f$search("x11vms:xvmsutils.olb") .nes. "" +$ then +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - + minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - + minigzip.obj libz.olb +$ endif +$ else +$ gosub crea_mms +$ SAY "Make ''name' ''version' with ''Make' " +$ 'make' +$ endif +$! +$! Alpha gets a shareable image +$! +$ If axp +$ Then +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call anal_obj_axp modules.opt _link.opt +$ if s_case +$ then +$ open/append optf modules.opt +$ write optf "case_sensitive=YES" +$ close optf +$ endif +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,_link.opt/opt +$ endif +$ write sys$output "Zlib build completed" +$ exit +$CC_ERR: +$ write sys$output "C compiler required to build ''name'" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ write sys$output "Exiting..." +$ exit 2 +$! +$! +$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES +$ V = 'F$Verify(0) +$! P1 = What we are trying to make +$! P2 = Command to make it +$! P3 - P8 What it depends on +$ +$ If F$Search(P1) .Eqs. "" Then Goto Makeit +$ Time = F$CvTime(F$File(P1,"RDT")) +$arg=3 +$Loop: +$ Argument = P'arg +$ If Argument .Eqs. "" Then Goto Exit +$ El=0 +$Loop2: +$ File = F$Element(El," ",Argument) +$ If File .Eqs. " " Then Goto Endl +$ AFile = "" +$Loop3: +$ OFile = AFile +$ AFile = F$Search(File) +$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl +$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit +$ Goto Loop3 +$NextEL: +$ El = El + 1 +$ Goto Loop2 +$EndL: +$ arg=arg+1 +$ If arg .Le. 8 Then Goto Loop +$ Goto Exit +$ +$Makeit: +$ VV=F$VERIFY(0) +$ write sys$output P2 +$ 'P2 +$ VV='F$Verify(VV) +$Exit: +$ If V Then Set Verify +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Look for the compiler used +$! +$CHECK_COMPILER: +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then +$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") +$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") +$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") +$ endif +$! +$! Exit if no compiler available +$! +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then goto CC_ERR +$ else +$ if its_decc then write sys$output "CC compiler check ... Compaq C" +$ if its_vaxc then write sys$output "CC compiler check ... VAX C" +$ if its_gnuc then write sys$output "CC compiler check ... GNU C" +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms..." +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser +# + +OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj, infback.obj\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, \ + inftrees.obj, inffast.obj + +$ eod +$ write out "CFLAGS=", ccopt +$ write out "LOPTS=", lopts +$ copy sys$input: out +$ deck + +all : example.exe minigzip.exe libz.olb + @ write sys$output " Example applications available" + +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link $(LOPTS) example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link $(LOPTS) minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* + + +# Other dependencies. +adler32.obj : adler32.c zutil.h zlib.h zconf.h +compress.obj : compress.c zlib.h zconf.h +crc32.obj : crc32.c zutil.h zlib.h zconf.h +deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h +example.obj : example.c zlib.h zconf.h +gzio.obj : gzio.c zutil.h zlib.h zconf.h +inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h +inflate.obj : inflate.c zutil.h zlib.h zconf.h +inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h +minigzip.obj : minigzip.c zlib.h zconf.h +trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h +uncompr.obj : uncompr.c zlib.h zconf.h +zutil.obj : zutil.c zutil.h zlib.h zconf.h +infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Read list of core library sources from makefile.in and create options +$! needed to build shareable image +$! +$CREA_OLIST: +$ open/read min makefile.in +$ open/write mod modules.opt +$ src_check = "OBJS =" +$MRLOOP: +$ read/end=mrdone min rec +$ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop +$ rec = rec - src_check +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrdone +$MRSLOOP: +$ read/end=mrdone min rec +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop +$MRDONE: +$ close min +$ close mod +$ return +$!------------------------------------------------------------------------------ +$! +$! Take record extracted in crea_olist and split it into single filenames +$! +$EXTRA_FILNAM: +$ myrec = f$edit(rec - "\", "trim,compress") +$ i = 0 +$FELOOP: +$ srcfil = f$element(i," ", myrec) +$ if (srcfil .nes. " ") +$ then +$ write mod f$parse(srcfil,,,"NAME"), ".obj" +$ i = i + 1 +$ goto feloop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Find current Zlib version number +$! +$FIND_VERSION: +$ open/read h_in 'v_file' +$hloop: +$ read/end=hdone h_in rec +$ rec = f$edit(rec,"TRIM") +$ if (f$extract(0,1,rec) .nes. "#") then goto hloop +$ rec = f$edit(rec - "#", "TRIM") +$ if f$element(0," ",rec) .nes. "define" then goto hloop +$ if f$element(1," ",rec) .eqs. v_string +$ then +$ version = 'f$element(2," ",rec)' +$ goto hdone +$ endif +$ goto hloop +$hdone: +$ close h_in +$ return +$!------------------------------------------------------------------------------ +$! +$! Analyze Object files for OpenVMS AXP to extract Procedure and Data +$! information to build a symbol vector for a shareable image +$! All the "brains" of this logic was suggested by Hartmut Becker +$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me +$! (zinser@decus.de), so if you do have problem reports please do not +$! bother Hartmut/HP, but get in touch with me +$! +$ ANAL_OBJ_AXP: Subroutine +$ V = 'F$Verify(0) +$ SAY := "WRITE_ SYS$OUTPUT" +$ +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_aa +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP: Error, no output file provided" +$ goto exit_aa +$ ENDIF +$ +$ open/read in 'p1 +$ create a.tmp +$ open/append atmp a.tmp +$ loop: +$ read/end=end_loop in line +$ f= f$search(line) +$ if f .eqs. "" +$ then +$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" +$ goto loop +$ endif +$ define/user sys$output nl: +$ define/user sys$error nl: +$ anal/obj/gsd 'f /out=x.tmp +$ open/read xtmp x.tmp +$ XLOOP: +$ read/end=end_xloop xtmp xline +$ xline = f$edit(xline,"compress") +$ write atmp xline +$ goto xloop +$ END_XLOOP: +$ close xtmp +$ goto loop +$ end_loop: +$ close in +$ close atmp +$ if f$search("a.tmp") .eqs. "" - + then $ exit +$ ! all global definitions +$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp +$ ! all procedures +$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp +$ search c.tmp "symbol:"/out=d.tmp +$ define/user sys$output nl: +$ edito/edt/command=sys$input d.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=PROCEDURE)/whole +exit +$ ! all data +$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp +$ search e.tmp "symbol:"/out=f.tmp +$ define/user sys$output nl: +$ edito/edt/command=sys$input f.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=DATA)/whole +exit +$ sort/nodupl d.tmp,f.tmp 'p2' +$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* +$ if f$search("x.tmp") .nes. "" - + then $ delete x.tmp;* +$! +$ EXIT_AA: +$ if V then set verify +$ endsubroutine +$!------------------------------------------------------------------------------ diff --git a/win32/3rdparty/zlib/minigzip.c b/win32/3rdparty/zlib/minigzip.c new file mode 100644 index 000000000..4524b96a1 --- /dev/null +++ b/win32/3rdparty/zlib/minigzip.c @@ -0,0 +1,322 @@ +/* minigzip.c -- simulate gzip using the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * minigzip is a minimal implementation of the gzip utility. This is + * only an example of using zlib and isn't meant to replace the + * full-featured gzip. No attempt is made to deal with file systems + * limiting names to 14 or 8+3 characters, etc... Error checking is + * very limited. So use minigzip only for testing; use gzip for the + * real thing. On MSDOS, use only on file names without extension + * or in pipe mode. + */ + +/* @(#) $Id$ */ + +#include +#include "zlib.h" + +#ifdef STDC +# include +# include +#endif + +#ifdef USE_MMAP +# include +# include +# include +#endif + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#ifdef VMS +# define unlink delete +# define GZ_SUFFIX "-gz" +#endif +#ifdef RISCOS +# define unlink remove +# define GZ_SUFFIX "-gz" +# define fileno(file) file->__file +#endif +#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fileno */ +#endif + +#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ + extern int unlink OF((const char *)); +#endif + +#ifndef GZ_SUFFIX +# define GZ_SUFFIX ".gz" +#endif +#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) + +#define BUFLEN 16384 +#define MAX_NAME_LEN 1024 + +#ifdef MAXSEG_64K +# define local static + /* Needed for systems with limitation on stack size. */ +#else +# define local +#endif + +char *prog; + +void error OF((const char *msg)); +void gz_compress OF((FILE *in, gzFile out)); +#ifdef USE_MMAP +int gz_compress_mmap OF((FILE *in, gzFile out)); +#endif +void gz_uncompress OF((gzFile in, FILE *out)); +void file_compress OF((char *file, char *mode)); +void file_uncompress OF((char *file)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Display error message and exit + */ +void error(msg) + const char *msg; +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + +/* =========================================================================== + * Compress input to output then close both files. + */ + +void gz_compress(in, out) + FILE *in; + gzFile out; +{ + local char buf[BUFLEN]; + int len; + int err; + +#ifdef USE_MMAP + /* Try first compressing with mmap. If mmap fails (minigzip used in a + * pipe), use the normal fread loop. + */ + if (gz_compress_mmap(in, out) == Z_OK) return; +#endif + for (;;) { + len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) break; + + if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); + } + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); +} + +#ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ + +/* Try compressing the input file at once using mmap. Return Z_OK if + * if success, Z_ERRNO otherwise. + */ +int gz_compress_mmap(in, out) + FILE *in; + gzFile out; +{ + int len; + int err; + int ifd = fileno(in); + caddr_t buf; /* mmap'ed buffer for the entire input file */ + off_t buf_len; /* length of the input file */ + struct stat sb; + + /* Determine the size of the file, needed for mmap: */ + if (fstat(ifd, &sb) < 0) return Z_ERRNO; + buf_len = sb.st_size; + if (buf_len <= 0) return Z_ERRNO; + + /* Now do the actual mmap: */ + buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (caddr_t)(-1)) return Z_ERRNO; + + /* Compress the whole file at once: */ + len = gzwrite(out, (char *)buf, (unsigned)buf_len); + + if (len != (int)buf_len) error(gzerror(out, &err)); + + munmap(buf, buf_len); + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); + return Z_OK; +} +#endif /* USE_MMAP */ + +/* =========================================================================== + * Uncompress input to output then close both files. + */ +void gz_uncompress(in, out) + gzFile in; + FILE *out; +{ + local char buf[BUFLEN]; + int len; + int err; + + for (;;) { + len = gzread(in, buf, sizeof(buf)); + if (len < 0) error (gzerror(in, &err)); + if (len == 0) break; + + if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + error("failed fwrite"); + } + } + if (fclose(out)) error("failed fclose"); + + if (gzclose(in) != Z_OK) error("failed gzclose"); +} + + +/* =========================================================================== + * Compress the given file: create a corresponding .gz file and remove the + * original. + */ +void file_compress(file, mode) + char *file; + char *mode; +{ + local char outfile[MAX_NAME_LEN]; + FILE *in; + gzFile out; + + strcpy(outfile, file); + strcat(outfile, GZ_SUFFIX); + + in = fopen(file, "rb"); + if (in == NULL) { + perror(file); + exit(1); + } + out = gzopen(outfile, mode); + if (out == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); + exit(1); + } + gz_compress(in, out); + + unlink(file); +} + + +/* =========================================================================== + * Uncompress the given file and remove the original. + */ +void file_uncompress(file) + char *file; +{ + local char buf[MAX_NAME_LEN]; + char *infile, *outfile; + FILE *out; + gzFile in; + uInt len = (uInt)strlen(file); + + strcpy(buf, file); + + if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { + infile = file; + outfile = buf; + outfile[len-3] = '\0'; + } else { + outfile = file; + infile = buf; + strcat(infile, GZ_SUFFIX); + } + in = gzopen(infile, "rb"); + if (in == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); + exit(1); + } + out = fopen(outfile, "wb"); + if (out == NULL) { + perror(file); + exit(1); + } + + gz_uncompress(in, out); + + unlink(infile); +} + + +/* =========================================================================== + * Usage: minigzip [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -d : decompress + * -f : compress with Z_FILTERED + * -h : compress with Z_HUFFMAN_ONLY + * -r : compress with Z_RLE + * -1 to -9 : compression level + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + int uncompr = 0; + gzFile file; + char outmode[20]; + + strcpy(outmode, "wb6 "); + + prog = argv[0]; + argc--, argv++; + + while (argc > 0) { + if (strcmp(*argv, "-d") == 0) + uncompr = 1; + else if (strcmp(*argv, "-f") == 0) + outmode[3] = 'f'; + else if (strcmp(*argv, "-h") == 0) + outmode[3] = 'h'; + else if (strcmp(*argv, "-r") == 0) + outmode[3] = 'R'; + else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && + (*argv)[2] == 0) + outmode[2] = (*argv)[1]; + else + break; + argc--, argv++; + } + if (outmode[3] == ' ') + outmode[3] = 0; + if (argc == 0) { + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + if (uncompr) { + file = gzdopen(fileno(stdin), "rb"); + if (file == NULL) error("can't gzdopen stdin"); + gz_uncompress(file, stdout); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + gz_compress(stdin, file); + } + } else { + do { + if (uncompr) { + file_uncompress(*argv); + } else { + file_compress(*argv, outmode); + } + } while (argv++, --argc); + } + return 0; +} diff --git a/win32/3rdparty/zlib/msdos/Makefile.bor b/win32/3rdparty/zlib/msdos/Makefile.bor new file mode 100644 index 000000000..8f8132d12 --- /dev/null +++ b/win32/3rdparty/zlib/msdos/Makefile.bor @@ -0,0 +1,109 @@ +# Makefile for zlib +# Borland C++ +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.bor" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C++, Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# memory model: one of s, m, c, l (small, medium, compact, large) +MODEL=l + +# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version +CC=bcc +LD=bcc +AR=tlib + +# compiler flags +# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0 +CFLAGS=-O2 -Z -m$(MODEL) $(LOC) + +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj +OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj +OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/win32/3rdparty/zlib/msdos/Makefile.dj2 b/win32/3rdparty/zlib/msdos/Makefile.dj2 new file mode 100644 index 000000000..283d1d961 --- /dev/null +++ b/win32/3rdparty/zlib/msdos/Makefile.dj2 @@ -0,0 +1,104 @@ +# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.dj2; make test -fmakefile.dj2 +# +# To install libz.a, zconf.h and zlib.h in the djgpp directories, type: +# +# make install -fmakefile.dj2 +# +# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as +# in the sample below if the pattern of the DJGPP distribution is to +# be followed. Remember that, while 'es around <=> are ignored in +# makefiles, they are *not* in batch files or in djgpp.env. +# - - - - - +# [make] +# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include +# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib +# BUTT=-m486 +# - - - - - +# Alternately, these variables may be defined below, overriding the values +# in djgpp.env, as +# INCLUDE_PATH=c:\usr\include +# LIBRARY_PATH=c:\usr\lib + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DDEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lz +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=libz.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infback.o inftrees.o inffast.o + +OBJA = +# to use the asm code: make OBJA=match.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +check: test +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +libz.a: $(OBJS) $(OBJA) + $(AR) $@ $(OBJS) $(OBJA) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + +# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env . + +.PHONY : uninstall clean + +install: $(INCL) $(LIBS) + -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH) + -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH) + $(INSTALL) zlib.h $(INCLUDE_PATH) + $(INSTALL) zconf.h $(INCLUDE_PATH) + $(INSTALL) libz.a $(LIBRARY_PATH) + +uninstall: + $(RM) $(INCLUDE_PATH)\zlib.h + $(RM) $(INCLUDE_PATH)\zconf.h + $(RM) $(LIBRARY_PATH)\libz.a + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) libz.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/win32/3rdparty/zlib/msdos/Makefile.emx b/win32/3rdparty/zlib/msdos/Makefile.emx new file mode 100644 index 000000000..ed4c31fbb --- /dev/null +++ b/win32/3rdparty/zlib/msdos/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DDEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/win32/3rdparty/zlib/msdos/Makefile.msc b/win32/3rdparty/zlib/msdos/Makefile.msc new file mode 100644 index 000000000..b8fc665ef --- /dev/null +++ b/win32/3rdparty/zlib/msdos/Makefile.msc @@ -0,0 +1,106 @@ +# Makefile for zlib +# Microsoft C 5.1 or later +# Last updated: 19-Mar-2003 + +# To use, do "make makefile.msc" +# To compile in small model, set below: MODEL=S + +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------- Microsoft C 5.1 and later ------------- + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# Memory model: one of S, M, C, L (small, medium, compact, large) +MODEL=L + +CC=cl +CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC) +#-Ox generates bad code with MSC 5.1 +LIB_CFLAGS=-Zl $(CFLAGS) + +LD=link +LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode +# "/farcall/packcode" are only useful for `large code' memory models +# but should be a "no-op" for small code models. + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj +OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(LIB_CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + +minigzip.obj: minigzip.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + if exist $(ZLIB_LIB) del $(ZLIB_LIB) + lib $(ZLIB_LIB) $(OBJ1); + lib $(ZLIB_LIB) $(OBJ2); + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB); + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB); + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del *.map + -del zlib_*.bak + -del foo.gz diff --git a/win32/3rdparty/zlib/msdos/Makefile.tc b/win32/3rdparty/zlib/msdos/Makefile.tc new file mode 100644 index 000000000..480750ade --- /dev/null +++ b/win32/3rdparty/zlib/msdos/Makefile.tc @@ -0,0 +1,94 @@ +# Makefile for zlib +# Turbo C 2.01, Turbo C++ 1.01 +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.tc" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to CFLAGS below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C 2.01, Turbo C++ 1.01 ------------ +MODEL=l +CC=tcc +LD=tcc +AR=tlib +# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +CFLAGS=-O2 -G -Z -m$(MODEL) +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj +OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj +OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/win32/3rdparty/zlib/old/Makefile.riscos b/win32/3rdparty/zlib/old/Makefile.riscos new file mode 100644 index 000000000..57e29d3fb --- /dev/null +++ b/win32/3rdparty/zlib/old/Makefile.riscos @@ -0,0 +1,151 @@ +# Project: zlib_1_03 +# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430 +# test works out-of-the-box, installs `somewhere' on demand + +# Toolflags: +CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah +C++flags = -c -depend !Depend -IC: -throwback +Linkflags = -aif -c++ -o $@ +ObjAsmflags = -throwback -NoCache -depend !Depend +CMHGflags = +LibFileflags = -c -l -o $@ +Squeezeflags = -o $@ + +# change the line below to where _you_ want the library installed. +libdest = lib:zlib + +# Final targets: +@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \ + @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \ + @.o.uncompr @.o.zutil + LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \ + @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \ + @.o.trees @.o.uncompr @.o.zutil +test: @.minigzip @.example @.lib + @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV + @echo running tests: hang on. + @/@.minigzip -f -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -f -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -1 libc + @/@.minigzip -d libc-gz + @diff @.lib @.libc + @echo that should have reported '@.lib and @.libc identical' if you have diff. + @/@.example @.fred @.fred + @echo that will have given lots of hello!'s. + +@.minigzip: @.o.minigzip @.lib C:o.Stubs + Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs +@.example: @.o.example @.lib C:o.Stubs + Link $(Linkflags) @.o.example @.lib C:o.Stubs + +install: @.lib + cdir $(libdest) + cdir $(libdest).h + @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV + @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV + @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV + @echo okay, installed zlib in $(libdest) + +clean:; remove @.minigzip + remove @.example + remove @.libc + -wipe @.o.* F~r~cV + remove @.fred + +# User-editable dependencies: +.c.o: + cc $(ccflags) -o $@ $< + +# Static dependencies: + +# Dynamic dependencies: +o.example: c.example +o.example: h.zlib +o.example: h.zconf +o.minigzip: c.minigzip +o.minigzip: h.zlib +o.minigzip: h.zconf +o.adler32: c.adler32 +o.adler32: h.zlib +o.adler32: h.zconf +o.compress: c.compress +o.compress: h.zlib +o.compress: h.zconf +o.crc32: c.crc32 +o.crc32: h.zlib +o.crc32: h.zconf +o.deflate: c.deflate +o.deflate: h.deflate +o.deflate: h.zutil +o.deflate: h.zlib +o.deflate: h.zconf +o.gzio: c.gzio +o.gzio: h.zutil +o.gzio: h.zlib +o.gzio: h.zconf +o.infblock: c.infblock +o.infblock: h.zutil +o.infblock: h.zlib +o.infblock: h.zconf +o.infblock: h.infblock +o.infblock: h.inftrees +o.infblock: h.infcodes +o.infblock: h.infutil +o.infcodes: c.infcodes +o.infcodes: h.zutil +o.infcodes: h.zlib +o.infcodes: h.zconf +o.infcodes: h.inftrees +o.infcodes: h.infblock +o.infcodes: h.infcodes +o.infcodes: h.infutil +o.infcodes: h.inffast +o.inffast: c.inffast +o.inffast: h.zutil +o.inffast: h.zlib +o.inffast: h.zconf +o.inffast: h.inftrees +o.inffast: h.infblock +o.inffast: h.infcodes +o.inffast: h.infutil +o.inffast: h.inffast +o.inflate: c.inflate +o.inflate: h.zutil +o.inflate: h.zlib +o.inflate: h.zconf +o.inflate: h.infblock +o.inftrees: c.inftrees +o.inftrees: h.zutil +o.inftrees: h.zlib +o.inftrees: h.zconf +o.inftrees: h.inftrees +o.inftrees: h.inffixed +o.infutil: c.infutil +o.infutil: h.zutil +o.infutil: h.zlib +o.infutil: h.zconf +o.infutil: h.infblock +o.infutil: h.inftrees +o.infutil: h.infcodes +o.infutil: h.infutil +o.trees: c.trees +o.trees: h.deflate +o.trees: h.zutil +o.trees: h.zlib +o.trees: h.zconf +o.trees: h.trees +o.uncompr: c.uncompr +o.uncompr: h.zlib +o.uncompr: h.zconf +o.zutil: c.zutil +o.zutil: h.zutil +o.zutil: h.zlib +o.zutil: h.zconf diff --git a/win32/3rdparty/zlib/old/README b/win32/3rdparty/zlib/old/README new file mode 100644 index 000000000..800bf0798 --- /dev/null +++ b/win32/3rdparty/zlib/old/README @@ -0,0 +1,3 @@ +This directory contains files that have not been updated for zlib 1.2.x + +(Volunteers are encouraged to help clean this up. Thanks.) diff --git a/win32/3rdparty/zlib/old/descrip.mms b/win32/3rdparty/zlib/old/descrip.mms new file mode 100644 index 000000000..7066da5b5 --- /dev/null +++ b/win32/3rdparty/zlib/old/descrip.mms @@ -0,0 +1,48 @@ +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser + +cc_defs = +c_deb = + +.ifdef __DECC__ +pref = /prefix=all +.endif + +OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ + inftrees.obj, infcodes.obj, infutil.obj, inffast.obj + +CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) + +all : example.exe minigzip.exe + @ write sys$output " Example applications available" +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;* + + +# Other dependencies. +adler32.obj : zutil.h zlib.h zconf.h +compress.obj : zlib.h zconf.h +crc32.obj : zutil.h zlib.h zconf.h +deflate.obj : deflate.h zutil.h zlib.h zconf.h +example.obj : zlib.h zconf.h +gzio.obj : zutil.h zlib.h zconf.h +infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h +inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h +inflate.obj : zutil.h zlib.h zconf.h infblock.h +inftrees.obj : zutil.h zlib.h zconf.h inftrees.h +infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h +minigzip.obj : zlib.h zconf.h +trees.obj : deflate.h zutil.h zlib.h zconf.h +uncompr.obj : zlib.h zconf.h +zutil.obj : zutil.h zlib.h zconf.h diff --git a/win32/3rdparty/zlib/old/os2/Makefile.os2 b/win32/3rdparty/zlib/old/os2/Makefile.os2 new file mode 100644 index 000000000..a105aaa5b --- /dev/null +++ b/win32/3rdparty/zlib/old/os2/Makefile.os2 @@ -0,0 +1,136 @@ +# Makefile for zlib under OS/2 using GCC (PGCC) +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# cp Makefile.os2 .. +# cd .. +# make -f Makefile.os2 test + +# This makefile will build a static library z.lib, a shared library +# z.dll and a import library zdll.lib. You can use either z.lib or +# zdll.lib by specifying either -lz or -lzdll on gcc's command line + +CC=gcc -Zomf -s + +CFLAGS=-O6 -Wall +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DDEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +#################### BUG WARNING: ##################### +## infcodes.c hits a bug in pgcc-1.0, so you have to use either +## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem) +## This bug is reportedly fixed in pgcc >1.0, but this was not tested +CFLAGS+=-fno-force-mem + +LDFLAGS=-s -L. -lzdll -Zcrtdll +LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll + +VER=1.1.0 +ZLIB=z.lib +SHAREDLIB=z.dll +SHAREDLIBIMP=zdll.lib +LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP) + +AR=emxomfar cr +IMPLIB=emximp +RANLIB=echo +TAR=tar +SHELL=bash + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o + +TEST_OBJS = example.o minigzip.o + +DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ + algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ + nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \ + contrib/asm386/*.asm contrib/asm386/*.c \ + contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \ + contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \ + contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 + +all: example.exe minigzip.exe + +test: all + @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + echo hello world | ./minigzip | ./minigzip -d || \ + echo ' *** minigzip test FAILED ***' ; \ + if ./example; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; \ + fi + +$(ZLIB): $(OBJS) + $(AR) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +$(SHAREDLIB): $(OBJS) os2/z.def + $(LDSHARED) -o $@ $^ + +$(SHAREDLIBIMP): os2/z.def + $(IMPLIB) -o $@ $^ + +example.exe: example.o $(LIBS) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) + +minigzip.exe: minigzip.o $(LIBS) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + +clean: + rm -f *.o *~ example minigzip libz.a libz.so* foo.gz + +distclean: clean + +zip: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + zip -ul9 zlib$$v $(DISTFILES) + mv Makefile~ Makefile + +dist: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + rm -f $$d.tar.gz; \ + if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ + files=""; \ + for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ + cd ..; \ + GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ + if test ! -d $$d; then rm -f $$d; fi + mv Makefile~ Makefile + +tags: + etags *.[ch] + +depend: + makedepend -- $(CFLAGS) -- *.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h +infcodes.o: zutil.h zlib.h zconf.h +infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h +inffast.o: infblock.h infcodes.h infutil.h inffast.h +inflate.o: zutil.h zlib.h zconf.h infblock.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/win32/3rdparty/zlib/old/os2/zlib.def b/win32/3rdparty/zlib/old/os2/zlib.def new file mode 100644 index 000000000..4c753f1a3 --- /dev/null +++ b/win32/3rdparty/zlib/old/os2/zlib.def @@ -0,0 +1,51 @@ +; +; Slightly modified version of ../nt/zlib.dnt :-) +; + +LIBRARY Z +DESCRIPTION "Zlib compression library for OS/2" +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE + +EXPORTS + adler32 + compress + crc32 + deflate + deflateCopy + deflateEnd + deflateInit2_ + deflateInit_ + deflateParams + deflateReset + deflateSetDictionary + gzclose + gzdopen + gzerror + gzflush + gzopen + gzread + gzwrite + inflate + inflateEnd + inflateInit2_ + inflateInit_ + inflateReset + inflateSetDictionary + inflateSync + uncompress + zlibVersion + gzprintf + gzputc + gzgetc + gzseek + gzrewind + gztell + gzeof + gzsetparams + zError + inflateSyncPoint + get_crc_table + compress2 + gzputs + gzgets diff --git a/win32/3rdparty/zlib/old/visual-basic.txt b/win32/3rdparty/zlib/old/visual-basic.txt new file mode 100644 index 000000000..57efe5812 --- /dev/null +++ b/win32/3rdparty/zlib/old/visual-basic.txt @@ -0,0 +1,160 @@ +See below some functions declarations for Visual Basic. + +Frequently Asked Question: + +Q: Each time I use the compress function I get the -5 error (not enough + room in the output buffer). + +A: Make sure that the length of the compressed buffer is passed by + reference ("as any"), not by value ("as long"). Also check that + before the call of compress this length is equal to the total size of + the compressed buffer and not zero. + + +From: "Jon Caruana" +Subject: Re: How to port zlib declares to vb? +Date: Mon, 28 Oct 1996 18:33:03 -0600 + +Got the answer! (I haven't had time to check this but it's what I got, and +looks correct): + +He has the following routines working: + compress + uncompress + gzopen + gzwrite + gzread + gzclose + +Declares follow: (Quoted from Carlos Rios , in Vb4 form) + +#If Win16 Then 'Use Win16 calls. +Declare Function compress Lib "ZLIB.DLL" (ByVal compr As + String, comprLen As Any, ByVal buf As String, ByVal buflen + As Long) As Integer +Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr + As String, uncomprLen As Any, ByVal compr As String, ByVal + lcompr As Long) As Integer +Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As + String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As + Long) As Integer +#Else +Declare Function compress Lib "ZLIB32.DLL" + (ByVal compr As String, comprLen As Any, ByVal buf As + String, ByVal buflen As Long) As Integer +Declare Function uncompress Lib "ZLIB32.DLL" + (ByVal uncompr As String, uncomprLen As Any, ByVal compr As + String, ByVal lcompr As Long) As Long +Declare Function gzopen Lib "ZLIB32.DLL" + (ByVal file As String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzwrite Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzclose Lib "ZLIB32.DLL" + (ByVal file As Long) As Long +#End If + +-Jon Caruana +jon-net@usa.net +Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member + + +Here is another example from Michael that he +says conforms to the VB guidelines, and that solves the problem of not +knowing the uncompressed size by storing it at the end of the file: + +'Calling the functions: +'bracket meaning: [optional] {Range of possible values} +'Call subCompressFile( [, , [level of compression {1..9}]]) +'Call subUncompressFile() + +Option Explicit +Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller' +Private Const SUCCESS As Long = 0 +Private Const strFilExt As String = ".cpr" +Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long, +ByVal level As Integer) As Long +Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) +As Long + +Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal +strargCprFilPth As String, Optional ByVal intLvl As Integer = 9) + Dim strCprPth As String + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim bytaryOri() As Byte + Dim bytaryCpr() As Byte + lngOriSiz = FileLen(strargOriFilPth) + ReDim bytaryOri(lngOriSiz - 1) + Open strargOriFilPth For Binary Access Read As #1 + Get #1, , bytaryOri() + Close #1 + strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth) +'Select file path and name + strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) = +strFilExt, "", strFilExt) 'Add file extension if not exists + lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit +more space then original file size + ReDim bytaryCpr(lngCprSiz - 1) + If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) = +SUCCESS Then + lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100 + ReDim Preserve bytaryCpr(lngCprSiz - 1) + Open strCprPth For Binary Access Write As #1 + Put #1, , bytaryCpr() + Put #1, , lngOriSiz 'Add the the original size value to the end +(last 4 bytes) + Close #1 + Else + MsgBox "Compression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub + +Public Sub subUncompressFile(ByVal strargFilPth As String) + Dim bytaryCpr() As Byte + Dim bytaryOri() As Byte + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim strOriPth As String + lngCprSiz = FileLen(strargFilPth) + ReDim bytaryCpr(lngCprSiz - 1) + Open strargFilPth For Binary Access Read As #1 + Get #1, , bytaryCpr() + Close #1 + 'Read the original file size value: + lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _ + + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _ + + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _ + + bytaryCpr(lngCprSiz - 4) + ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value + ReDim bytaryOri(lngOriSiz - 1) + If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS +Then + strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt)) + Open strOriPth For Binary Access Write As #1 + Put #1, , bytaryOri() + Close #1 + Else + MsgBox "Uncompression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub +Public Property Get lngPercentSmaller() As Long + lngPercentSmaller = lngpvtPcnSml +End Property diff --git a/win32/3rdparty/zlib/old/zlib.html b/win32/3rdparty/zlib/old/zlib.html new file mode 100644 index 000000000..8c1b190c3 --- /dev/null +++ b/win32/3rdparty/zlib/old/zlib.html @@ -0,0 +1,971 @@ + + + + zlib general purpose compression library version 1.1.4 + + + + + +

zlib 1.1.4 Manual

+
+

Contents

+
    +
  1. Prologue +
  2. Introduction +
  3. Utility functions +
  4. Basic functions +
  5. Advanced functions +
  6. Constants +
  7. struct z_stream_s +
  8. Checksum functions +
  9. Misc +
+
+

Prologue

+ 'zlib' general purpose compression library version 1.1.4, March 11th, 2002 +

+ Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler +

+ This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. +

+ Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: +

    +
  1. The origin of this software must not be misrepresented ; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +
  2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +
  3. This notice may not be removed or altered from any source distribution. +
+ +
+
Jean-loup Gailly +
jloup@gzip.org +
Mark Adler +
madler@alumni.caltech.edu +
+ + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files + + ftp://ds.internic.net/rfc/rfc1950.txt + (zlib format), + + rfc1951.txt + (deflate format) and + + rfc1952.txt + (gzip format). +

+ This manual is converted from zlib.h by + piaip +

+ Visit + http://ftp.cdrom.com/pub/infozip/zlib/ + for the official zlib web page. +

+ +


+

Introduction

+ The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. +

+ + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. +

+ + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio. +

+ + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +

+ +


+

Utility functions

+ The following utility functions are implemented on top of the +
basic stream-oriented functions. + To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +

Function list

+
    +
  • int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
  • int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); +
  • int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
  • typedef voidp gzFile; +
  • gzFile gzopen (const char *path, const char *mode); +
  • gzFile gzdopen (int fd, const char *mode); +
  • int gzsetparams (gzFile file, int level, int strategy); +
  • int gzread (gzFile file, voidp buf, unsigned len); +
  • int gzwrite (gzFile file, const voidp buf, unsigned len); +
  • int VA gzprintf (gzFile file, const char *format, ...); +
  • int gzputs (gzFile file, const char *s); +
  • char * gzgets (gzFile file, char *buf, int len); +
  • int gzputc (gzFile file, int c); +
  • int gzgetc (gzFile file); +
  • int gzflush (gzFile file, int flush); +
  • z_off_t gzseek (gzFile file, z_off_t offset, int whence); +
  • z_off_t gztell (gzFile file); +
  • int gzrewind (gzFile file); +
  • int gzeof (gzFile file); +
  • int gzclose (gzFile file); +
  • const char * gzerror (gzFile file, int *errnum); +
+

Function description

+
+
int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
+ Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least 0.1% larger than + sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the + compressed buffer.

+ This function can be used to compress a whole file at once if the + input file is mmap'ed.

+ compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer.

+ +

int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); +
+ Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. +

+ + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +

+ +

int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
+ Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer.

+ This function can be used to decompress a whole file at once if the + input file is mmap'ed. +

+ + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +

+ +

typedef voidp gzFile; +

+ +

gzFile gzopen (const char *path, const char *mode); +
+ Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h". (See the description + of deflateInit2 for more information about the strategy parameter.) +

+ + gzopen can be used to read a file which is not in gzip format ; in this + case gzread will directly read from the file without decompression. +

+ + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state ; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +

+ +

gzFile gzdopen (int fd, const char *mode); +
+ gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. +

+ The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). +

+ gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +

+ +

int gzsetparams (gzFile file, int level, int strategy); +
+ Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. +

+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +

+ +

int gzread (gzFile file, voidp buf, unsigned len); +
+ Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. +

+ gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). +

+ +

int gzwrite (gzFile file, const voidp buf, unsigned len); +
+ Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +

+ +

int VA gzprintf (gzFile file, const char *format, ...); +
+ Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +

+ +

int gzputs (gzFile file, const char *s); +
+ Writes the given null-terminated string to the compressed file, excluding + the terminating null character. +

+ gzputs returns the number of characters written, or -1 in case of error. +

+ +

char * gzgets (gzFile file, char *buf, int len); +
+ Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. +

+ gzgets returns buf, or Z_NULL in case of error. +

+ +

int gzputc (gzFile file, int c); +
+ Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +

+ +

int gzgetc (gzFile file); +
+ Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +

+ +

int gzflush (gzFile file, int flush); +
+ Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. +

+ gzflush should be called only when strictly necessary because it can + degrade compression. +

+ +

z_off_t gzseek (gzFile file, z_off_t offset, int whence); +
+ Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. +

+ If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported ; gzseek then compresses a sequence of zeroes up to the new + starting position. +

+ gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +

+ +

int gzrewind (gzFile file); +
+ Rewinds the given file. This function is supported only for reading. +

+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +

+ +

z_off_t gztell (gzFile file); +
+ Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +

+ + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +

+ +

int gzeof (gzFile file); +
+ Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +

+ +

int gzclose (gzFile file); +
+ Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +

+ +

const char * gzerror (gzFile file, int *errnum); +
+ Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +

+

+
+

Basic functions

+

Function list

+
+ +

Function description

+
+
const char * zlibVersion (void); +
The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. +

+ +

int deflateInit (z_streamp strm, int level); +
+ Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. +

+ + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). +

+ + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). +

+ + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +

+ +

int deflate (z_streamp strm, int flush); +
+ deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush.

+ + The detailed semantics are as follows. deflate performs one or both of the + following actions: + +

    +
  • Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + +
  • + Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. +

+ + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly ; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. +

+ + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. +

+ + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. +

+ + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). +

+ + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space ; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. +

+ + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + 0.1% larger than avail_in plus 12 bytes. If deflate does not return + Z_STREAM_END, then it must be called again as described above. +

+ + deflate() sets strm-> adler to the adler32 checksum of all input read + so far (that is, total_in bytes). +

+ + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. +

+ + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). +

+ +

int deflateEnd (z_streamp strm); +
+ All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. +

+ + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +

+ +

int inflateInit (z_streamp strm); +
+ Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly ; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. +

+ + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +

+ +

int inflate (z_streamp strm, int flush); +
+ inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may some + introduce some output latency (reading input without producing any output) + except when forced to flush. +

+ + The detailed semantics are as follows. inflate performs one or both of the + following actions: + +

    +
  • Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + +
  • Provide more output starting at next_out and update next_out and + avail_out accordingly. inflate() provides as much output as possible, + until there is no more input data or no more space in the output buffer + (see below about the flush parameter). +

+ + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. +

+ + If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much + output as possible to the output buffer. The flushing behavior of inflate is + not specified for values of the flush parameter other than Z_SYNC_FLUSH + and Z_FINISH, but the current implementation actually flushes as much output + as possible anyway. +

+ + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed ; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster routine + may be used for the single inflate() call. +

+ + If a preset dictionary is needed at this point (see inflateSetDictionary + below), inflate sets strm-adler to the adler32 checksum of the + dictionary chosen by the compressor and returns Z_NEED_DICT ; otherwise + it sets strm-> adler to the adler32 checksum of all output produced + so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or + an error code as described below. At the end of the stream, inflate() + checks that its computed adler32 checksum is equal to that saved by the + compressor and returns Z_STREAM_END only if the checksum is correct. +

+ + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect + adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent + (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if no progress is possible or if there was not + enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR + case, the application may then call inflateSync to look for a good + compression block. +

+ +

int inflateEnd (z_streamp strm); +
+ All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. +

+ + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +

+
+

Advanced functions

+ The following functions are needed only in some special applications. +

Function list

+
+

Function description

+
+
int deflateInit2 (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy); + +
This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller.

+ + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library.

+ + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead.

+ + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio ; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel.

+ + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match). Filtered data consists mostly of small values with a + somewhat random distribution. In this case, the compression algorithm is + tuned to compress them better. The effect of Z_FILTERED is to force more + Huffman coding and less string matching ; it is somewhat intermediate + between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects + the compression ratio but not the correctness of the compressed output even + if it is not set appropriately.

+ + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate().

+ +

int deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength); +
+ Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary).

+ + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy ; the data can then be compressed better than + with the default empty dictionary.

+ + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front.

+ + Upon return of this function, strm-> adler is set to the Adler32 value + of the dictionary ; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.)

+ + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate().

+ +

int deflateCopy (z_streamp dest, z_streamp source); +
+ Sets the destination stream as a complete copy of the source stream.

+ + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory.

+ + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination.

+ +

int deflateReset (z_streamp strm); +
This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2.

+ + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL).

+ +

int deflateParams (z_streamp strm, int level, int strategy); +
+ Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate().

+ + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm-> avail_out must be + non-zero.

+ + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero.

+ +

int inflateInit2 (z_streamp strm, int windowBits); + +
This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller.

+ + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. If a compressed stream with a larger window size is given as + input, inflate() will return with the error code Z_DATA_ERROR instead of + trying to allocate a larger window.

+ + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.)

+ +

int inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength); +
+ Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary).

+ + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate().

+ +

int inflateSync (z_streamp strm); + +
Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided.

+ + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data.

+ +

int inflateReset (z_streamp strm); +
+ This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. +

+ + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +

+

+ +
+

Checksum functions

+ These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +

Function list

+
+

Function description

+
+
uLong adler32 (uLong adler, const Bytef *buf, uInt len); +
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. +

+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: +

+
+     uLong adler = adler32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       adler = adler32(adler, buffer, length);
+     }
+     if (adler != original_adler) error();
+   
+ +
uLong crc32 (uLong crc, const Bytef *buf, uInt len); +
+ Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: +
+
+     uLong crc = crc32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       crc = crc32(crc, buffer, length);
+     }
+     if (crc != original_crc) error();
+   
+
+
+

struct z_stream_s

+ +
+
+typedef struct z_stream_s {
+    Bytef    *next_in;  /* next input byte */
+    uInt     avail_in;  /* number of bytes available at next_in */
+    uLong    total_in;  /* total nb of input bytes read so far */
+
+    Bytef    *next_out; /* next output byte should be put there */
+    uInt     avail_out; /* remaining free space at next_out */
+    uLong    total_out; /* total nb of bytes output so far */
+
+    char     *msg;      /* last error message, NULL if no error */
+    struct internal_state FAR *state; /* not visible by applications */
+
+    alloc_func zalloc;  /* used to allocate the internal state */
+    free_func  zfree;   /* used to free the internal state */
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */
+
+    int     data_type;  /* best guess about the data type: ascii or binary */
+    uLong   adler;      /* adler32 value of the uncompressed data */
+    uLong   reserved;   /* reserved for future use */
+} z_stream ;
+
+typedef z_stream FAR * z_streamp;  
+
+
+ The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application.

+ + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value.

+ + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe.

+ + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). +

+ + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step).

+ +


+

Constants

+ +
+#define Z_NO_FLUSH      0
+#define Z_PARTIAL_FLUSH 1
+	/* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH    2
+#define Z_FULL_FLUSH    3
+#define Z_FINISH        4
+/* Allowed flush values ; see deflate() below for details */
+
+#define Z_OK            0
+#define Z_STREAM_END    1
+#define Z_NEED_DICT     2
+#define Z_ERRNO        (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR   (-3)
+#define Z_MEM_ERROR    (-4)
+#define Z_BUF_ERROR    (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION         0
+#define Z_BEST_SPEED             1
+#define Z_BEST_COMPRESSION       9
+#define Z_DEFAULT_COMPRESSION  (-1)
+/* compression levels */
+
+#define Z_FILTERED            1
+#define Z_HUFFMAN_ONLY        2
+#define Z_DEFAULT_STRATEGY    0
+/* compression strategy ; see deflateInit2() below for details */
+
+#define Z_BINARY   0
+#define Z_ASCII    1
+#define Z_UNKNOWN  2
+/* Possible values of the data_type field */
+
+#define Z_DEFLATED   8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions less than 1.0.2 */
+
+
+ +
+

Misc

+
deflateInit and inflateInit are macros to allow checking the zlib version + and the compiler's view of z_stream. +

+ Other functions: +

+
const char * zError (int err); +
int inflateSyncPoint (z_streamp z); +
const uLongf * get_crc_table (void); +
+
+ + Last update: Wed Oct 13 20:42:34 1999
+ piapi@csie.ntu.edu.tw +
+ + + diff --git a/win32/3rdparty/zlib/projects/README.projects b/win32/3rdparty/zlib/projects/README.projects new file mode 100644 index 000000000..1c029e4a3 --- /dev/null +++ b/win32/3rdparty/zlib/projects/README.projects @@ -0,0 +1,41 @@ +This directory contains project files for building zlib under various +Integrated Development Environments (IDE). + +If you wish to submit a new project to this directory, you should comply +to the following requirements. Otherwise (e.g. if you wish to integrate +a custom piece of code that changes the zlib interface or its behavior), +please consider submitting the project to the contrib directory. + + +Requirements +============ + +- The project must build zlib using the source files from the official + zlib source distribution, exclusively. + +- If the project produces redistributable builds (e.g. shared objects + or DLL files), these builds must be compatible to those produced by + makefiles, if such makefiles exist in the zlib distribution. + In particular, if the project produces a DLL build for the Win32 + platform, this build must comply to the officially-ammended Win32 DLL + Application Binary Interface (ABI), described in win32/DLL_FAQ.txt. + +- The project may provide additional build targets, which depend on + 3rd-party (unofficially-supported) software, present in the contrib + directory. For example, it is possible to provide an "ASM build", + besides the officially-supported build, and have ASM source files + among its dependencies. + +- If there are significant differences between the project files created + by different versions of an IDE (e.g. Visual C++ 6.0 vs. 7.0), the name + of the project directory should contain the version number of the IDE + for which the project is intended (e.g. "visualc6" for Visual C++ 6.0, + or "visualc7" for Visual C++ 7.0 and 7.1). + + +Current projects +================ + +visualc6/ by Simon-Pierre Cadieux + and Cosmin Truta + Project for Microsoft Visual C++ 6.0 diff --git a/win32/3rdparty/zlib/projects/visualc6/README.txt b/win32/3rdparty/zlib/projects/visualc6/README.txt new file mode 100644 index 000000000..d0296c272 --- /dev/null +++ b/win32/3rdparty/zlib/projects/visualc6/README.txt @@ -0,0 +1,73 @@ +Microsoft Developer Studio Project Files, Format Version 6.00 for zlib. + +Copyright (C) 2000-2004 Simon-Pierre Cadieux. +Copyright (C) 2004 Cosmin Truta. +For conditions of distribution and use, see copyright notice in zlib.h. + + +This project builds the zlib binaries as follows: + +* Win32_DLL_Release\zlib1.dll DLL build +* Win32_DLL_Debug\zlib1d.dll DLL build (debug version) +* Win32_DLL_ASM_Release\zlib1.dll DLL build using ASM code +* Win32_DLL_ASM_Debug\zlib1d.dll DLL build using ASM code (debug version) +* Win32_LIB_Release\zlib.lib static build +* Win32_LIB_Debug\zlibd.lib static build (debug version) +* Win32_LIB_ASM_Release\zlib.lib static build using ASM code +* Win32_LIB_ASM_Debug\zlibd.lib static build using ASM code (debug version) + + +For more information regarding the DLL builds, please see the DLL FAQ +in ..\..\win32\DLL_FAQ.txt. + + +To build and test: + +1) On the main menu, select "File | Open Workspace". + Open "zlib.dsw". + +2) Select "Build | Set Active Configuration". + Choose the configuration you wish to build. + +3) Select "Build | Clean". + +4) Select "Build | Build ... (F7)". Ignore warning messages about + not being able to find certain include files (e.g. alloc.h). + +5) If you built one of the sample programs (example or minigzip), + select "Build | Execute ... (Ctrl+F5)". + + +To use: + +1) Select "Project | Settings (Alt+F7)". + Make note of the configuration names used in your project. + Usually, these names are "Win32 Release" and "Win32 Debug". + +2) In the Workspace window, select the "FileView" tab. + Right-click on the root item "Workspace '...'". + Select "Insert Project into Workspace". + Switch on the checkbox "Dependency of:", and select the name + of your project. Open "zlib.dsp". + +3) Select "Build | Configurations". + For each configuration of your project: + 3.1) Choose the zlib configuration you wish to use. + 3.2) Click on "Add". + 3.3) Set the new zlib configuration name to the name used by + the configuration from the current iteration. + +4) Select "Build | Set Active Configuration". + Choose the configuration you wish to build. + +5) Select "Build | Build ... (F7)". + +6) If you built an executable program, select + "Build | Execute ... (Ctrl+F5)". + + +Note: + +To build the ASM-enabled code, you need Microsoft Assembler +(ML.EXE). You can get it by downloading and installing the +latest Processor Pack for Visual C++ 6.0. diff --git a/win32/3rdparty/zlib/projects/visualc6/example.dsp b/win32/3rdparty/zlib/projects/visualc6/example.dsp new file mode 100644 index 000000000..e072a37ff --- /dev/null +++ b/win32/3rdparty/zlib/projects/visualc6/example.dsp @@ -0,0 +1,278 @@ +# Microsoft Developer Studio Project File - Name="example" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=example - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "example.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "example.mak" CFG="example - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "example - Win32 DLL Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 DLL Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 DLL ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 DLL ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "example - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_DLL_Release" +# PROP BASE Intermediate_Dir "example___Win32_DLL_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_Release" +# PROP Intermediate_Dir "Win32_DLL_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_DLL_Debug" +# PROP BASE Intermediate_Dir "example___Win32_DLL_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_Debug" +# PROP Intermediate_Dir "Win32_DLL_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 DLL ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_DLL_ASM_Release" +# PROP BASE Intermediate_Dir "example___Win32_DLL_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_ASM_Release" +# PROP Intermediate_Dir "Win32_DLL_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 DLL ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_DLL_ASM_Debug" +# PROP BASE Intermediate_Dir "example___Win32_DLL_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_ASM_Debug" +# PROP Intermediate_Dir "Win32_DLL_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_LIB_Release" +# PROP BASE Intermediate_Dir "example___Win32_LIB_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_Release" +# PROP Intermediate_Dir "Win32_LIB_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_LIB_Debug" +# PROP BASE Intermediate_Dir "example___Win32_LIB_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_Debug" +# PROP Intermediate_Dir "Win32_LIB_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 LIB ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_LIB_ASM_Release" +# PROP BASE Intermediate_Dir "example___Win32_LIB_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_ASM_Release" +# PROP Intermediate_Dir "Win32_LIB_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 LIB ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_LIB_ASM_Debug" +# PROP BASE Intermediate_Dir "example___Win32_LIB_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_ASM_Debug" +# PROP Intermediate_Dir "Win32_LIB_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "example - Win32 DLL Release" +# Name "example - Win32 DLL Debug" +# Name "example - Win32 DLL ASM Release" +# Name "example - Win32 DLL ASM Debug" +# Name "example - Win32 LIB Release" +# Name "example - Win32 LIB Debug" +# Name "example - Win32 LIB ASM Release" +# Name "example - Win32 LIB ASM Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\example.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\zconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\zlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/win32/3rdparty/zlib/projects/visualc6/minigzip.dsp b/win32/3rdparty/zlib/projects/visualc6/minigzip.dsp new file mode 100644 index 000000000..f32024eaf --- /dev/null +++ b/win32/3rdparty/zlib/projects/visualc6/minigzip.dsp @@ -0,0 +1,278 @@ +# Microsoft Developer Studio Project File - Name="minigzip" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=minigzip - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "minigzip.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "minigzip.mak" CFG="minigzip - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "minigzip - Win32 DLL Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 DLL Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 DLL ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 DLL ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "minigzip - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_DLL_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_Release" +# PROP Intermediate_Dir "Win32_DLL_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_DLL_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_Debug" +# PROP Intermediate_Dir "Win32_DLL_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "minigzip - Win32 DLL ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_DLL_ASM_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_ASM_Release" +# PROP Intermediate_Dir "Win32_DLL_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 DLL ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_DLL_ASM_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_ASM_Debug" +# PROP Intermediate_Dir "Win32_DLL_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_LIB_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_Release" +# PROP Intermediate_Dir "Win32_LIB_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_LIB_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_Debug" +# PROP Intermediate_Dir "Win32_LIB_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_LIB_ASM_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_ASM_Release" +# PROP Intermediate_Dir "Win32_LIB_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_LIB_ASM_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_ASM_Debug" +# PROP Intermediate_Dir "Win32_LIB_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "minigzip - Win32 DLL Release" +# Name "minigzip - Win32 DLL Debug" +# Name "minigzip - Win32 DLL ASM Release" +# Name "minigzip - Win32 DLL ASM Debug" +# Name "minigzip - Win32 LIB Release" +# Name "minigzip - Win32 LIB Debug" +# Name "minigzip - Win32 LIB ASM Release" +# Name "minigzip - Win32 LIB ASM Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\minigzip.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\zconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\zlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/win32/3rdparty/zlib/projects/visualc6/zlib.dsp b/win32/3rdparty/zlib/projects/visualc6/zlib.dsp new file mode 100644 index 000000000..0fe0604cc --- /dev/null +++ b/win32/3rdparty/zlib/projects/visualc6/zlib.dsp @@ -0,0 +1,609 @@ +# Microsoft Developer Studio Project File - Name="zlib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=zlib - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "zlib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "zlib.mak" CFG="zlib - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "zlib - Win32 DLL Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 DLL ASM Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 DLL ASM Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 LIB Release" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 LIB Debug" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 LIB ASM Release" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 LIB ASM Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_DLL_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_Release" +# PROP Intermediate_Dir "Win32_DLL_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 /nologo /dll /machine:I386 /out:"Win32_DLL_Release\zlib1.dll" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_DLL_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_Debug" +# PROP Intermediate_Dir "Win32_DLL_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /dll /debug /machine:I386 /out:"Win32_DLL_Debug\zlib1d.dll" /pdbtype:sept + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_DLL_ASM_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_ASM_Release" +# PROP Intermediate_Dir "Win32_DLL_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "ASMV" /D "ASMINF" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 /nologo /dll /machine:I386 /out:"Win32_DLL_ASM_Release\zlib1.dll" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_DLL_ASM_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_ASM_Debug" +# PROP Intermediate_Dir "Win32_DLL_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "ASMV" /D "ASMINF" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /dll /debug /machine:I386 /out:"Win32_DLL_ASM_Debug\zlib1d.dll" /pdbtype:sept + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_LIB_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_Release" +# PROP Intermediate_Dir "Win32_LIB_Release" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_LIB_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_Debug" +# PROP Intermediate_Dir "Win32_LIB_Debug" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"Win32_LIB_Debug\zlibd.lib" + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_LIB_ASM_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_ASM_Release" +# PROP Intermediate_Dir "Win32_LIB_ASM_Release" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "ASMV" /D "ASMINF" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_LIB_ASM_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_ASM_Debug" +# PROP Intermediate_Dir "Win32_LIB_ASM_Debug" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "ASMV" /D "ASMINF" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"Win32_LIB_ASM_Debug\zlibd.lib" + +!ENDIF + +# Begin Target + +# Name "zlib - Win32 DLL Release" +# Name "zlib - Win32 DLL Debug" +# Name "zlib - Win32 DLL ASM Release" +# Name "zlib - Win32 DLL ASM Debug" +# Name "zlib - Win32 LIB Release" +# Name "zlib - Win32 LIB Debug" +# Name "zlib - Win32 LIB ASM Release" +# Name "zlib - Win32 LIB ASM Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\adler32.c +# End Source File +# Begin Source File + +SOURCE=..\..\compress.c +# End Source File +# Begin Source File + +SOURCE=..\..\crc32.c +# End Source File +# Begin Source File + +SOURCE=..\..\deflate.c +# End Source File +# Begin Source File + +SOURCE=..\..\gzio.c +# End Source File +# Begin Source File + +SOURCE=..\..\infback.c +# End Source File +# Begin Source File + +SOURCE=..\..\inffast.c +# End Source File +# Begin Source File + +SOURCE=..\..\inflate.c +# End Source File +# Begin Source File + +SOURCE=..\..\inftrees.c +# End Source File +# Begin Source File + +SOURCE=..\..\trees.c +# End Source File +# Begin Source File + +SOURCE=..\..\uncompr.c +# End Source File +# Begin Source File + +SOURCE=..\..\win32\zlib.def + +!IF "$(CFG)" == "zlib - Win32 DLL Release" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\zutil.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\crc32.h +# End Source File +# Begin Source File + +SOURCE=..\..\deflate.h +# End Source File +# Begin Source File + +SOURCE=..\..\inffast.h +# End Source File +# Begin Source File + +SOURCE=..\..\inffixed.h +# End Source File +# Begin Source File + +SOURCE=..\..\inflate.h +# End Source File +# Begin Source File + +SOURCE=..\..\inftrees.h +# End Source File +# Begin Source File + +SOURCE=..\..\trees.h +# End Source File +# Begin Source File + +SOURCE=..\..\zconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\zlib.h +# End Source File +# Begin Source File + +SOURCE=..\..\zutil.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=..\..\win32\zlib1.rc +# End Source File +# End Group +# Begin Group "Assembler Files (Unsupported)" + +# PROP Default_Filter "asm;obj;c;cpp;cxx;h;hpp;hxx" +# Begin Source File + +SOURCE=..\..\contrib\masmx86\gvmat32.asm + +!IF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Release +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Debug +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Release +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Debug +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\contrib\masmx86\gvmat32c.c + +!IF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# ADD CPP /I "..\.." + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\contrib\masmx86\inffas32.asm + +!IF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Release +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Debug +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Release +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Debug +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# Begin Source File + +SOURCE=.\README.txt +# End Source File +# End Target +# End Project diff --git a/win32/3rdparty/zlib/projects/visualc6/zlib.dsw b/win32/3rdparty/zlib/projects/visualc6/zlib.dsw new file mode 100644 index 000000000..3a771fce0 --- /dev/null +++ b/win32/3rdparty/zlib/projects/visualc6/zlib.dsw @@ -0,0 +1,59 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "example"=.\example.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "minigzip"=.\minigzip.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "zlib"=.\zlib.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/win32/3rdparty/zlib/qnx/package.qpg b/win32/3rdparty/zlib/qnx/package.qpg new file mode 100644 index 000000000..8a4a47c72 --- /dev/null +++ b/win32/3rdparty/zlib/qnx/package.qpg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Library + + Medium + + 2.0 + + + + zlib + zlib + alain.bonnefoy@icbt.com + Public + public + www.gzip.org/zlib + + + Jean-Loup Gailly,Mark Adler + www.gzip.org/zlib + + zlib@gzip.org + + + A massively spiffy yet delicately unobtrusive compression library. + zlib is designed to be a free, general-purpose, legally unencumbered, lossless data compression library for use on virtually any computer hardware and operating system. + http://www.gzip.org/zlib + + + + + 1.2.3 + Medium + Stable + + + + + + + No License + + + + Software Development/Libraries and Extensions/C Libraries + zlib,compression + qnx6 + qnx6 + None + Developer + + + + + + + + + + + + + + Install + Post + No + Ignore + + No + Optional + + + + + + + + + + + + + InstallOver + zlib + + + + + + + + + + + + + InstallOver + zlib-dev + + + + + + + + + diff --git a/win32/3rdparty/zlib/trees.c b/win32/3rdparty/zlib/trees.c new file mode 100644 index 000000000..395e4e168 --- /dev/null +++ b/win32/3rdparty/zlib/trees.c @@ -0,0 +1,1219 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type(s) + deflate_state *s; +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/win32/3rdparty/zlib/trees.h b/win32/3rdparty/zlib/trees.h new file mode 100644 index 000000000..72facf900 --- /dev/null +++ b/win32/3rdparty/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/win32/3rdparty/zlib/uncompr.c b/win32/3rdparty/zlib/uncompr.c new file mode 100644 index 000000000..b59e3d0de --- /dev/null +++ b/win32/3rdparty/zlib/uncompr.c @@ -0,0 +1,61 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/win32/3rdparty/zlib/win32/DLL_FAQ.txt b/win32/3rdparty/zlib/win32/DLL_FAQ.txt new file mode 100644 index 000000000..fb18e0711 --- /dev/null +++ b/win32/3rdparty/zlib/win32/DLL_FAQ.txt @@ -0,0 +1,397 @@ + + Frequently Asked Questions about ZLIB1.DLL + + +This document describes the design, the rationale, and the usage +of the official DLL build of zlib, named ZLIB1.DLL. If you have +general questions about zlib, you should see the file "FAQ" found +in the zlib distribution, or at the following location: + http://www.gzip.org/zlib/zlib_faq.html + + + 1. What is ZLIB1.DLL, and how can I get it? + + - ZLIB1.DLL is the official build of zlib as a DLL. + (Please remark the character '1' in the name.) + + Pointers to a precompiled ZLIB1.DLL can be found in the zlib + web site at: + http://www.zlib.org/ + + Applications that link to ZLIB1.DLL can rely on the following + specification: + + * The exported symbols are exclusively defined in the source + files "zlib.h" and "zlib.def", found in an official zlib + source distribution. + * The symbols are exported by name, not by ordinal. + * The exported names are undecorated. + * The calling convention of functions is "C" (CDECL). + * The ZLIB1.DLL binary is linked to MSVCRT.DLL. + + The archive in which ZLIB1.DLL is bundled contains compiled + test programs that must run with a valid build of ZLIB1.DLL. + It is recommended to download the prebuilt DLL from the zlib + web site, instead of building it yourself, to avoid potential + incompatibilities that could be introduced by your compiler + and build settings. If you do build the DLL yourself, please + make sure that it complies with all the above requirements, + and it runs with the precompiled test programs, bundled with + the original ZLIB1.DLL distribution. + + If, for any reason, you need to build an incompatible DLL, + please use a different file name. + + + 2. Why did you change the name of the DLL to ZLIB1.DLL? + What happened to the old ZLIB.DLL? + + - The old ZLIB.DLL, built from zlib-1.1.4 or earlier, required + compilation settings that were incompatible to those used by + a static build. The DLL settings were supposed to be enabled + by defining the macro ZLIB_DLL, before including "zlib.h". + Incorrect handling of this macro was silently accepted at + build time, resulting in two major problems: + + * ZLIB_DLL was missing from the old makefile. When building + the DLL, not all people added it to the build options. In + consequence, incompatible incarnations of ZLIB.DLL started + to circulate around the net. + + * When switching from using the static library to using the + DLL, applications had to define the ZLIB_DLL macro and + to recompile all the sources that contained calls to zlib + functions. Failure to do so resulted in creating binaries + that were unable to run with the official ZLIB.DLL build. + + The only possible solution that we could foresee was to make + a binary-incompatible change in the DLL interface, in order to + remove the dependency on the ZLIB_DLL macro, and to release + the new DLL under a different name. + + We chose the name ZLIB1.DLL, where '1' indicates the major + zlib version number. We hope that we will not have to break + the binary compatibility again, at least not as long as the + zlib-1.x series will last. + + There is still a ZLIB_DLL macro, that can trigger a more + efficient build and use of the DLL, but compatibility no + longer dependents on it. + + + 3. Can I build ZLIB.DLL from the new zlib sources, and replace + an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier? + + - In principle, you can do it by assigning calling convention + keywords to the macros ZEXPORT and ZEXPORTVA. In practice, + it depends on what you mean by "an old ZLIB.DLL", because the + old DLL exists in several mutually-incompatible versions. + You have to find out first what kind of calling convention is + being used in your particular ZLIB.DLL build, and to use the + same one in the new build. If you don't know what this is all + about, you might be better off if you would just leave the old + DLL intact. + + + 4. Can I compile my application using the new zlib interface, and + link it to an old ZLIB.DLL, that was built from zlib-1.1.4 or + earlier? + + - The official answer is "no"; the real answer depends again on + what kind of ZLIB.DLL you have. Even if you are lucky, this + course of action is unreliable. + + If you rebuild your application and you intend to use a newer + version of zlib (post- 1.1.4), it is strongly recommended to + link it to the new ZLIB1.DLL. + + + 5. Why are the zlib symbols exported by name, and not by ordinal? + + - Although exporting symbols by ordinal is a little faster, it + is risky. Any single glitch in the maintenance or use of the + DEF file that contains the ordinals can result in incompatible + builds and frustrating crashes. Simply put, the benefits of + exporting symbols by ordinal do not justify the risks. + + Technically, it should be possible to maintain ordinals in + the DEF file, and still export the symbols by name. Ordinals + exist in every DLL, and even if the dynamic linking performed + at the DLL startup is searching for names, ordinals serve as + hints, for a faster name lookup. However, if the DEF file + contains ordinals, the Microsoft linker automatically builds + an implib that will cause the executables linked to it to use + those ordinals, and not the names. It is interesting to + notice that the GNU linker for Win32 does not suffer from this + problem. + + It is possible to avoid the DEF file if the exported symbols + are accompanied by a "__declspec(dllexport)" attribute in the + source files. You can do this in zlib by predefining the + ZLIB_DLL macro. + + + 6. I see that the ZLIB1.DLL functions use the "C" (CDECL) calling + convention. Why not use the STDCALL convention? + STDCALL is the standard convention in Win32, and I need it in + my Visual Basic project! + + (For readability, we use CDECL to refer to the convention + triggered by the "__cdecl" keyword, STDCALL to refer to + the convention triggered by "__stdcall", and FASTCALL to + refer to the convention triggered by "__fastcall".) + + - Most of the native Windows API functions (without varargs) use + indeed the WINAPI convention (which translates to STDCALL in + Win32), but the standard C functions use CDECL. If a user + application is intrinsically tied to the Windows API (e.g. + it calls native Windows API functions such as CreateFile()), + sometimes it makes sense to decorate its own functions with + WINAPI. But if ANSI C or POSIX portability is a goal (e.g. + it calls standard C functions such as fopen()), it is not a + sound decision to request the inclusion of , or to + use non-ANSI constructs, for the sole purpose to make the user + functions STDCALL-able. + + The functionality offered by zlib is not in the category of + "Windows functionality", but is more like "C functionality". + + Technically, STDCALL is not bad; in fact, it is slightly + faster than CDECL, and it works with variable-argument + functions, just like CDECL. It is unfortunate that, in spite + of using STDCALL in the Windows API, it is not the default + convention used by the C compilers that run under Windows. + The roots of the problem reside deep inside the unsafety of + the K&R-style function prototypes, where the argument types + are not specified; but that is another story for another day. + + The remaining fact is that CDECL is the default convention. + Even if an explicit convention is hard-coded into the function + prototypes inside C headers, problems may appear. The + necessity to expose the convention in users' callbacks is one + of these problems. + + The calling convention issues are also important when using + zlib in other programming languages. Some of them, like Ada + (GNAT) and Fortran (GNU G77), have C bindings implemented + initially on Unix, and relying on the C calling convention. + On the other hand, the pre- .NET versions of Microsoft Visual + Basic require STDCALL, while Borland Delphi prefers, although + it does not require, FASTCALL. + + In fairness to all possible uses of zlib outside the C + programming language, we choose the default "C" convention. + Anyone interested in different bindings or conventions is + encouraged to maintain specialized projects. The "contrib/" + directory from the zlib distribution already holds a couple + of foreign bindings, such as Ada, C++, and Delphi. + + + 7. I need a DLL for my Visual Basic project. What can I do? + + - Define the ZLIB_WINAPI macro before including "zlib.h", when + building both the DLL and the user application (except that + you don't need to define anything when using the DLL in Visual + Basic). The ZLIB_WINAPI macro will switch on the WINAPI + (STDCALL) convention. The name of this DLL must be different + than the official ZLIB1.DLL. + + Gilles Vollant has contributed a build named ZLIBWAPI.DLL, + with the ZLIB_WINAPI macro turned on, and with the minizip + functionality built in. For more information, please read + the notes inside "contrib/vstudio/readme.txt", found in the + zlib distribution. + + + 8. I need to use zlib in my Microsoft .NET project. What can I + do? + + - Henrik Ravn has contributed a .NET wrapper around zlib. Look + into contrib/dotzlib/, inside the zlib distribution. + + + 9. If my application uses ZLIB1.DLL, should I link it to + MSVCRT.DLL? Why? + + - It is not required, but it is recommended to link your + application to MSVCRT.DLL, if it uses ZLIB1.DLL. + + The executables (.EXE, .DLL, etc.) that are involved in the + same process and are using the C run-time library (i.e. they + are calling standard C functions), must link to the same + library. There are several libraries in the Win32 system: + CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc. + Since ZLIB1.DLL is linked to MSVCRT.DLL, the executables that + depend on it should also be linked to MSVCRT.DLL. + + +10. Why are you saying that ZLIB1.DLL and my application should + be linked to the same C run-time (CRT) library? I linked my + application and my DLLs to different C libraries (e.g. my + application to a static library, and my DLLs to MSVCRT.DLL), + and everything works fine. + + - If a user library invokes only pure Win32 API (accessible via + and the related headers), its DLL build will work + in any context. But if this library invokes standard C API, + things get more complicated. + + There is a single Win32 library in a Win32 system. Every + function in this library resides in a single DLL module, that + is safe to call from anywhere. On the other hand, there are + multiple versions of the C library, and each of them has its + own separate internal state. Standalone executables and user + DLLs that call standard C functions must link to a C run-time + (CRT) library, be it static or shared (DLL). Intermixing + occurs when an executable (not necessarily standalone) and a + DLL are linked to different CRTs, and both are running in the + same process. + + Intermixing multiple CRTs is possible, as long as their + internal states are kept intact. The Microsoft Knowledge Base + articles KB94248 "HOWTO: Use the C Run-Time" and KB140584 + "HOWTO: Link with the Correct C Run-Time (CRT) Library" + mention the potential problems raised by intermixing. + + If intermixing works for you, it's because your application + and DLLs are avoiding the corruption of each of the CRTs' + internal states, maybe by careful design, or maybe by fortune. + + Also note that linking ZLIB1.DLL to non-Microsoft CRTs, such + as those provided by Borland, raises similar problems. + + +11. Why are you linking ZLIB1.DLL to MSVCRT.DLL? + + - MSVCRT.DLL exists on every Windows 95 with a new service pack + installed, or with Microsoft Internet Explorer 4 or later, and + on all other Windows 4.x or later (Windows 98, Windows NT 4, + or later). It is freely distributable; if not present in the + system, it can be downloaded from Microsoft or from other + software provider for free. + + The fact that MSVCRT.DLL does not exist on a virgin Windows 95 + is not so problematic. Windows 95 is scarcely found nowadays, + Microsoft ended its support a long time ago, and many recent + applications from various vendors, including Microsoft, do not + even run on it. Furthermore, no serious user should run + Windows 95 without a proper update installed. + + +12. Why are you not linking ZLIB1.DLL to + <> ? + + - We considered and abandoned the following alternatives: + + * Linking ZLIB1.DLL to a static C library (LIBC.LIB, or + LIBCMT.LIB) is not a good option. People are using the DLL + mainly to save disk space. If you are linking your program + to a static C library, you may as well consider linking zlib + in statically, too. + + * Linking ZLIB1.DLL to CRTDLL.DLL looks appealing, because + CRTDLL.DLL is present on every Win32 installation. + Unfortunately, it has a series of problems: it does not + work properly with Microsoft's C++ libraries, it does not + provide support for 64-bit file offsets, (and so on...), + and Microsoft discontinued its support a long time ago. + + * Linking ZLIB1.DLL to MSVCR70.DLL or MSVCR71.DLL, supplied + with the Microsoft .NET platform, and Visual C++ 7.0/7.1, + raises problems related to the status of ZLIB1.DLL as a + system component. According to the Microsoft Knowledge Base + article KB326922 "INFO: Redistribution of the Shared C + Runtime Component in Visual C++ .NET", MSVCR70.DLL and + MSVCR71.DLL are not supposed to function as system DLLs, + because they may clash with MSVCRT.DLL. Instead, the + application's installer is supposed to put these DLLs + (if needed) in the application's private directory. + If ZLIB1.DLL depends on a non-system runtime, it cannot + function as a redistributable system component. + + * Linking ZLIB1.DLL to non-Microsoft runtimes, such as + Borland's, or Cygwin's, raises problems related to the + reliable presence of these runtimes on Win32 systems. + It's easier to let the DLL build of zlib up to the people + who distribute these runtimes, and who may proceed as + explained in the answer to Question 14. + + +13. If ZLIB1.DLL cannot be linked to MSVCR70.DLL or MSVCR71.DLL, + how can I build/use ZLIB1.DLL in Microsoft Visual C++ 7.0 + (Visual Studio .NET) or newer? + + - Due to the problems explained in the Microsoft Knowledge Base + article KB326922 (see the previous answer), the C runtime that + comes with the VC7 environment is no longer considered a + system component. That is, it should not be assumed that this + runtime exists, or may be installed in a system directory. + Since ZLIB1.DLL is supposed to be a system component, it may + not depend on a non-system component. + + In order to link ZLIB1.DLL and your application to MSVCRT.DLL + in VC7, you need the library of Visual C++ 6.0 or older. If + you don't have this library at hand, it's probably best not to + use ZLIB1.DLL. + + We are hoping that, in the future, Microsoft will provide a + way to build applications linked to a proper system runtime, + from the Visual C++ environment. Until then, you have a + couple of alternatives, such as linking zlib in statically. + If your application requires dynamic linking, you may proceed + as explained in the answer to Question 14. + + +14. I need to link my own DLL build to a CRT different than + MSVCRT.DLL. What can I do? + + - Feel free to rebuild the DLL from the zlib sources, and link + it the way you want. You should, however, clearly state that + your build is unofficial. You should give it a different file + name, and/or install it in a private directory that can be + accessed by your application only, and is not visible to the + others (e.g. it's not in the SYSTEM or the SYSTEM32 directory, + and it's not in the PATH). Otherwise, your build may clash + with applications that link to the official build. + + For example, in Cygwin, zlib is linked to the Cygwin runtime + CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL. + + +15. May I include additional pieces of code that I find useful, + link them in ZLIB1.DLL, and export them? + + - No. A legitimate build of ZLIB1.DLL must not include code + that does not originate from the official zlib source code. + But you can make your own private DLL build, under a different + file name, as suggested in the previous answer. + + For example, zlib is a part of the VCL library, distributed + with Borland Delphi and C++ Builder. The DLL build of VCL + is a redistributable file, named VCLxx.DLL. + + +16. May I remove some functionality out of ZLIB1.DLL, by enabling + macros like NO_GZCOMPRESS or NO_GZIP at compile time? + + - No. A legitimate build of ZLIB1.DLL must provide the complete + zlib functionality, as implemented in the official zlib source + code. But you can make your own private DLL build, under a + different file name, as suggested in the previous answer. + + +17. I made my own ZLIB1.DLL build. Can I test it for compliance? + + - We prefer that you download the official DLL from the zlib + web site. If you need something peculiar from this DLL, you + can send your suggestion to the zlib mailing list. + + However, in case you do rebuild the DLL yourself, you can run + it with the test programs found in the DLL distribution. + Running these test programs is not a guarantee of compliance, + but a failure can imply a detected problem. + +** + +This document is written and maintained by +Cosmin Truta diff --git a/win32/3rdparty/zlib/win32/Makefile.bor b/win32/3rdparty/zlib/win32/Makefile.bor new file mode 100644 index 000000000..b802519ca --- /dev/null +++ b/win32/3rdparty/zlib/win32/Makefile.bor @@ -0,0 +1,107 @@ +# Makefile for zlib +# Borland C++ for Win32 +# +# Updated for zlib 1.2.x by Cosmin Truta, 11-Mar-2003 +# Last updated: 28-Aug-2003 +# +# Usage: +# make -f win32/Makefile.bor +# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj + +# ------------ Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or +# added to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +CC = bcc32 +AS = bcc32 +LD = bcc32 +AR = tlib +CFLAGS = -a -d -k- -O2 $(LOC) +ASFLAGS = $(LOC) +LDFLAGS = $(LOC) + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj +OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +#OBJA = +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj +OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj +#OBJPA= + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $< + +.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) $(OBJA) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + $(AR) $(ZLIB_LIB) $(OBJPA) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.lib + -del *.exe + -del *.tds + -del zlib.bak + -del foo.gz diff --git a/win32/3rdparty/zlib/win32/Makefile.emx b/win32/3rdparty/zlib/win32/Makefile.emx new file mode 100644 index 000000000..7b08424ce --- /dev/null +++ b/win32/3rdparty/zlib/win32/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc -Zwin32 + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DDEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/win32/3rdparty/zlib/win32/Makefile.gcc b/win32/3rdparty/zlib/win32/Makefile.gcc new file mode 100644 index 000000000..62a843015 --- /dev/null +++ b/win32/3rdparty/zlib/win32/Makefile.gcc @@ -0,0 +1,141 @@ +# Makefile for zlib, derived from Makefile.dj2. +# Modified for mingw32 by C. Spieler, 6/16/98. +# Updated for zlib 1.2.x by Christian Spieler and Cosmin Truta, Mar-2003. +# Last updated: 1-Aug-2003. +# Tested under Cygwin and MinGW. + +# Copyright (C) 1995-2003 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.gcc; make test testdll -fmakefile.gcc +# +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o -fmakefile.gcc +# +# To install libz.a, zconf.h and zlib.h in the system directories, type: +# +# make install -fmakefile.gcc + +# Note: +# If the platform is *not* MinGW (e.g. it is Cygwin or UWIN), +# the DLL name should be changed from "zlib1.dll". + +STATICLIB = libz.a +SHAREDLIB = zlib1.dll +IMPLIB = libzdll.a + +#LOC = -DASMV +#LOC = -DDEBUG -g + +CC = gcc +CFLAGS = $(LOC) -O3 -Wall + +AS = $(CC) +ASFLAGS = $(LOC) -Wall + +LD = $(CC) +LDFLAGS = $(LOC) -s + +AR = ar +ARFLAGS = rcs + +RC = windres +RCFLAGS = --define GCC_WINDRES + +CP = cp -fp +# If GNU install is available, replace $(CP) with install. +INSTALL = $(CP) +RM = rm -f + +prefix = /usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzio.o infback.o \ + inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJA = + +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) example minigzip example_d minigzip_d + +test: example minigzip + ./example + echo hello world | ./minigzip | ./minigzip -d + +testdll: example_d minigzip_d + ./example_d + echo hello world | ./minigzip_d | ./minigzip_d -d + +.c.o: + $(CC) $(CFLAGS) -c -o $@ $< + +.S.o: + $(AS) $(ASFLAGS) -c -o $@ $< + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) $@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + dllwrap --driver-name $(CC) --def win32/zlib.def \ + --implib $(IMPLIB) -o $@ $(OBJS) $(OBJA) zlibrc.o + strip $@ + +example: example.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(STATICLIB) + +minigzip: minigzip.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(STATICLIB) + +example_d: example.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(IMPLIB) + +minigzip_d: minigzip.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(IMPLIB) + +zlibrc.o: win32/zlib1.rc + $(RC) $(RCFLAGS) -o $@ win32/zlib1.rc + + +# INCLUDE_PATH and LIBRARY_PATH must be set. + +.PHONY: install uninstall clean + +install: zlib.h zconf.h $(LIB) + -@if not exist $(INCLUDE_PATH)/nul mkdir $(INCLUDE_PATH) + -@if not exist $(LIBRARY_PATH)/nul mkdir $(LIBRARY_PATH) + -$(INSTALL) zlib.h $(INCLUDE_PATH) + -$(INSTALL) zconf.h $(INCLUDE_PATH) + -$(INSTALL) $(STATICLIB) $(LIBRARY_PATH) + -$(INSTALL) $(IMPLIB) $(LIBRARY_PATH) + +uninstall: + -$(RM) $(INCLUDE_PATH)/zlib.h + -$(RM) $(INCLUDE_PATH)/zconf.h + -$(RM) $(LIBRARY_PATH)/$(STATICLIB) + -$(RM) $(LIBRARY_PATH)/$(IMPLIB) + +clean: + -$(RM) $(STATICLIB) + -$(RM) $(SHAREDLIB) + -$(RM) $(IMPLIB) + -$(RM) *.o + -$(RM) *.exe + -$(RM) foo.gz + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/win32/3rdparty/zlib/win32/Makefile.msc b/win32/3rdparty/zlib/win32/Makefile.msc new file mode 100644 index 000000000..528ecaaf2 --- /dev/null +++ b/win32/3rdparty/zlib/win32/Makefile.msc @@ -0,0 +1,126 @@ +# Makefile for zlib -- Microsoft (Visual) C +# +# Authors: +# Cosmin Truta, 11-Mar-2003 +# Christian Spieler, 19-Mar-2003 +# +# Last updated: +# Cosmin Truta, 27-Aug-2003 +# +# Usage: +# nmake -f win32/Makefile.msc (standard build) +# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) +# nmake -f win32/Makefile.msc LOC=-DASMV OBJA=match.obj (use ASM code) + + +# optional build flags +LOC = + + +# variables +STATICLIB = zlib.lib +SHAREDLIB = zlib1.dll +IMPLIB = zdll.lib + +CC = cl +AS = ml +LD = link +AR = lib +RC = rc +CFLAGS = -nologo -MD -O2 $(LOC) +ASFLAGS = -coff +LDFLAGS = -nologo -release +ARFLAGS = -nologo +RCFLAGS = /dWIN32 /r + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj \ + inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJA = + + +# targets +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \ + example.exe minigzip.exe example_d.exe minigzip_d.exe + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) -out:$@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlib1.res + $(LD) $(LDFLAGS) -def:win32/zlib.def -dll -implib:$(IMPLIB) \ + -out:$@ $(OBJS) $(OBJA) zlib1.res + +example.exe: example.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj $(STATICLIB) + +minigzip.exe: minigzip.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) + +example_d.exe: example.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) + +minigzip_d.exe: minigzip.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) + +.c.obj: + $(CC) -c $(CFLAGS) $< + +.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzio.obj: gzio.c zutil.h zlib.h zconf.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + +zlib1.res: win32/zlib1.rc + $(RC) $(RCFLAGS) /fo$@ win32/zlib1.rc + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +testdll: example_d.exe minigzip_d.exe + example_d + echo hello world | minigzip_d | minigzip_d -d + + +# cleanup +clean: + -del $(STATICLIB) + -del $(SHAREDLIB) + -del $(IMPLIB) + -del *.obj + -del *.res + -del *.exp + -del *.exe + -del foo.gz diff --git a/win32/3rdparty/zlib/win32/VisualC.txt b/win32/3rdparty/zlib/win32/VisualC.txt new file mode 100644 index 000000000..579a5fc9e --- /dev/null +++ b/win32/3rdparty/zlib/win32/VisualC.txt @@ -0,0 +1,3 @@ + +To build zlib using the Microsoft Visual C++ environment, +use the appropriate project from the projects/ directory. diff --git a/win32/3rdparty/zlib/win32/zlib.def b/win32/3rdparty/zlib/win32/zlib.def new file mode 100644 index 000000000..a47cbc10c --- /dev/null +++ b/win32/3rdparty/zlib/win32/zlib.def @@ -0,0 +1,60 @@ +LIBRARY +; zlib data compression library + +EXPORTS +; basic functions + zlibVersion + deflate + deflateEnd + inflate + inflateEnd +; advanced functions + deflateSetDictionary + deflateCopy + deflateReset + deflateParams + deflateBound + deflatePrime + inflateSetDictionary + inflateSync + inflateCopy + inflateReset + inflateBack + inflateBackEnd + zlibCompileFlags +; utility functions + compress + compress2 + compressBound + uncompress + gzopen + gzdopen + gzsetparams + gzread + gzwrite + gzprintf + gzputs + gzgets + gzputc + gzgetc + gzungetc + gzflush + gzseek + gzrewind + gztell + gzeof + gzclose + gzerror + gzclearerr +; checksum functions + adler32 + crc32 +; various hacks, don't look :) + deflateInit_ + deflateInit2_ + inflateInit_ + inflateInit2_ + inflateBackInit_ + inflateSyncPoint + get_crc_table + zError diff --git a/win32/3rdparty/zlib/win32/zlib1.rc b/win32/3rdparty/zlib/win32/zlib1.rc new file mode 100644 index 000000000..99025c974 --- /dev/null +++ b/win32/3rdparty/zlib/win32/zlib1.rc @@ -0,0 +1,39 @@ +#include + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION 1,2,2,0 + PRODUCTVERSION 1,2,2,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", "1.2.3\0" + VALUE "InternalName", "zlib1.dll\0" + VALUE "LegalCopyright", "(C) 1995-2004 Jean-loup Gailly & Mark Adler\0" + VALUE "OriginalFilename", "zlib1.dll\0" + VALUE "ProductName", "zlib\0" + VALUE "ProductVersion", "1.2.3\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/win32/3rdparty/zlib/zconf.h b/win32/3rdparty/zlib/zconf.h new file mode 100644 index 000000000..03a9431c8 --- /dev/null +++ b/win32/3rdparty/zlib/zconf.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/win32/3rdparty/zlib/zconf.in.h b/win32/3rdparty/zlib/zconf.in.h new file mode 100644 index 000000000..03a9431c8 --- /dev/null +++ b/win32/3rdparty/zlib/zconf.in.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/win32/3rdparty/zlib/zlib.3 b/win32/3rdparty/zlib/zlib.3 new file mode 100644 index 000000000..90b816287 --- /dev/null +++ b/win32/3rdparty/zlib/zlib.3 @@ -0,0 +1,159 @@ +.TH ZLIB 3 "18 July 2005" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms will be added later +and will have the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +(for example if an input file is mmap'ed), +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I example.c +and +.IR minigzip.c . +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source, +and are concerned primarily with bug fixes and portability enhancements. +.LP +A Java implementation of +.I zlib +is available in the Java Development Kit 1.1: +.IP +http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html +.LP +A Perl interface to +.IR zlib , +written by Paul Marquess (pmqs@cpan.org), +is available at CPAN (Comprehensive Perl Archive Network) sites, +including: +.IP +http://www.cpan.org/modules/by-module/Compress/ +.LP +A Python interface to +.IR zlib , +written by A.M. Kuchling (amk@magnet.com), +is available in Python 1.5 and later versions: +.IP +http://www.python.org/doc/lib/module-zlib.html +.LP +A +.I zlib +binding for +.IR tcl (1), +written by Andreas Kupries (a.kupries@westend.com), +is availlable at: +.IP +http://www.westend.com/~kupries/doc/trf/man/man.html +.LP +An experimental package to read and write files in .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/unzip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +web site. +.SH "SEE ALSO" +The +.I zlib +web site can be found at either of these locations: +.IP +http://www.zlib.org +.br +http://www.gzip.org/zlib/ +.LP +The data format used by the zlib library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://www.ietf.org/rfc/rfc1950.txt (concerning zlib format) +.br +http://www.ietf.org/rfc/rfc1951.txt (concerning deflate format) +.br +http://www.ietf.org/rfc/rfc1952.txt (concerning gzip format) +.LP +These documents are also available in other formats from: +.IP +ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html +.LP +Mark Nelson (markn@ieee.org) wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://dogma.net/markn/articles/zlibtool/zlibtool.htm +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://www.gzip.org/zlib/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS +Version 1.2.3 +Copyright (C) 1995-2005 Jean-loup Gailly (jloup@gzip.org) +and Mark Adler (madler@alumni.caltech.edu). +.LP +This software is provided "as-is," +without any express or implied warranty. +In no event will the authors be held liable for any damages +arising from the use of this software. +See the distribution directory with respect to requirements +governing redistribution. +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/win32/3rdparty/zlib/zlib.h b/win32/3rdparty/zlib/zlib.h new file mode 100644 index 000000000..022817927 --- /dev/null +++ b/win32/3rdparty/zlib/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/win32/3rdparty/zlib/zutil.c b/win32/3rdparty/zlib/zutil.c new file mode 100644 index 000000000..d55f5948a --- /dev/null +++ b/win32/3rdparty/zlib/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/win32/3rdparty/zlib/zutil.h b/win32/3rdparty/zlib/zutil.h new file mode 100644 index 000000000..b7d5eff81 --- /dev/null +++ b/win32/3rdparty/zlib/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/win32/ClamAV.sln b/win32/ClamAV.sln new file mode 100644 index 000000000..f692aa5c5 --- /dev/null +++ b/win32/ClamAV.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libclamav", "libclamav.vcproj", "{3AD5B16C-340A-40AC-96AD-6017B941A316}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AD5B16C-340A-40AC-96AD-6017B941A316}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AD5B16C-340A-40AC-96AD-6017B941A316}.Debug|Win32.Build.0 = Debug|Win32 + {3AD5B16C-340A-40AC-96AD-6017B941A316}.Release|Win32.ActiveCfg = Release|Win32 + {3AD5B16C-340A-40AC-96AD-6017B941A316}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/clamav-config.h b/win32/clamav-config.h new file mode 100644 index 000000000..3fa510cdf --- /dev/null +++ b/win32/clamav-config.h @@ -0,0 +1,571 @@ +/* clamav-config.h. Generated from clamav-config.h.in by configure. */ +/* clamav-config.h.in. Generated from configure.in by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* mmap flag for anonymous maps */ +/* #undef ANONYMOUS_MAP */ + +/* enable bind8 compatibility */ +/* #undef BIND_8_COMPAT */ + +/* "build clamd" */ +#define BUILD_CLAMD 1 + +/* name of the clamav group */ +#define CLAMAVGROUP "clamav" + +/* name of the clamav user */ +#define CLAMAVUSER "clamav" + +/* enable clamuko */ +/* #undef CLAMUKO */ + +/* enable debugging */ +/* #undef CL_DEBUG */ + +/* enable experimental code */ +/* #undef CL_EXPERIMENTAL */ + +/* thread safe */ +#define CL_THREAD_SAFE 1 + +/* where to look for the config file */ +#define CONFDIR "/usr/local/etc" + +/* curses header location */ +/* #define CURSES_INCLUDE + +/* os is aix */ +/* #undef C_AIX */ + +/* os is beos */ +/* #undef C_BEOS */ + +/* Increase thread stack size. */ +/* #undef C_BIGSTACK */ + +/* os is bsd flavor */ +/* #undef C_BSD */ + +/* os is darwin */ +/* #undef C_DARWIN */ + +/* target is gnu-hurd */ +/* #undef C_GNU_HURD */ + +/* os is hpux */ +/* #undef C_HPUX */ + +/* os is interix */ +/* #undef C_INTERIX */ + +/* os is irix */ +/* #undef C_IRIX */ + +/* target is kfreebsd-gnu */ +/* #undef C_KFREEBSD_GNU */ + +/* target is linux */ +/* #undef C_LINUX */ + +/* os is OS/2 */ +/* #undef C_OS2 */ + +/* os is osf/tru64 */ +/* #undef C_OSF */ + +/* os is QNX 6.x.x */ +/* #undef C_QNX6 */ + +/* os is solaris */ +/* #undef C_SOLARIS */ + +/* Path to virus database directory. */ +#define DATADIR "/usr/local/share/clamav" + +/* "default FD_SETSIZE value" */ +#define DEFAULT_FD_SETSIZE 1024 + +/* whether _XOPEN_SOURCE needs to be defined for fd passing to work */ +/* #undef FDPASS_NEED_XOPEN */ + +/* file i/o buffer size */ +#define FILEBUFF 8192 + +/* FPU byte ordering is little endian */ +#define FPU_WORDS_BIGENDIAN 0 + +/* enable workaround for broken DNS servers */ +/* #undef FRESHCLAM_DNS_FIX */ + +/* use "Cache-Control: no-cache" in freshclam */ +/* #undef FRESHCLAM_NO_CACHE */ + +/* Define to 1 if you have the `argz_add' function. */ +#define HAVE_ARGZ_ADD 1 + +/* Define to 1 if you have the `argz_append' function. */ +#define HAVE_ARGZ_APPEND 1 + +/* Define to 1 if you have the `argz_count' function. */ +#define HAVE_ARGZ_COUNT 1 + +/* Define to 1 if you have the `argz_create_sep' function. */ +#define HAVE_ARGZ_CREATE_SEP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARGZ_H 1 + +/* Define to 1 if you have the `argz_insert' function. */ +#define HAVE_ARGZ_INSERT 1 + +/* Define to 1 if you have the `argz_next' function. */ +#define HAVE_ARGZ_NEXT 1 + +/* Define to 1 if you have the `argz_stringify' function. */ +#define HAVE_ARGZ_STRINGIFY 1 + +/* attrib aligned */ +/* #undef HAVE_ATTRIB_ALIGNED */ + +/* attrib packed */ +/* #undef HAVE_ATTRIB_PACKED */ + +/* have bzip2 */ +#define HAVE_BZLIB_H 1 + +/* Define to 1 if you have the `closedir' function. */ +#define HAVE_CLOSEDIR 1 + +/* ancillary data style fd pass */ +#define HAVE_CONTROL_IN_MSGHDR 1 + +/* Define to 1 if you have the `ctime_r' function. */ +#define HAVE_CTIME_R 1 + +/* ctime_r takes 2 arguments */ +#define HAVE_CTIME_R_2 1 + +/* ctime_r takes 3 arguments */ +/* #undef HAVE_CTIME_R_3 */ + +/* Define to 1 if you have the declaration of `cygwin_conv_path', and to 0 if + you don't. */ +/* #undef HAVE_DECL_CYGWIN_CONV_PATH */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the GNU dld library. */ +/* #undef HAVE_DLD */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLD_H */ + +/* Define to 1 if you have the `dlerror' function. */ +#define HAVE_DLERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DL_H */ + +/* Define if you have the _dyld_func_lookup function. */ +/* #undef HAVE_DYLD */ + +/* Define to 1 if the system has the type `error_t'. */ +#define HAVE_ERROR_T 1 + +/* have working file descriptor passing support */ +#define HAVE_FD_PASSING 1 + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#define HAVE_FSEEKO 1 + +/* have getaddrinfo() */ +#define HAVE_GETADDRINFO 1 + +/* gethostbyname_r takes 3 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_3 */ + +/* gethostbyname_r takes 5 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_5 */ + +/* gethostbyname_r takes 6 arguments */ +#define HAVE_GETHOSTBYNAME_R_6 1 + +/* Define to 1 if getpagesize() is available */ +#define HAVE_GETPAGESIZE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* iconv() available */ +/* #undef HAVE_ICONV 1 */ + +/* Define to 1 if you have the `inet_ntop' function. */ +#define HAVE_INET_NTOP 1 + +/* Define to 1 if you have the `initgroups' function. */ +#define HAVE_INITGROUPS 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* in_addr_t is defined */ +#define HAVE_IN_ADDR_T 1 + +/* in_port_t is defined */ +#define HAVE_IN_PORT_T 1 + +/* Define to '1' if you have the check.h library */ +/* #undef HAVE_LIBCHECK */ + +/* Define if you have the libdl library or equivalent. */ +#define HAVE_LIBDL 1 + +/* Define if libdlloader will be built on this platform */ +#define HAVE_LIBDLLOADER 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBMILTER_MFAPI_H */ + +/* Define to '1' if you have the ncurses.h library */ +/* #undef HAVE_LIBNCURSES 1 */ + +/* Define to '1' if you have the curses.h library */ +/* #undef HAVE_LIBPDCURSES */ + +/* Define to 1 if you have the `z' library (-lz). */ +#define HAVE_LIBZ 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define this if a modern libltdl is already installed */ +#define HAVE_LTDL 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_O_DYLD_H */ + +/* Define to 1 if you have the `madvise' function. */ +/* #undef HAVE_MADVISE */ + +/* Define to 1 if you have the `mallinfo' function. */ +/* #undef HAVE_MALLINFO */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have a working `mmap' system call that supports + MAP_PRIVATE. */ +/* #undef HAVE_MMAP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the `opendir' function. */ +#define HAVE_OPENDIR 1 + +/* Define to 1 if you have the `poll' function. */ +#define HAVE_POLL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_POLL_H 1 + +/* "pragma pack" */ +#define HAVE_PRAGMA_PACK 1 + +/* "pragma pack hppa/hp-ux style" */ +/* #undef HAVE_PRAGMA_PACK_HPPA */ + +/* Define if libtool can extract symbol lists from object files. */ +#define HAVE_PRELOADED_SYMBOLS 1 + +/* Define to 1 if you have the `pthread_yield' function. */ +#define HAVE_PTHREAD_YIELD 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PWD_H */ + +/* Define to 1 if you have the `readdir' function. */ +#define HAVE_READDIR 1 + +/* readdir_r takes 2 arguments */ +/* #undef HAVE_READDIR_R_2 */ + +/* readdir_r takes 3 arguments */ +/* #undef HAVE_READDIR_R_3 */ + +/* Define to 1 if you have the `recvmsg' function. */ +#define HAVE_RECVMSG 1 + +/* have resolv.h */ +#define HAVE_RESOLV_H 1 + +/* Define signed right shift implementation */ +#define HAVE_SAR 1 + +/* Define to 1 if you have the `sched_yield' function. */ +/* #undef HAVE_SCHED_YIELD */ + +/* Define to 1 if you have the `sendmsg' function. */ +#define HAVE_SENDMSG 1 + +/* Define to 1 if you have the `setgroups' function. */ +#define HAVE_SETGROUPS 1 + +/* Define to 1 if you have the `setsid' function. */ +#define HAVE_SETSID 1 + +/* Define if you have the shl_load function. */ +/* #undef HAVE_SHL_LOAD */ + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the header file. */ +/* #define HAVE_STDBOOL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasestr' function. */ +#define HAVE_STRCASESTR 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRINGS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcat' function. */ +/* #undef HAVE_STRLCAT */ + +/* Define to 1 if you have the `strlcpy' function. */ +/* #undef HAVE_STRLCPY */ + +/* Define to 1 if sysconf(_SC_PAGESIZE) is available */ +/* #undef HAVE_SYSCONF_SC_PAGESIZE */ + +/* link against system-wide libtommath */ +/* #undef HAVE_SYSTEM_TOMMATH */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_DL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_FILIO_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_INTTYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_INT_TYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MMAN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* "have " */ +/* #undef HAVE_SYS_SELECT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UIO_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_TERMIOS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UNISTD_H */ + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* This value is set to 1 to indicate that the system argz facility works */ +#define HAVE_WORKING_ARGZ 1 + +/* "Full library version number" */ +#define LIBCLAMAV_FULLVER "6.0.4" + +/* "Major library version number" */ +#define LIBCLAMAV_MAJORVER 6 + +/* Define if the OS needs help to load dependent libraries for dlopen(). */ +/* #undef LTDL_DLOPEN_DEPLIBS */ + +/* Define to the system default library search path. */ +#define LT_DLSEARCH_PATH "/lib:/usr/lib:/usr/local/lib:/usr/lib/atlas:/usr/local/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu" + +/* The archive extension */ +#define LT_LIBEXT "a" + +/* Define to the extension used for runtime loadable modules, say, ".so". */ +#define LT_MODULE_EXT ".so" + +/* Define to the name of the environment variable that determines the run-time + module search path. */ +#define LT_MODULE_PATH_VAR "LD_LIBRARY_PATH" + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* disable assertions */ +#define NDEBUG 1 + +/* Define if dlsym() requires a leading underscore in symbol names. */ +/* #undef NEED_USCORE */ + +/* bzip funtions do not have bz2 prefix */ +/* #undef NOBZ2PREFIX */ + +/* "no fd_set" */ +/* #undef NO_FD_SET */ + +/* Name of package */ +#define PACKAGE PACKAGE_NAME + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://bugs.clamav.net/" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "ClamAV" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "ClamAV devel" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "clamav" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "http://www.clamav.net/" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "devel" + +/* scan buffer size */ +#define SCANBUFF 131072 + +/* Define to 1 if the `setpgrp' function takes no argument. */ +#define SETPGRP_VOID 1 + +/* The number of bytes in type int */ +#define SIZEOF_INT 4 + +/* The number of bytes in type long */ +#define SIZEOF_LONG 4 + +/* The number of bytes in type long long */ +#define SIZEOF_LONG_LONG 8 + +/* The number of bytes in type short */ +#define SIZEOF_SHORT 2 + +/* The number of bytes in type void * */ +#define SIZEOF_VOID_P 4 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Support for IPv6 */ +/* #undef SUPPORT_IPv6 */ + +/* enable memory pools */ +/* #undef USE_MPOOL */ + +/* use syslog */ +/* #undef USE_SYSLOG */ + +/* Version number of package */ +#define VERSION "devel-20091010" + +/* Version suffix for package */ +#define VERSION_SUFFIX "" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 0 +# endif +#else +# ifndef WORDS_BIGENDIAN +# define WORDS_BIGENDIAN 0 +# endif +#endif + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* #undef _LARGEFILE_SOURCE */ + +/* POSIX compatibility */ +/* #undef _POSIX_PII_SOCKET */ + +/* thread safe */ +#define _REENTRANT 1 + +/* thread safe */ +/* #undef _THREAD_SAFE */ + +/* Define so that glibc/gnulib argp.h does not typedef error_t. */ +/* #undef __error_t_defined */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to a type to use for `error_t' if it is not otherwise available. */ +/* #undef error_t */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#define inline _inline +#endif + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +/* #undef restrict */ +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif + +/* Define to "int" if does not define. */ +/* #undef socklen_t */ + +#include "platform.h" diff --git a/win32/compat/dirent.c b/win32/compat/dirent.c new file mode 100644 index 000000000..ad67a22c0 --- /dev/null +++ b/win32/compat/dirent.c @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2009 Sourcefire, Inc. + * + * Authors: aCaB + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include "dirent.h" + +DIR *opendir(const char *name) { + + +} \ No newline at end of file diff --git a/win32/compat/dirent.h b/win32/compat/dirent.h new file mode 100644 index 000000000..234c0f797 --- /dev/null +++ b/win32/compat/dirent.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2009 Sourcefire, Inc. + * + * Authors: aCaB + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef __DIRENT_H +#define __DIRENT_H + +#if HAVE_CONFIG_H +#include "clamav-config.h" +#endif + +#define _DIRENT_HAVE_D_TYPE + +typedef struct { + HANDLE dh; + WIN32_FIND_DATAW wfd; + char entry[MAX_PATH]; +} DIR; + +struct dirent { + char d_ino; /* inode number */ + unsigned char d_type; /* type of file */ + char d_name[MAX_PATH]; /* filename */ +}; + +enum { + DT_BLOCK, + DT_CHR, + DT_DIR, + DT_FIFO, + DT_LNK, + DT_REG, + DT_SOCK, + DT_UNKNOWN +}; + +DIR *opendir(const char *name); +struct dirent *readdir(DIR *dirp); +void rewinddir(DIR *dirp); +int closedir(DIR *dirp); +#endif \ No newline at end of file diff --git a/win32/libclamav.vcproj b/win32/libclamav.vcproj new file mode 100644 index 000000000..950c2b26f --- /dev/null +++ b/win32/libclamav.vcproj @@ -0,0 +1,887 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/platform.h b/win32/platform.h new file mode 100644 index 000000000..6e61b8fc8 --- /dev/null +++ b/win32/platform.h @@ -0,0 +1,43 @@ +#ifndef __PLATFORM_H +#define __PLATFORM_H + +#include +#include +#include +#include +#include +#include + +typedef int ssize_t; +#define strcasecmp lstrcmpi +#define strncasecmp strnicmp +#define snprintf _snprintf + +#define S_IRUSR S_IREAD +#define S_IWUSR S_IWRITE +#define S_IRWXU (S_IRUSR|S_IWUSR) +#define mkdir(path, mode) mkdir(path) +#define lstat stat +#define F_OK 0 +#define W_OK 2 +#define R_OK 4 +#define X_OK R_OK + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef HAVE_IN_PORT_T +typedef unsigned short in_port_t; +#endif + +#ifndef HAVE_IN_ADDR_T +typedef unsigned int in_addr_t; +#endif + +#define PATHSEP "\\" + +#endif /* __PLATFORM_H */ \ No newline at end of file